コード例 #1
0
        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);
        }