From 0c539b4e8412d9a225dcec3acf917c429f686e16 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 6 May 2020 15:50:57 +0100 Subject: [PATCH] Fix replace patterns Fixes #445 #440 #372 --- .../factory/parser/DefaultBlockParser.java | 33 ++++++++++--------- .../worldedit/function/mask/BlockMask.java | 9 ++++- .../world/block/FuzzyBlockState.java | 25 +++++++++++--- 3 files changed, 46 insertions(+), 21 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java index 19bc026b6..659760670 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java @@ -237,6 +237,7 @@ public class DefaultBlockParser extends InputParser { private BaseBlock parseLogic(String input, ParserContext context) throws InputParseException { String[] blockAndExtraData = input.trim().split("\\|", 2); blockAndExtraData[0] = woolMapper(blockAndExtraData[0]); + Map, Object> blockStates = new HashMap<>(); BlockState state = null; @@ -287,6 +288,10 @@ public class DefaultBlockParser extends InputParser { } stateString = blockAndExtraData[0].substring(stateStart + 1, blockAndExtraData[0].length() - 1); } + String[] stateProperties = EMPTY_STRING_ARRAY; + if(stateString != null) { + stateProperties = stateString.split(","); + } if (typeString.isEmpty()) { throw new InputParseException("Invalid format"); } @@ -319,7 +324,7 @@ public class DefaultBlockParser extends InputParser { } Player player = (Player) actor; BlockBag bag = player.getInventoryBlockBag(); - if (bag == null || !(bag instanceof SlottableBlockBag)) { + if (!(bag instanceof SlottableBlockBag)) { throw new InputParseException("Unsupported!"); } SlottableBlockBag slottable = (SlottableBlockBag) bag; @@ -341,25 +346,21 @@ public class DefaultBlockParser extends InputParser { "Does not match a valid block type: '" + input + "'"); } } - if (nbt == null) nbt = state.getNbtData(); - - if (stateString != null) { - state = BlockState.get(state.getBlockType(), "[" + stateString + "]", state); + if (nbt == null) { + nbt = state.getNbtData(); } + + blockStates.putAll(parseProperties(state.getBlockType(), stateProperties, context)); if (context.isPreferringWildcard()) { if (stateString == null || stateString.isEmpty()) { state = new FuzzyBlockState(state); } else { - BlockType blockType = state.getBlockType(); FuzzyBlockState.Builder fuzzyBuilder = FuzzyBlockState.builder(); - fuzzyBuilder.type(blockType); - String[] entries = stateString.split(","); - for (String entry : entries) { - String[] split = entry.split("="); - String key = split[0]; - String val = split[1]; - Property prop = blockType.getProperty(key); - fuzzyBuilder.withProperty(prop, prop.getValueFor(val)); + fuzzyBuilder.type(state.getBlockType()); + for (Map.Entry, Object> blockState : blockStates.entrySet()) { + @SuppressWarnings("unchecked") + Property objProp = (Property) blockState.getKey(); + fuzzyBuilder.withProperty(objProp, blockState.getValue()); } state = fuzzyBuilder.build(); } @@ -390,7 +391,9 @@ public class DefaultBlockParser extends InputParser { } } - if (nbt != null) return validate(context, state.toBaseBlock(nbt)); + if (nbt != null) { + return validate(context, state.toBaseBlock(nbt)); + } if (blockType == BlockTypes.SIGN || blockType == BlockTypes.WALL_SIGN || BlockCategories.SIGNS.contains(blockType)) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java index bcb8f8775..550d95adf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java @@ -29,6 +29,7 @@ import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.BlockTypesCache; +import com.sk89q.worldedit.world.block.ImmutableBaseBlock; import java.util.Arrays; import java.util.Collection; @@ -154,7 +155,13 @@ public class BlockMask extends ABlockMask { public void add(Collection blocks) { checkNotNull(blocks); for (BaseBlock block : blocks) { - add(block.toBlockState()); + if (block instanceof ImmutableBaseBlock) { + for (BlockState state : block.getBlockType().getAllStates()) { + ordinals[state.getOrdinal()] = true; + } + } else { + add(block.toBlockState()); + } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java index 1d99baae7..1fc5c2a06 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java @@ -19,8 +19,6 @@ package com.sk89q.worldedit.world.block; -import static com.google.common.base.Preconditions.checkNotNull; - import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.registry.state.PropertyKey; @@ -29,6 +27,8 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; +import static com.google.common.base.Preconditions.checkNotNull; + /** * A Fuzzy BlockState. Used for partial matching. * @@ -37,6 +37,7 @@ import java.util.Objects; public class FuzzyBlockState extends BlockState { private final Map props; + private final Map, Object> values; FuzzyBlockState(BlockType blockType) { this(blockType.getDefaultState(), null); @@ -50,12 +51,15 @@ public class FuzzyBlockState extends BlockState { super(state.getBlockType(), state.getInternalId(), state.getOrdinal()); if (values == null || values.isEmpty()) { props = Collections.emptyMap(); + this.values = Collections.emptyMap(); } else { props = new HashMap<>(values.size()); for (Map.Entry, Object> entry : values.entrySet()) { props.put(entry.getKey().getKey(), entry.getValue()); } + this.values = new HashMap<>(values); } + } /** @@ -89,9 +93,15 @@ public class FuzzyBlockState extends BlockState { return true; } - @Override - public BaseBlock toBaseBlock() { - return new BaseBlock(this); + @Override public BaseBlock toBaseBlock() { + if (props == null || props.isEmpty()) { + return super.toBaseBlock(); + } + BlockState state = this; + for (Map.Entry entry : props.entrySet()) { + state = state.with(entry.getKey(), entry.getValue()); + } + return new BaseBlock(state); } @Override @@ -99,6 +109,11 @@ public class FuzzyBlockState extends BlockState { return getFullState(); } + @Override + public Map, Object> getStates() { + return values; + } + /** * Gets an instance of a builder. *