Esempio n. 1
0
        /// <summary>
        /// Main iterator function for movement
        /// </summary>
        public void HandleMoveToPosition()
        {
            //Console.WriteLine("HandleMoveToPosition");

            if (PhysicsObj == null)
            {
                CancelMoveTo(WeenieError.NoPhysicsObject);
                return;
            }

            var curPos = new Position(PhysicsObj.Position);

            var movementParams = new MovementParameters();

            movementParams.Speed = MovementParams.Speed;
            //movementParams.Speed = 1.0f;    // commented out?
            var flags = (MovementParamFlags)0xFFFF7FFF;

            movementParams.Flags          = movementParams.Flags & flags; // ??
            movementParams.HoldKeyToApply = MovementParams.HoldKeyToApply;

            if (!PhysicsObj.motions_pending())
            {
                var heading = MovementParams.get_desired_heading(CurrentCommand, MovingAway) + curPos.heading(CurrentTargetPosition);
                if (heading >= 360.0f)
                {
                    heading -= 360.0f;
                }

                var diff = heading - PhysicsObj.get_heading();

                if (Math.Abs(diff) < PhysicsGlobals.EPSILON)
                {
                    diff = 0.0f;
                }
                if (diff < -PhysicsGlobals.EPSILON)
                {
                    diff += 360.0f;
                }

                if (diff > 20.0f && diff < 340.0f)
                {
                    uint motionID = diff >= 180.0f ? (uint)MotionCommand.TurnLeft : (uint)MotionCommand.TurnRight;
                    if (motionID != AuxCommand)
                    {
                        _DoMotion(motionID, movementParams);
                        AuxCommand = motionID;
                    }
                }
                else
                {
                    stop_aux_command(movementParams);
                }
            }
            else
            {
                stop_aux_command(movementParams);
            }

            var dist = GetCurrentDistance();

            if (!CheckProgressMade(dist))
            {
                if (!PhysicsObj.IsInterpolating() && !PhysicsObj.motions_pending())
                {
                    FailProgressCount++;
                }
            }
            else
            {
                FailProgressCount = 0;
                if (MovingAway && dist >= MovementParams.MinDistance || !MovingAway && dist <= MovementParams.DistanceToObject)
                {
                    PendingActions.RemoveAt(0);
                    _StopMotion(CurrentCommand, movementParams);

                    CurrentCommand = 0;
                    stop_aux_command(movementParams);

                    BeginNextNode();
                }
                else
                {
                    if (StartingPosition.Distance(PhysicsObj.Position) > MovementParams.FailDistance)
                    {
                        CancelMoveTo(WeenieError.YouChargedTooFar);
                    }
                }
            }

            if (TopLevelObjectID != 0 && MovementType != MovementType.Invalid)
            {
                var velocity       = PhysicsObj.get_velocity();
                var velocityLength = velocity.Length();
                if (velocityLength > 0.1f)
                {
                    var time = dist / velocityLength;
                    if (Math.Abs(time - PhysicsObj.get_target_quantum()) > 1.0f)
                    {
                        PhysicsObj.set_target_quantum(time);
                    }
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Main iterator function for movement
        /// </summary>
        public void HandleMoveToPosition()
        {
            //Console.WriteLine("HandleMoveToPosition");

            if (PhysicsObj == null)
            {
                CancelMoveTo(WeenieError.NoPhysicsObject);
                return;
            }

            var curPos = new Position(PhysicsObj.Position);

            var movementParams = new MovementParameters();

            movementParams.CancelMoveTo = false;

            movementParams.Speed          = MovementParams.Speed;
            movementParams.HoldKeyToApply = MovementParams.HoldKeyToApply;

            if (!PhysicsObj.IsAnimating)
            {
                var heading = MovementParams.get_desired_heading(CurrentCommand, MovingAway) + curPos.heading(CurrentTargetPosition);
                if (heading >= 360.0f)
                {
                    heading -= 360.0f;
                }

                var diff = heading - PhysicsObj.get_heading();

                if (Math.Abs(diff) < PhysicsGlobals.EPSILON)
                {
                    diff = 0.0f;
                }
                if (diff < -PhysicsGlobals.EPSILON)
                {
                    diff += 360.0f;
                }

                if (diff > 20.0f && diff < 340.0f)
                {
                    uint motionID = diff >= 180.0f ? (uint)MotionCommand.TurnLeft : (uint)MotionCommand.TurnRight;
                    if (motionID != AuxCommand)
                    {
                        _DoMotion(motionID, movementParams);
                        AuxCommand = motionID;
                    }
                }
                else
                {
                    // custom: sync for server ticrate
                    if (AuxCommand != 0)
                    {
                        PhysicsObj.set_heading(heading, true);
                    }

                    stop_aux_command(movementParams);
                }
            }
            else
            {
                stop_aux_command(movementParams);
            }

            var dist = GetCurrentDistance();

            if (!CheckProgressMade(dist))
            {
                if (!PhysicsObj.IsInterpolating() && !PhysicsObj.IsAnimating)
                {
                    FailProgressCount++;
                }
            }
            else
            {
                // custom for low monster update rate
                var inRange = false;

                if (!MovementParams.UseSpheres)
                {
                    if (dist < 1.0f && PreviousDistance < dist)
                    {
                        inRange = true;
                    }

                    PreviousDistance     = dist;
                    PreviousDistanceTime = PhysicsTimer.CurrentTime;
                }

                FailProgressCount = 0;
                if (MovingAway && dist >= MovementParams.MinDistance || !MovingAway && dist <= MovementParams.DistanceToObject || inRange)
                {
                    PendingActions.RemoveAt(0);
                    _StopMotion(CurrentCommand, movementParams);

                    CurrentCommand = 0;
                    stop_aux_command(movementParams);

                    BeginNextNode();
                }
                else
                {
                    if (StartingPosition.Distance(PhysicsObj.Position) > MovementParams.FailDistance)
                    {
                        CancelMoveTo(WeenieError.YouChargedTooFar);
                    }
                }
            }

            if (TopLevelObjectID != 0 && MovementType != MovementType.Invalid)
            {
                var velocity       = PhysicsObj.get_velocity();
                var velocityLength = velocity.Length();
                if (velocityLength > 0.1f)
                {
                    var time = dist / velocityLength;
                    if (Math.Abs(time - PhysicsObj.get_target_quantum()) > 1.0f)
                    {
                        PhysicsObj.set_target_quantum(time);
                    }
                }
            }
        }
Esempio n. 3
0
        public void HandleMoveToPosition()
        {
            if (PhysicsObj == null)
            {
                CancelMoveTo(0x8);
                return;
            }
            var curPos = PhysicsObj.Position;

            var movementParams = new MovementParameters();

            movementParams.Speed          = MovementParams.Speed;
            movementParams.Bitfield      &= 0xFFFF7FFF;
            movementParams.HoldKeyToApply = MovementParams.HoldKeyToApply;

            if (!PhysicsObj.motions_pending())
            {
                var heading = MovementParams.get_desired_heading(CurrentCommand, MovingAway) + curPos.heading(CurrentTargetPosition);
                if (heading >= 360.0f)
                {
                    heading -= 360.0f;
                }

                var diff = heading - PhysicsObj.get_heading();

                if (Math.Abs(diff) < PhysicsGlobals.EPSILON)
                {
                    diff = 0.0f;
                }
                if (diff < -PhysicsGlobals.EPSILON)
                {
                    diff += 360.0f;
                }

                if (diff > 20.0f && diff < 340.0f)
                {
                    uint motionID = (uint)(diff >= 180.0f ? 0x6500000E : 0x6500000D);
                    if (motionID != AuxCommand)
                    {
                        _DoMotion(motionID, movementParams);
                        AuxCommand = motionID;
                    }
                }
                else
                {
                    stop_aux_command(movementParams);
                }
            }
            else
            {
                stop_aux_command(movementParams);
            }

            var dist = GetCurrentDistance();

            if (!CheckProgressMade(dist))
            {
                if (!PhysicsObj.IsInterpolating() && !PhysicsObj.motions_pending())
                {
                    FailProgressCount++;
                }
            }
            else
            {
                FailProgressCount = 0;
                if (MovingAway && dist >= MovementParams.MinDistance && MovingAway || !MovingAway && dist <= MovementParams.DistanceToObject)
                {
                    PendingActions.RemoveAt(0);
                    _StopMotion(CurrentCommand, movementParams);

                    CurrentCommand = 0;
                    stop_aux_command(movementParams);

                    BeginNextNode();
                }
                else
                {
                    if (StartingPosition.Distance(PhysicsObj.Position) > MovementParams.FailDistance)
                    {
                        CancelMoveTo(0x3D);
                    }
                }
            }
            if (TopLevelObjectID != 0 && MovementType != MovementType.Invalid)
            {
                var velocity       = PhysicsObj.get_velocity();
                var velocityLength = velocity.Length();
                if (velocityLength > 0.1f)
                {
                    var time = dist / velocityLength;
                    if (Math.Abs(time - PhysicsObj.get_target_quantum()) > 1.0f)
                    {
                        PhysicsObj.set_target_quantum(time);
                    }
                }
            }
        }