public bool FindPath(int startX, int startY, MapPos finalPos, OnPathCallback callback) { return(FindPath(startX, startY, new List <MapPos>() { finalPos }, callback)); }
public bool FindPath(int startX, int startY, List <MapPos> finalPositions, OnPathCallback callback) { var width = widthMax; var height = heightMax; var start = GetClosestValidPos(startX, startY); startX = start.x; startY = start.y; var paths = new List <PathRoute>(); foreach (var finalPos in finalPositions) { if (startX < 0 || startY < 0 || finalPos.x < 0 || finalPos.y < 0 || startX >= width || finalPos.x >= width || startY >= height || finalPos.y >= height) { continue; // Out of bounds! } if (mapNodes[finalPos.x][finalPos.y].weight == WALL_WEIGHT || mapNodes[startX][startY].weight == WALL_WEIGHT) // Find close non-wall start/end { continue; // Wall } var currentPath = findPath(startX, startY, finalPos.x, finalPos.y); if (currentPath.Count <= 0 && (startX != finalPos.x || startY != finalPos.y)) { // Don't add path if there's no path } else { if (!finalPos.straightToOffset) // Don't go straight to offset, add dummy { currentPath.Add(currentPath[currentPath.Count - 1]); } paths.Add(new PathRoute(currentPath, worldOrigin, nodeSize, finalPos)); } } var smallest = 0; for (var i = 1; i < paths.Count; i++) { if (paths[i].pathNodeList.Count < paths[smallest].pathNodeList.Count) { smallest = i; } } if (paths.Count <= 0 || paths.Count > 0 && paths[smallest].pathNodeList.Count <= 0) // No path { return(false); } callback(paths[smallest].pathNodeList, paths[smallest].finalPos); return(true); }