private Task <Vector3Int> FindItem(Vector3Int origin, Type itemToFind) { // breadth first search for the itemtype HashSet <Vector3Int> failedPositions = new HashSet <Vector3Int>(); Queue <Vector3Int> testPositions = new Queue <Vector3Int>(); testPositions.Enqueue(origin); while (testPositions.Count > 0) { Vector3Int current = testPositions.Dequeue(); failedPositions.Add(current); InventoryComponent[] inventories = ItemMap.GetInventories(current); foreach (InventoryComponent inventory in inventories) { if (inventory.HasItem(itemToFind)) { return(Task.FromResult(current)); } } foreach (Vector3Int delta in DeltaPositions.DeltaPositions3D) { Vector3Int nextPos = current + delta; if (Astar.IsStepValid(nextPos, current, delta) && !failedPositions.Contains(nextPos)) { testPositions.Enqueue(nextPos); } } } return(null); }