예제 #1
0
        /// <summary>
        /// Returns a path that prevents collisions with the navmesh, but floats freely otherwise
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="start">Start in GlobalXYZ</param>
        /// <param name="end">End in GlobalXYZ</param>
        /// <returns></returns>
        public async Task <WrappedPathingResult> GetPathStraightAsync(Zone zone, Vector3 start, Vector3 end)
        {
            if (!_navmeshPtrs.ContainsKey(zone.ClientID))
            {
                return new WrappedPathingResult {
                           Error  = PathingError.NoPathFound,
                           Points = null,
                }
            }
            ;
            GSStatistics.Paths.Inc();

            return(await Task.Factory.StartNew(() =>
            {
                var ptrs = _navmeshPtrs[zone.ClientID];
                var startFloats = (start + Vector3.zAxis * 8).ToRecastFloats();
                var endFloats = (end + Vector3.zAxis * 8).ToRecastFloats();

                var numNodes = 0;
                var buffer = new float[MAX_POLY * 3];
                var flags = new dtPolyFlags[MAX_POLY];
                dtPolyFlags includeFilter = dtPolyFlags.ALL ^ dtPolyFlags.DISABLED;
                dtPolyFlags excludeFilter = 0;
                float polyExtX = 64.0f;
                float polyExtY = 64.0f;
                float polyExtZ = 256.0f;
                dtStraightPathOptions options = dtStraightPathOptions.DT_STRAIGHTPATH_ALL_CROSSINGS;
                var filter = new[] { includeFilter, excludeFilter };
                var status = PathStraight(ptrs[1], startFloats, endFloats,
                                          new Vector3(polyExtX, polyExtY, polyExtZ).ToRecastFloats(), filter, options, ref numNodes, buffer, flags);
                if ((status & dtStatus.DT_SUCCESS) == 0)
                {
                    return new WrappedPathingResult
                    {
                        Error = PathingError.NoPathFound,
                        Points = null,
                    };
                }

                var points = new WrappedPathPoint[numNodes];
                var positions = Vector3ArrayFromRecastFloats(buffer, numNodes);

                for (var i = 0; i < numNodes; i++)
                {
                    points[i].Position = positions[i];
                    points[i].Flags = flags[i];
                }

                ImprovePath(zone, points);

                if ((status & dtStatus.DT_PARTIAL_RESULT) == 0)
                {
                    return new WrappedPathingResult
                    {
                        Error = PathingError.PathFound,
                        Points = points,
                    };
                }
                else
                {
                    return new WrappedPathingResult
                    {
                        Error = PathingError.PartialPathFound,
                        Points = points,
                    };
                }
            }, TaskCreationOptions.LongRunning));
        }
예제 #2
0
 private static extern dtStatus PathStraight(IntPtr queryPtr, float[] start, float[] end, float[] polyPickExt, dtPolyFlags[] queryFilter, dtStraightPathOptions pathOptions, ref int pointCount, float[] pointBuffer, dtPolyFlags[] pointFlags);
예제 #3
0
        /// <summary>
        /// Returns a path that prevents collisions with the navmesh, but floats freely otherwise
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="start">Start in GlobalXYZ</param>
        /// <param name="end">End in GlobalXYZ</param>
        /// <returns></returns>
        public static PathPoint[] GetPathStraight(Zone2 zone, Vector3 start, Vector3 end, dtPolyFlags includeFilter = dtPolyFlags.ALL ^ dtPolyFlags.DISABLED, dtPolyFlags excludeFilter = 0, float polyExtX = 64.0f, float polyExtY = 64.0f, float polyExtZ = 256.0f, dtStraightPathOptions options = dtStraightPathOptions.DT_STRAIGHTPATH_ALL_CROSSINGS)
        {
            if (!_loadedZones.ContainsKey(zone.ID))
            {
                return(null);
            }

            var ptrs        = _loadedZones[zone.ID];
            var startFloats = (start + zAxis * 8).ToRecastFloats();
            var endFloats   = (end + zAxis * 8).ToRecastFloats();

            var numNodes = 0;
            var buffer   = new float[MAX_POLY * 3];
            var flags    = new dtPolyFlags[MAX_POLY];
            var filter   = new[] { includeFilter, excludeFilter };

            PathStraight(ptrs.queryPtr, startFloats, endFloats, new Vector3(polyExtX, polyExtY, polyExtZ).ToRecastFloats(), filter, options, ref numNodes, buffer, flags);

            var points    = new PathPoint[numNodes];
            var positions = Vector3ArrayFromRecastFloats(buffer, numNodes);

            for (var i = 0; i < numNodes; i++)
            {
                points[i].Position = positions[i];
                points[i].Flags    = flags[i];
            }

            return(points);
        }