diff --git a/src/api/java/baritone/api/Settings.java b/src/api/java/baritone/api/Settings.java index a4d352832..faf5413d7 100644 --- a/src/api/java/baritone/api/Settings.java +++ b/src/api/java/baritone/api/Settings.java @@ -610,6 +610,13 @@ public final class Settings { */ public final Setting exploreChunkSetMinimumSize = new Setting<>(10); + /** + * Attempt to maintain Y coordinate while exploring + *

+ * -1 to disable + */ + public final Setting exploreMaintainY = new Setting<>(64); + /** * Replant nether wart */ diff --git a/src/main/java/baritone/process/ExploreProcess.java b/src/main/java/baritone/process/ExploreProcess.java index cfcd6336a..d3625f21b 100644 --- a/src/main/java/baritone/process/ExploreProcess.java +++ b/src/main/java/baritone/process/ExploreProcess.java @@ -22,6 +22,7 @@ import baritone.api.cache.ICachedWorld; import baritone.api.pathing.goals.Goal; import baritone.api.pathing.goals.GoalComposite; import baritone.api.pathing.goals.GoalXZ; +import baritone.api.pathing.goals.GoalYLevel; import baritone.api.process.IExploreProcess; import baritone.api.process.PathingCommand; import baritone.api.process.PathingCommandType; @@ -133,11 +134,25 @@ public class ExploreProcess extends BaritoneProcessHelper implements IExplorePro } } if (centers.size() >= count) { - return centers.stream().map(pos -> new GoalXZ(pos.getX(), pos.getZ())).toArray(Goal[]::new); + return centers.stream().map(pos -> createGoal(pos.getX(), pos.getZ())).toArray(Goal[]::new); } } } + private static Goal createGoal(int x, int z) { + if (Baritone.settings().exploreMaintainY.value == -1) { + return new GoalXZ(x, z); + } + // don't use a goalblock because we still want isInGoal to return true if X and Z are correct + // we just want to try and maintain Y on the way there, not necessarily end at that specific Y + return new GoalXZ(x, z) { + @Override + public double heuristic(int x, int y, int z) { + return super.heuristic(x, y, z) + GoalYLevel.calculate(Baritone.settings().exploreMaintainY.value, y); + } + }; + } + private enum Status { EXPLORED, NOT_EXPLORED, UNKNOWN; }