diff --git a/include/Client.h b/include/Client.h index 6f29bd57..d846022d 100644 --- a/include/Client.h +++ b/include/Client.h @@ -85,10 +85,12 @@ class TClient final { [[nodiscard]] std::string GetName() const { return mName; } void SetUnicycleID(int ID) { mUnicycleID = ID; } void SetID(int ID) { mID = ID; } + void SetSelfPing(uint16_t ping ) { mSelfPing = ping; } [[nodiscard]] int GetOpenCarID() const; [[nodiscard]] int GetCarCount() const; void ClearCars(); [[nodiscard]] int GetID() const { return mID; } + [[nodiscard]] uint16_t GetSelfPing() const { return mSelfPing; } [[nodiscard]] int GetUnicycleID() const { return mUnicycleID; } [[nodiscard]] bool IsUDPConnected() const { return mIsUDPConnected; } [[nodiscard]] bool IsSynced() const { return mIsSynced; } @@ -139,6 +141,7 @@ class TClient final { std::string mRole; std::string mDID; int mID = -1; + uint16_t mSelfPing = 0; std::chrono::time_point mLastPingTime = std::chrono::high_resolution_clock::now(); std::vector mMagic; }; diff --git a/src/TNetwork.cpp b/src/TNetwork.cpp index 3cf8b75c..fc8b66bf 100644 --- a/src/TNetwork.cpp +++ b/src/TNetwork.cpp @@ -819,6 +819,39 @@ void TNetwork::UpdatePlayer(TClient& Client) { }); Packet = Packet.substr(0, Packet.length() - 1); Client.EnqueuePacket(StringToVector(Packet)); + + std::vector PingsPacket = StringToVector("Sp"); + + PingsPacket.push_back(0); + + uint8_t amount = 0; + + mServer.ForEachClient([&](const std::weak_ptr& ClientPtr) -> bool { + if (amount == UINT8_MAX) { + beammp_debugf("Client ping packet overflow"); + return false; + } + ReadLock Lock(mServer.GetClientMutex()); + if (const auto c = ClientPtr.lock()) { + int ID = c->GetID(); + if (ID < 0 || ID > UINT8_MAX) { + beammp_debugf("Invalid ID found: {}", ID); + return true; + } + PingsPacket.push_back(static_cast(ID)); + const uint16_t ping = c->GetSelfPing(); + + PingsPacket.push_back(static_cast(ping)); + PingsPacket.push_back(static_cast(ping >> 8)); + + amount++; + } + return true; + }); + + PingsPacket[2] = amount; + + Client.EnqueuePacket(PingsPacket); //(void)Respond(Client, Packet, true); } diff --git a/src/TServer.cpp b/src/TServer.cpp index ef0e27b2..8ed82fa5 100644 --- a/src/TServer.cpp +++ b/src/TServer.cpp @@ -217,12 +217,18 @@ void TServer::GlobalParser(const std::weak_ptr& Client, std::vector ServerTime(sizeof(uint64_t)); std::memcpy(ServerTime.data(), &Time, sizeof(uint64_t)); + uint16_t selfPing = 0; + std::memcpy(&selfPing, &Packet[Packet.size() - 2], sizeof(uint16_t)); + + LockedClient->SetSelfPing(selfPing); + + Packet.erase(Packet.end() - 2,Packet.end()); auto Data = Packet; beammp_debugf("Sending server time {} to client '{}' ({}), client time: {}", Time, LockedClient->GetName(), LockedClient->GetID(), reinterpret_cast(Data.data()));