diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index 83fa34f4..411b91aa 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -82,6 +82,15 @@ void TLuaEngine::operator()() { } } + // now call onInitFinal after all states have completed their onInit + auto FinalFutures = TriggerEvent("onInitFinal", ""); + WaitForAll(FinalFutures, std::chrono::seconds(5)); + for (const auto& Future : FinalFutures) { + if (Future->Error && Future->ErrorMessage != BeamMPFnNotFoundError) { + beammp_lua_error("Calling \"onInitFinal\" on \"" + Future->StateId + "\" failed: " + Future->ErrorMessage); + } + } + auto ResultCheckThread = std::thread([&] { RegisterThread("ResultCheckThread"); while (!Application::IsShuttingDown()) { @@ -433,6 +442,7 @@ void TLuaEngine::EnsureStateExists(TLuaStateId StateId, const std::string& Name, auto DataPtr = std::make_unique(Name, StateId, *this); mLuaStates[StateId] = std::move(DataPtr); RegisterEvent("onInit", StateId, "onInit"); + RegisterEvent("onInitFinal", StateId, "onInitFinal"); if (!DontCallOnInit) { auto Res = EnqueueFunctionCall(StateId, "onInit", {}, "onInit"); Res->WaitUntilReady(); diff --git a/src/TServer.cpp b/src/TServer.cpp index b064e87e..7346fcee 100644 --- a/src/TServer.cpp +++ b/src/TServer.cpp @@ -325,7 +325,7 @@ void TServer::HandleEvent(TClient& c, const std::string& RawData) { std::string Name = RawData.substr(2, NameDataSep - 2); std::string Data = RawData.substr(NameDataSep + 1); - std::vector exclude = {"onInit", "onFileChanged","onVehicleDeleted","onConsoleInput","onPlayerAuth","postPlayerAuth", "onPlayerDisconnect", + std::vector exclude = {"onInit", "onInitFinal", "onFileChanged","onVehicleDeleted","onConsoleInput","onPlayerAuth","postPlayerAuth", "onPlayerDisconnect", "onPlayerConnecting","onPlayerJoining","onPlayerJoin","onChatMessage","postChatMessage","onVehicleSpawn","postVehicleSpawn","onVehicleEdited", "postVehicleEdited", "onVehicleReset","onVehiclePaintChanged","onShutdown"};