Mirror von
https://github.com/IntellectualSites/FastAsyncWorldEdit.git
synchronisiert 2024-12-24 18:10:08 +01:00
Convert the data system to a state system. This doesn't work, needs new data
Dieser Commit ist enthalten in:
Ursprung
1cc735e359
Commit
a71e39d777
@ -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<State, StateValue> 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) {
|
||||
|
@ -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()));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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.</p>
|
||||
*
|
||||
* <p>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.</p>
|
||||
*
|
||||
* <p>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<State, StateValue> 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<State, StateValue> 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<State, StateValue> 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<State, StateValue> 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<State, StateValue> 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() + "}";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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<String, ? extends State> 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<String, ? extends State> 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<String, ? extends StateValue> 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;
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -41,7 +41,7 @@ public class FuzzyBlockMask extends BlockMask {
|
||||
Extent extent = getExtent();
|
||||
Collection<BaseBlock> 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);
|
||||
}
|
||||
}
|
||||
|
@ -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<QueuedEffect> effectQueue = new PriorityQueue<QueuedEffect>();
|
||||
private final PriorityQueue<QueuedEffect> 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
|
||||
|
@ -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;
|
||||
|
@ -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<String, BlockEntry> idMap = new HashMap<String, BlockEntry>();
|
||||
private final Map<Integer, BlockEntry> legacyMap = new HashMap<Integer, BlockEntry>(); // Trove usage removed temporarily
|
||||
private final Map<String, BlockEntry> idMap = new HashMap<>();
|
||||
private final Map<Integer, BlockEntry> legacyMap = new HashMap<>(); // Trove usage removed temporarily
|
||||
|
||||
/**
|
||||
* Create a new instance.
|
||||
@ -84,7 +86,6 @@ public class BundledBlockData {
|
||||
List<BlockEntry> entries = gson.fromJson(data, new TypeToken<List<BlockEntry>>() {}.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<String> aliases;
|
||||
private Map<String, SimpleState> states = new HashMap<>();
|
||||
private SimpleBlockMaterial material = new SimpleBlockMaterial();
|
||||
|
||||
void postDeserialization() {
|
||||
for (SimpleState state : states.values()) {
|
||||
state.postDeserialization();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -1,71 +0,0 @@
|
||||
/*
|
||||
* WorldEdit, a Minecraft world manipulation toolkit
|
||||
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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<String, SimpleStateValue> values;
|
||||
|
||||
@Override
|
||||
public Map<String, SimpleStateValue> 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* WorldEdit, a Minecraft world manipulation toolkit
|
||||
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.sk89q.worldedit.world.registry.state;
|
||||
|
||||
import com.sk89q.worldedit.world.registry.state.value.DirectionalStateValue;
|
||||
|
||||
public class DirectionalState extends SimpleState<DirectionalStateValue> {
|
||||
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* WorldEdit, a Minecraft world manipulation toolkit
|
||||
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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<T extends SimpleStateValue> implements State<T> {
|
||||
|
||||
private List<T> values = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public List<T> getValues() {
|
||||
return Collections.unmodifiableList(values);
|
||||
}
|
||||
|
||||
}
|
@ -17,12 +17,11 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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;
|
||||
* <p>Example states include "variant" (indicating material or type) and
|
||||
* "facing" (indicating orientation).</p>
|
||||
*/
|
||||
public interface State {
|
||||
public interface State<T extends SimpleStateValue> {
|
||||
|
||||
/**
|
||||
* Return a map of available values for this state.
|
||||
* Return a list of available values for this state.
|
||||
*
|
||||
* <p>Keys are the value of state and map values describe that
|
||||
* particular state value.</p>
|
||||
*
|
||||
* @return the map of state values
|
||||
* @return the list of state values
|
||||
*/
|
||||
Map<String, ? extends StateValue> 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<T> getValues();
|
||||
|
||||
}
|
@ -17,39 +17,13 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* WorldEdit, a Minecraft world manipulation toolkit
|
||||
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
@ -17,10 +17,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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();
|
||||
|
||||
}
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren