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()}, got {setModMovementForceMagnitudeAck.Ack.Status.Guid}"); 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); }