mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-17 21:50:50 -04:00
Core/Packets: Added CMSG_TIME_SYNC_REQ and SMSG_TIME_SYNC_RESP packets
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user