From 7ea938e212d34d59ac4afd9081d8dd98653ae790 Mon Sep 17 00:00:00 2001 From: Trihedraf Date: Mon, 2 Mar 2026 20:47:31 -0800 Subject: [PATCH] allow for return from new func CallLuaEventReturn --- Source/lua/lua_event.cpp | 20 ++++++++++++++++++++ assets/lua/devilutionx/events.lua | 14 +++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Source/lua/lua_event.cpp b/Source/lua/lua_event.cpp index d1eb38c7e..1ea0d59ab 100644 --- a/Source/lua/lua_event.cpp +++ b/Source/lua/lua_event.cpp @@ -32,6 +32,26 @@ void CallLuaEvent(std::string_view name, Args &&...args) SafeCallResult(fn(std::forward(args)...), /*optional=*/true); } +template +T CallLuaEventReturn(T defaultValue, std::string_view name, Args &&...args) +{ + sol::table *events = GetLuaEvents(); + if (events == nullptr) { + return defaultValue; + } + + const auto trigger = events->traverse_get>(name, "trigger"); + if (!trigger.has_value() || !trigger->is()) { + return defaultValue; + } + const sol::protected_function fn = trigger->as(); + sol::object result = SafeCallResult(fn(std::forward(args)...), /*optional=*/true); + if (result.is()) { + return result.as(); + } + return defaultValue; +} + void MonsterDataLoaded() { CallLuaEvent("MonsterDataLoaded"); diff --git a/assets/lua/devilutionx/events.lua b/assets/lua/devilutionx/events.lua index dc795b27e..4104defb7 100644 --- a/assets/lua/devilutionx/events.lua +++ b/assets/lua/devilutionx/events.lua @@ -24,17 +24,13 @@ local function CreateEvent() --- ---The arguments are forwarded to handlers. ---@param ... any + ---@return any trigger = function(...) - local args = {...} - if #args > 0 then - for _, func in ipairs(functions) do - func(table.unpack(args)) - end - else - for _, func in ipairs(functions) do - func() - end + local result + for _, func in ipairs(functions) do + result = func(...) end + return result end, __sig_trigger = "(...)", }