/// <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); } } } }
/// <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); } } } }
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); } } } }