Beispiel #1
0
        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;
            }
        }