private void UpdateMove(long tick) { if (MovementSpeed == 0 || _unit != null && _unit.IsDisabled || _unit != null && _unit.IsStaggered) { return; } long deltaMs = tick - _moveStartTime; uint newWorldPosX = (uint)Point2D.Lerp(_startWorldPos.X, _destWorldPos.X, GetMoveFactor(deltaMs)); uint newWorldPosY = (uint)Point2D.Lerp(_startWorldPos.Y, _destWorldPos.Y, GetMoveFactor(deltaMs)); Zone_Info destZone = _unit.Region.GetZone((ushort)(newWorldPosX >> 12), (ushort)(newWorldPosY >> 12)); if (destZone == null) { return; } ushort pinX = _unit.Zone.CalculPin(newWorldPosX, true); ushort pinY = _unit.Zone.CalculPin(newWorldPosY, false); ushort pinZ = (ushort)Point2D.Lerp(_startWorldPos.Z, _destWorldPos.Z, GetMoveFactor(deltaMs)); _unit.SetPosition(pinX, pinY, pinZ, _unit.Heading, destZone.ZoneId); if (tick > _moveStartTime + _moveDuration) { if (MoveState == EMoveState.Move) { MoveState = EMoveState.None; } _moveDuration = 0; } }