diff --git a/core/src/main/java/com/boydti/fawe/object/HistoryExtent.java b/core/src/main/java/com/boydti/fawe/object/HistoryExtent.java index ee4abd03..bb557290 100644 --- a/core/src/main/java/com/boydti/fawe/object/HistoryExtent.java +++ b/core/src/main/java/com/boydti/fawe/object/HistoryExtent.java @@ -4,10 +4,7 @@ import com.boydti.fawe.FaweCache; import com.boydti.fawe.object.changeset.FaweChangeSet; import com.boydti.fawe.object.exception.FaweException; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.Vector2D; -import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.*; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; @@ -142,6 +139,17 @@ public class HistoryExtent extends AbstractDelegateExtent { } } + @Override + public boolean setBiome(int x, int y, int z, BaseBiome newBiome) { + BaseBiome oldBiome = this.getBiome(MutableBlockVector2D.get(x, z)); + if (oldBiome.getId() != newBiome.getId()) { + this.changeSet.addBiomeChange(x, z, oldBiome, newBiome); + return getExtent().setBiome(x, y, z, newBiome); + } else { + return false; + } + } + public class TrackedEntity implements Entity { private final Entity entity; diff --git a/core/src/main/java/com/boydti/fawe/object/extent/BlockTranslateExtent.java b/core/src/main/java/com/boydti/fawe/object/extent/BlockTranslateExtent.java index bc078325..87ca4d74 100644 --- a/core/src/main/java/com/boydti/fawe/object/extent/BlockTranslateExtent.java +++ b/core/src/main/java/com/boydti/fawe/object/extent/BlockTranslateExtent.java @@ -41,6 +41,11 @@ public class BlockTranslateExtent extends AbstractDelegateExtent { return super.setBiome(position.add(dx, dz), biome); } + @Override + public boolean setBiome(int x, int y, int z, BaseBiome biome) { + return super.setBiome(x + dx, y + dy, z + dz, biome); + } + @Override public BaseBiome getBiome(Vector2D position) { return super.getBiome(position.add(dx, dz)); diff --git a/core/src/main/java/com/boydti/fawe/object/extent/EmptyExtent.java b/core/src/main/java/com/boydti/fawe/object/extent/EmptyExtent.java index 7e0aa4e6..459934ff 100644 --- a/core/src/main/java/com/boydti/fawe/object/extent/EmptyExtent.java +++ b/core/src/main/java/com/boydti/fawe/object/extent/EmptyExtent.java @@ -62,6 +62,11 @@ public class EmptyExtent implements Extent { return false; } + @Override + public boolean setBiome(int x, int y, int z, BaseBiome biome) { + return false; + } + @Nullable public Operation commit() { return null; diff --git a/core/src/main/java/com/boydti/fawe/object/extent/FaweRegionExtent.java b/core/src/main/java/com/boydti/fawe/object/extent/FaweRegionExtent.java index 192494d6..f94c86e4 100644 --- a/core/src/main/java/com/boydti/fawe/object/extent/FaweRegionExtent.java +++ b/core/src/main/java/com/boydti/fawe/object/extent/FaweRegionExtent.java @@ -86,6 +86,17 @@ public abstract class FaweRegionExtent extends ResettableExtent { return super.setBiome(position, biome); } + @Override + public boolean setBiome(int x, int y, int z, BaseBiome biome) { + if (!contains(x, y, z)) { + if (!limit.MAX_FAILS()) { + WEManager.IMP.cancelEditSafe(this, BBC.WORLDEDIT_CANCEL_REASON_OUTSIDE_REGION); + } + return false; + } + return super.setBiome(x, y, z, biome); + } + @Override public BaseBiome getBiome(Vector2D position) { if (!contains(position)) { diff --git a/core/src/main/java/com/boydti/fawe/object/extent/OffsetExtent.java b/core/src/main/java/com/boydti/fawe/object/extent/OffsetExtent.java index 967e68fc..d88d49c2 100644 --- a/core/src/main/java/com/boydti/fawe/object/extent/OffsetExtent.java +++ b/core/src/main/java/com/boydti/fawe/object/extent/OffsetExtent.java @@ -24,6 +24,11 @@ public class OffsetExtent extends ResettableExtent { return getExtent().setBiome(mutable.setComponents(position.getBlockX() + dx, position.getBlockZ() + dz), biome); } + @Override + public boolean setBiome(int x, int y, int z, BaseBiome biome) { + return getExtent().setBiome(x + dx, y + dy, z + dz, biome); + } + @Override public boolean setBlock(Vector location, BaseBlock block) throws WorldEditException { return getExtent().setBlock(location.getBlockX() + dx, location.getBlockY() + dy, location.getBlockZ() + dz, block); diff --git a/core/src/main/java/com/boydti/fawe/object/pattern/BiomePattern.java b/core/src/main/java/com/boydti/fawe/object/pattern/BiomePattern.java index 49f9aa7e..74e3af5a 100644 --- a/core/src/main/java/com/boydti/fawe/object/pattern/BiomePattern.java +++ b/core/src/main/java/com/boydti/fawe/object/pattern/BiomePattern.java @@ -23,8 +23,8 @@ public class BiomePattern extends ExistingPattern { } @Override - public boolean apply(Extent extent, Vector setPosition, Vector getPosition) throws WorldEditException { - return extent.setBiome(mutable.setComponents(setPosition.getBlockX(), setPosition.getBlockZ()), biome); + public boolean apply(Extent extent, Vector set, Vector getPosition) throws WorldEditException { + return extent.setBiome(set.getBlockX(), set.getBlockY(), set.getBlockZ(), biome); } public class BiomePatternException extends RuntimeException { diff --git a/core/src/main/java/com/sk89q/worldedit/EditSession.java b/core/src/main/java/com/sk89q/worldedit/EditSession.java index 07986fe8..6f968b1e 100644 --- a/core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -983,6 +983,12 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, return this.extent.setBiome(position, biome); } + @Override + public boolean setBiome(int x, int y, int z, BaseBiome biome) { + this.changes++; + return this.extent.setBiome(x, y, z, biome); + } + @Override public int getLight(int x, int y, int z) { return queue.getLight(x, y, z); diff --git a/core/src/main/java/com/sk89q/worldedit/command/MaskCommands.java b/core/src/main/java/com/sk89q/worldedit/command/MaskCommands.java index e8072d64..07a229ff 100644 --- a/core/src/main/java/com/sk89q/worldedit/command/MaskCommands.java +++ b/core/src/main/java/com/sk89q/worldedit/command/MaskCommands.java @@ -85,6 +85,22 @@ public class MaskCommands extends MethodCommands { return new LightMask(extent, (int) min, (int) max); } + @Command( + aliases = {"false"}, + desc = "Always false" + ) + public Mask falseMask(Extent extent) { + return Masks.alwaysFalse(); + } + + @Command( + aliases = {"true"}, + desc = "Always true" + ) + public Mask trueMask(Extent extent) { + return Masks.alwaysTrue(); + } + @Command( aliases = {"#skylight"}, desc = "Restrict to specific sky light levels", diff --git a/core/src/main/java/com/sk89q/worldedit/extent/Extent.java b/core/src/main/java/com/sk89q/worldedit/extent/Extent.java index 7a709c56..a80e7b8b 100644 --- a/core/src/main/java/com/sk89q/worldedit/extent/Extent.java +++ b/core/src/main/java/com/sk89q/worldedit/extent/Extent.java @@ -7,11 +7,7 @@ import com.boydti.fawe.jnbt.anvil.generator.OreGen; import com.boydti.fawe.jnbt.anvil.generator.Resource; import com.boydti.fawe.jnbt.anvil.generator.SchemGen; import com.boydti.fawe.object.PseudoRandom; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.MutableBlockVector; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.Vector2D; -import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.*; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BlockID; import com.sk89q.worldedit.entity.BaseEntity; @@ -22,6 +18,7 @@ import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.session.ClipboardHolder; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.world.biome.BaseBiome; import com.sk89q.worldedit.world.registry.WorldData; import java.util.ArrayList; import java.util.List; @@ -70,6 +67,10 @@ public interface Extent extends InputExtent, OutputExtent { return 255; } + default boolean setBiome(int x, int y, int z, BaseBiome biome) { + return setBiome(MutableBlockVector2D.get(x, z), biome); + } + default public int getNearestSurfaceLayer(int x, int z, int y, int minY, int maxY) { int clearanceAbove = maxY - y; int clearanceBelow = y - minY;