Skip to content

Commit

Permalink
traverse lua handler
Browse files Browse the repository at this point in the history
  • Loading branch information
20dka committed Aug 28, 2024
1 parent 54e02ab commit 3621b57
Showing 1 changed file with 57 additions and 4 deletions.
61 changes: 57 additions & 4 deletions src/TLuaEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -350,11 +350,35 @@ std::set<std::string> TLuaEngine::GetEventHandlersForState(const std::string& Ev
return mLuaEvents[EventName][StateId];
}

static inline void SplitString(std::string const& str, const char delim, std::vector<std::string>& out) {
size_t start;
size_t end = 0;

while ((start = str.find_first_not_of(delim, end)) != std::string::npos) {
end = str.find(delim, start);
out.push_back(str.substr(start, end - start));
}
}

sol::table TLuaEngine::StateThreadData::Lua_TriggerGlobalEvent(const std::string& EventName, sol::variadic_args EventArgs) {
auto Return = mEngine->TriggerEvent(EventName, mStateId, EventArgs);
auto MyHandlers = mEngine->GetEventHandlersForState(EventName, mStateId);
for (const auto& Handler : MyHandlers) {
auto Fn = mStateView[Handler];
for (const std::string& Handler : MyHandlers) {
beammp_info(Handler);
sol::function Fn;
if (Handler.find(".") != std::string::npos) {
beammp_warn("trying traverse_get");
std::vector<std::string> out;
SplitString(Handler, '.', out);
//int s = out.size();
//std::array<std::string, s> bruh;
//std::tuple tuple = std::tuple_cat(bruh);
Fn = mStateView.traverse_get<sol::function>(out);
beammp_warn(Fn.valid() ? "Fn is valid" : "Fn is not valid");
}
else {
Fn = mStateView[Handler];
}
if (Fn.valid()) {
auto LuaResult = Fn(EventArgs);
auto Result = std::make_shared<TLuaResult>();
Expand Down Expand Up @@ -402,7 +426,21 @@ sol::table TLuaEngine::StateThreadData::Lua_TriggerLocalEvent(const std::string&
// TODO: make asynchronous?
sol::table Result = mStateView.create_table();
for (const auto& Handler : mEngine->GetEventHandlersForState(EventName, mStateId)) {
auto Fn = mStateView[Handler];
beammp_info(Handler);
sol::function Fn;
if (Handler.find(".") != std::string::npos) {
beammp_warn("trying traverse_get");
std::vector<std::string> out;
SplitString(Handler, '.', out);
//int s = out.size();
//std::array<std::string, s> bruh;
//std::tuple tuple = std::tuple_cat(bruh);
Fn = mStateView.traverse_get<sol::function>(out);
beammp_warn(Fn.valid() ? "Fn is valid" : "Fn is not valid");
}
else {
Fn = mStateView[Handler];
}
if (Fn.valid() && Fn.get_type() == sol::type::function) {
auto FnRet = Fn(EventArgs);
if (FnRet.valid()) {
Expand Down Expand Up @@ -881,7 +919,22 @@ void TLuaEngine::StateThreadData::operator()() {
// TODO: Use TheQueuedFunction.EventName for errors, warnings, etc
Result->StateId = mStateId;
sol::state_view StateView(mState);
auto Fn = StateView[FnName];
beammp_info(FnName);
sol::function Fn;
if (FnName.find(".") != std::string::npos) {
beammp_warn("trying traverse_get");
std::vector<std::string> out;
SplitString(FnName, '.', out);
for (size_t i = 0; i < out.size(); i++)
{
beammp_info(out[i]);
}
Fn = StateView.globals().traverse_get<sol::function>(out);
beammp_warn(Fn.valid() ? "Fn is valid" : "Fn is not valid");
}
else {
Fn = StateView[FnName];
}
if (Fn.valid() && Fn.get_type() == sol::type::function) {
std::vector<sol::object> LuaArgs;
for (const auto& Arg : Args) {
Expand Down

0 comments on commit 3621b57

Please sign in to comment.