Browse Source

allow for return from new func CallLuaEventReturn

pull/8485/head
Trihedraf 2 weeks ago committed by Stephen C. Wills
parent
commit
7ea938e212
  1. 20
      Source/lua/lua_event.cpp
  2. 14
      assets/lua/devilutionx/events.lua

20
Source/lua/lua_event.cpp

@ -32,6 +32,26 @@ void CallLuaEvent(std::string_view name, Args &&...args)
SafeCallResult(fn(std::forward<Args>(args)...), /*optional=*/true);
}
template <typename T, typename... Args>
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<std::optional<sol::object>>(name, "trigger");
if (!trigger.has_value() || !trigger->is<sol::protected_function>()) {
return defaultValue;
}
const sol::protected_function fn = trigger->as<sol::protected_function>();
sol::object result = SafeCallResult(fn(std::forward<Args>(args)...), /*optional=*/true);
if (result.is<T>()) {
return result.as<T>();
}
return defaultValue;
}
void MonsterDataLoaded()
{
CallLuaEvent("MonsterDataLoaded");

14
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 = "(...)",
}

Loading…
Cancel
Save