aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChaouki Dhib <chaodhib@gmail.com>2019-02-02 21:15:19 +0100
committerShauren <shauren.trinity@gmail.com>2021-11-23 21:18:07 +0100
commit4507a02ada7ff2b30d1e82d4a111fc7143fd0823 (patch)
tree775e1674aff4ef0cf872806548e5c59ee885c9c1 /src
parente475cac63134be27d0902cb0d3efd869217bb464 (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.cpp28
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp8
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h11
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
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);