private Vector3 GetFurthestPathPosition(IndexedList <Vector3> path, float maxDistance, RayType type, bool updatePath) { if (path == null || path.Count == 0) { return(Vector3.Zero); } Vector3 startPosition = Core.Player.Position; Vector3 reachablePosition = startPosition; Vector3 unreachablePosition = path.LastOrDefault(); // Find closest valid path point; for (int i = path.Index; i < path.Count; i++) { var point = path[i]; if (startPosition.Distance(point) > maxDistance || type == RayType.Cast && !CanRayCast(startPosition, point) || type == RayType.Walk && !CanRayWalk(startPosition, point)) { if (updatePath) { path.Index = i; } unreachablePosition = point; break; } reachablePosition = point; } var distance = reachablePosition.Distance(unreachablePosition); const float incrementDistance = 2f; var totalSegments = distance / incrementDistance; // Find closest valid portion of path. for (int i = 0; i < totalSegments; i++) { var point = MathEx.CalculatePointFrom(unreachablePosition, reachablePosition, i * incrementDistance); if (startPosition.Distance(point) > maxDistance || type == RayType.Cast && !CanRayCast(startPosition, point) || type == RayType.Walk && !CanRayWalk(startPosition, point)) { break; } reachablePosition = point; } return(reachablePosition); }