From 69233f4185face7d08021aaf18449f5b833c873c Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Tue, 4 Aug 2026 22:51:40 +0200 Subject: [PATCH 1/6] Add time ping handling --- src/TServer.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/TServer.cpp b/src/TServer.cpp index f4b0a45..a80c1ee 100644 --- a/src/TServer.cpp +++ b/src/TServer.cpp @@ -156,6 +156,13 @@ size_t TServer::ClientCount() const { return mClients.size(); } +std::mt19937_64 TimeSyncRandomDevice(std::random_device{}()); + +auto TimeSyncStart = std::chrono::steady_clock::now() + - std::chrono::duration_cast( + std::chrono::duration(std::uniform_real_distribution(0.0, 2592000.0)(TimeSyncRandomDevice)) + ); + void TServer::GlobalParser(const std::weak_ptr& Client, std::vector&& Packet, TPPSMonitor& PPSMonitor, TNetwork& Network, bool udp) { constexpr std::string_view ABG = "ABG:"; if (Packet.size() >= ABG.size() && std::equal(Packet.begin(), Packet.begin() + ABG.size(), ABG.begin(), ABG.end())) { @@ -210,6 +217,24 @@ void TServer::GlobalParser(const std::weak_ptr& Client, std::vector(std::chrono::steady_clock::now() - TimeSyncStart).count(); + + std::vector ServerTime(sizeof(uint64_t)); + std::memcpy(ServerTime.data(), &Time, sizeof(uint64_t)); + + auto Data = Packet; + + beammp_debugf("Sending server time {} to client '{}' ({}), client time: {}", Time, LockedClient->GetName(), LockedClient->GetID(), reinterpret_cast(Data.data())); + + Data.insert(Data.end(), ServerTime.begin(), ServerTime.end()); + + if (!Network.Respond(*LockedClient, Data, true)) { + Network.DisconnectClient(*LockedClient, "Failed to send time"); + } + } + return; case 'H': // initial connection if (udp) { beammp_debugf("Received 'H' packet over UDP from client '{}' ({}), ignoring it", LockedClient->GetName(), LockedClient->GetID()); From a8dfa4b004ba9432546563ff59be8f8dbc1d7591 Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Fri, 7 Aug 2026 01:33:19 +0200 Subject: [PATCH 2/6] Move server time partially into header file --- include/TServer.h | 2 ++ src/TServer.cpp | 15 +++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/TServer.h b/include/TServer.h index 3202c9e..3c5be8c 100644 --- a/include/TServer.h +++ b/include/TServer.h @@ -53,7 +53,9 @@ public: io_context& IoCtx() { return mIoCtxPoller.IoCtx(); } + uint64_t GetServerTimeMS() const { return std::chrono::duration_cast(std::chrono::steady_clock::now() - TimeSyncStart).count();} private: + std::chrono::time_point TimeSyncStart; TIoPollThread mIoCtxPoller; TClientSet mClients; mutable RWMutex mClientsMutex; diff --git a/src/TServer.cpp b/src/TServer.cpp index a80c1ee..ef0e27b 100644 --- a/src/TServer.cpp +++ b/src/TServer.cpp @@ -123,6 +123,12 @@ TEST_CASE("GetPidVid") { TServer::TServer(const std::vector& Arguments) { beammp_info("BeamMP Server v" + Application::ServerVersionString()); Application::SetSubsystemStatus("Server", Application::Status::Starting); + std::mt19937_64 TimeSyncRandomDevice(std::random_device{}()); + + TimeSyncStart = std::chrono::steady_clock::now() + - std::chrono::duration_cast( + std::chrono::duration(std::uniform_real_distribution(0.0, 2592000.0)(TimeSyncRandomDevice)) + ); Application::SetSubsystemStatus("Server", Application::Status::Good); } @@ -156,13 +162,6 @@ size_t TServer::ClientCount() const { return mClients.size(); } -std::mt19937_64 TimeSyncRandomDevice(std::random_device{}()); - -auto TimeSyncStart = std::chrono::steady_clock::now() - - std::chrono::duration_cast( - std::chrono::duration(std::uniform_real_distribution(0.0, 2592000.0)(TimeSyncRandomDevice)) - ); - void TServer::GlobalParser(const std::weak_ptr& Client, std::vector&& Packet, TPPSMonitor& PPSMonitor, TNetwork& Network, bool udp) { constexpr std::string_view ABG = "ABG:"; if (Packet.size() >= ABG.size() && std::equal(Packet.begin(), Packet.begin() + ABG.size(), ABG.begin(), ABG.end())) { @@ -219,7 +218,7 @@ void TServer::GlobalParser(const std::weak_ptr& Client, std::vector(std::chrono::steady_clock::now() - TimeSyncStart).count(); + auto Time = GetServerTimeMS(); std::vector ServerTime(sizeof(uint64_t)); std::memcpy(ServerTime.data(), &Time, sizeof(uint64_t)); From cd4cc3e6309f1e8eaea45adf936e11c4b8f08a3b Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Fri, 7 Aug 2026 01:33:44 +0200 Subject: [PATCH 3/6] Add servertime lua function --- src/TLuaEngine.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index f92ff3c..21ba656 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -1012,6 +1012,10 @@ TLuaEngine::StateThreadData::StateThreadData(const std::string& Name, TLuaStateI } MPTable.set_function("Get", &LuaAPI::MP::Get); + MPTable.set_function("GetServerTimeMS", [this](const sol::this_state ts) { + return make_object(sol::state_view(ts), this->mEngine->Server().GetServerTimeMS()); + }); + auto UtilTable = StateView.create_named_table("Util"); UtilTable.set_function("LogDebug", [this](sol::variadic_args args) { std::string ToPrint = ""; From b21d4062c6f42031eff2e112cd42960b4d19c96c Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Sat, 8 Aug 2026 13:42:55 +0200 Subject: [PATCH 4/6] Add MP.GetServerTime in seconds --- include/TServer.h | 1 + src/TLuaEngine.cpp | 4 ++++ src/TServer.cpp | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/TServer.h b/include/TServer.h index 3c5be8c..d620dcc 100644 --- a/include/TServer.h +++ b/include/TServer.h @@ -54,6 +54,7 @@ public: io_context& IoCtx() { return mIoCtxPoller.IoCtx(); } uint64_t GetServerTimeMS() const { return std::chrono::duration_cast(std::chrono::steady_clock::now() - TimeSyncStart).count();} + double GetServerTime() const { return std::chrono::duration(std::chrono::steady_clock::now() - TimeSyncStart).count(); } private: std::chrono::time_point TimeSyncStart; TIoPollThread mIoCtxPoller; diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index 21ba656..05d919d 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -1016,6 +1016,10 @@ TLuaEngine::StateThreadData::StateThreadData(const std::string& Name, TLuaStateI return make_object(sol::state_view(ts), this->mEngine->Server().GetServerTimeMS()); }); + MPTable.set_function("GetServerTime", [this] { + return this->mEngine->Server().GetServerTime(); + }); + auto UtilTable = StateView.create_named_table("Util"); UtilTable.set_function("LogDebug", [this](sol::variadic_args args) { std::string ToPrint = ""; diff --git a/src/TServer.cpp b/src/TServer.cpp index ef0e27b..d86f5e0 100644 --- a/src/TServer.cpp +++ b/src/TServer.cpp @@ -127,7 +127,7 @@ TServer::TServer(const std::vector& Arguments) { TimeSyncStart = std::chrono::steady_clock::now() - std::chrono::duration_cast( - std::chrono::duration(std::uniform_real_distribution(0.0, 2592000.0)(TimeSyncRandomDevice)) + std::chrono::duration(std::uniform_real_distribution(0.0, 86400.0)(TimeSyncRandomDevice)) //2592000 ); Application::SetSubsystemStatus("Server", Application::Status::Good); } From b50f82166b0bac51c4d4cea592b91145f96d265c Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Fri, 14 Aug 2026 02:18:25 +0200 Subject: [PATCH 5/6] Increase MP.GetServerTime precision Function will break after 272 years --- src/TLuaEngine.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index 05d919d..027bd45 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -1016,8 +1016,8 @@ TLuaEngine::StateThreadData::StateThreadData(const std::string& Name, TLuaStateI return make_object(sol::state_view(ts), this->mEngine->Server().GetServerTimeMS()); }); - MPTable.set_function("GetServerTime", [this] { - return this->mEngine->Server().GetServerTime(); + MPTable.set_function("GetServerTime", [this](const sol::this_state ts) { + return make_object(sol::state_view(ts), this->mEngine->Server().GetServerTime()); }); auto UtilTable = StateView.create_named_table("Util"); From e7a5050e1ba7a580bb4010b0d78bfe400a0e7ec5 Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Fri, 14 Aug 2026 02:24:23 +0200 Subject: [PATCH 6/6] Change time offset and remove comment --- src/TServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TServer.cpp b/src/TServer.cpp index d86f5e0..ef0e27b 100644 --- a/src/TServer.cpp +++ b/src/TServer.cpp @@ -127,7 +127,7 @@ TServer::TServer(const std::vector& Arguments) { TimeSyncStart = std::chrono::steady_clock::now() - std::chrono::duration_cast( - std::chrono::duration(std::uniform_real_distribution(0.0, 86400.0)(TimeSyncRandomDevice)) //2592000 + std::chrono::duration(std::uniform_real_distribution(0.0, 2592000.0)(TimeSyncRandomDevice)) ); Application::SetSubsystemStatus("Server", Application::Status::Good); }