From fdc3cd56f79998c903c77c95ef0d7be2f2b10743 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Thu, 30 Aug 2018 14:51:38 +1000 Subject: [PATCH] Add a mask for block categories. Eg, you can now do //replace ##wool minecraft:sand to replace all wool with sand --- .../extension/factory/DefaultMaskParser.java | 15 +++++- .../function/mask/BlockCategoryMask.java | 53 +++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockCategoryMask.java diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultMaskParser.java index cf0565739..981e60800 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultMaskParser.java @@ -28,6 +28,7 @@ import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.BiomeMask2D; +import com.sk89q.worldedit.function.mask.BlockCategoryMask; import com.sk89q.worldedit.function.mask.BlockMask; import com.sk89q.worldedit.function.mask.ExistingBlockMask; import com.sk89q.worldedit.function.mask.ExpressionMask; @@ -47,6 +48,8 @@ import com.sk89q.worldedit.session.request.Request; import com.sk89q.worldedit.session.request.RequestSelection; import com.sk89q.worldedit.world.biome.BaseBiome; import com.sk89q.worldedit.world.biome.Biomes; +import com.sk89q.worldedit.world.block.BlockCategories; +import com.sk89q.worldedit.world.block.BlockCategory; import com.sk89q.worldedit.world.registry.BiomeRegistry; import java.util.ArrayList; @@ -111,8 +114,16 @@ class DefaultMaskParser extends InputParser { } catch (IncompleteRegionException e) { throw new InputParseException("Please make a selection first."); } + } else if (component.startsWith("##")) { + // This means it's a tag mask. + BlockCategory category = BlockCategories.get(component.substring(2).toLowerCase()); + if (category == null) { + throw new NoMatchException("Unrecognised tag '" + component.substring(2) + '\''); + } else { + return new BlockCategoryMask(extent, category); + } } else { - throw new NoMatchException("Unrecognized mask '" + component + "'"); + throw new NoMatchException("Unrecognized mask '" + component + '\''); } case '>': @@ -135,7 +146,7 @@ class DefaultMaskParser extends InputParser { for (String biomeName : biomesList) { BaseBiome biome = Biomes.findBiomeByName(knownBiomes, biomeName, biomeRegistry); if (biome == null) { - throw new InputParseException("Unknown biome '" + biomeName + "'"); + throw new InputParseException("Unknown biome '" + biomeName + '\''); } biomes.add(biome); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockCategoryMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockCategoryMask.java new file mode 100644 index 000000000..fae7888a0 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockCategoryMask.java @@ -0,0 +1,53 @@ +/* + * 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 Lesser 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 Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.function.mask; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.world.block.BlockCategory; + +import javax.annotation.Nullable; + +/** + * A mask that tests whether a block matches a given {@link BlockCategory}, or tag. + */ +public class BlockCategoryMask extends AbstractExtentMask { + + private BlockCategory category; + + public BlockCategoryMask(Extent extent, BlockCategory category) { + super(extent); + checkNotNull(category); + this.category = category; + } + + @Override + public boolean test(Vector vector) { + return category.contains(getExtent().getBlock(vector)); + } + + @Nullable + @Override + public Mask2D toMask2D() { + return null; + } +}