diff --git a/src/main/java/baritone/chunk/CachedRegion.java b/src/main/java/baritone/chunk/CachedRegion.java index 66204d5a..3df6d68a 100644 --- a/src/main/java/baritone/chunk/CachedRegion.java +++ b/src/main/java/baritone/chunk/CachedRegion.java @@ -77,6 +77,10 @@ public final class CachedRegion implements IBlockTypeAccess { return null; } + public final boolean isCached(int x, int z) { + return chunks[x >> 4][z >> 4] != null; + } + public final LinkedList getLocationsOf(String block) { LinkedList res = new LinkedList<>(); for (int chunkX = 0; chunkX < 32; chunkX++) { diff --git a/src/main/java/baritone/chunk/CachedWorld.java b/src/main/java/baritone/chunk/CachedWorld.java index 42b4c13d..703eab0d 100644 --- a/src/main/java/baritone/chunk/CachedWorld.java +++ b/src/main/java/baritone/chunk/CachedWorld.java @@ -59,7 +59,8 @@ public final class CachedWorld implements IBlockTypeAccess { if (!Files.exists(directory)) { try { Files.createDirectories(directory); - } catch (IOException ignored) {} + } catch (IOException ignored) { + } } this.directory = directory.toString(); System.out.println("Cached world directory: " + directory); @@ -102,6 +103,17 @@ public final class CachedWorld implements IBlockTypeAccess { return region.getBlock(x & 511, y, z & 511); } + public final boolean isCached(BlockPos pos) { + int x = pos.getX(); + int z = pos.getZ(); + CachedRegion region = getRegion(x >> 9, z >> 9); + if (region == null) { + return false; + } + return region.isCached(x & 511, z & 511); + } + + public final LinkedList getLocationsOf(String block, int minimum, int maxRegionDistanceSq) { LinkedList res = new LinkedList<>(); int playerRegionX = playerFeet().getX() >> 9; diff --git a/src/main/java/baritone/pathing/calc/AStarPathFinder.java b/src/main/java/baritone/pathing/calc/AStarPathFinder.java index 383c3b90..c708d3e9 100644 --- a/src/main/java/baritone/pathing/calc/AStarPathFinder.java +++ b/src/main/java/baritone/pathing/calc/AStarPathFinder.java @@ -18,6 +18,7 @@ package baritone.pathing.calc; import baritone.Baritone; +import baritone.chunk.CachedWorld; import baritone.chunk.WorldProvider; import baritone.pathing.calc.openset.BinaryHeapOpenSet; import baritone.pathing.calc.openset.IOpenSet; @@ -70,6 +71,7 @@ public class AStarPathFinder extends AbstractNodeCostSearch implements Helper { CalculationContext calcContext = new CalculationContext(); HashSet favored = favoredPositions.orElse(null); currentlyRunning = this; + CachedWorld world = Optional.ofNullable(WorldProvider.INSTANCE.getCurrentWorld()).map(w -> w.cache).orElse(null); long startTime = System.currentTimeMillis(); boolean slowPath = Baritone.settings().slowPath.get(); long timeoutTime = startTime + (slowPath ? Baritone.settings().slowPathTimeoutMS : Baritone.settings().pathTimeoutMS).get(); @@ -112,8 +114,8 @@ public class AStarPathFinder extends AbstractNodeCostSearch implements Helper { } BetterBlockPos dest = (BetterBlockPos) movementToGetToNeighbor.getDest(); boolean isPositionCached = false; - if (WorldProvider.INSTANCE.getCurrentWorld() != null) { - if (WorldProvider.INSTANCE.getCurrentWorld().cache.getBlock(dest) != null) { + if (world != null) { + if (world.isCached(dest)) { isPositionCached = true; } }