Use fuzzy blocks in default block parser

This commit is contained in:
Jesse Boyd 2019-05-07 16:40:37 +10:00
parent 55b02e1b1f
commit 113aeb1689
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
3 changed files with 43 additions and 13 deletions

View File

@ -47,6 +47,7 @@ import com.sk89q.worldedit.extent.inventory.BlockBag;
import com.sk89q.worldedit.extent.inventory.SlottableBlockBag; import com.sk89q.worldedit.extent.inventory.SlottableBlockBag;
import com.sk89q.worldedit.internal.registry.InputParser; import com.sk89q.worldedit.internal.registry.InputParser;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.registry.state.Property;
import com.sk89q.worldedit.util.HandSide; import com.sk89q.worldedit.util.HandSide;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
@ -54,9 +55,11 @@ import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.BlockTypes;
import com.sk89q.worldedit.world.block.FuzzyBlockState;
import com.sk89q.worldedit.world.registry.LegacyMapper; import com.sk89q.worldedit.world.registry.LegacyMapper;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -249,10 +252,28 @@ public class DefaultBlockParser extends InputParser<BaseBlock> {
throw new NoMatchException(BBC.getPrefix() + "Does not match a valid block type: '" + input + "'"); throw new NoMatchException(BBC.getPrefix() + "Does not match a valid block type: '" + input + "'");
} }
} }
// if (nbt == null) nbt = state.getNbtData(); if (nbt == null) nbt = state.getNbtData();
if (stateString != null) { if (stateString != null) {
state = BlockState.get(state.getBlockType(), "[" + stateString + "]", state); state = BlockState.get(state.getBlockType(), "[" + stateString + "]", state);
if (context.isPreferringWildcard()) {
if (stateString.isEmpty()) {
state = new FuzzyBlockState(state);
} else {
BlockType type = state.getBlockType();
FuzzyBlockState.Builder fuzzyBuilder = FuzzyBlockState.builder();
fuzzyBuilder.type(type);
String[] entries = stateString.split(",");
for (String entry : entries) {
String[] split = entry.split("=");
String key = split[0];
String val = split[1];
Property<Object> prop = type.getProperty(key);
fuzzyBuilder.withProperty(prop, prop.getValueFor(val));
}
state = fuzzyBuilder.build();
}
}
} }
} }

View File

@ -174,7 +174,7 @@ public class DefaultMaskParser extends FaweParser<Mask> {
} catch (InputParseException ignore) {} } catch (InputParseException ignore) {}
} }
if (mask == null) { if (mask == null) {
context.setPreferringWildcard(true); context.setPreferringWildcard(false);
context.setRestricted(false); context.setRestricted(false);
BlockStateHolder block = worldEdit.getBlockFactory().parseFromInput(full, context); BlockStateHolder block = worldEdit.getBlockFactory().parseFromInput(full, context);
builder.add(block); builder.add(block);

View File

@ -37,20 +37,24 @@ import java.util.Objects;
*/ */
public class FuzzyBlockState extends BlockState { public class FuzzyBlockState extends BlockState {
private final Map<PropertyKey, Object> state; private final Map<PropertyKey, Object> props;
FuzzyBlockState(BlockType blockType) { public FuzzyBlockState(BlockType blockType) {
this(blockType, null); this(blockType.getDefaultState(), null);
} }
private FuzzyBlockState(BlockType blockType, Map<Property<?>, Object> values) { public FuzzyBlockState(BlockState state) {
super(blockType, blockType.getDefaultState().getInternalId(), blockType.getDefaultState().getOrdinal()); this(state, null);
}
private FuzzyBlockState(BlockState state, Map<Property<?>, Object> values) {
super(state.getBlockType(), state.getInternalId(), state.getOrdinal());
if (values == null || values.isEmpty()) { if (values == null || values.isEmpty()) {
state = Collections.emptyMap(); props = Collections.emptyMap();
} else { } else {
state = new HashMap<>(values.size()); props = new HashMap<>(values.size());
for (Map.Entry<Property<?>, Object> entry : values.entrySet()) { for (Map.Entry<Property<?>, Object> entry : values.entrySet()) {
state.put(entry.getKey().getKey(), entry.getValue()); props.put(entry.getKey().getKey(), entry.getValue());
} }
} }
} }
@ -76,8 +80,8 @@ public class FuzzyBlockState extends BlockState {
if (!getBlockType().equals(o.getBlockType())) { if (!getBlockType().equals(o.getBlockType())) {
return false; return false;
} }
if (!state.isEmpty()) { if (!props.isEmpty()) {
for (Map.Entry<PropertyKey, Object> entry : state.entrySet()) { for (Map.Entry<PropertyKey, Object> entry : props.entrySet()) {
if (!Objects.equals(o.getState(entry.getKey()), entry.getValue())) { if (!Objects.equals(o.getState(entry.getKey()), entry.getValue())) {
return false; return false;
} }
@ -86,6 +90,11 @@ public class FuzzyBlockState extends BlockState {
return true; return true;
} }
@Override
public BaseBlock toBaseBlock() {
return new BaseBlock();
}
@Override @Override
public BlockState toImmutableState() { public BlockState toImmutableState() {
return getFullState(); return getFullState();
@ -158,7 +167,7 @@ public class FuzzyBlockState extends BlockState {
if (values.isEmpty()) { if (values.isEmpty()) {
return type.getFuzzyMatcher(); return type.getFuzzyMatcher();
} }
return new FuzzyBlockState(type, values); return new FuzzyBlockState(type.getDefaultState(), values);
} }
/** /**