diff --git a/src/api/java/baritone/api/Settings.java b/src/api/java/baritone/api/Settings.java index d008007ce..52fb169ae 100644 --- a/src/api/java/baritone/api/Settings.java +++ b/src/api/java/baritone/api/Settings.java @@ -1550,6 +1550,13 @@ public final class Settings { */ public final Setting elytraChatSpam = new Setting<>(false); + /** + * A custom height limit to contain block placements under + *

+ * Prevents Baritone from placing blocks if some servers have different build limits + */ + public final Setting blockPlaceHeightLimit = new Setting<>(Integer.MAX_VALUE); + /** * A map of lowercase setting field names to their respective setting */ diff --git a/src/main/java/baritone/pathing/movement/CalculationContext.java b/src/main/java/baritone/pathing/movement/CalculationContext.java index ffd1a2fca..ddcf23aaf 100644 --- a/src/main/java/baritone/pathing/movement/CalculationContext.java +++ b/src/main/java/baritone/pathing/movement/CalculationContext.java @@ -79,6 +79,7 @@ public class CalculationContext { public double backtrackCostFavoringCoefficient; public double jumpPenalty; public final double walkOnWaterOnePenalty; + public final int blockPlaceHeightLimit; public final BetterWorldBorder worldBorder; public final PrecomputedData precomputedData; @@ -125,6 +126,7 @@ public CalculationContext(IBaritone baritone, boolean forUseOnAnotherThread) { this.backtrackCostFavoringCoefficient = Baritone.settings().backtrackCostFavoringCoefficient.value; this.jumpPenalty = Baritone.settings().jumpPenalty.value; this.walkOnWaterOnePenalty = Baritone.settings().walkOnWaterOnePenalty.value; + this.blockPlaceHeightLimit = Baritone.settings().blockPlaceHeightLimit.value; // why cache these things here, why not let the movements just get directly from settings? // because if some movements are calculated one way and others are calculated another way, // then you get a wildly inconsistent path that isn't optimal for either scenario. @@ -167,6 +169,9 @@ public double costOfPlacingAt(int x, int y, int z, BlockState current) { if (!Baritone.settings().allowPlaceInFluidsFlow.value && !current.getFluidState().isEmpty() && !current.getFluidState().isSource()) { return COST_INF; } + if (y > blockPlaceHeightLimit) { + return COST_INF; + } return placeBlockCost; }