From 6ebfe5743cf6e7602dae38526adb3f547d9c30fb Mon Sep 17 00:00:00 2001 From: Lion Kortlepel Date: Sun, 6 Nov 2022 02:16:55 +0100 Subject: [PATCH] add :Wait(timeout_s) function to the result of MP.TriggerGlobalEvent --- src/TLuaEngine.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index 501c3a2..e386d34 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -444,16 +444,21 @@ sol::table TLuaEngine::StateThreadData::Lua_TriggerGlobalEvent(const std::string break; } } - JsonString Str { LuaAPI::MP::JsonEncode(Table) }; + JsonString Str { "" }; + if (!Table.empty()) { + Str.value = LuaAPI::MP::JsonEncode(Table); + } + auto Return = mEngine->TriggerEvent(EventName, mStateId, Str); mEngine->ReportErrors(Return); auto MyHandlers = mEngine->GetEventHandlersForState(EventName, mStateId); - sol::variadic_results LocalArgs = JsonStringToArray(Str); + sol::variadic_results LocalArgs = Str.value.empty() ? sol::variadic_results {} : JsonStringToArray(Str); + for (const auto& Handler : MyHandlers) { auto Fn = mStateView[Handler]; if (Fn.valid()) { - auto LuaResult = Fn(LocalArgs); + auto LuaResult = LocalArgs.empty() ? Fn() : Fn(LocalArgs); auto Result = std::make_shared(); if (LuaResult.valid()) { Result->Error = false; @@ -492,6 +497,15 @@ sol::table TLuaEngine::StateThreadData::Lua_TriggerGlobalEvent(const std::string } return Result; }); + AsyncEventReturn.set_function("Wait", + [](const sol::table& Self, std::optional TimeoutS) { + auto Vector = Self.get>>("ReturnValueImpl"); + if (TimeoutS.has_value()) { + TLuaEngine::WaitForAll(Vector, std::chrono::milliseconds(size_t(TimeoutS.value() * 1000.0f))); + } else { + TLuaEngine::WaitForAll(Vector); + } + }); return AsyncEventReturn; } @@ -1026,8 +1040,11 @@ void TLuaEngine::StateThreadData::operator()() { LuaArgs.push_back(sol::make_object(StateView, std::get(Arg))); break; case TLuaType::Json: { - auto LocalArgs = JsonStringToArray(std::get(Arg)); - LuaArgs.insert(LuaArgs.end(), LocalArgs.begin(), LocalArgs.end()); + auto Str = std::get(Arg); + if (!Str.value.empty()) { + auto LocalArgs = JsonStringToArray(Str); + LuaArgs.insert(LuaArgs.end(), LocalArgs.begin(), LocalArgs.end()); + } break; } case TLuaType::Bool: