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();
}