From 13ea0a98de2e51ddd4d062f1f4a0cafc95a818d5 Mon Sep 17 00:00:00 2001 From: Edmond Mondor Date: Mon, 18 Sep 2023 09:41:33 -0700 Subject: [PATCH] Don't trust the local machine's system time. Co-authored-by: Adam Johnson --- .../plNetClient/plNetCliAgeJoiner.cpp | 2 +- .../PubUtilLib/plNetClient/plNetClientMgr.cpp | 49 +++++++------------ .../PubUtilLib/plNetClient/plNetClientMgr.h | 5 +- 3 files changed, 20 insertions(+), 36 deletions(-) diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.cpp b/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.cpp index 6581052d..62c26dfd 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.cpp +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.cpp @@ -211,7 +211,7 @@ void plNCAgeJoiner::Start () { plNetClientMgr * nc = plNetClientMgr::GetInstance(); nc->SetFlagsBit(plNetClientMgr::kPlayingGame, false); - nc->fServerTimeOffset = 0; // reset since we're connecting to a new server + nc->ResetServerTimeOffset(); nc->fRequiredNumInitialSDLStates = 0; nc->fNumInitialSDLStates = 0; nc->SetFlagsBit(plNetClientApp::kNeedInitialAgeStateCount); diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.cpp b/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.cpp index dc5d4e12..6ef1dede 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.cpp +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.cpp @@ -133,9 +133,7 @@ plNetClientMgr::plNetClientMgr() : // fProgressBar( nil ), fTaskProgBar( nil ), fMsgRecorder(nil), - fServerTimeOffset(0), - fTimeSamples(0), - fLastTimeUpdate(0), + fLastLocalTime(), fListenListMode(kListenList_Distance), fAgeSDLObjectKey(nil), fExperimentalLevel(0), @@ -480,34 +478,23 @@ void plNetClientMgr::StartLinkInFX() // void plNetClientMgr::UpdateServerTimeOffset(plNetMessage* msg) { - if ((hsTimer::GetSysSeconds() - fLastTimeUpdate) > 5) - { - fLastTimeUpdate = hsTimer::GetSysSeconds(); - - const plUnifiedTime& msgSentUT = msg->GetTimeSent(); - if (!msgSentUT.AtEpoch()) - { - double diff = plUnifiedTime::GetTimeDifference(msgSentUT, plClientUnifiedTime::GetCurrentTime()); + if (!msg->GetHasTimeSent()) + return; + if (msg->GetTimeSent().AtEpoch()) + return; - if (fServerTimeOffset == 0) - { - fServerTimeOffset = diff; - } - else - { - fServerTimeOffset = fServerTimeOffset + ((diff - fServerTimeOffset) / ++fTimeSamples); - } + double localTime = hsTimer::GetSeconds(); + if (localTime - fLastLocalTime < 1.0) + return; - DebugMsg("Setting server time offset to %f", fServerTimeOffset); - } - } + fLastServerTime = msg->GetTimeSent(); + fLastLocalTime = localTime; } void plNetClientMgr::ResetServerTimeOffset() { - fServerTimeOffset = 0; - fTimeSamples = 0; - fLastTimeUpdate = 0; + fLastServerTime.ToEpoch(); + fLastLocalTime = 0.0; } // @@ -515,14 +502,12 @@ void plNetClientMgr::ResetServerTimeOffset() // plUnifiedTime plNetClientMgr::GetServerTime() const { - if ( fServerTimeOffset==0 ) // offline mode or before connecting/calibrating to a server + if (fLastServerTime.AtEpoch()) { + WarningMsg("Someone asked for the server time, but we don't know it yet!"); return plUnifiedTime::GetCurrentTime(); - - plUnifiedTime serverUT; - if (fServerTimeOffset<0) - return plUnifiedTime::GetCurrentTime() - plUnifiedTime(fabs(fServerTimeOffset)); - else - return plUnifiedTime::GetCurrentTime() + plUnifiedTime(fServerTimeOffset); + } + + return fLastServerTime + plUnifiedTime(hsTimer::GetSeconds() - fLastLocalTime); } // diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.h b/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.h index 8fe246b5..a94f4f25 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.h +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.h @@ -166,9 +166,8 @@ private: std::string fSPDesiredPlayerName; // SP: the player we want to load from vault. // server info - double fServerTimeOffset; // diff between our unified time and server's unified time - UInt32 fTimeSamples; - double fLastTimeUpdate; + plUnifiedTime fLastServerTime; // Last received time update from the server + double fLastLocalTime; // Last monotonic time (in seconds) when the above update was received UInt8 fJoinOrder; // returned by the server