From 00560f76462c6bc365f5d4c8d800711bbd63bc98 Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Sat, 15 Feb 2025 21:47:17 +0100 Subject: [PATCH] Wait for the server to start before loading plugins or allowing connections --- src/TLuaEngine.cpp | 3 ++- src/TNetwork.cpp | 5 +++++ src/main.cpp | 15 ++++++++++----- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index fbd5758..a383972 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -80,10 +80,11 @@ TEST_CASE("TLuaEngine ctor & dtor") { void TLuaEngine::operator()() { RegisterThread("LuaEngine"); - Application::SetSubsystemStatus("LuaEngine", Application::Status::Good); // lua engine main thread beammp_infof("Lua v{}.{}.{}", LUA_VERSION_MAJOR, LUA_VERSION_MINOR, LUA_VERSION_RELEASE); CollectAndInitPlugins(); + + Application::SetSubsystemStatus("LuaEngine", Application::Status::Good); // now call all onInit's auto Futures = TriggerEvent("onInit", ""); WaitForAll(Futures, std::chrono::seconds(5)); diff --git a/src/TNetwork.cpp b/src/TNetwork.cpp index 24fc37c..3a40543 100644 --- a/src/TNetwork.cpp +++ b/src/TNetwork.cpp @@ -307,6 +307,11 @@ std::shared_ptr TNetwork::Authentication(TConnection&& RawConnection) { Client->SetIdentifier("ip", ip); beammp_tracef("This thread is ip {} ({})", ip, RawConnection.SockAddr.address().to_v6().is_v4_mapped() ? "IPv4 mapped IPv6" : "IPv6"); + if (Application::GetSubsystemStatuses().at("Main") == Application::Status::Starting) { + ClientKick(*Client, "The server is still starting, please try joining again later."); + return nullptr; + } + beammp_info("Identifying new ClientConnection..."); auto Data = TCPRcv(*Client); diff --git a/src/main.cpp b/src/main.cpp index f28bd5b..7fb09e6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -182,10 +182,6 @@ int BeamMPServerMain(MainArguments Arguments) { TServer Server(Arguments.List); - auto LuaEngine = std::make_shared(); - LuaEngine->SetServer(&Server); - Application::Console().InitializeLuaConsole(*LuaEngine); - RegisterThread("Main"); beammp_trace("Running in debug mode on a debug build"); @@ -194,13 +190,16 @@ int BeamMPServerMain(MainArguments Arguments) { TPPSMonitor PPSMonitor(Server); THeartbeatThread Heartbeat(ResourceManager, Server); TNetwork Network(Server, PPSMonitor, ResourceManager); + + auto LuaEngine = std::make_shared(); + LuaEngine->SetServer(&Server); + Application::Console().InitializeLuaConsole(*LuaEngine); LuaEngine->SetNetwork(&Network); PPSMonitor.SetNetwork(Network); Application::CheckForUpdates(); TPluginMonitor PluginMonitor(fs::path(Application::Settings.getAsString(Settings::Key::General_ResourceFolder)) / "Server", LuaEngine); - Application::SetSubsystemStatus("Main", Application::Status::Good); RegisterThread("Main(Waiting)"); std::set IgnoreSubsystems { @@ -215,6 +214,10 @@ int BeamMPServerMain(MainArguments Arguments) { std::string SystemsBadList {}; auto Statuses = Application::GetSubsystemStatuses(); for (const auto& NameStatusPair : Statuses) { + if (NameStatusPair.first == "Main") { + continue; + } + if (IgnoreSubsystems.count(NameStatusPair.first) > 0) { continue; // ignore } @@ -228,6 +231,8 @@ int BeamMPServerMain(MainArguments Arguments) { // remove ", " SystemsBadList = SystemsBadList.substr(0, SystemsBadList.size() - 2); if (FullyStarted) { + Application::SetSubsystemStatus("Main", Application::Status::Good); + if (!WithErrors) { beammp_info("ALL SYSTEMS STARTED SUCCESSFULLY, EVERYTHING IS OKAY"); } else {