diff options
author | Chaouki Dhib <chaodhib@gmail.com> | 2019-02-02 21:15:19 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-11-23 21:18:07 +0100 |
commit | 4507a02ada7ff2b30d1e82d4a111fc7143fd0823 (patch) | |
tree | 775e1674aff4ef0cf872806548e5c59ee885c9c1 /src | |
parent | e475cac63134be27d0902cb0d3efd869217bb464 (diff) |
Core/Movement: Implement move time skipped handler (#22994)
* Implement CMSG_MOVE_TIME_SKIPPED handler and move it to MovementHandler.cpp
* Add better error handling
* Update MovementHandler.cpp
(cherry picked from commit f9ed72e351ecdafe77da2036d9fd68e46da2f3ab)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 28 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.h | 11 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 |
4 files changed, 44 insertions, 5 deletions
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index fafbb4d751e..7273b896c97 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -651,10 +651,6 @@ void WorldSession::HandleMoveSetModMovementForceMagnitudeAck(WorldPackets::Movem mover->SendMessageToSet(updateModMovementForceMagnitude.Write(), false); } -void WorldSession::HandleMoveTimeSkippedOpcode(WorldPackets::Movement::MoveTimeSkipped& /*moveTimeSkipped*/) -{ -} - void WorldSession::HandleMoveSplineDoneOpcode(WorldPackets::Movement::MoveSplineDone& moveSplineDone) { MovementInfo movementInfo = moveSplineDone.Status; @@ -696,3 +692,27 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPackets::Movement::MoveSpline if (GetPlayer()->pvpInfo.IsHostile) GetPlayer()->CastSpell(GetPlayer(), 2479, true); } + +void WorldSession::HandleMoveTimeSkippedOpcode(WorldPackets::Movement::MoveTimeSkipped& moveTimeSkipped) +{ + Unit* mover = GetPlayer()->m_unitMovedByMe; + if (!mover) + { + TC_LOG_WARN("entities.player", "WorldSession::HandleMoveTimeSkippedOpcode wrong mover state from the unit moved by %s", GetPlayer()->GetGUID().ToString().c_str()); + return; + } + + // prevent tampered movement data + if (moveTimeSkipped.MoverGUID != mover->GetGUID()) + { + TC_LOG_WARN("entities.player", "WorldSession::HandleMoveTimeSkippedOpcode wrong guid from the unit moved by %s", GetPlayer()->GetGUID().ToString().c_str()); + return; + } + + mover->m_movementInfo.time += moveTimeSkipped.TimeSkipped; + + WorldPackets::Movement::MoveSkipTime moveSkipTime; + moveSkipTime.MoverGUID = moveTimeSkipped.MoverGUID; + moveSkipTime.TimeSkipped = moveTimeSkipped.TimeSkipped; + mover->SendMessageToSet(moveSkipTime.Write(), _player); +} diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 52460632213..e89e2953d29 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -918,6 +918,14 @@ void WorldPackets::Movement::MoveTimeSkipped::Read() _worldPacket >> TimeSkipped; } +WorldPacket const* WorldPackets::Movement::MoveSkipTime::Write() +{ + _worldPacket << MoverGUID; + _worldPacket << TimeSkipped; + + return &_worldPacket; +} + void WorldPackets::Movement::SummonResponse::Read() { _worldPacket >> SummonerGUID; diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index c2d2fdade6c..18936d9773a 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -546,6 +546,17 @@ namespace WorldPackets uint32 TimeSkipped = 0; }; + class MoveSkipTime final : public ServerPacket + { + public: + MoveSkipTime() : ServerPacket(SMSG_MOVE_SKIP_TIME, 16 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + uint32 TimeSkipped = 0; + }; + class SummonResponse final : public ClientPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ebc5440fc07..43fb5bbbf01 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1578,7 +1578,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_VEHICLE_REC_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WALK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WATER_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SKIP_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SKIP_TIME, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_DISABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_DISABLE_GRAVITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_ENABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); |