diff --git a/src/main/java/baritone/pathing/calc/AbstractNodeCostSearch.java b/src/main/java/baritone/pathing/calc/AbstractNodeCostSearch.java index 2432699a4..2f376082c 100644 --- a/src/main/java/baritone/pathing/calc/AbstractNodeCostSearch.java +++ b/src/main/java/baritone/pathing/calc/AbstractNodeCostSearch.java @@ -83,6 +83,7 @@ public abstract class AbstractNodeCostSearch implements IPathFinder { this.cancelRequested = false; try { Optional path = calculate0(timeout); + path.ifPresent(IPath::postprocess); isFinished = true; return path; } catch (Exception e) { diff --git a/src/main/java/baritone/pathing/calc/Path.java b/src/main/java/baritone/pathing/calc/Path.java index 96c8950e6..d0ad696e9 100644 --- a/src/main/java/baritone/pathing/calc/Path.java +++ b/src/main/java/baritone/pathing/calc/Path.java @@ -54,6 +54,8 @@ class Path implements IPath { private final int numNodes; + private volatile boolean verified; + Path(PathNode start, PathNode end, int numNodes) { this.start = start.pos; this.end = end.pos; @@ -61,7 +63,6 @@ class Path implements IPath { this.path = new ArrayList<>(); this.movements = new ArrayList<>(); assemblePath(start, end); - sanityCheck(); } /** @@ -116,8 +117,22 @@ class Path implements IPath { } } + @Override + public void postprocess() { + if (verified) { + throw new IllegalStateException(); + } + verified = true; + // more post processing here + movements.forEach(Movement::checkLoadedChunk); + sanityCheck(); + } + @Override public List movements() { + if (!verified) { + throw new IllegalStateException(); + } return Collections.unmodifiableList(movements); } diff --git a/src/main/java/baritone/pathing/movement/Movement.java b/src/main/java/baritone/pathing/movement/Movement.java index 0c59bfc0a..5aaf1be1d 100644 --- a/src/main/java/baritone/pathing/movement/Movement.java +++ b/src/main/java/baritone/pathing/movement/Movement.java @@ -26,6 +26,7 @@ import baritone.utils.pathing.BetterBlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.chunk.EmptyChunk; import java.util.ArrayList; import java.util.Arrays; @@ -290,6 +291,16 @@ public abstract class Movement implements Helper, MovementHelper { return getDest().subtract(getSrc()); } + private Boolean calculatedWhileLoaded; + + public void checkLoadedChunk() { + calculatedWhileLoaded = !(world().getChunk(getDest()) instanceof EmptyChunk); + } + + public boolean calculatedWhileLoaded() { + return calculatedWhileLoaded; + } + public List toBreakCached = null; public List toPlaceCached = null; public List toWalkIntoCached = null; diff --git a/src/main/java/baritone/pathing/path/IPath.java b/src/main/java/baritone/pathing/path/IPath.java index 575aacb14..c9b473b5e 100644 --- a/src/main/java/baritone/pathing/path/IPath.java +++ b/src/main/java/baritone/pathing/path/IPath.java @@ -49,6 +49,12 @@ public interface IPath extends Helper { */ List positions(); + /** + * This path is actually going to be executed in the world. Do whatever additional processing is required. + * (as opposed to Path objects that are just constructed every frame for rendering) + */ + default void postprocess() {} + /** * Number of positions in this path * diff --git a/src/main/java/baritone/pathing/path/PathExecutor.java b/src/main/java/baritone/pathing/path/PathExecutor.java index ab132ca03..8506eeb70 100644 --- a/src/main/java/baritone/pathing/path/PathExecutor.java +++ b/src/main/java/baritone/pathing/path/PathExecutor.java @@ -236,7 +236,7 @@ public class PathExecutor implements Helper { Baritone.INSTANCE.getInputOverrideHandler().clearAllKeys(); return true; } - if (currentCost - currentMovementInitialCostEstimate > Baritone.settings().maxCostIncrease.get()) { + if (!movement.calculatedWhileLoaded() && currentCost - currentMovementInitialCostEstimate > Baritone.settings().maxCostIncrease.get()) { logDebug("Original cost " + currentMovementInitialCostEstimate + " current cost " + currentCost + ". Cancelling."); pathPosition = path.length() + 3; failed = true;