diff --git a/include/TLuaEngine.h b/include/TLuaEngine.h index 47a5c760..cba8bcca 100644 --- a/include/TLuaEngine.h +++ b/include/TLuaEngine.h @@ -168,7 +168,7 @@ class TLuaEngine : public std::enable_shared_from_this, IThreaded { bool HasState(TLuaStateId StateId); [[nodiscard]] std::shared_ptr EnqueueScript(TLuaStateId StateID, const TLuaChunk& Script); [[nodiscard]] std::shared_ptr EnqueueFunctionCall(TLuaStateId StateID, const std::string& FunctionName, const std::vector& Args, const std::string& EventName); - void EnsureStateExists(TLuaStateId StateId, const std::string& Name, bool DontCallOnInit = false); + void EnsureStateExists(TLuaStateId StateId, const std::string& Name); void RegisterEvent(const std::string& EventName, TLuaStateId StateId, const std::string& FunctionName); /** * diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index 49dd4455..cefaac53 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -70,14 +70,21 @@ void TLuaEngine::operator()() { Application::SetSubsystemStatus("LuaEngine", Application::Status::Good); // now call all onInit's - auto Futures = TriggerEvent("onInit", ""); - WaitForAll(Futures, std::chrono::seconds(5)); - for (const auto& Future : Futures) { + auto InitFutures = TriggerEvent("onInit", ""); + WaitForAll(InitFutures, std::chrono::seconds(5)); + for (const auto& Future : InitFutures) { if (Future->Error && Future->ErrorMessage != BeamMPFnNotFoundError) { beammp_lua_error("Calling \"onInit\" on \"" + Future->StateId + "\" failed: " + Future->ErrorMessage); } } - + // now call all onInitFinal's + auto FinalInitFutures = TriggerEvent("onInitFinal", ""); + WaitForAll(FinalInitFutures, std::chrono::seconds(5)); + for (const auto& Future : FinalInitFutures) { + 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()) { @@ -394,7 +401,7 @@ void TLuaEngine::InitializePlugin(const fs::path& Folder, const TLuaPluginConfig beammp_assert(fs::exists(Folder)); beammp_assert(fs::is_directory(Folder)); std::unique_lock Lock(mLuaStatesMutex); - EnsureStateExists(Config.StateId, Folder.stem().string(), true); + EnsureStateExists(Config.StateId, Folder.stem().string()); mLuaStates[Config.StateId]->AddPath(Folder); // add to cpath + path Lock.unlock(); auto Plugin = std::make_shared(*this, Config, Folder); @@ -421,21 +428,13 @@ void TLuaEngine::FindAndParseConfig(const fs::path& Folder, TLuaPluginConfig& Co } } -void TLuaEngine::EnsureStateExists(TLuaStateId StateId, const std::string& Name, bool DontCallOnInit) { +void TLuaEngine::EnsureStateExists(TLuaStateId StateId, const std::string& Name) { beammp_assert(!StateId.empty()); std::unique_lock Lock(mLuaStatesMutex); if (mLuaStates.find(StateId) == mLuaStates.end()) { beammp_debug("Creating lua state for state id \"" + StateId + "\""); auto DataPtr = std::make_unique(Name, StateId, *this); mLuaStates[StateId] = std::move(DataPtr); - RegisterEvent("onInit", StateId, "onInit"); - if (!DontCallOnInit) { - auto Res = EnqueueFunctionCall(StateId, "onInit", {}, "onInit"); - Res->WaitUntilReady(); - if (Res->Error && Res->ErrorMessage != TLuaEngine::BeamMPFnNotFoundError) { - beammp_lua_error("Calling \"onInit\" on \"" + StateId + "\" failed: " + Res->ErrorMessage); - } - } } } diff --git a/src/TServer.cpp b/src/TServer.cpp index 26188402..189d7ea4 100644 --- a/src/TServer.cpp +++ b/src/TServer.cpp @@ -327,7 +327,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"};