From 9113cd4bd3d836bedf525d18fa324c8c902d00eb Mon Sep 17 00:00:00 2001 From: sk89q Date: Sun, 30 Mar 2014 01:36:02 -0700 Subject: [PATCH] Added new Mask interface and deprecated old one. --- .../java/com/sk89q/worldedit/EditSession.java | 21 ++-- .../worldedit/commands/RegionCommands.java | 2 +- .../function/FlatRegionMaskingFilter.java | 11 +- .../function/RegionMaskingFilter.java | 12 +- .../function/mask/AbstractExtentMask.java | 61 ++++++++++ .../mask/AbstractMask.java} | 19 +-- .../mask}/AbstractMask2D.java | 4 +- .../worldedit/function/mask/BlockMask.java | 99 +++++++++++++++ .../mask/BoundedHeightMask.java} | 27 +++-- .../function/mask/ExistingBlockMask.java | 46 +++++++ .../function/mask/FuzzyBlockMask.java | 45 +++++++ .../mask/Mask.java} | 18 +-- .../mask/Mask2D.java} | 18 +-- .../function/mask/MaskIntersection.java | 102 ++++++++++++++++ .../worldedit/function/mask/MaskUnion.java | 64 ++++++++++ .../sk89q/worldedit/function/mask/Masks.java | 113 ++++++++++++++++++ .../{masks => function/mask}/NoiseFilter.java | 7 +- .../mask}/NoiseFilter2D.java | 5 +- .../worldedit/function/mask/RegionMask.java | 67 +++++++++++ .../function/mask/SolidBlockMask.java | 38 ++++++ .../function/visitor/DownwardVisitor.java | 2 +- .../function/visitor/LayerVisitor.java | 8 +- .../function/visitor/RecursiveVisitor.java | 4 +- .../sk89q/worldedit/masks/AbstractMask.java | 5 + .../com/sk89q/worldedit/masks/BlockMask.java | 10 +- .../sk89q/worldedit/masks/CombinedMask.java | 5 + .../worldedit/masks/DynamicRegionMask.java | 2 +- .../worldedit/masks/ExistingBlockMask.java | 8 +- .../worldedit/masks/ExtentAwareMask.java | 71 ----------- .../sk89q/worldedit/masks/FuzzyBlockMask.java | 10 +- .../sk89q/worldedit/masks/InvertedMask.java | 5 + .../java/com/sk89q/worldedit/masks/Mask.java | 8 +- .../com/sk89q/worldedit/masks/RandomMask.java | 5 + .../com/sk89q/worldedit/masks/RegionMask.java | 4 + .../sk89q/worldedit/masks/SolidBlockMask.java | 9 +- 35 files changed, 753 insertions(+), 182 deletions(-) create mode 100644 src/main/java/com/sk89q/worldedit/function/mask/AbstractExtentMask.java rename src/main/java/com/sk89q/worldedit/{masks/Mask2D.java => function/mask/AbstractMask.java} (62%) rename src/main/java/com/sk89q/worldedit/{masks => function/mask}/AbstractMask2D.java (88%) create mode 100644 src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java rename src/main/java/com/sk89q/worldedit/{masks/BoundedYMask.java => function/mask/BoundedHeightMask.java} (59%) create mode 100644 src/main/java/com/sk89q/worldedit/function/mask/ExistingBlockMask.java create mode 100644 src/main/java/com/sk89q/worldedit/function/mask/FuzzyBlockMask.java rename src/main/java/com/sk89q/worldedit/{masks/DummyMask.java => function/mask/Mask.java} (73%) rename src/main/java/com/sk89q/worldedit/{masks/DummyMask2D.java => function/mask/Mask2D.java} (73%) create mode 100644 src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java create mode 100644 src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java create mode 100644 src/main/java/com/sk89q/worldedit/function/mask/Masks.java rename src/main/java/com/sk89q/worldedit/{masks => function/mask}/NoiseFilter.java (92%) rename src/main/java/com/sk89q/worldedit/{masks => function/mask}/NoiseFilter2D.java (94%) create mode 100644 src/main/java/com/sk89q/worldedit/function/mask/RegionMask.java create mode 100644 src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java delete mode 100644 src/main/java/com/sk89q/worldedit/masks/ExtentAwareMask.java diff --git a/src/main/java/com/sk89q/worldedit/EditSession.java b/src/main/java/com/sk89q/worldedit/EditSession.java index 4963ae0db..342ed68f8 100644 --- a/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/src/main/java/com/sk89q/worldedit/EditSession.java @@ -33,6 +33,7 @@ import com.sk89q.worldedit.function.block.BlockCount; import com.sk89q.worldedit.function.block.BlockReplace; import com.sk89q.worldedit.function.block.Naturalizer; import com.sk89q.worldedit.function.generator.GardenPatchGenerator; +import com.sk89q.worldedit.function.mask.*; import com.sk89q.worldedit.function.operation.OperationHelper; import com.sk89q.worldedit.function.util.RegionOffset; import com.sk89q.worldedit.function.visitor.DownwardVisitor; @@ -42,7 +43,8 @@ import com.sk89q.worldedit.function.visitor.RegionVisitor; import com.sk89q.worldedit.interpolation.Interpolation; import com.sk89q.worldedit.interpolation.KochanekBartelsInterpolation; import com.sk89q.worldedit.interpolation.Node; -import com.sk89q.worldedit.masks.*; +import com.sk89q.worldedit.masks.Mask; +import com.sk89q.worldedit.math.noise.RandomNoise; import com.sk89q.worldedit.patterns.Pattern; import com.sk89q.worldedit.patterns.SingleBlockPattern; import com.sk89q.worldedit.regions.*; @@ -51,7 +53,6 @@ import com.sk89q.worldedit.shape.ArbitraryShape; import com.sk89q.worldedit.shape.RegionShape; import com.sk89q.worldedit.shape.WorldEditExpressionEnvironment; import com.sk89q.worldedit.util.TreeGenerator; -import com.sk89q.worldedit.math.noise.RandomNoise; import java.util.*; @@ -559,9 +560,9 @@ public class EditSession implements Extent { * @return the number of blocks that matched the pattern */ public int countBlocks(Region region, Set searchBlocks) { - FuzzyBlockMask mask = new FuzzyBlockMask(searchBlocks); + FuzzyBlockMask mask = new FuzzyBlockMask(this, searchBlocks); BlockCount count = new BlockCount(); - RegionMaskingFilter filter = new RegionMaskingFilter(this, mask, count); + RegionMaskingFilter filter = new RegionMaskingFilter(mask, count); RegionVisitor visitor = new RegionVisitor(region, filter); OperationHelper.completeBlindly(visitor); // We can't throw exceptions, nor do we expect any return count.getCount(); @@ -819,10 +820,10 @@ public class EditSession implements Extent { checkArgument(radius >= 0, "radius >= 0"); checkArgument(depth >= 1, "depth >= 1"); - CombinedMask mask = new CombinedMask( + MaskIntersection mask = new MaskIntersection( new RegionMask(new EllipsoidRegion(null, origin, new Vector(radius, radius, radius))), - new BoundedYMask(origin.getBlockY() - depth + 1, origin.getBlockY()), - new InvertedMask(new ExistingBlockMask())); + new BoundedHeightMask(origin.getBlockY() - depth + 1, origin.getBlockY()), + Masks.negate(new ExistingBlockMask(this))); // Want to replace blocks BlockReplace replace = new BlockReplace(this, pattern); @@ -901,7 +902,7 @@ public class EditSession implements Extent { checkNotNull(position); checkArgument(apothem >= 1, "apothem >= 1"); - Mask mask = new FuzzyBlockMask(new BaseBlock(blockType, -1)); + Mask mask = new com.sk89q.worldedit.masks.FuzzyBlockMask(new BaseBlock(blockType, -1)); Vector adjustment = new Vector(1, 1, 1).multiply(apothem - 1); Region region = new CuboidRegion( getWorld(), // Causes clamping of Y range @@ -966,7 +967,7 @@ public class EditSession implements Extent { * @throws MaxChangedBlocksException thrown if too many blocks are changed */ public int replaceBlocks(Region region, Set filter, Pattern pattern) throws MaxChangedBlocksException { - Mask mask = filter == null ? new ExistingBlockMask() : new FuzzyBlockMask(filter); + Mask mask = filter == null ? new com.sk89q.worldedit.masks.ExistingBlockMask() : new com.sk89q.worldedit.masks.FuzzyBlockMask(filter); return replaceBlocks(region, mask, pattern); } @@ -986,7 +987,7 @@ public class EditSession implements Extent { checkNotNull(pattern); BlockReplace replace = new BlockReplace(this, pattern); - RegionMaskingFilter filter = new RegionMaskingFilter(this, mask, replace); + RegionMaskingFilter filter = new RegionMaskingFilter(Masks.wrap(this, mask), replace); RegionVisitor visitor = new RegionVisitor(region, filter); OperationHelper.completeLegacy(visitor); return visitor.getAffected(); diff --git a/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java b/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java index 141c39744..bc72cdb3d 100644 --- a/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java +++ b/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java @@ -35,7 +35,7 @@ import com.sk89q.worldedit.function.generator.ForestGenerator; import com.sk89q.worldedit.function.operation.OperationHelper; import com.sk89q.worldedit.function.visitor.LayerVisitor; import com.sk89q.worldedit.masks.Mask; -import com.sk89q.worldedit.masks.NoiseFilter2D; +import com.sk89q.worldedit.function.mask.NoiseFilter2D; import com.sk89q.worldedit.patterns.Pattern; import com.sk89q.worldedit.patterns.SingleBlockPattern; import com.sk89q.worldedit.regions.ConvexPolyhedralRegion; diff --git a/src/main/java/com/sk89q/worldedit/function/FlatRegionMaskingFilter.java b/src/main/java/com/sk89q/worldedit/function/FlatRegionMaskingFilter.java index e6bf41fba..df28989a5 100644 --- a/src/main/java/com/sk89q/worldedit/function/FlatRegionMaskingFilter.java +++ b/src/main/java/com/sk89q/worldedit/function/FlatRegionMaskingFilter.java @@ -19,10 +19,9 @@ package com.sk89q.worldedit.function; -import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector2D; import com.sk89q.worldedit.WorldEditException; -import com.sk89q.worldedit.masks.Mask2D; +import com.sk89q.worldedit.function.mask.Mask2D; import static com.google.common.base.Preconditions.checkNotNull; @@ -33,30 +32,26 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class FlatRegionMaskingFilter implements FlatRegionFunction { - private final EditSession editSession; private final FlatRegionFunction function; private Mask2D mask; /** * Create a new masking filter. * - * @param editSession the edit session * @param mask the mask * @param function the delegate function to call */ - public FlatRegionMaskingFilter(EditSession editSession, Mask2D mask, FlatRegionFunction function) { + public FlatRegionMaskingFilter(Mask2D mask, FlatRegionFunction function) { checkNotNull(function); - checkNotNull(editSession); checkNotNull(mask); - this.editSession = editSession; this.mask = mask; this.function = function; } @Override public boolean apply(Vector2D position) throws WorldEditException { - return mask.matches(editSession, position) && function.apply(position); + return mask.test(position) && function.apply(position); } } diff --git a/src/main/java/com/sk89q/worldedit/function/RegionMaskingFilter.java b/src/main/java/com/sk89q/worldedit/function/RegionMaskingFilter.java index 461846c5d..cd0ac45b7 100644 --- a/src/main/java/com/sk89q/worldedit/function/RegionMaskingFilter.java +++ b/src/main/java/com/sk89q/worldedit/function/RegionMaskingFilter.java @@ -19,10 +19,9 @@ package com.sk89q.worldedit.function; -import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.WorldEditException; -import com.sk89q.worldedit.masks.Mask; +import com.sk89q.worldedit.function.mask.Mask; import static com.google.common.base.Preconditions.checkNotNull; @@ -33,30 +32,25 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class RegionMaskingFilter implements RegionFunction { - private final EditSession editSession; private final RegionFunction function; private Mask mask; /** * Create a new masking filter. * - * @param editSession the edit session * @param mask the mask * @param function the function */ - public RegionMaskingFilter(EditSession editSession, Mask mask, RegionFunction function) { + public RegionMaskingFilter(Mask mask, RegionFunction function) { checkNotNull(function); - checkNotNull(editSession); checkNotNull(mask); - - this.editSession = editSession; this.mask = mask; this.function = function; } @Override public boolean apply(Vector position) throws WorldEditException { - return mask.matches(editSession, position) && function.apply(position); + return mask.test(position) && function.apply(position); } } diff --git a/src/main/java/com/sk89q/worldedit/function/mask/AbstractExtentMask.java b/src/main/java/com/sk89q/worldedit/function/mask/AbstractExtentMask.java new file mode 100644 index 000000000..4d90b4e43 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/function/mask/AbstractExtentMask.java @@ -0,0 +1,61 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.function.mask; + +import com.sk89q.worldedit.Extent; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * An abstract implementation of {@link Mask} that takes uses an {@link Extent}. + */ +public abstract class AbstractExtentMask extends AbstractMask { + + private Extent extent; + + /** + * Construct a new mask. + * + * @param extent the extent + */ + protected AbstractExtentMask(Extent extent) { + setExtent(extent); + } + + /** + * Get the extent. + * + * @return the extent + */ + public Extent getExtent() { + return extent; + } + + /** + * Set the extent. + * + * @param extent the extent + */ + public void setExtent(Extent extent) { + checkNotNull(extent); + this.extent = extent; + } + +} diff --git a/src/main/java/com/sk89q/worldedit/masks/Mask2D.java b/src/main/java/com/sk89q/worldedit/function/mask/AbstractMask.java similarity index 62% rename from src/main/java/com/sk89q/worldedit/masks/Mask2D.java rename to src/main/java/com/sk89q/worldedit/function/mask/AbstractMask.java index f70af34a0..21c5900df 100644 --- a/src/main/java/com/sk89q/worldedit/masks/Mask2D.java +++ b/src/main/java/com/sk89q/worldedit/function/mask/AbstractMask.java @@ -17,23 +17,10 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.masks; - -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.Vector2D; +package com.sk89q.worldedit.function.mask; /** - * A 2-dimensional mask, similar to {@link com.sk89q.worldedit.masks.Mask}. + * A base class of {@link Mask} that all masks should inherit from. */ -public interface Mask2D { - - /** - * Return whether the given position is matched by this mask. - * - * @param editSession an edit session - * @param position a mask - * @return true if there is a match - */ - boolean matches(EditSession editSession, Vector2D position); - +public abstract class AbstractMask implements Mask { } diff --git a/src/main/java/com/sk89q/worldedit/masks/AbstractMask2D.java b/src/main/java/com/sk89q/worldedit/function/mask/AbstractMask2D.java similarity index 88% rename from src/main/java/com/sk89q/worldedit/masks/AbstractMask2D.java rename to src/main/java/com/sk89q/worldedit/function/mask/AbstractMask2D.java index 72df4af4d..1cffb2d2a 100644 --- a/src/main/java/com/sk89q/worldedit/masks/AbstractMask2D.java +++ b/src/main/java/com/sk89q/worldedit/function/mask/AbstractMask2D.java @@ -17,10 +17,10 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.masks; +package com.sk89q.worldedit.function.mask; /** - * An abstract implementaiton of {@link com.sk89q.worldedit.masks.Mask2D}. + * A base class of {@link Mask2D} that all masks should inherit from. */ public abstract class AbstractMask2D implements Mask2D { } diff --git a/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java b/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java new file mode 100644 index 000000000..1ea91cd46 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java @@ -0,0 +1,99 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.function.mask; + +import com.sk89q.worldedit.Extent; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.blocks.BaseBlock; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * A mask that checks whether blocks at the given positions are listed + * in a list of block types. + *

+ * This mask checks for both an exact block ID and data value match, as well + * for a block with the same ID but a data value of -1. + */ +public class BlockMask extends AbstractExtentMask { + + private final Set blocks = new HashSet(); + + /** + * Create a new block mask. + * + * @param extent the extent + * @param blocks a list of blocks to match + */ + public BlockMask(Extent extent, Collection blocks) { + super(extent); + checkNotNull(blocks); + blocks.addAll(blocks); + } + + /** + * Create a new block mask. + * + * @param extent the extent + * @param block an array of blocks to match + */ + public BlockMask(Extent extent, BaseBlock... block) { + this(extent, Arrays.asList(checkNotNull(block))); + } + + /** + * Add the given blocks to the list of criteria. + * + * @param blocks a list of blocks + */ + public void add(Collection blocks) { + checkNotNull(blocks); + blocks.addAll(blocks); + } + + /** + * Add the given blocks to the list of criteria. + * + * @param block an array of blocks + */ + public void add(BaseBlock... block) { + add(Arrays.asList(checkNotNull(block))); + } + + /** + * Get the list of blocks that are tested with. + * + * @return a list of blocks + */ + public Collection getBlocks() { + return blocks; + } + + @Override + public boolean test(Vector vector) { + BaseBlock block = getExtent().getBlock(vector); + return blocks.contains(block) || blocks.contains(new BaseBlock(block.getType(), -1)); + } +} diff --git a/src/main/java/com/sk89q/worldedit/masks/BoundedYMask.java b/src/main/java/com/sk89q/worldedit/function/mask/BoundedHeightMask.java similarity index 59% rename from src/main/java/com/sk89q/worldedit/masks/BoundedYMask.java rename to src/main/java/com/sk89q/worldedit/function/mask/BoundedHeightMask.java index 21980312d..e955de42a 100644 --- a/src/main/java/com/sk89q/worldedit/masks/BoundedYMask.java +++ b/src/main/java/com/sk89q/worldedit/function/mask/BoundedHeightMask.java @@ -17,31 +17,36 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.masks; +package com.sk89q.worldedit.function.mask; -import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; +import static com.google.common.base.Preconditions.checkArgument; + /** - * Fails all tests against locations outside a range of Y values. + * Has the criteria where the Y value of passed positions must be within + * a certain range of Y values (inclusive). */ -public class BoundedYMask extends AbstractMask { +public class BoundedHeightMask extends AbstractMask { private final int minY; private final int maxY; - public BoundedYMask(int minY, int maxY) { - if (minY > maxY) { - throw new IllegalArgumentException("minY must be less than or equal to maxY"); - } + /** + * Create a new bounded height mask. + * + * @param minY the minimum Y + * @param maxY the maximum Y (must be equal to or greater than minY) + */ + public BoundedHeightMask(int minY, int maxY) { + checkArgument(minY <= maxY, "minY <= maxY required"); this.minY = minY; this.maxY = maxY; } @Override - public boolean matches(EditSession editSession, Vector pos) { - int y = pos.getBlockY(); - return y >= minY && y <= maxY; + public boolean test(Vector vector) { + return vector.getY() >= minY && vector.getY() <= maxY; } } diff --git a/src/main/java/com/sk89q/worldedit/function/mask/ExistingBlockMask.java b/src/main/java/com/sk89q/worldedit/function/mask/ExistingBlockMask.java new file mode 100644 index 000000000..b2fe813df --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/function/mask/ExistingBlockMask.java @@ -0,0 +1,46 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.function.mask; + +import com.sk89q.worldedit.Extent; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.blocks.BlockID; + +/** + * A mask that returns true whenever the block at the location is not + * an air block (it contains some other block). + */ +public class ExistingBlockMask extends AbstractExtentMask { + + /** + * Create a new existing block map. + * + * @param extent the extent to check + */ + public ExistingBlockMask(Extent extent) { + super(extent); + } + + @Override + public boolean test(Vector vector) { + return getExtent().getBlockType(vector) != BlockID.AIR; + } + +} diff --git a/src/main/java/com/sk89q/worldedit/function/mask/FuzzyBlockMask.java b/src/main/java/com/sk89q/worldedit/function/mask/FuzzyBlockMask.java new file mode 100644 index 000000000..10251e172 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/function/mask/FuzzyBlockMask.java @@ -0,0 +1,45 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.function.mask; + +import com.sk89q.worldedit.Extent; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.blocks.BaseBlock; + +import java.util.Collection; + +public class FuzzyBlockMask extends BlockMask { + + public FuzzyBlockMask(Extent extent, Collection blocks) { + super(extent, blocks); + } + + public FuzzyBlockMask(Extent extent, BaseBlock... block) { + super(extent, block); + } + + @Override + public boolean test(Vector vector) { + Extent extent = getExtent(); + Collection blocks = getBlocks(); + BaseBlock compare = new BaseBlock(extent.getBlockType(vector), extent.getBlockData(vector)); + return BaseBlock.containsFuzzy(blocks, compare); + } +} diff --git a/src/main/java/com/sk89q/worldedit/masks/DummyMask.java b/src/main/java/com/sk89q/worldedit/function/mask/Mask.java similarity index 73% rename from src/main/java/com/sk89q/worldedit/masks/DummyMask.java rename to src/main/java/com/sk89q/worldedit/function/mask/Mask.java index 0b6ef5c8a..12d9931b5 100644 --- a/src/main/java/com/sk89q/worldedit/masks/DummyMask.java +++ b/src/main/java/com/sk89q/worldedit/function/mask/Mask.java @@ -17,19 +17,21 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.masks; +package com.sk89q.worldedit.function.mask; -import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; /** - * A mask that only returns true. + * Tests whether a given vector meets a criteria. */ -public class DummyMask extends AbstractMask { +public interface Mask { - @Override - public boolean matches(EditSession editSession, Vector pos) { - return true; - } + /** + * Returns true if the criteria is met. + * + * @param vector the vector to test + * @return true if the criteria is met + */ + boolean test(Vector vector); } diff --git a/src/main/java/com/sk89q/worldedit/masks/DummyMask2D.java b/src/main/java/com/sk89q/worldedit/function/mask/Mask2D.java similarity index 73% rename from src/main/java/com/sk89q/worldedit/masks/DummyMask2D.java rename to src/main/java/com/sk89q/worldedit/function/mask/Mask2D.java index cb1e3b19c..e1b12a84f 100644 --- a/src/main/java/com/sk89q/worldedit/masks/DummyMask2D.java +++ b/src/main/java/com/sk89q/worldedit/function/mask/Mask2D.java @@ -17,19 +17,21 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.masks; +package com.sk89q.worldedit.function.mask; -import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector2D; /** - * A mask that only returns true. + * Tests whether a given vector meets a criteria. */ -public class DummyMask2D extends AbstractMask2D { +public interface Mask2D { - @Override - public boolean matches(EditSession editSession, Vector2D position) { - return true; - } + /** + * Returns true if the criteria is met. + * + * @param vector the vector to test + * @return true if the criteria is met + */ + boolean test(Vector2D vector); } diff --git a/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java b/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java new file mode 100644 index 000000000..6c5be470d --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java @@ -0,0 +1,102 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.function.mask; + +import com.sk89q.worldedit.Vector; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Combines several masks and requires that all masks return true + * when a certain position is tested. It serves as a logical AND operation + * on a list of masks. + */ +public class MaskIntersection extends AbstractMask { + + private final Set masks = new HashSet(); + + /** + * Create a new intersection. + * + * @param masks a list of masks + */ + public MaskIntersection(Collection masks) { + checkNotNull(masks); + masks.addAll(masks); + } + + /** + * Create a new intersection. + * + * @param mask a list of masks + */ + public MaskIntersection(Mask... mask) { + this(Arrays.asList(checkNotNull(mask))); + } + + /** + * Add some masks to the list. + * + * @param masks the masks + */ + public void add(Collection masks) { + checkNotNull(masks); + masks.addAll(masks); + } + + /** + * Add some masks to the list. + * + * @param mask the masks + */ + public void add(Mask... mask) { + add(Arrays.asList(checkNotNull(mask))); + } + + /** + * Get the masks that are tested with. + * + * @return the masks + */ + public Collection getMasks() { + return masks; + } + + @Override + public boolean test(Vector vector) { + if (masks.size() == 0) { + return false; + } + + for (Mask mask : masks) { + if (!mask.test(vector)) { + return false; + } + } + + return true; + } + +} diff --git a/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java b/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java new file mode 100644 index 000000000..3ab29c600 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java @@ -0,0 +1,64 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.function.mask; + +import com.sk89q.worldedit.Vector; + +import java.util.Collection; + +/** + * Combines several masks and requires that one or more masks return true + * when a certain position is tested. It serves as a logical OR operation + * on a list of masks. + */ +public class MaskUnion extends MaskIntersection { + + /** + * Create a new union. + * + * @param masks a list of masks + */ + public MaskUnion(Collection masks) { + super(masks); + } + + /** + * Create a new union. + * + * @param mask a list of masks + */ + public MaskUnion(Mask... mask) { + super(mask); + } + + @Override + public boolean test(Vector vector) { + Collection masks = getMasks(); + + for (Mask mask : masks) { + if (mask.test(vector)) { + return true; + } + } + + return false; + } + +} diff --git a/src/main/java/com/sk89q/worldedit/function/mask/Masks.java b/src/main/java/com/sk89q/worldedit/function/mask/Masks.java new file mode 100644 index 000000000..7f8275aeb --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/function/mask/Masks.java @@ -0,0 +1,113 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.function.mask; + +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.Vector2D; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Various utility functions related to {@link Mask} and {@link Mask2D}. + */ +public final class Masks { + + private Masks() { + } + + /** + * Return a 3D mask that always returns true; + * + * @return a mask + */ + public static Mask alwaysTrue() { + return new AbstractMask() { + @Override + public boolean test(Vector vector) { + return true; + } + }; + } + + /** + * Return a 2D mask that always returns true; + * + * @return a mask + */ + public static Mask2D alwaysTrue2D() { + return new AbstractMask2D() { + @Override + public boolean test(Vector2D vector) { + return true; + } + }; + } + + /** + * Negate the given mask. + * + * @param mask the mask + * @return a new mask + */ + public static Mask negate(final Mask mask) { + checkNotNull(mask); + return new AbstractMask() { + @Override + public boolean test(Vector vector) { + return !mask.test(vector); + } + }; + } + + /** + * Negate the given mask. + * + * @param mask the mask + * @return a new mask + */ + public static Mask2D negate(final Mask2D mask) { + checkNotNull(mask); + return new AbstractMask2D() { + @Override + public boolean test(Vector2D vector) { + return !mask.test(vector); + } + }; + } + + /** + * Wrap an old-style mask and convert it to a new mask. + * + * @param editSession the edit session to bind to + * @param mask the old-style mask + * @return a new-style mask + */ + public static Mask wrap(final EditSession editSession, final com.sk89q.worldedit.masks.Mask mask) { + checkNotNull(mask); + return new AbstractMask() { + @Override + public boolean test(Vector vector) { + return mask.matches(editSession, vector); + } + }; + } + +} diff --git a/src/main/java/com/sk89q/worldedit/masks/NoiseFilter.java b/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter.java similarity index 92% rename from src/main/java/com/sk89q/worldedit/masks/NoiseFilter.java rename to src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter.java index 6c5e586a2..3cb815771 100644 --- a/src/main/java/com/sk89q/worldedit/masks/NoiseFilter.java +++ b/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter.java @@ -17,9 +17,8 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.masks; +package com.sk89q.worldedit.function.mask; -import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.math.noise.NoiseGenerator; @@ -86,8 +85,8 @@ public class NoiseFilter extends AbstractMask { } @Override - public boolean matches(EditSession editSession, Vector pos) { - return noiseGenerator.noise(pos) <= density; + public boolean test(Vector vector) { + return noiseGenerator.noise(vector) <= density; } } diff --git a/src/main/java/com/sk89q/worldedit/masks/NoiseFilter2D.java b/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter2D.java similarity index 94% rename from src/main/java/com/sk89q/worldedit/masks/NoiseFilter2D.java rename to src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter2D.java index 2071ce000..8c74b6cb9 100644 --- a/src/main/java/com/sk89q/worldedit/masks/NoiseFilter2D.java +++ b/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter2D.java @@ -17,9 +17,8 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.masks; +package com.sk89q.worldedit.function.mask; -import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector2D; import com.sk89q.worldedit.math.noise.NoiseGenerator; @@ -86,7 +85,7 @@ public class NoiseFilter2D extends AbstractMask2D { } @Override - public boolean matches(EditSession editSession, Vector2D pos) { + public boolean test(Vector2D pos) { return noiseGenerator.noise(pos) <= density; } diff --git a/src/main/java/com/sk89q/worldedit/function/mask/RegionMask.java b/src/main/java/com/sk89q/worldedit/function/mask/RegionMask.java new file mode 100644 index 000000000..42a1d5ff0 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/function/mask/RegionMask.java @@ -0,0 +1,67 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.function.mask; + +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.regions.Region; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * A mask that tests whether given positions are contained within a region. + */ +public class RegionMask extends AbstractMask { + + private Region region; + + /** + * Create a new region mask. + * + * @param region the region + */ + public RegionMask(Region region) { + setRegion(region); + } + + /** + * Get the region. + * + * @return the region + */ + public Region getRegion() { + return region; + } + + /** + * Set the region that positions must be contained within. + * + * @param region the region + */ + public void setRegion(Region region) { + checkNotNull(region); + this.region = region; + } + + @Override + public boolean test(Vector vector) { + return region.contains(vector); + } + +} diff --git a/src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java b/src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java new file mode 100644 index 000000000..fb0607637 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java @@ -0,0 +1,38 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.function.mask; + +import com.sk89q.worldedit.Extent; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.blocks.BlockType; + +public class SolidBlockMask extends AbstractExtentMask { + + public SolidBlockMask(Extent extent) { + super(extent); + } + + @Override + public boolean test(Vector vector) { + Extent extent = getExtent(); + return !BlockType.canPassThrough(extent.getBlockType(vector), extent.getBlockData(vector)); + } + +} diff --git a/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java b/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java index a2764476f..0af12c68e 100644 --- a/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java +++ b/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java @@ -21,8 +21,8 @@ package com.sk89q.worldedit.function.visitor; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.masks.Mask; import com.sk89q.worldedit.function.RegionFunction; +import com.sk89q.worldedit.function.mask.Mask; import java.util.List; diff --git a/src/main/java/com/sk89q/worldedit/function/visitor/LayerVisitor.java b/src/main/java/com/sk89q/worldedit/function/visitor/LayerVisitor.java index 3872f4f4a..a7500ce74 100644 --- a/src/main/java/com/sk89q/worldedit/function/visitor/LayerVisitor.java +++ b/src/main/java/com/sk89q/worldedit/function/visitor/LayerVisitor.java @@ -24,9 +24,9 @@ import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector2D; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.LayerFunction; +import com.sk89q.worldedit.function.mask.Mask2D; +import com.sk89q.worldedit.function.mask.Masks; import com.sk89q.worldedit.function.operation.Operation; -import com.sk89q.worldedit.masks.DummyMask2D; -import com.sk89q.worldedit.masks.Mask2D; import com.sk89q.worldedit.regions.FlatRegion; import static com.google.common.base.Preconditions.checkArgument; @@ -45,7 +45,7 @@ public class LayerVisitor implements Operation { private final EditSession editSession; private final FlatRegion flatRegion; private final LayerFunction function; - private Mask2D mask = new DummyMask2D(); + private Mask2D mask = Masks.alwaysTrue2D(); private int minY; private int maxY; @@ -94,7 +94,7 @@ public class LayerVisitor implements Operation { @Override public Operation resume() throws WorldEditException { for (Vector2D column : flatRegion.asFlatRegion()) { - if (!mask.matches(editSession, column)) { + if (!mask.test(column)) { continue; } diff --git a/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java b/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java index 5e86da7c5..4446c566a 100644 --- a/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java +++ b/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java @@ -21,7 +21,7 @@ package com.sk89q.worldedit.function.visitor; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.masks.Mask; +import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.RegionFunction; /** @@ -45,6 +45,6 @@ public class RecursiveVisitor extends BreadthFirstSearch { if (y < 0 || y > editSession.getWorld().getMaxY()) { return false; } - return mask.matches(editSession, to); + return mask.test(to); } } diff --git a/src/main/java/com/sk89q/worldedit/masks/AbstractMask.java b/src/main/java/com/sk89q/worldedit/masks/AbstractMask.java index 0be57ccab..05525fe9b 100644 --- a/src/main/java/com/sk89q/worldedit/masks/AbstractMask.java +++ b/src/main/java/com/sk89q/worldedit/masks/AbstractMask.java @@ -4,8 +4,13 @@ import com.sk89q.worldedit.LocalPlayer; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.Vector; +/** + * @deprecated Switch to {@link com.sk89q.worldedit.function.mask.AbstractMask} + */ +@Deprecated public abstract class AbstractMask implements Mask { @Override public void prepare(LocalSession session, LocalPlayer player, Vector target) { } + } diff --git a/src/main/java/com/sk89q/worldedit/masks/BlockMask.java b/src/main/java/com/sk89q/worldedit/masks/BlockMask.java index 692501ad7..c6d9a922e 100644 --- a/src/main/java/com/sk89q/worldedit/masks/BlockMask.java +++ b/src/main/java/com/sk89q/worldedit/masks/BlockMask.java @@ -1,7 +1,6 @@ package com.sk89q.worldedit.masks; import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.Extent; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.blocks.BaseBlock; @@ -9,7 +8,11 @@ import java.util.Collection; import java.util.HashSet; import java.util.Set; -public class BlockMask extends ExtentAwareMask { +/** + * @deprecated Use {@link com.sk89q.worldedit.function.mask.BlockMask} + */ +@Deprecated +public class BlockMask extends AbstractMask { private final Set blocks; @@ -43,8 +46,7 @@ public class BlockMask extends ExtentAwareMask { @Override public boolean matches(EditSession editSession, Vector pos) { - Extent extent = getExtent(editSession); - BaseBlock block = extent.getBlock(pos); + BaseBlock block = editSession.getBlock(pos); return blocks.contains(block) || blocks.contains(new BaseBlock(block.getType(), -1)); } diff --git a/src/main/java/com/sk89q/worldedit/masks/CombinedMask.java b/src/main/java/com/sk89q/worldedit/masks/CombinedMask.java index 79eca640b..2a8b0ecd8 100644 --- a/src/main/java/com/sk89q/worldedit/masks/CombinedMask.java +++ b/src/main/java/com/sk89q/worldedit/masks/CombinedMask.java @@ -23,10 +23,15 @@ import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalPlayer; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.function.mask.MaskIntersection; import java.util.ArrayList; import java.util.List; +/** + * @deprecated See {@link MaskIntersection} + */ +@Deprecated public class CombinedMask extends AbstractMask { private final List masks = new ArrayList(); diff --git a/src/main/java/com/sk89q/worldedit/masks/DynamicRegionMask.java b/src/main/java/com/sk89q/worldedit/masks/DynamicRegionMask.java index bb4536df1..d55d6cee2 100644 --- a/src/main/java/com/sk89q/worldedit/masks/DynamicRegionMask.java +++ b/src/main/java/com/sk89q/worldedit/masks/DynamicRegionMask.java @@ -7,7 +7,7 @@ import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.regions.Region; -public class DynamicRegionMask implements Mask { +public class DynamicRegionMask extends AbstractMask { private Region region; @Override diff --git a/src/main/java/com/sk89q/worldedit/masks/ExistingBlockMask.java b/src/main/java/com/sk89q/worldedit/masks/ExistingBlockMask.java index 8a536195f..09c4231d0 100644 --- a/src/main/java/com/sk89q/worldedit/masks/ExistingBlockMask.java +++ b/src/main/java/com/sk89q/worldedit/masks/ExistingBlockMask.java @@ -23,9 +23,13 @@ import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.blocks.BlockID; -public class ExistingBlockMask extends ExtentAwareMask { +/** + * @deprecated See {@link com.sk89q.worldedit.function.mask.ExistingBlockMask} + */ +@Deprecated +public class ExistingBlockMask extends AbstractMask { @Override public boolean matches(EditSession editSession, Vector pos) { - return getExtent(editSession).getBlockType(pos) != BlockID.AIR; + return editSession.getBlockType(pos) != BlockID.AIR; } } diff --git a/src/main/java/com/sk89q/worldedit/masks/ExtentAwareMask.java b/src/main/java/com/sk89q/worldedit/masks/ExtentAwareMask.java deleted file mode 100644 index 4b86f9d25..000000000 --- a/src/main/java/com/sk89q/worldedit/masks/ExtentAwareMask.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.masks; - -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.Extent; - -/** - * Extended by masks to make them potentially use an {@link Extent} rather than - * the {@link EditSession}. - *

- * At the moment, masks are coupled to {@link EditSession} when they should - * not be. However, because a change to {@link Mask} would cause massive breakage in - * the API, that change is deferred until further notice and this class exists as - * an opt-in mixin for adding support for {@link Extent}s. - */ -public abstract class ExtentAwareMask extends AbstractMask { - - private Extent extent; - - /** - * Get the extent that will be used for lookups. - * - * @return the extent, or null if the {@link EditSession} is to be used - */ - public Extent getExtent() { - return extent; - } - - /** - * Set the extent that will be used for lookups. - * - * @param extent the extent, or null if the {@link EditSession} is to be used - */ - public void setExtent(Extent extent) { - this.extent = extent; - } - - /** - * Get the extent to use for operations. Subclasses should call this method - * rather than access the passed {@link EditSession} directly. - * - * @param editSession the passed in {@link EditSession} - * @return an extent - */ - protected Extent getExtent(EditSession editSession) { - if (extent != null) { - return extent; - } else { - return editSession; - } - } - -} diff --git a/src/main/java/com/sk89q/worldedit/masks/FuzzyBlockMask.java b/src/main/java/com/sk89q/worldedit/masks/FuzzyBlockMask.java index fe35ec30f..e350802f8 100644 --- a/src/main/java/com/sk89q/worldedit/masks/FuzzyBlockMask.java +++ b/src/main/java/com/sk89q/worldedit/masks/FuzzyBlockMask.java @@ -20,7 +20,6 @@ package com.sk89q.worldedit.masks; import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.Extent; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.blocks.BaseBlock; @@ -28,10 +27,10 @@ import java.util.HashSet; import java.util.Set; /** - * Uses {@link BaseBlock#containsFuzzy(java.util.Collection, BaseBlock)} to - * match blocks. + * @deprecated See {@link com.sk89q.worldedit.function.mask.FuzzyBlockMask} */ -public class FuzzyBlockMask extends ExtentAwareMask { +@Deprecated +public class FuzzyBlockMask extends AbstractMask { private final Set filter; @@ -59,8 +58,7 @@ public class FuzzyBlockMask extends ExtentAwareMask { @Override public boolean matches(EditSession editSession, Vector pos) { - Extent extent = getExtent(editSession); - BaseBlock compare = new BaseBlock(extent.getBlockType(pos), extent.getBlockData(pos)); + BaseBlock compare = new BaseBlock(editSession.getBlockType(pos), editSession.getBlockData(pos)); return BaseBlock.containsFuzzy(filter, compare); } } diff --git a/src/main/java/com/sk89q/worldedit/masks/InvertedMask.java b/src/main/java/com/sk89q/worldedit/masks/InvertedMask.java index 9ffc5213e..b84113790 100644 --- a/src/main/java/com/sk89q/worldedit/masks/InvertedMask.java +++ b/src/main/java/com/sk89q/worldedit/masks/InvertedMask.java @@ -4,7 +4,12 @@ import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalPlayer; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.function.mask.Masks; +/** + * @deprecated See {@link Masks#negate(com.sk89q.worldedit.function.mask.Mask)} + */ +@Deprecated public class InvertedMask extends AbstractMask { private final Mask mask; diff --git a/src/main/java/com/sk89q/worldedit/masks/Mask.java b/src/main/java/com/sk89q/worldedit/masks/Mask.java index ce18cbece..aab2b8b36 100644 --- a/src/main/java/com/sk89q/worldedit/masks/Mask.java +++ b/src/main/java/com/sk89q/worldedit/masks/Mask.java @@ -25,13 +25,9 @@ import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.Vector; /** - * Base matcher for the block filtering framework. Implementing classes - * can be used to filter blocks to set or replace. - *

- * Do NOT implement this interface. Extend {@link AbstractMask} instead. - * - * @author sk89q + * @deprecated Use {@link com.sk89q.worldedit.function.mask.Mask} */ +@Deprecated public interface Mask { /** diff --git a/src/main/java/com/sk89q/worldedit/masks/RandomMask.java b/src/main/java/com/sk89q/worldedit/masks/RandomMask.java index 65c71af47..4b8374388 100644 --- a/src/main/java/com/sk89q/worldedit/masks/RandomMask.java +++ b/src/main/java/com/sk89q/worldedit/masks/RandomMask.java @@ -2,7 +2,12 @@ package com.sk89q.worldedit.masks; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.function.mask.NoiseFilter; +/** + * @deprecated See {@link NoiseFilter} + */ +@Deprecated public class RandomMask extends AbstractMask { private final double ratio; diff --git a/src/main/java/com/sk89q/worldedit/masks/RegionMask.java b/src/main/java/com/sk89q/worldedit/masks/RegionMask.java index b734e7ae3..a8e1e65fc 100644 --- a/src/main/java/com/sk89q/worldedit/masks/RegionMask.java +++ b/src/main/java/com/sk89q/worldedit/masks/RegionMask.java @@ -23,6 +23,10 @@ import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.regions.Region; +/** + * @deprecated See {@link com.sk89q.worldedit.function.mask.RegionMask} + */ +@Deprecated public class RegionMask extends AbstractMask { private final Region region; diff --git a/src/main/java/com/sk89q/worldedit/masks/SolidBlockMask.java b/src/main/java/com/sk89q/worldedit/masks/SolidBlockMask.java index 9414cfaf8..fda252825 100644 --- a/src/main/java/com/sk89q/worldedit/masks/SolidBlockMask.java +++ b/src/main/java/com/sk89q/worldedit/masks/SolidBlockMask.java @@ -1,17 +1,16 @@ package com.sk89q.worldedit.masks; import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.Extent; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.blocks.BlockType; /** - * Works like {@link ExistingBlockMask}, except also dealing with non-solid non-air blocks the same way as with air. + * @deprecated See {@link com.sk89q.worldedit.function.mask.SolidBlockMask} */ -public class SolidBlockMask extends ExtentAwareMask { +@Deprecated +public class SolidBlockMask extends AbstractMask { @Override public boolean matches(EditSession editSession, Vector pos) { - Extent extent = getExtent(editSession); - return !BlockType.canPassThrough(extent.getBlockType(pos), extent.getBlockData(pos)); + return !BlockType.canPassThrough(editSession.getBlockType(pos), editSession.getBlockData(pos)); } }