From 0a8e7d8e502d68333ab86e6a4ef94cdbeefac126 Mon Sep 17 00:00:00 2001 From: Lion Kortlepel Date: Thu, 14 Jul 2022 00:27:44 +0200 Subject: [PATCH] add TriggerLocalEvent --- include/TLuaEngine.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/include/TLuaEngine.h b/include/TLuaEngine.h index ee4e953..f71b9df 100644 --- a/include/TLuaEngine.h +++ b/include/TLuaEngine.h @@ -119,7 +119,6 @@ public: [[nodiscard]] std::shared_ptr EnqueueFunctionCall(TLuaStateId StateID, const std::string& FunctionName, const std::vector& Args); void EnsureStateExists(TLuaStateId StateId, const std::string& Name, bool DontCallOnInit = false); void RegisterEvent(const std::string& EventName, TLuaStateId StateId, const std::string& FunctionName); - template /** * * @tparam ArgsT Template Arguments for the event (Metadata) todo: figure out what this means @@ -128,6 +127,7 @@ public: * @param Args * @return */ + template [[nodiscard]] std::vector> TriggerEvent(const std::string& EventName, TLuaStateId IgnoreId, ArgsT&&... Args) { std::unique_lock Lock(mLuaEventsMutex); beammp_event(EventName); @@ -147,6 +147,21 @@ public: } return Results; // } + template + [[nodiscard]] std::vector> TriggerLocalEvent(const TLuaStateId& StateId, const std::string& EventName, ArgsT&&... Args) { + std::unique_lock Lock(mLuaEventsMutex); + beammp_event(EventName + " in '" + StateId + "'"); + if (mLuaEvents.find(EventName) == mLuaEvents.end()) { // if no event handler is defined for 'EventName', return immediately + return {}; + } + std::vector> Results; + std::vector Arguments { TLuaArgTypes { std::forward(Args) }... }; + const auto Handlers = GetEventHandlersForState(EventName, StateId); + for (const auto& Handler : Handlers) { + Results.push_back(EnqueueFunctionCall(StateId, Handler, Arguments)); + } + return Results; + } std::set GetEventHandlersForState(const std::string& EventName, TLuaStateId StateId); void CreateEventTimer(const std::string& EventName, TLuaStateId StateId, size_t IntervalMS, CallStrategy Strategy); void CancelEventTimers(const std::string& EventName, TLuaStateId StateId);