/// <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)); }
private static extern dtStatus PathStraight(IntPtr queryPtr, float[] start, float[] end, float[] polyPickExt, dtPolyFlags[] queryFilter, dtStraightPathOptions pathOptions, ref int pointCount, float[] pointBuffer, dtPolyFlags[] pointFlags);
/// <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); }