From a71e39d777b85dca23b0423f305746e1b5962045 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Thu, 14 Jun 2018 16:35:56 +1000 Subject: [PATCH] Convert the data system to a state system. This doesn't work, needs new data --- .../com/sk89q/worldedit/blocks/LazyBlock.java | 15 ++- .../com/sk89q/worldedit/masks/BlockMask.java | 2 +- .../com/sk89q/worldedit/blocks/BaseBlock.java | 113 +++++++++++------- .../worldedit/command/tool/QueryTool.java | 46 +------ .../transform/BlockTransformExtent.java | 26 ++-- .../function/block/ExtentBlockCopy.java | 2 +- .../function/generator/FloraGenerator.java | 3 +- .../generator/GardenPatchGenerator.java | 2 +- .../worldedit/function/mask/BlockMask.java | 2 +- .../function/mask/FuzzyBlockMask.java | 2 +- .../sk89q/worldedit/world/AbstractWorld.java | 16 +-- .../world/registry/BlockRegistry.java | 1 + .../world/registry/BundledBlockData.java | 13 +- .../world/registry/BundledBlockRegistry.java | 1 + .../worldedit/world/registry/SimpleState.java | 71 ----------- .../registry/state/DirectionalState.java | 26 ++++ .../world/registry/state/SimpleState.java | 37 ++++++ .../world/registry/{ => state}/State.java | 34 ++---- .../value/DirectionalStateValue.java} | 32 +---- .../state/value/SimpleStateValue.java | 41 +++++++ .../{ => state/value}/StateValue.java | 21 ++-- 21 files changed, 236 insertions(+), 270 deletions(-) delete mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleState.java create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/DirectionalState.java create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/SimpleState.java rename worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/{ => state}/State.java (55%) rename worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/{SimpleStateValue.java => state/value/DirectionalStateValue.java} (55%) create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/value/SimpleStateValue.java rename worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/{ => state/value}/StateValue.java (68%) diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/LazyBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/LazyBlock.java index 2a55ba4d8..6e3a7e9b4 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/LazyBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/LazyBlock.java @@ -23,9 +23,13 @@ import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.blocks.type.BlockType; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.world.registry.state.State; +import com.sk89q.worldedit.world.registry.state.value.StateValue; import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Map; + /** * A implementation of a lazy block for {@link Extent#getLazyBlock(Vector)} * that takes the block's ID and metadata, but will defer loading of NBT @@ -78,13 +82,13 @@ public class LazyBlock extends BaseBlock { * Create a new lazy block. * * @param type the block type - * @param data the data value + * @param states the block states * @param extent the extent to later load the full block data from * @param position the position to later load the full block data from */ @Deprecated - public LazyBlock(BlockType type, int data, Extent extent, Vector position) { - super(type, data); + public LazyBlock(BlockType type, Map states, Extent extent, Vector position) { + super(type, states); checkNotNull(extent); checkNotNull(position); this.extent = extent; @@ -123,6 +127,11 @@ public class LazyBlock extends BaseBlock { throw new UnsupportedOperationException("This object is immutable"); } + @Override + public void setState(State state, StateValue stateValue) { + throw new UnsupportedOperationException("This object is immutable"); + } + @Override public CompoundTag getNbtData() { if (!loaded) { diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/masks/BlockMask.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/masks/BlockMask.java index a6dd9ab97..f50b76de2 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/masks/BlockMask.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/masks/BlockMask.java @@ -67,7 +67,7 @@ public class BlockMask extends AbstractMask { public boolean matches(EditSession editSession, Vector position) { BaseBlock block = editSession.getBlock(position); return blocks.contains(block) - || blocks.contains(new BaseBlock(block.getType(), -1)); + || blocks.contains(new BaseBlock(block.getType())); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java index 87b790191..dd1ead2c4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java @@ -28,10 +28,15 @@ import com.sk89q.worldedit.blocks.type.BlockTypes; import com.sk89q.worldedit.foundation.Block; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.world.registry.BundledBlockData; -import com.sk89q.worldedit.world.registry.WorldData; +import com.sk89q.worldedit.world.registry.state.State; +import com.sk89q.worldedit.world.registry.state.value.StateValue; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import javax.annotation.Nullable; -import java.util.Collection; /** * Represents a mutable "snapshot" of a block. @@ -42,15 +47,6 @@ import java.util.Collection; * snapshot of blocks correctly, so, for example, the NBT data for a block * may be missing.

* - *

This class identifies blocks using an integer ID. However, IDs for - * a given block may differ between worlds so it is important that users of - * this class convert the ID from one "world space" to another "world space," - * a task that that is assisted with by working with the source and - * destination {@link WorldData} instances. Numeric IDs are utilized because - * they are more space efficient to store, and it also implies that internal - * uses of this class (i.e. history, etc.) do not need to worry about - * interning block string IDs.

- * *

A peculiar detail of this class is that it accepts {@code -1} as a * valid data value. This is due to legacy reasons: WorldEdit uses -1 * as a "wildcard" block value, even though a {@link Mask} would be @@ -59,17 +55,11 @@ import java.util.Collection; @SuppressWarnings("deprecation") public class BaseBlock extends Block implements TileEntityBlock { - /** - * Indicates the maximum data value (inclusive) that can be used. A future - * version of Minecraft may abolish block data values. - */ - public static final int MAX_DATA = 15; - // Instances of this class should be _as small as possible_ because there will // be millions of instances of this object. private BlockType blockType; - private short data; + private Map states; @Nullable private CompoundTag nbtData; @@ -83,6 +73,7 @@ public class BaseBlock extends Block implements TileEntityBlock { public BaseBlock(int id) { internalSetId(id); internalSetData(0); + this.states = new HashMap<>(); } /** @@ -92,6 +83,7 @@ public class BaseBlock extends Block implements TileEntityBlock { */ public BaseBlock(BlockType blockType) { internalSetType(blockType); + this.states = new HashMap<>(); } /** @@ -106,22 +98,20 @@ public class BaseBlock extends Block implements TileEntityBlock { public BaseBlock(int id, int data) { internalSetId(id); internalSetData(data); + this.states = new HashMap<>(); } /** * Construct a block with the given ID and data value. * - * THIS WILL GET REMOVED SOON. - * * @param blockType The block type - * @param data data value + * @param states The states * @see #setId(int) * @see #setData(int) */ - @Deprecated - public BaseBlock(BlockType blockType, int data) { + public BaseBlock(BlockType blockType, Map states) { internalSetType(blockType); - internalSetData(data); + setStates(states); } /** @@ -136,21 +126,19 @@ public class BaseBlock extends Block implements TileEntityBlock { internalSetId(id); setData(data); setNbtData(nbtData); + this.states = new HashMap<>(); } /** * Construct a block with the given ID, data value and NBT data structure. * - * THIS WILL GET REMOVED SOON. - * * @param blockType The block type - * @param data data value + * @param states The states * @param nbtData NBT data, which may be null */ - @Deprecated - public BaseBlock(BlockType blockType, int data, @Nullable CompoundTag nbtData) { + public BaseBlock(BlockType blockType, Map states, @Nullable CompoundTag nbtData) { setType(blockType); - setData(data); + setStates(states); setNbtData(nbtData); } @@ -160,7 +148,7 @@ public class BaseBlock extends Block implements TileEntityBlock { * @param other the other block */ public BaseBlock(BaseBlock other) { - this(other.getId(), other.getData(), other.getNbtData()); + this(other.getType(), other.getStates(), other.getNbtData()); } /** @@ -216,38 +204,70 @@ public class BaseBlock extends Block implements TileEntityBlock { /** * Get the block's data value. * + * Broken - do not use + * * @return data value (0-15) */ @Override + @Deprecated public int getData() { - return data; + return 0; } /** - * Set the block's data value. + * Gets a map of state to statevalue * - * @param data block data value (between 0 and {@link #MAX_DATA}). + * @return The state map */ - protected final void internalSetData(int data) { - if (data > MAX_DATA) { - throw new IllegalArgumentException( - "Can't have a block data value above " + MAX_DATA + " (" - + data + " given)"); - } + public Map getStates() { + return Collections.unmodifiableMap(states); + } - if (data < -1) { - throw new IllegalArgumentException("Can't have a block data value below -1"); - } + /** + * Sets the states of this block. + * + * @param states The states + */ + private void setStates(Map states) { + this.states = states; + } - this.data = (short) data; + /** + * Gets the State for this Block. + * + * @param state The state to get the value for + * @return The state value + */ + public StateValue getState(State state) { + return states.get(state); + } + + /** + * Sets a state to a specific value + * + * @param state The state + * @param stateValue The value + */ + public void setState(State state, StateValue stateValue) { + this.states.put(state, stateValue); } /** * Set the block's data value. * - * @param data block data value (between 0 and {@link #MAX_DATA}). + * @param data block data value + */ + @Deprecated + protected final void internalSetData(int data) { + } + + /** + * Set the block's data value. + * + * @param data block data value */ @Override + @Deprecated public void setData(int data) { internalSetData(data); } @@ -274,6 +294,7 @@ public class BaseBlock extends Block implements TileEntityBlock { * @return true if the data value is -1 */ @Override + @Deprecated public boolean hasWildcardData() { return getData() == -1; } @@ -446,7 +467,7 @@ public class BaseBlock extends Block implements TileEntityBlock { @Override public String toString() { - return "Block{Type:" + getType().getId() + ", Data: " + getData() + "}"; + return "Block{Type:" + getType().getId() + ", States: " + getStates().toString() + "}"; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/QueryTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/QueryTool.java index a0ed140b5..9a12f7891 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/QueryTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/QueryTool.java @@ -23,23 +23,12 @@ import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.blocks.BaseBlock; -import com.sk89q.worldedit.blocks.BlockID; -import com.sk89q.worldedit.blocks.BlockType; -import com.sk89q.worldedit.blocks.ClothColor; import com.sk89q.worldedit.blocks.MobSpawnerBlock; import com.sk89q.worldedit.blocks.NoteBlock; -import com.sk89q.worldedit.blocks.type.BlockTypes; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.world.World; -import com.sk89q.worldedit.world.registry.BundledBlockData; -import com.sk89q.worldedit.world.registry.SimpleState; -import com.sk89q.worldedit.world.registry.State; -import com.sk89q.worldedit.world.registry.StateValue; - -import java.util.Map; -import java.util.Map.Entry; /** * Looks up information about a block. @@ -57,13 +46,12 @@ public class QueryTool implements BlockTool { World world = (World) clicked.getExtent(); EditSession editSession = session.createEditSession(player); BaseBlock block = editSession.getBlock(clicked.toVector()); - BlockType type = BlockType.fromID(block.getType().getLegacyId()); player.print("\u00A79@" + clicked.toVector() + ": " + "\u00A7e" + "#" + block.getType() + "\u00A77" + " (" - + (type == null ? "Unknown" : type.getName()) + ") " + + block.getType().getId() + ") " + "\u00A7f" - + "[" + block.getData() + "]" + " (" + world.getBlockLightLevel(clicked.toVector()) + "/" + world.getBlockLightLevel(clicked.toVector().add(0, 1, 0)) + ")"); + + "[" + block.getStates().toString() + "]" + " (" + world.getBlockLightLevel(clicked.toVector()) + "/" + world.getBlockLightLevel(clicked.toVector().add(0, 1, 0)) + ")"); if (block instanceof MobSpawnerBlock) { player.printRaw("\u00A7e" + "Mob Type: " @@ -73,36 +61,6 @@ public class QueryTool implements BlockTool { + ((NoteBlock) block).getNote()); } - Map states = BundledBlockData.getInstance().getStatesById(block.getType().getId()); - if (states == null || states.isEmpty()) return true; - StringBuilder builder = new StringBuilder(); - builder.append("States: "); - boolean first = true; - boolean hasVisibleStates = false; - for (Entry e : states.entrySet()) { - String name = e.getKey(); - State state = e.getValue(); - if (state instanceof SimpleState && ((SimpleState) state).getDataMask() == 0) { - continue; // don't try to determine states that aren't reflected in their data value - } - hasVisibleStates = true; - if (!first) { - builder.append(", "); - } - first = false; - String valName = ""; - for (Entry entry : state.valueMap().entrySet()) { - if (entry.getValue().isSet(block)) { - valName = entry.getKey(); - break; - } - } - builder.append("\u00A79").append(name).append(": \u00A7f").append(valName != null ? valName : "set"); - } - if (hasVisibleStates) { - player.printRaw(builder.toString()); - } - return true; } 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 dc634ed2f..abe9a8c7b 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 @@ -19,6 +19,8 @@ package com.sk89q.worldedit.extent.transform; +import static com.google.common.base.Preconditions.checkNotNull; + import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseBlock; @@ -26,13 +28,13 @@ import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.world.registry.BlockRegistry; -import com.sk89q.worldedit.world.registry.State; -import com.sk89q.worldedit.world.registry.StateValue; +import com.sk89q.worldedit.world.registry.state.DirectionalState; +import com.sk89q.worldedit.world.registry.state.State; +import com.sk89q.worldedit.world.registry.state.value.DirectionalStateValue; -import javax.annotation.Nullable; import java.util.Map; -import static com.google.common.base.Preconditions.checkNotNull; +import javax.annotation.Nullable; /** * Transforms blocks themselves (but not their position) according to a @@ -131,12 +133,12 @@ public class BlockTransformExtent extends AbstractDelegateExtent { } for (State state : states.values()) { - if (state.hasDirection()) { - StateValue value = state.getValue(block); - if (value != null && value.getDirection() != null) { - StateValue newValue = getNewStateValue(state, transform, value.getDirection()); + if (state instanceof DirectionalState) { + DirectionalStateValue value = (DirectionalStateValue) block.getState(state); + if (value != null && value.getData() != null) { + DirectionalStateValue newValue = getNewStateValue((DirectionalState) state, transform, value.getDirection()); if (newValue != null) { - newValue.set(changedBlock); + changedBlock.setState(state, newValue); } } } @@ -154,13 +156,13 @@ public class BlockTransformExtent extends AbstractDelegateExtent { * @return a new state or null if none could be found */ @Nullable - private static StateValue getNewStateValue(State state, Transform transform, Vector oldDirection) { + private static DirectionalStateValue getNewStateValue(DirectionalState state, Transform transform, Vector oldDirection) { Vector newDirection = transform.apply(oldDirection).subtract(transform.apply(Vector.ZERO)).normalize(); - StateValue newValue = null; + DirectionalStateValue newValue = null; double closest = -2; boolean found = false; - for (StateValue v : state.valueMap().values()) { + for (DirectionalStateValue v : state.getValues()) { if (v.getDirection() != null) { double dot = v.getDirection().normalize().dot(newDirection); if (dot >= closest) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java index c72990a1b..576882ded 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java @@ -104,7 +104,7 @@ public class ExtentBlockCopy implements RegionFunction { builder.putByte("Rot", (byte) MCDirections.toRotation(newDirection)); - return new BaseBlock(state.getType(), state.getData(), builder.build()); + return new BaseBlock(state.getType(), state.getStates(), builder.build()); } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java index a5d68d8f1..068c075a6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java @@ -23,7 +23,6 @@ import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseBlock; -import com.sk89q.worldedit.blocks.BlockID; import com.sk89q.worldedit.blocks.type.BlockTypes; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.pattern.BlockPattern; @@ -97,7 +96,7 @@ public class FloraGenerator implements RegionFunction { */ public static Pattern getTemperatePattern() { RandomPattern pattern = new RandomPattern(); - pattern.add(new BlockPattern(new BaseBlock(BlockTypes.TALL_GRASS, 1)), 300); + pattern.add(new BlockPattern(new BaseBlock(BlockTypes.GRASS)), 300); pattern.add(new BlockPattern(new BaseBlock(BlockTypes.POPPY)), 5); pattern.add(new BlockPattern(new BaseBlock(BlockTypes.DANDELION)), 5); return pattern; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java index e0da9361b..c9b1294a1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java @@ -190,7 +190,7 @@ public class GardenPatchGenerator implements RegionFunction { public static Pattern getPumpkinPattern() { RandomPattern pattern = new RandomPattern(); for (int i = 0; i < 4; i++) { - pattern.add(new BlockPattern(new BaseBlock(BlockTypes.PUMPKIN, i)), 100); +// TODO pattern.add(new BlockPattern(new BaseBlock(BlockTypes.CARVED_PUMPKIN, i)), 100); } return pattern; } 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 bd2e1c831..15fe2705e 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 @@ -95,7 +95,7 @@ public class BlockMask extends AbstractExtentMask { @Override public boolean test(Vector vector) { BaseBlock block = getExtent().getBlock(vector); - return blocks.contains(block) || blocks.contains(new BaseBlock(block.getType(), -1)); + return blocks.contains(block) || blocks.contains(new BaseBlock(block.getType())); } @Nullable diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/FuzzyBlockMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/FuzzyBlockMask.java index 19a0b7590..0b0fc603f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/FuzzyBlockMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/FuzzyBlockMask.java @@ -41,7 +41,7 @@ public class FuzzyBlockMask extends BlockMask { Extent extent = getExtent(); Collection blocks = getBlocks(); BaseBlock lazyBlock = extent.getLazyBlock(vector); - BaseBlock compare = new BaseBlock(lazyBlock.getType(), lazyBlock.getData()); + BaseBlock compare = new BaseBlock(lazyBlock.getType(), lazyBlock.getStates()); return Blocks.containsFuzzy(blocks, compare); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java index fea1e00da..3f2d0e9b7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java @@ -27,7 +27,6 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; -import com.sk89q.worldedit.blocks.BlockID; import com.sk89q.worldedit.blocks.BlockType; import com.sk89q.worldedit.blocks.type.BlockTypes; import com.sk89q.worldedit.extension.platform.Platform; @@ -37,15 +36,16 @@ import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.TreeGenerator.TreeType; -import javax.annotation.Nullable; import java.util.PriorityQueue; +import javax.annotation.Nullable; + /** * An abstract implementation of {@link World}. */ public abstract class AbstractWorld implements World { - private final PriorityQueue effectQueue = new PriorityQueue(); + private final PriorityQueue effectQueue = new PriorityQueue<>(); private int taskId = -1; @Override @@ -65,7 +65,7 @@ public abstract class AbstractWorld implements World { @Override public final void setBlockData(Vector position, int data) { try { - setBlock(position, new BaseBlock(getLazyBlock(position).getType(), data)); + setBlock(position, new BaseBlock(getLazyBlock(position).getType().getLegacyId(), data)); } catch (WorldEditException ignored) { } } @@ -103,10 +103,10 @@ public abstract class AbstractWorld implements World { @Override public Mask createLiquidMask() { return new BlockMask(this, - new BaseBlock(BlockTypes.LAVA, -1), - new BaseBlock(BlockTypes.FLOWING_LAVA, -1), - new BaseBlock(BlockTypes.WATER, -1), - new BaseBlock(BlockTypes.FLOWING_WATER, -1)); + new BaseBlock(BlockTypes.LAVA), + new BaseBlock(BlockTypes.FLOWING_LAVA), + new BaseBlock(BlockTypes.WATER), + new BaseBlock(BlockTypes.FLOWING_WATER)); } @Override 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 45b5afb43..12e35a040 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 @@ -21,6 +21,7 @@ package com.sk89q.worldedit.world.registry; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BlockMaterial; +import com.sk89q.worldedit.world.registry.state.State; import javax.annotation.Nullable; import java.util.Map; 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 b79465de3..846eba25c 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 @@ -26,6 +26,8 @@ import com.google.gson.reflect.TypeToken; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.blocks.BlockMaterial; import com.sk89q.worldedit.util.gson.VectorAdapter; +import com.sk89q.worldedit.world.registry.state.SimpleState; +import com.sk89q.worldedit.world.registry.state.State; import javax.annotation.Nullable; import java.io.IOException; @@ -53,8 +55,8 @@ public class BundledBlockData { private static final Logger log = Logger.getLogger(BundledBlockData.class.getCanonicalName()); private static final BundledBlockData INSTANCE = new BundledBlockData(); - private final Map idMap = new HashMap(); - private final Map legacyMap = new HashMap(); // Trove usage removed temporarily + private final Map idMap = new HashMap<>(); + private final Map legacyMap = new HashMap<>(); // Trove usage removed temporarily /** * Create a new instance. @@ -84,7 +86,6 @@ public class BundledBlockData { List entries = gson.fromJson(data, new TypeToken>() {}.getType()); for (BlockEntry entry : entries) { - entry.postDeserialization(); idMap.put(entry.id, entry); legacyMap.put(entry.legacyId, entry); } @@ -196,12 +197,6 @@ public class BundledBlockData { private List aliases; private Map states = new HashMap<>(); private SimpleBlockMaterial material = new SimpleBlockMaterial(); - - void postDeserialization() { - for (SimpleState state : states.values()) { - state.postDeserialization(); - } - } } } 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 6e0606ef9..5979a164b 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 @@ -22,6 +22,7 @@ package com.sk89q.worldedit.world.registry; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BlockMaterial; import com.sk89q.worldedit.blocks.type.BlockTypes; +import com.sk89q.worldedit.world.registry.state.State; import javax.annotation.Nullable; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleState.java deleted file mode 100644 index cdf55f11b..000000000 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleState.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 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.world.registry; - -import com.sk89q.worldedit.blocks.BaseBlock; - -import javax.annotation.Nullable; -import java.util.Collections; -import java.util.Map; - -public class SimpleState implements State { - - private Byte dataMask; - private Map values; - - @Override - public Map valueMap() { - return Collections.unmodifiableMap(values); - } - - @Nullable - @Override - public StateValue getValue(BaseBlock block) { - for (StateValue value : values.values()) { - if (value.isSet(block)) { - return value; - } - } - - return null; - } - - public byte getDataMask() { - return dataMask != null ? dataMask : 0xF; - } - - @Override - public boolean hasDirection() { - for (SimpleStateValue value : values.values()) { - if (value.getDirection() != null) { - return true; - } - } - - return false; - } - - void postDeserialization() { - for (SimpleStateValue v : values.values()) { - v.setState(this); - } - } - -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/DirectionalState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/DirectionalState.java new file mode 100644 index 000000000..d4a578a67 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/DirectionalState.java @@ -0,0 +1,26 @@ +/* + * 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.world.registry.state; + +import com.sk89q.worldedit.world.registry.state.value.DirectionalStateValue; + +public class DirectionalState extends SimpleState { + +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/SimpleState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/SimpleState.java new file mode 100644 index 000000000..a6c66bf1d --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/SimpleState.java @@ -0,0 +1,37 @@ +/* + * 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.world.registry.state; + +import com.sk89q.worldedit.world.registry.state.value.SimpleStateValue; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class SimpleState implements State { + + private List values = new ArrayList<>(); + + @Override + public List getValues() { + return Collections.unmodifiableList(values); + } + +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/State.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/State.java similarity index 55% rename from worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/State.java rename to worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/State.java index a8cbfde3c..49d77a1c0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/State.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/State.java @@ -17,12 +17,11 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.world.registry; +package com.sk89q.worldedit.world.registry.state; -import com.sk89q.worldedit.blocks.BaseBlock; +import com.sk89q.worldedit.world.registry.state.value.SimpleStateValue; -import javax.annotation.Nullable; -import java.util.Map; +import java.util.List; /** * Describes a state property of a block. @@ -30,32 +29,13 @@ import java.util.Map; *

Example states include "variant" (indicating material or type) and * "facing" (indicating orientation).

*/ -public interface State { +public interface State { /** - * Return a map of available values for this state. + * Return a list of available values for this state. * - *

Keys are the value of state and map values describe that - * particular state value.

- * - * @return the map of state values + * @return the list of state values */ - Map valueMap(); - - /** - * Get the value that the block is set to. - * - * @param block the block - * @return the state, otherwise null if the block isn't set to any of the values - */ - @Nullable - StateValue getValue(BaseBlock block); - - /** - * Returns whether this state contains directional data. - * - * @return true if directional data is available - */ - boolean hasDirection(); + List getValues(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleStateValue.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/value/DirectionalStateValue.java similarity index 55% rename from worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleStateValue.java rename to worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/value/DirectionalStateValue.java index 791bc684a..f440dd2ac 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleStateValue.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/value/DirectionalStateValue.java @@ -17,39 +17,13 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.world.registry; +package com.sk89q.worldedit.world.registry.state.value; import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.blocks.BaseBlock; -class SimpleStateValue implements StateValue { +public class DirectionalStateValue extends SimpleStateValue { - private SimpleState state; - private Byte data; - private Vector direction; - - void setState(SimpleState state) { - this.state = state; - } - - @Override - public boolean isSet(BaseBlock block) { - return data != null && (block.getData() & state.getDataMask()) == data; - } - - @Override - public boolean set(BaseBlock block) { - if (data != null) { - block.setData((block.getData() & ~state.getDataMask()) | data); - return true; - } else { - return false; - } - } - - @Override public Vector getDirection() { - return direction; + return new Vector(); // TODO } - } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/value/SimpleStateValue.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/value/SimpleStateValue.java new file mode 100644 index 000000000..7f1731f48 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/value/SimpleStateValue.java @@ -0,0 +1,41 @@ +/* + * 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.world.registry.state.value; + +public class SimpleStateValue implements StateValue { + + private String data; + + @Override + public boolean isSet() { + return data != null; + } + + @Override + public void set(String data) { + this.data = data; + } + + @Override + public String getData() { + return this.data; + } + +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/StateValue.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/value/StateValue.java similarity index 68% rename from worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/StateValue.java rename to worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/value/StateValue.java index 4e565cb19..c6dcf902d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/StateValue.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/state/value/StateValue.java @@ -17,10 +17,7 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.world.registry; - -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.blocks.BaseBlock; +package com.sk89q.worldedit.world.registry.state.value; import javax.annotation.Nullable; @@ -32,25 +29,21 @@ public interface StateValue { /** * Return whether this state is set on the given block. * - * @param block the block * @return true if this value is set */ - boolean isSet(BaseBlock block); + boolean isSet(); /** - * Set the state to this value on the given block. - * - * @param block the block to change - * @return true if the value was set successfully + * Set the state to the given value. */ - boolean set(BaseBlock block); + void set(String data); /** - * Return the direction associated with this value. + * Returns the data associated with this value. * - * @return the direction, otherwise null + * @return The data, otherwise null */ @Nullable - Vector getDirection(); + String getData(); }