diff --git a/Source/Game/Handlers/MovementHandler.cs b/Source/Game/Handlers/MovementHandler.cs index 9ee76776f..d9d16d7b4 100644 --- a/Source/Game/Handlers/MovementHandler.cs +++ b/Source/Game/Handlers/MovementHandler.cs @@ -694,6 +694,26 @@ namespace Game [WorldPacketHandler(ClientOpcodes.MoveTimeSkipped, Processing = PacketProcessing.Inplace)] void HandleMoveTimeSkipped(MoveTimeSkipped moveTimeSkipped) { + Unit mover = GetPlayer().m_unitMovedByMe; + if (mover == null) + { + Log.outWarn(LogFilter.Player, $"WorldSession.HandleMoveTimeSkipped wrong mover state from the unit moved by {GetPlayer().GetGUID()}"); + return; + } + + // prevent tampered movement data + if (moveTimeSkipped.MoverGUID != mover.GetGUID()) + { + Log.outWarn(LogFilter.Player, $"WorldSession.HandleMoveTimeSkipped wrong guid from the unit moved by {GetPlayer().GetGUID()}"); + return; + } + + mover.m_movementInfo.Time += moveTimeSkipped.TimeSkipped; + + MoveSkipTime moveSkipTime = new(); + moveSkipTime.MoverGUID = moveTimeSkipped.MoverGUID; + moveSkipTime.TimeSkipped = moveTimeSkipped.TimeSkipped; + mover.SendMessageToSet(moveSkipTime, _player); } [WorldPacketHandler(ClientOpcodes.MoveSplineDone, Processing = PacketProcessing.ThreadSafe)] diff --git a/Source/Game/Networking/Packets/MovementPackets.cs b/Source/Game/Networking/Packets/MovementPackets.cs index 2bb04a047..8249fcf02 100644 --- a/Source/Game/Networking/Packets/MovementPackets.cs +++ b/Source/Game/Networking/Packets/MovementPackets.cs @@ -982,6 +982,20 @@ namespace Game.Networking.Packets public uint TimeSkipped; } + class MoveSkipTime : ServerPacket + { + public MoveSkipTime() : base(ServerOpcodes.MoveSkipTime, ConnectionType.Instance) { } + + public override void Write() + { + _worldPacket.WritePackedGuid(MoverGUID); + _worldPacket.WriteUInt32(TimeSkipped); + } + + public ObjectGuid MoverGUID; + public uint TimeSkipped; + } + class SummonResponse : ClientPacket { public SummonResponse(WorldPacket packet) : base(packet) { }