public static async Task <bool> MoveToPointWithinNoMount( this Vector3 destination, float radius, string name = null) { var sprintDistance = Math.Min(20.0f, CharacterSettings.Instance.MountDistance); var moveResult = MoveResult.GeneratingPath; if (!MovementManager.IsFlying && !MovementManager.IsDiving) { destination = destination.AddRandomDirection2D(10.0f); } while (Behaviors.ShouldContinue && !moveResult.IsDoneMoving()) { moveResult = Navigator.MoveTo(new MoveToParameters(destination)); await Coroutine.Yield(); var distance = Core.Player.Location.Distance3D(destination); if (distance > sprintDistance) { await Sprint(); } } Navigator.Stop(); return(true); }
public MoveResult MoveToRandomSpotWithin(Vector3 location, float radius, string destination = null) { if (generatingPath) { return(MoveResult.GeneratingPath); } if (!playerMover.CanFly || (!MovementManager.IsFlying && !playerMover.ShouldFlyTo(location))) { return(innerNavigator.MoveTo(location, destination)); } var currentLocation = GameObjectManager.LocalPlayer.Location; if (location.DistanceSqr(currentLocation) > PathPrecisionSqr) { if (ShouldGeneratePath(location, radius)) { generatingPath = true; origin = currentLocation; requestedDestination = location; finalDestination = location.AddRandomDirection2D(radius); pathGeneratorStopwatch.Restart(); logger.Info("Generating path on {0} from {1} to {2}", WorldManager.ZoneId, origin, finalDestination); GeneratePath(origin, finalDestination).ContinueWith(HandlePathGenerationResult); return(MoveResult.GeneratingPath); } if (CurrentPath.Count == 0) { return(MoveResult.ReachedDestination); } return(MoveToNextHop(destination)); } logger.Info("Navigation reached current destination. Within {0}", currentLocation.Distance(location)); requestedDestination = Vector3.Zero; playerMover.MoveStop(); CurrentPath.Reset(); return(MoveResult.Done); }