diff options
author | Intel <chemicstry@gmail.com> | 2014-11-15 18:21:06 +0200 |
---|---|---|
committer | Intel <chemicstry@gmail.com> | 2014-11-15 18:21:06 +0200 |
commit | eb7f4e79d60205bd037dd459a62b5ff4e1aabb65 (patch) | |
tree | 69f2df5e2a97eeffd6274e818c41eec0872689c2 | |
parent | cd9be923955c57a0ec5054897ac377a964f502ca (diff) |
Core/Packets: Added CMSG_TIME_SYNC_REQ and SMSG_TIME_SYNC_RESP packets
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.cpp | 13 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.h | 21 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 3 |
6 files changed, 48 insertions, 15 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1026681cd81..6eb9716bdc6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -86,6 +86,7 @@ #include "WorldPacket.h" #include "WorldSession.h" #include "WorldStatePackets.h" +#include "MiscPackets.h" #define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS) @@ -26163,9 +26164,9 @@ void Player::SendTimeSync() { m_timeSyncQueue.push(m_movementCounter++); - WorldPacket data(SMSG_TIME_SYNC_REQ, 4); - data << uint32(m_timeSyncQueue.back()); - GetSession()->SendPacket(&data); + WorldPackets::Misc::TimeSyncRequest packet; + packet.SequenceIndex = m_timeSyncQueue.back(); + GetSession()->SendPacket(packet.Write()); // Schedule next sync in 10 sec m_timeSyncTimer = 10000; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index ab906fa956f..e5442773c7f 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1522,24 +1522,21 @@ void WorldSession::HandleSetTitleOpcode(WorldPacket& recvData) GetPlayer()->SetUInt32Value(PLAYER_CHOSEN_TITLE, title); } -void WorldSession::HandleTimeSyncResp(WorldPacket& recvData) +void WorldSession::HandleTimeSyncResp(WorldPackets::Misc::TimeSyncResponse& packet) { TC_LOG_DEBUG("network", "CMSG_TIME_SYNC_RESP"); - uint32 counter, clientTicks; - recvData >> counter >> clientTicks; - - if (counter != _player->m_timeSyncQueue.front()) + if (packet.SequenceIndex != _player->m_timeSyncQueue.front()) TC_LOG_ERROR("network", "Wrong time sync counter from player %s (cheater?)", _player->GetName().c_str()); - TC_LOG_DEBUG("network", "Time sync received: counter %u, client ticks %u, time since last sync %u", counter, clientTicks, clientTicks - _player->m_timeSyncClient); + TC_LOG_DEBUG("network", "Time sync received: counter %u, client ticks %u, time since last sync %u", packet.SequenceIndex, packet.ClientTime, packet.ClientTime - _player->m_timeSyncClient); - uint32 ourTicks = clientTicks + (getMSTime() - _player->m_timeSyncServer); + uint32 ourTicks = packet.ClientTime + (getMSTime() - _player->m_timeSyncServer); // diff should be small - TC_LOG_DEBUG("network", "Our ticks: %u, diff %u, latency %u", ourTicks, ourTicks - clientTicks, GetLatency()); + TC_LOG_DEBUG("network", "Our ticks: %u, diff %u, latency %u", ourTicks, ourTicks - packet.ClientTime, GetLatency()); - _player->m_timeSyncClient = clientTicks; + _player->m_timeSyncClient = packet.ClientTime; _player->m_timeSyncQueue.pop(); } diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 66128354884..800e9621c09 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -21,3 +21,16 @@ void WorldPackets::Misc::ViolenceLevel::Read() { _worldPacket >> ViolenceLvl; } + +WorldPacket const* WorldPackets::Misc::TimeSyncRequest::Write() +{ + _worldPacket << SequenceIndex; + + return &_worldPacket; +} + +void WorldPackets::Misc::TimeSyncResponse::Read() +{ + _worldPacket >> SequenceIndex; + _worldPacket >> ClientTime; +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 8b78074090f..dc64985dcda 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -33,6 +33,27 @@ namespace WorldPackets int8 ViolenceLvl = -1; ///< 0 - no combat effects, 1 - display some combat effects, 2 - blood, 3 - bloody, 4 - bloodier, 5 - bloodiest }; + + class TimeSyncRequest final : public ServerPacket + { + public: + TimeSyncRequest() : ServerPacket(SMSG_TIME_SYNC_REQ, 4) { } + + WorldPacket const* Write() override; + + uint32 SequenceIndex = 0; + }; + + class TimeSyncResponse final : public ClientPacket + { + public: + TimeSyncResponse(WorldPacket&& packet) : ClientPacket(CMSG_TIME_SYNC_RESP, std::move(packet)) { } + + void Read() override; + + uint32 ClientTime = 0; // Client ticks in ms + uint32 SequenceIndex = 0; // Same index as in request + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 89b130c61f4..df40b4c83fb 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -620,7 +620,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_TELEPORT_TO_UNIT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TEXT_EMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTextEmoteOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_ADJUSTMENT_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_SYNC_RESP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleTimeSyncResp ); + DEFINE_HANDLER(CMSG_TIME_SYNC_RESP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::TimeSyncResponse, &WorldSession::HandleTimeSyncResp); DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_SYNC_RESP_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TOGGLE_PVP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTogglePvP ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TOTEM_DESTROYED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTotemDestroyed ); @@ -1351,7 +1351,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_REMOVE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_ADJUSTMENT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_SYNC_REQ, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_SYNC_REQ, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_EARNED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOGGLE_XP_GAIN, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_CREATED, STATUS_UNHANDLED); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 2db482e220c..37cfc414702 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -109,6 +109,7 @@ namespace WorldPackets namespace Misc { class ViolenceLevel; + class TimeSyncResponse; } namespace Query @@ -900,7 +901,7 @@ class WorldSession void HandleMoveSetCanFlyAckOpcode(WorldPacket& recvData); void HandleSetTitleOpcode(WorldPacket& recvData); void HandleRealmSplitOpcode(WorldPacket& recvData); - void HandleTimeSyncResp(WorldPacket& recvData); + void HandleTimeSyncResp(WorldPackets::Misc::TimeSyncResponse& packet); void HandleWhoisOpcode(WorldPacket& recvData); void HandleResetInstancesOpcode(WorldPacket& recvData); void HandleHearthAndResurrect(WorldPacket& recvData); |