Core/Movement: Implemented movement forces

Port From (https://github.com/TrinityCore/TrinityCore/commit/8e98ceb2936842ea0032cbfdc04a510d6b1e5de0)
This commit is contained in:
hondacrx
2019-09-08 12:48:10 -04:00
parent 981e1e04c1
commit 5b67e2f539
9 changed files with 458 additions and 62 deletions
+86
View File
@@ -620,6 +620,92 @@ namespace Game
GetPlayer().ValidateMovementInfo(packet.Data.Status);
}
[WorldPacketHandler(ClientOpcodes.MoveApplyMovementForceAck, Processing = PacketProcessing.ThreadSafe)]
void HandleMoveApplyMovementForceAck(MoveApplyMovementForceAck moveApplyMovementForceAck)
{
Unit mover = _player.m_unitMovedByMe;
Cypher.Assert(mover != null);
_player.ValidateMovementInfo(moveApplyMovementForceAck.Ack.Status);
// prevent tampered movement data
if (moveApplyMovementForceAck.Ack.Status.Guid != mover.GetGUID())
{
Log.outError(LogFilter.Network, $"HandleMoveApplyMovementForceAck: guid error, expected {mover.GetGUID().ToString()}, got {moveApplyMovementForceAck.Ack.Status.Guid.ToString()}");
return;
}
moveApplyMovementForceAck.Ack.Status.Time += m_clientTimeDelay;
MoveUpdateApplyMovementForce updateApplyMovementForce = new MoveUpdateApplyMovementForce();
updateApplyMovementForce.Status = moveApplyMovementForceAck.Ack.Status;
updateApplyMovementForce.Force = moveApplyMovementForceAck.Force;
mover.SendMessageToSet(updateApplyMovementForce, false);
}
[WorldPacketHandler(ClientOpcodes.MoveRemoveMovementForceAck, Processing = PacketProcessing.ThreadSafe)]
void HandleMoveRemoveMovementForceAck(MoveRemoveMovementForceAck moveRemoveMovementForceAck)
{
Unit mover = _player.m_unitMovedByMe;
Cypher.Assert(mover != null);
_player.ValidateMovementInfo(moveRemoveMovementForceAck.Ack.Status);
// prevent tampered movement data
if (moveRemoveMovementForceAck.Ack.Status.Guid != mover.GetGUID())
{
Log.outError(LogFilter.Network, $"HandleMoveRemoveMovementForceAck: guid error, expected {mover.GetGUID().ToString()}, got {moveRemoveMovementForceAck.Ack.Status.Guid.ToString()}");
return;
}
moveRemoveMovementForceAck.Ack.Status.Time += m_clientTimeDelay;
MoveUpdateRemoveMovementForce updateRemoveMovementForce = new MoveUpdateRemoveMovementForce();
updateRemoveMovementForce.Status = moveRemoveMovementForceAck.Ack.Status;
updateRemoveMovementForce.TriggerGUID = moveRemoveMovementForceAck.ID;
mover.SendMessageToSet(updateRemoveMovementForce, false);
}
[WorldPacketHandler(ClientOpcodes.MoveSetModMovementForceMagnitudeAck, Processing = PacketProcessing.ThreadSafe)]
void HandleMoveSetModMovementForceMagnitudeAck(MovementSpeedAck setModMovementForceMagnitudeAck)
{
Unit mover = _player.m_unitMovedByMe;
Cypher.Assert(mover != null); // there must always be a mover
_player.ValidateMovementInfo(setModMovementForceMagnitudeAck.Ack.Status);
// prevent tampered movement data
if (setModMovementForceMagnitudeAck.Ack.Status.Guid != mover.GetGUID())
{
Log.outError(LogFilter.Network, "HandleSetModMovementForceMagnitudeAck: guid error, expected {mover.GetGUID().ToString()}, got {setModMovementForceMagnitudeAck.Ack.Status.guid.ToString()}");
return;
}
// skip all except last
if (_player.m_movementForceModMagnitudeChanges > 0)
{
--_player.m_movementForceModMagnitudeChanges;
if (_player.m_movementForceModMagnitudeChanges == 0)
{
float expectedModMagnitude = 1.0f;
MovementForces movementForces = mover.GetMovementForces();
if (movementForces != null)
expectedModMagnitude = movementForces.GetModMagnitude();
if (Math.Abs(expectedModMagnitude - setModMovementForceMagnitudeAck.Speed) > 0.01f)
{
Log.outDebug(LogFilter.Misc, $"Player {_player.GetName()} from account id {_player.GetSession().GetAccountId()} kicked for incorrect movement force magnitude (must be {expectedModMagnitude} instead {setModMovementForceMagnitudeAck.Speed})");
_player.GetSession().KickPlayer();
return;
}
}
}
setModMovementForceMagnitudeAck.Ack.Status.Time += m_clientTimeDelay;
MoveUpdateSpeed updateModMovementForceMagnitude = new MoveUpdateSpeed(ServerOpcodes.MoveUpdateModMovementForceMagnitude);
updateModMovementForceMagnitude.Status = setModMovementForceMagnitudeAck.Ack.Status;
updateModMovementForceMagnitude.Speed = setModMovementForceMagnitudeAck.Speed;
mover.SendMessageToSet(updateModMovementForceMagnitude, false);
}
[WorldPacketHandler(ClientOpcodes.MoveTimeSkipped, Processing = PacketProcessing.Inplace)]
void HandleMoveTimeSkipped(MoveTimeSkipped moveTimeSkipped)
{