diff --git a/src/api/java/baritone/api/Settings.java b/src/api/java/baritone/api/Settings.java index 14a131831..dac1ae55c 100644 --- a/src/api/java/baritone/api/Settings.java +++ b/src/api/java/baritone/api/Settings.java @@ -184,6 +184,20 @@ public final class Settings { Blocks.WALL_SIGN ))); + /** + * A list of blocks to be treated as if they're air. + *
+ * If a schematic asks for air at a certain position, and that position currently contains a block on this list, it will be treated as correct.
+ */
+ public final Setting
diff --git a/src/main/java/baritone/process/BuilderProcess.java b/src/main/java/baritone/process/BuilderProcess.java
index 17cbe110e..4d66a7645 100644
--- a/src/main/java/baritone/process/BuilderProcess.java
+++ b/src/main/java/baritone/process/BuilderProcess.java
@@ -764,11 +764,20 @@ public final class BuilderProcess extends BaritoneProcessHelper implements IBuil
}
private boolean valid(IBlockState current, IBlockState desired) {
+ if (desired == null) {
+ return true;
+ }
// TODO more complicated comparison logic I guess
if (current.getBlock() instanceof BlockLiquid && Baritone.settings().okIfWater.value) {
return true;
}
- return desired == null || current.equals(desired);
+ if (desired.getBlock() instanceof BlockAir && Baritone.settings().buildIgnoreBlocks.value.contains(current.getBlock())) {
+ return true;
+ }
+ if (!(current.getBlock() instanceof BlockAir) && Baritone.settings().buildIgnoreExisting.value) {
+ return true;
+ }
+ return current.equals(desired);
}
public class BuilderCalculationContext extends CalculationContext {
> buildIgnoreBlocks = new Setting<>(new ArrayList<>(Arrays.asList(
+
+ )));
+
+ /**
+ * If this is true, the builder will treat all non-air blocks as correct. It will only place new blocks.
+ */
+ public final Setting