From 6b5f218809e4aad4011e405a4074e9ea4778ce8a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Wed, 18 Jul 2018 00:42:09 +1000 Subject: [PATCH] Basically finish the state system. Just 1 more bug that I'm encountering. --- .../worldedit/bukkit/BukkitBlockRegistry.java | 15 ++----- .../worldedit/bukkit/WorldEditPlugin.java | 7 ++-- .../bukkit/adapter/BukkitImplAdapter.java | 10 ----- .../bukkit/adapter/impl/Spigot_v1_13_R1.class | Bin 18415 -> 19401 bytes .../java/com/sk89q/worldedit/WorldEdit.java | 12 ++++-- .../extension/factory/DefaultBlockParser.java | 6 +-- .../extension/platform/PlatformManager.java | 3 ++ .../transform/BlockTransformExtent.java | 24 ++++-------- .../registry/state/AbstractProperty.java | 12 ++++-- .../registry/state/BooleanProperty.java | 11 ++++-- .../registry/state/DirectionalProperty.java | 18 +++++---- .../registry/state/EnumProperty.java | 10 +++-- .../registry/state/IntegerProperty.java | 15 +++++-- .../worldedit/registry/state/Property.java | 3 +- .../worldedit/world/block/BlockState.java | 35 ++++++++++++++++- .../worldedit/world/block/BlockType.java | 37 +++++++++++++++++- .../world/registry/BlockRegistry.java | 13 +----- .../world/registry/BundledBlockData.java | 5 ++- .../world/registry/BundledBlockRegistry.java | 10 +---- .../world/registry/BundledItemData.java | 5 ++- .../world/registry/LegacyMapper.java | 5 ++- 21 files changed, 158 insertions(+), 98 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java index 0b880cb18..8c3ef7c9d 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java @@ -28,7 +28,6 @@ import com.sk89q.worldedit.world.registry.PassthroughBlockMaterial; import org.bukkit.Material; import java.util.EnumMap; -import java.util.List; import java.util.Map; import javax.annotation.Nullable; @@ -39,17 +38,9 @@ public class BukkitBlockRegistry extends BundledBlockRegistry { @Nullable @Override - public BlockMaterial getMaterial(String id) { - return materialMap.computeIfAbsent(BukkitUtil.toMaterial(BlockTypes.get(id)), - material -> new BukkitBlockMaterial(BukkitBlockRegistry.super.getMaterial(id), material)); - } - - @Override - public List getPropertyValues(BlockType blockType, Property property) { - if (WorldEditPlugin.getInstance().getBukkitImplAdapter() != null) { - return WorldEditPlugin.getInstance().getBukkitImplAdapter().getPropertyValues(blockType, property); - } - return super.getPropertyValues(blockType, property); + public BlockMaterial getMaterial(BlockType blockType) { + return materialMap.computeIfAbsent(BukkitUtil.toMaterial(blockType), + material -> new BukkitBlockMaterial(BukkitBlockRegistry.super.getMaterial(blockType), material)); } @Nullable diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index 0122352ae..cbd56f920 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -82,12 +82,13 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { WorldEdit worldEdit = WorldEdit.getInstance(); - loadConfig(); // Load configuration - PermissionsResolverManager.initialize(this); // Setup permission resolver - // Setup platform server = new BukkitServerInterface(this, getServer()); worldEdit.getPlatformManager().register(server); + worldEdit.loadMappings(); + + loadConfig(); // Load configuration + PermissionsResolverManager.initialize(this); // Setup permission resolver // Register CUI getServer().getMessenger().registerIncomingPluginChannel(this, CUI_PLUGIN_CHANNEL, new CUIChannelListener(this)); diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java index 942bbe625..359ddd90d 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -28,7 +28,6 @@ import org.bukkit.Location; import org.bukkit.block.Biome; import org.bukkit.entity.Entity; -import java.util.List; import java.util.Map; import javax.annotation.Nullable; @@ -95,15 +94,6 @@ public interface BukkitImplAdapter { @Nullable Entity createEntity(Location location, BaseEntity state); - - /** - * Get a list of values for a property. - * - * @param property The property - * @return The list of values - */ - List getPropertyValues(BlockType blockType, Property property); - /** * Get a map of string -> properties * diff --git a/worldedit-bukkit/src/main/resources/com/sk89q/worldedit/bukkit/adapter/impl/Spigot_v1_13_R1.class b/worldedit-bukkit/src/main/resources/com/sk89q/worldedit/bukkit/adapter/impl/Spigot_v1_13_R1.class index a9885edc5c58c176413f963ba7e23d01aedd9376..f2101f1559f9d3bb1dd4501eda74693cdb116743 100644 GIT binary patch delta 7831 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 ehsCQ3iB;mQ7VA| delta 6664 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 S63@3s;C~b3OZmEI^8WxAZS4vG diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java b/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java index 4232679c0..5880047d8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java @@ -100,9 +100,6 @@ public class WorldEdit { static { WorldEditPrefixHandler.register("com.sk89q.worldedit"); getVersion(); - BundledBlockData.getInstance(); // Load block registry - BundledItemData.getInstance(); // Load item registry - LegacyMapper.getInstance(); // Load item registry } private WorldEdit() { @@ -283,6 +280,15 @@ public class WorldEdit { } } + /** + * Load the bundled mappings. + */ + public void loadMappings() { + BundledBlockData.getInstance(); // Load block registry + BundledItemData.getInstance(); // Load item registry + LegacyMapper.getInstance(); // Load item registry + } + /** * Checks to see if the specified radius is within bounds. * diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultBlockParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultBlockParser.java index 9ed05da68..34c61bb26 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultBlockParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultBlockParser.java @@ -45,7 +45,6 @@ import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; @@ -78,7 +77,6 @@ class DefaultBlockParser extends InputParser { public BlockStateHolder parseFromInput(String input, ParserContext context) throws InputParseException { String originalInput = input; - input = input.replace("_", " "); input = input.replace(";", "|"); Exception suppressed = null; try { @@ -162,8 +160,7 @@ class DefaultBlockParser extends InputParser { throw new NoMatchException("Bad state format in " + parseableData); } - Property propertyKey = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.GAME_HOOKS) - .getRegistries().getBlockRegistry().getProperties(state.getBlockType()).get(parts[0]); + Property propertyKey = state.getBlockType().getPropertyMap().get(parts[0]); if (propertyKey == null) { throw new NoMatchException("Unknown state " + parts[0] + " for block " + state.getBlockType().getName()); } @@ -176,6 +173,7 @@ class DefaultBlockParser extends InputParser { } catch (NoMatchException e) { throw e; // Pass-through } catch (Exception e) { + e.printStackTrace(); throw new NoMatchException("Unknown state '" + parseableData + "'"); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java index 356ad5c58..95c202455 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java @@ -165,6 +165,9 @@ public class PlatformManager { if (platform != null) { return platform; } else { + if (preferences.isEmpty()) { + return platforms.get(0); // Use the first available if preferences have not been decided yet. + } throw new NoCapablePlatformException("No platform was found supporting " + capability.name()); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java index 81d2ed272..4ff6771c4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java @@ -22,20 +22,17 @@ package com.sk89q.worldedit.extent.transform; import static com.google.common.base.Preconditions.checkNotNull; import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.LazyBlock; -import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.block.BlockStateHolder; -import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.registry.state.DirectionalProperty; import com.sk89q.worldedit.registry.state.Property; - -import java.util.Map; +import com.sk89q.worldedit.util.Direction; +import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.world.block.BlockStateHolder; import javax.annotation.Nullable; @@ -127,14 +124,7 @@ public class BlockTransformExtent extends AbstractDelegateExtent { checkNotNull(block); checkNotNull(transform); - Map states = WorldEdit.getInstance().getPlatformManager() - .queryCapability(Capability.GAME_HOOKS).getRegistries().getBlockRegistry().getProperties(block.getBlockType()); - - if (states == null) { - return changedBlock; - } - - for (Property property : states.values()) { + for (Property property : block.getBlockType().getProperties()) { if (property instanceof DirectionalProperty) { Vector value = (Vector) block.getState(property); if (value != null) { @@ -164,11 +154,11 @@ public class BlockTransformExtent extends AbstractDelegateExtent { double closest = -2; boolean found = false; - for (Vector v : state.getValues()) { - double dot = v.normalize().dot(newDirection); + for (Direction v : state.getValues()) { + double dot = v.toVector().normalize().dot(newDirection); if (dot >= closest) { closest = dot; - newValue = v; + newValue = v.toVector(); found = true; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java index 91589ea84..1168db403 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java @@ -21,15 +21,21 @@ package com.sk89q.worldedit.registry.state; import static com.google.common.base.Preconditions.checkState; +import java.util.List; + public abstract class AbstractProperty implements Property { private String name; + private List values; - public AbstractProperty() { + public AbstractProperty(final String name, final List values) { + this.name = name; + this.values = values; } - public AbstractProperty(final String name) { - this.name = name; + @Override + public List getValues() { + return this.values; } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/BooleanProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/BooleanProperty.java index 4acb12f7d..b6502f3ff 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/BooleanProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/BooleanProperty.java @@ -25,14 +25,17 @@ import javax.annotation.Nullable; public class BooleanProperty extends AbstractProperty { - @Override - public List getValues() { - return null; + public BooleanProperty(final String name, final List values) { + super(name, values); } @Nullable @Override public Boolean getValueFor(String string) { - return null; + boolean val = Boolean.parseBoolean(string); + if (!getValues().contains(val)) { + throw new IllegalArgumentException("Invalid boolean value: " + string + ". Must be in " + getValues().toString()); + } + return val; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/DirectionalProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/DirectionalProperty.java index e29a7cc75..ef41a8c0c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/DirectionalProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/DirectionalProperty.java @@ -19,21 +19,25 @@ package com.sk89q.worldedit.registry.state; -import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.util.Direction; import java.util.List; import javax.annotation.Nullable; -public class DirectionalProperty extends AbstractProperty { - @Override - public List getValues() { - return null; +public class DirectionalProperty extends AbstractProperty { + + public DirectionalProperty(final String name, final List values) { + super(name, values); } @Nullable @Override - public Vector getValueFor(final String string) { - return null; + public Direction getValueFor(final String string) { + Direction direction = Direction.valueOf(string); + if (!getValues().contains(direction)) { + throw new IllegalArgumentException("Invalid direction value: " + string + ". Must be in " + getValues().toString()); + } + return direction; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/EnumProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/EnumProperty.java index 37d3bfe20..d593eb062 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/EnumProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/EnumProperty.java @@ -25,14 +25,16 @@ import javax.annotation.Nullable; public class EnumProperty extends AbstractProperty { - @Override - public List getValues() { - return null; + public EnumProperty(final String name, final List values) { + super(name, values); } @Nullable @Override public String getValueFor(String string) { - return null; + if (!getValues().contains(string)) { + throw new IllegalArgumentException("Invalid value: " + string + ". Must be in " + getValues().toString()); + } + return string; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java index bc08a33ee..fe7b7b7de 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java @@ -25,14 +25,21 @@ import javax.annotation.Nullable; public class IntegerProperty extends AbstractProperty { - @Override - public List getValues() { - return null; + public IntegerProperty(final String name, final List values) { + super(name, values); } @Nullable @Override public Integer getValueFor(String string) { - return null; + try { + int val = Integer.parseInt(string); + if (!getValues().contains(val)) { + throw new IllegalArgumentException("Invalid int value: " + string + ". Must be in " + getValues().toString()); + } + return val; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid int value: " + string + ". Not an int."); + } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/Property.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/Property.java index 069b279c5..856bdd850 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/Property.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/Property.java @@ -50,7 +50,8 @@ public interface Property { * * @param string The string * @return The value, or null + * @throws IllegalArgumentException When the value is invalid. */ @Nullable - T getValueFor(String string); + T getValueFor(String string) throws IllegalArgumentException; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java index 5297179f2..3430e431e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java @@ -21,6 +21,7 @@ package com.sk89q.worldedit.world.block; import com.google.common.collect.ArrayTable; import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Table; import com.sk89q.worldedit.registry.state.Property; @@ -28,8 +29,10 @@ import com.sk89q.worldedit.registry.state.Property; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * An immutable class that represents the state a block can be in. @@ -46,7 +49,7 @@ public class BlockState implements BlockStateHolder { BlockState(BlockType blockType) { this.blockType = blockType; - this.values = new HashMap<>(); + this.values = new LinkedHashMap<>(); this.fuzzy = false; } @@ -62,6 +65,34 @@ public class BlockState implements BlockStateHolder { this.fuzzy = true; } + public static Map, Object>, BlockState> generateStateMap(BlockType blockType) { + List properties = blockType.getProperties(); + List> valueLists = Lists.cartesianProduct(properties.stream().map(Property::getValues).collect(Collectors.toList())); + Map, Object>, BlockState> stateMap = new LinkedHashMap<>(); + for (int i = 0; i < valueLists.size(); i++) { + List valueList = valueLists.get(i); + Property property = properties.get(i); + LinkedHashMap, Object> valueMap = new LinkedHashMap<>(); + BlockState stateMaker = new BlockState(blockType); + for (Object value : valueList) { + valueMap.put(property, value); + stateMaker.setState(property, value); + } + stateMap.put(valueMap, stateMaker); + } + + if (stateMap.isEmpty()) { + // No properties. + stateMap.put(new LinkedHashMap<>(), new BlockState(blockType)); + } + + for (BlockState state : stateMap.values()) { + state.populate(stateMap); + } + + return stateMap; + } + public void populate(Map, Object>, BlockState> stateMap) { final Table, Object, BlockState> states = HashBasedTable.create(); @@ -154,7 +185,7 @@ public class BlockState implements BlockStateHolder { * @param value The value * @return The blockstate, for chaining */ - private BlockState setState(final Property property, final V value) { + private BlockState setState(final Property property, final Object value) { this.values.put(property, value); return this; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java index 3dc01ea1a..70584f54a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java @@ -19,15 +19,21 @@ package com.sk89q.worldedit.world.block; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.blocks.BlockMaterial; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.registry.NamespacedRegistry; +import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.registry.BundledBlockData; import com.sk89q.worldedit.world.registry.LegacyMapper; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import java.util.function.Function; import javax.annotation.Nullable; @@ -38,6 +44,8 @@ public class BlockType { private String id; private BlockState defaultState; + private Map properties; + private BlockMaterial blockMaterial; public BlockType(String id) { this(id, null); @@ -49,7 +57,7 @@ public class BlockType { id = "minecraft:" + id; } this.id = id; - this.defaultState = new BlockState(this); + this.defaultState = new ArrayList<>(BlockState.generateStateMap(this).values()).get(0); if (values != null) { this.defaultState = values.apply(this.defaultState); } @@ -78,6 +86,28 @@ public class BlockType { } } + /** + * Gets the properties of this BlockType in a key->property mapping. + * + * @return The properties map + */ + public Map getPropertyMap() { + if (properties == null) { + properties = ImmutableMap.copyOf(WorldEdit.getInstance().getPlatformManager() + .queryCapability(Capability.GAME_HOOKS).getRegistries().getBlockRegistry().getProperties(this)); + } + return this.properties; + } + + /** + * Gets the properties of this BlockType. + * + * @return the properties + */ + public List getProperties() { + return ImmutableList.copyOf(this.getPropertyMap().values()); + } + /** * Gets the default state of this block type. * @@ -112,7 +142,10 @@ public class BlockType { * @return The material */ public BlockMaterial getMaterial() { - return WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.GAME_HOOKS).getRegistries().getBlockRegistry().getMaterial(this.id); + if (this.blockMaterial == null) { + this.blockMaterial = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.GAME_HOOKS).getRegistries().getBlockRegistry().getMaterial(this); + } + return this.blockMaterial; } /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java index ed86f0e03..df22df349 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java @@ -36,20 +36,11 @@ public interface BlockRegistry { /** * Get the material for the given block. * - * @param id the block + * @param blockType the block * @return the material, or null if the material information is not known */ @Nullable - BlockMaterial getMaterial(String id); - - /** - * Get an unmodifiable list of values for this property. - * - * @param blockType The block - * @param property the property - * @return the list of values - */ - List getPropertyValues(BlockType blockType, Property property); + BlockMaterial getMaterial(BlockType blockType); /** * Get an unmodifiable map of states for this block. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java index 2fa75d668..0ec4ca15f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java @@ -52,7 +52,7 @@ import javax.annotation.Nullable; public class BundledBlockData { private static final Logger log = Logger.getLogger(BundledBlockData.class.getCanonicalName()); - private static final BundledBlockData INSTANCE = new BundledBlockData(); + private static BundledBlockData INSTANCE; private final Map idMap = new HashMap<>(); @@ -125,6 +125,9 @@ public class BundledBlockData { * @return the instance */ public static BundledBlockData getInstance() { + if (INSTANCE == null) { + INSTANCE = new BundledBlockData(); + } return INSTANCE; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java index 05a9c9029..1f1a2b317 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java @@ -24,7 +24,6 @@ import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.world.block.BlockType; import java.util.Collections; -import java.util.List; import java.util.Map; import javax.annotation.Nullable; @@ -37,13 +36,8 @@ public class BundledBlockRegistry implements BlockRegistry { @Nullable @Override - public BlockMaterial getMaterial(String id) { - return new PassthroughBlockMaterial(BundledBlockData.getInstance().getMaterialById(id)); - } - - @Override - public List getPropertyValues(BlockType blockType, Property property) { - return Collections.emptyList(); // Oof + public BlockMaterial getMaterial(BlockType blockType) { + return new PassthroughBlockMaterial(BundledBlockData.getInstance().getMaterialById(blockType.getId())); } @Nullable diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java index bedbf6a19..00cafb244 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java @@ -51,7 +51,7 @@ import javax.annotation.Nullable; public class BundledItemData { private static final Logger log = Logger.getLogger(BundledItemData.class.getCanonicalName()); - private static final BundledItemData INSTANCE = new BundledItemData(); + private static BundledItemData INSTANCE; private final Map idMap = new HashMap<>(); @@ -108,6 +108,9 @@ public class BundledItemData { * @return the instance */ public static BundledItemData getInstance() { + if (INSTANCE == null) { + INSTANCE = new BundledItemData(); + } return INSTANCE; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java index f24ffe1e3..8950b8242 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java @@ -46,7 +46,7 @@ import javax.annotation.Nullable; public class LegacyMapper { private static final Logger log = Logger.getLogger(LegacyMapper.class.getCanonicalName()); - private static final LegacyMapper INSTANCE = new LegacyMapper(); + private static LegacyMapper INSTANCE; private BiMap blockMap = HashBiMap.create(); private BiMap itemMap = HashBiMap.create(); @@ -141,6 +141,9 @@ public class LegacyMapper { } public static LegacyMapper getInstance() { + if (INSTANCE == null) { + INSTANCE = new LegacyMapper(); + } return INSTANCE; }