public void GetPathNeighbours(MPPathNode current, int maxX, int maxZ, MPNeigbours neighbours) { ulong[] curSlices = HeightSlicePool.GetSlices(current.SliceHeader); if (curSlices == null) { return; } //get current ceiling, where I can't go across ushort maxH = ushort.MaxValue; if (current.HIdx < curSlices.Length - 1) { ulong higherSlice = curSlices[current.HIdx + 1]; ushort higherf = SliceAccessor.flag(higherSlice); ushort higherheight = SliceAccessor.heightGrade(higherSlice); if ((higherf & SliceAccessor.SliceCeiling) > 0) { maxH = higherheight; } } for (int u = current.BoundaryXMin; u <= current.BoundaryXMax; ++u) { if (u < 0 || u >= maxX) { continue; } if (current.BoundaryZMin >= 0 && current.BoundaryZMin < maxZ) { GetPathNeighbour(current.HeightGrade, maxH, u, current.BoundaryZMin, neighbours); } if (current.BoundaryZMax >= 0 && current.BoundaryZMax < maxZ) { GetPathNeighbour(current.HeightGrade, maxH, u, current.BoundaryZMax, neighbours); } } for (int v = current.BoundaryZMin; v <= current.BoundaryZMax; ++v) { if (v < 0 || v >= maxZ) { continue; } if (current.BoundaryXMin >= 0 && current.BoundaryXMin < maxX) { GetPathNeighbour(current.HeightGrade, maxH, current.BoundaryXMin, v, neighbours); } if (current.BoundaryXMax >= 0 && current.BoundaryXMax < maxX) { GetPathNeighbour(current.HeightGrade, maxH, current.BoundaryXMax, v, neighbours); } } }