diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 3 |
3 files changed, 8 insertions, 5 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c748fd02c0e..806760494ea 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -26481,7 +26481,6 @@ void Player::ActivateSpec(uint8 spec) void Player::ResetTimeSync() { - m_timeSyncCounter = 0; m_timeSyncTimer = 0; m_timeSyncClient = 0; m_timeSyncServer = getMSTime(); @@ -26489,15 +26488,18 @@ void Player::ResetTimeSync() void Player::SendTimeSync() { - m_timeSyncCounter = m_movementCounter; + m_timeSyncQueue.push(m_movementCounter++); WorldPacket data(SMSG_TIME_SYNC_REQ, 4); - data << uint32(m_movementCounter++); + data << uint32(m_timeSyncQueue.back()); GetSession()->SendPacket(&data); // Schedule next sync in 10 sec m_timeSyncTimer = 10000; m_timeSyncServer = getMSTime(); + + if (m_timeSyncQueue.size() > 3) + TC_LOG_ERROR(LOG_FILTER_NETWORKIO, "Not received CMSG_TIME_SYNC_RESP for over 30 seconds from player %u (%s), possible cheater", GetGUIDLow(), GetName().c_str()); } void Player::SetReputation(uint32 factionentry, uint32 value) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index cbaf2701332..49cd037bd46 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2862,7 +2862,7 @@ class Player : public Unit, public GridObject<Player> uint32 m_ChampioningFaction; - uint32 m_timeSyncCounter; + std::queue<uint32> m_timeSyncQueue; uint32 m_timeSyncTimer; uint32 m_timeSyncClient; uint32 m_timeSyncServer; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 62227e14b5a..6b3959a7df3 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1488,7 +1488,7 @@ void WorldSession::HandleTimeSyncResp(WorldPacket& recvData) uint32 counter, clientTicks; recvData >> counter >> clientTicks; - if (counter != _player->m_timeSyncCounter) + if (counter != _player->m_timeSyncQueue.front()) TC_LOG_ERROR(LOG_FILTER_NETWORKIO, "Wrong time sync counter from player %s (cheater?)", _player->GetName().c_str()); TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "Time sync received: counter %u, client ticks %u, time since last sync %u", counter, clientTicks, clientTicks - _player->m_timeSyncClient); @@ -1499,6 +1499,7 @@ void WorldSession::HandleTimeSyncResp(WorldPacket& recvData) TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "Our ticks: %u, diff %u, latency %u", ourTicks, ourTicks - clientTicks, GetLatency()); _player->m_timeSyncClient = clientTicks; + _player->m_timeSyncQueue.pop(); } void WorldSession::HandleResetInstancesOpcode(WorldPacket& /*recvData*/) |