diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index a383972..9dc0f25 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -40,18 +40,6 @@ TLuaEngine* LuaAPI::MP::Engine; static sol::protected_function AddTraceback(sol::state_view StateView, sol::protected_function RawFn); -static std::optional GetLuaHandler(sol::state_view StateView, const std::string Handler, const std::string EventName); - -static std::optional GetLuaHandler(sol::state_view StateView, const std::string Handler, const std::string EventName) { - auto Res = StateView.safe_script("return " + Handler, sol::script_pass_on_error); - if (!Res.valid()) { - beammp_errorf("invalid handler for event \"{}\". handler: \"{}\"", EventName, Handler); - } else if (Res.get_type() == sol::type::function) { - return Res.get(); - } - return std::nullopt; -} - TLuaEngine::TLuaEngine() : mResourceServerPath(fs::path(Application::Settings.getAsString(Settings::Key::General_ResourceFolder)) / "Server") { Application::SetSubsystemStatus("LuaEngine", Application::Status::Starting); @@ -507,11 +495,9 @@ sol::table TLuaEngine::StateThreadData::Lua_TriggerGlobalEvent(const std::string sol::variadic_results LocalArgs = JsonStringToArray(Str); for (const auto& Handler : MyHandlers) { - auto Res = GetLuaHandler(mStateView, Handler, EventName); - if (Res.has_value()) { - sol::function Fn = Res.value(); - Fn = AddTraceback(mStateView, Fn); - + auto Fn = mStateView[Handler]; + Fn = AddTraceback(mStateView, Fn); + if (Fn.valid()) { auto LuaResult = Fn(LocalArgs); auto Result = std::make_shared(); if (LuaResult.valid()) { @@ -563,9 +549,8 @@ sol::table TLuaEngine::StateThreadData::Lua_TriggerLocalEvent(const std::string& sol::table Result = mStateView.create_table(); int i = 1; for (const auto& Handler : mEngine->GetEventHandlersForState(EventName, mStateId)) { - auto Res = GetLuaHandler(mStateView, Handler, EventName); - if (Res.has_value()) { - sol::function Fn = Res.value(); + auto Fn = mStateView[Handler]; + if (Fn.valid() && Fn.get_type() == sol::type::function) { auto FnRet = Fn(EventArgs); if (FnRet.valid()) { Result.set(i, FnRet); @@ -1177,10 +1162,8 @@ void TLuaEngine::StateThreadData::operator()() { // TODO: Use TheQueuedFunction.EventName for errors, warnings, etc Result->StateId = mStateId; sol::state_view StateView(mState); - - auto Res = GetLuaHandler(StateView, FnName, TheQueuedFunction.EventName); - if (Res.has_value()) { - sol::function Fn = Res.value(); + auto RawFn = StateView[FnName]; + if (RawFn.valid() && RawFn.get_type() == sol::type::function) { std::vector LuaArgs; for (const auto& Arg : Args) { if (Arg.valueless_by_exception()) { @@ -1215,7 +1198,7 @@ void TLuaEngine::StateThreadData::operator()() { break; } } - Fn = AddTraceback(StateView, Fn); + auto Fn = AddTraceback(StateView, RawFn); auto Res = Fn(sol::as_args(LuaArgs)); if (Res.valid()) { Result->Error = false;