diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 67cc87f1b16..f447f702928 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -937,49 +937,6 @@ void WorldSession::HandleNextCinematicCamera(WorldPacket& /*recvData*/) GetPlayer()->GetCinematicMgr()->BeginCinematic(); } -void WorldSession::HandleMoveTimeSkippedOpcode(WorldPacket& recvData) -{ - TC_LOG_DEBUG("network", "WORLD: Received CMSG_MOVE_TIME_SKIPPED"); - - ObjectGuid guid; - uint32 time; - recvData >> time; - - guid[5] = recvData.ReadBit(); - guid[1] = recvData.ReadBit(); - guid[3] = recvData.ReadBit(); - guid[7] = recvData.ReadBit(); - guid[6] = recvData.ReadBit(); - guid[0] = recvData.ReadBit(); - guid[4] = recvData.ReadBit(); - guid[2] = recvData.ReadBit(); - - recvData.ReadByteSeq(guid[7]); - recvData.ReadByteSeq(guid[1]); - recvData.ReadByteSeq(guid[2]); - recvData.ReadByteSeq(guid[4]); - recvData.ReadByteSeq(guid[3]); - recvData.ReadByteSeq(guid[6]); - recvData.ReadByteSeq(guid[0]); - recvData.ReadByteSeq(guid[5]); - - //TODO! - - /* - uint64 guid; - uint32 time_skipped; - recvData >> guid; - recvData >> time_skipped; - TC_LOG_DEBUG("network", "WORLD: CMSG_MOVE_TIME_SKIPPED"); - - //// @todo - must be need use in Trinity - We substract server Lags to move time (AntiLags) - for exmaple - GetPlayer()->ModifyLastMoveTime(-int32(time_skipped)); - */ -} - void WorldSession::HandleFeatherFallAck(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: CMSG_MOVE_FEATHER_FALL_ACK"); diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index ae05ab2fc37..076288ae705 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -655,3 +655,52 @@ void WorldSession::HandleSetCollisionHeightAck(WorldPacket& recvPacket) MovementInfo movementInfo; GetPlayer()->ReadMovementInfo(recvPacket, &movementInfo, &extra); } + +void WorldSession::HandleMoveTimeSkippedOpcode(WorldPacket& recvData) +{ + TC_LOG_DEBUG("network", "WORLD: Received CMSG_MOVE_TIME_SKIPPED"); + + ObjectGuid guid; + uint32 time; + recvData >> time; + + guid[5] = recvData.ReadBit(); + guid[1] = recvData.ReadBit(); + guid[3] = recvData.ReadBit(); + guid[7] = recvData.ReadBit(); + guid[6] = recvData.ReadBit(); + guid[0] = recvData.ReadBit(); + guid[4] = recvData.ReadBit(); + guid[2] = recvData.ReadBit(); + + recvData.ReadByteSeq(guid[7]); + recvData.ReadByteSeq(guid[1]); + recvData.ReadByteSeq(guid[2]); + recvData.ReadByteSeq(guid[4]); + recvData.ReadByteSeq(guid[3]); + recvData.ReadByteSeq(guid[6]); + recvData.ReadByteSeq(guid[0]); + recvData.ReadByteSeq(guid[5]); + + Unit* mover = GetPlayer()->m_unitMovedByMe; + + if (!mover) + { + TC_LOG_WARN("entities.player", "WorldSession::HandleMoveTimeSkippedOpcode wrong mover state from the unit moved by the player %s", GetPlayer()->GetGUID().ToString().c_str()); + return; + } + + // prevent tampered movement data + if (guid != mover->GetGUID()) + { + TC_LOG_WARN("entities.player", "WorldSession::HandleMoveTimeSkippedOpcode wrong guid from the unit moved by the player %s", GetPlayer()->GetGUID().ToString().c_str()); + return; + } + + mover->m_movementInfo.time += time; + + WorldPacket data(MSG_MOVE_TIME_SKIPPED, recvData.size()); + data << guid.WriteAsPacked(); + data << time; + GetPlayer()->SendMessageToSet(&data, false); +} diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 51e1b75fe81..72bb0ca0131 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -609,7 +609,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck ); DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(MSG_MOVE_TIME_SKIPPED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(MSG_MOVE_TIME_SKIPPED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(MSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode ); DEFINE_OPCODE_HANDLER(MSG_NOTIFY_PARTY_SQUELCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );