Further BaseBlock modernisation

This commit is contained in:
Matthew Miller
2018-06-18 17:53:33 +10:00
parent 811f1d4433
commit e99190225e
61 changed files with 344 additions and 787 deletions

View File

@ -1063,7 +1063,7 @@ public class EditSession implements Extent {
// Remove the original blocks
com.sk89q.worldedit.function.pattern.Pattern pattern = replacement != null ?
new BlockPattern(replacement) :
new BlockPattern(new BaseBlock(BlockID.AIR));
new BlockPattern(new BaseBlock(BlockTypes.AIR));
BlockReplace remove = new BlockReplace(this, pattern);
// Copy to a buffer so we don't destroy our original before we can copy all the blocks from it
@ -1143,22 +1143,22 @@ public class EditSession implements Extent {
* @return number of blocks affected
* @throws MaxChangedBlocksException thrown if too many blocks are changed
*/
public int fixLiquid(Vector origin, double radius, int moving, int stationary) throws MaxChangedBlocksException {
public int fixLiquid(Vector origin, double radius, com.sk89q.worldedit.blocks.type.BlockType moving, com.sk89q.worldedit.blocks.type.BlockType stationary) throws MaxChangedBlocksException {
checkNotNull(origin);
checkArgument(radius >= 0, "radius >= 0 required");
// Our origins can only be liquids
BlockMask liquidMask = new BlockMask(
this,
new BaseBlock(moving, -1),
new BaseBlock(stationary, -1));
new BaseBlock(moving),
new BaseBlock(stationary));
// But we will also visit air blocks
MaskIntersection blockMask =
new MaskUnion(liquidMask,
new BlockMask(
this,
new BaseBlock(BlockID.AIR)));
new BaseBlock(BlockTypes.AIR)));
// There are boundaries that the routine needs to stay in
MaskIntersection mask = new MaskIntersection(
@ -1449,7 +1449,7 @@ public class EditSession implements Extent {
for (int y = world.getMaxY(); y >= 1; --y) {
Vector pt = new Vector(x, y, z);
com.sk89q.worldedit.blocks.type.BlockType id = getLazyBlock(pt).getType();
com.sk89q.worldedit.blocks.type.BlockType id = getLazyBlock(pt).getBlockType();
if (id == BlockTypes.ICE) {
if (setBlock(pt, water)) {
@ -1657,14 +1657,14 @@ public class EditSession implements Extent {
for (int y = basePosition.getBlockY(); y >= basePosition.getBlockY() - 10; --y) {
// Check if we hit the ground
int t = getBlock(new Vector(x, y, z)).getType().getLegacyId();
if (t == BlockID.GRASS || t == BlockID.DIRT) {
com.sk89q.worldedit.blocks.type.BlockType t = getBlock(new Vector(x, y, z)).getBlockType();
if (t == BlockTypes.GRASS_BLOCK || t == BlockTypes.DIRT) {
treeGenerator.generate(this, new Vector(x, y + 1, z));
++affected;
break;
} else if (t == BlockID.SNOW) {
setBlock(new Vector(x, y, z), new BaseBlock(BlockID.AIR));
} else if (t != BlockID.AIR) { // Trees won't grow on this!
} else if (t == BlockTypes.SNOW) {
setBlock(new Vector(x, y, z), new BaseBlock(BlockTypes.AIR));
} else if (t != BlockTypes.AIR) { // Trees won't grow on this!
break;
}
}
@ -1680,9 +1680,9 @@ public class EditSession implements Extent {
* @param region a region
* @return the results
*/
public List<Countable<Integer>> getBlockDistribution(Region region) {
List<Countable<Integer>> distribution = new ArrayList<>();
Map<Integer, Countable<Integer>> map = new HashMap<>();
public List<Countable<com.sk89q.worldedit.blocks.type.BlockType>> getBlockDistribution(Region region) {
List<Countable<com.sk89q.worldedit.blocks.type.BlockType>> distribution = new ArrayList<>();
Map<com.sk89q.worldedit.blocks.type.BlockType, Countable<com.sk89q.worldedit.blocks.type.BlockType>> map = new HashMap<>();
if (region instanceof CuboidRegion) {
// Doing this for speed
@ -1701,13 +1701,13 @@ public class EditSession implements Extent {
for (int z = minZ; z <= maxZ; ++z) {
Vector pt = new Vector(x, y, z);
int id = getLazyBlock(pt).getId();
com.sk89q.worldedit.blocks.type.BlockType type = getLazyBlock(pt).getBlockType();
if (map.containsKey(id)) {
map.get(id).increment();
if (map.containsKey(type)) {
map.get(type).increment();
} else {
Countable<Integer> c = new Countable<>(id, 1);
map.put(id, c);
Countable<com.sk89q.worldedit.blocks.type.BlockType> c = new Countable<>(type, 1);
map.put(type, c);
distribution.add(c);
}
}
@ -1715,13 +1715,13 @@ public class EditSession implements Extent {
}
} else {
for (Vector pt : region) {
int id = getLazyBlock(pt).getId();
com.sk89q.worldedit.blocks.type.BlockType type = getLazyBlock(pt).getBlockType();
if (map.containsKey(id)) {
map.get(id).increment();
if (map.containsKey(type)) {
map.get(type).increment();
} else {
Countable<Integer> c = new Countable<>(id, 1);
map.put(id, c);
Countable<com.sk89q.worldedit.blocks.type.BlockType> c = new Countable<>(type, 1);
map.put(type, c);
}
}
}
@ -1809,7 +1809,7 @@ public class EditSession implements Extent {
final Vector scaled = current.subtract(zero).divide(unit);
try {
if (expression.evaluate(scaled.getX(), scaled.getY(), scaled.getZ(), defaultMaterial.getType().getLegacyId(), defaultMaterial.getData()) <= 0) {
if (expression.evaluate(scaled.getX(), scaled.getY(), scaled.getZ(), defaultMaterial.getBlockType().getLegacyId(), defaultMaterial.getData()) <= 0) {
return null;
}

View File

@ -24,19 +24,18 @@ import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.CuboidClipboard.FlipDirection;
import com.sk89q.worldedit.blocks.type.BlockState;
import com.sk89q.worldedit.blocks.type.BlockStateHolder;
import com.sk89q.worldedit.blocks.type.BlockType;
import com.sk89q.worldedit.blocks.type.BlockTypes;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.world.registry.BundledBlockData;
import com.sk89q.worldedit.world.registry.state.State;
import com.sk89q.worldedit.world.registry.state.value.StateValue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import javax.annotation.Nullable;
@ -54,13 +53,12 @@ import javax.annotation.Nullable;
* as a "wildcard" block value, even though a {@link Mask} would be
* more appropriate.</p>
*/
public class BaseBlock implements TileEntityBlock {
public class BaseBlock implements BlockStateHolder<BaseBlock>, TileEntityBlock {
// Instances of this class should be _as small as possible_ because there will
// be millions of instances of this object.
private BlockType blockType;
private Map<State, StateValue> states;
private BlockState blockState;
@Nullable
private CompoundTag nbtData;
@ -68,18 +66,18 @@ public class BaseBlock implements TileEntityBlock {
* Construct a block with the given ID and a data value of 0.
*
* @param id ID value
* @see #setId(int)
*/
@Deprecated
public BaseBlock(int id) {
internalSetId(id);
internalSetData(0);
this.states = new HashMap<>();
}
/**
* Construct a block with a state.
*
* @param blockState The blockstate
*/
public BaseBlock(BlockState blockState) {
this.blockType = blockState.getBlockType();
this.states = blockState.getStates();
this.blockState = blockState;
}
/**
@ -88,8 +86,18 @@ public class BaseBlock implements TileEntityBlock {
* @param blockType The block type
*/
public BaseBlock(BlockType blockType) {
internalSetType(blockType);
this.states = new HashMap<>();
this.blockState = blockType.getDefaultState();
}
/**
* Construct a block with the given ID, data value and NBT data structure.
*
* @param state The block state
* @param nbtData NBT data, which may be null
*/
public BaseBlock(BlockState state, @Nullable CompoundTag nbtData) {
this.blockState = state;
setNbtData(nbtData);
}
/**
@ -97,27 +105,9 @@ public class BaseBlock implements TileEntityBlock {
*
* @param id ID value
* @param data data value
* @see #setId(int)
* @see #setData(int)
*/
@Deprecated
public BaseBlock(int id, int data) {
internalSetId(id);
internalSetData(data);
this.states = new HashMap<>();
}
/**
* Construct a block with the given ID and data value.
*
* @param blockType The block type
* @param states The states
* @see #setId(int)
* @see #setData(int)
*/
public BaseBlock(BlockType blockType, Map<State, StateValue> states) {
internalSetType(blockType);
setStates(states);
}
/**
@ -129,22 +119,6 @@ public class BaseBlock implements TileEntityBlock {
*/
@Deprecated
public BaseBlock(int id, int data, @Nullable CompoundTag nbtData) {
internalSetId(id);
setData(data);
setNbtData(nbtData);
this.states = new HashMap<>();
}
/**
* Construct a block with the given ID, data value and NBT data structure.
*
* @param blockType The block type
* @param states The states
* @param nbtData NBT data, which may be null
*/
public BaseBlock(BlockType blockType, Map<State, StateValue> states, @Nullable CompoundTag nbtData) {
setType(blockType);
setStates(states);
setNbtData(nbtData);
}
@ -154,7 +128,16 @@ public class BaseBlock implements TileEntityBlock {
* @param other the other block
*/
public BaseBlock(BaseBlock other) {
this(other.getType(), other.getStates(), other.getNbtData());
this(other.getState(), other.getNbtData());
}
/**
* Get the block state
*
* @return The block state
*/
public BlockState getState() {
return this.blockState;
}
/**
@ -164,45 +147,7 @@ public class BaseBlock implements TileEntityBlock {
*/
@Deprecated
public int getId() {
return this.blockType.getLegacyId();
}
/**
* Set the block ID.
*
* @param type block type
*/
protected final void internalSetType(BlockType type) {
if (type == null) {
throw new IllegalArgumentException("You must provide a BlockType");
}
this.blockType = type;
}
/**
* Set the block ID.
*
* @param id block id
*/
@Deprecated
public void setId(int id) {
internalSetId(id);
}
@Deprecated
private void internalSetId(int id) {
BlockType type = BlockTypes.getBlockType(BundledBlockData.getInstance().fromLegacyId(id));
internalSetType(type);
}
/**
* Set the block type.
*
* @param type block type
*/
public void setType(BlockType type) {
internalSetType(type);
return this.blockState.getBlockType().getLegacyId();
}
/**
@ -223,16 +168,17 @@ public class BaseBlock implements TileEntityBlock {
* @return The state map
*/
public Map<State, StateValue> getStates() {
return Collections.unmodifiableMap(states);
return this.blockState.getStates();
}
/**
* Sets the states of this block.
*
* @param states The states
*/
private void setStates(Map<State, StateValue> states) {
this.states = states;
@Override
public BlockType getBlockType() {
return this.blockState.getBlockType();
}
@Override
public BaseBlock with(State state, StateValue value) {
return new BaseBlock(this.blockState.with(state, value), getNbtData());
}
/**
@ -242,26 +188,7 @@ public class BaseBlock implements TileEntityBlock {
* @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
*/
@Deprecated
protected final void internalSetData(int data) {
return this.blockState.getState(state);
}
/**
@ -271,34 +198,6 @@ public class BaseBlock implements TileEntityBlock {
*/
@Deprecated
public void setData(int data) {
internalSetData(data);
}
/**
* Set both the block's ID and data value.
*
* @param id ID value
* @param data data value
* @see #setId(int)
* @see #setData(int)
*/
@Deprecated
public void setIdAndData(int id, int data) {
setId(id);
setData(data);
}
/**
* Returns whether there are no matched states.
*
* @return true if there are no matched states
*/
public boolean hasWildcardData() {
return getStates().isEmpty();
}
public boolean hasWildcardDataFor(State state) {
return getState(state) == null;
}
@Override
@ -323,21 +222,12 @@ public class BaseBlock implements TileEntityBlock {
@Nullable
@Override
public CompoundTag getNbtData() {
return nbtData;
return this.nbtData;
}
@Override
public void setNbtData(@Nullable CompoundTag nbtData) {
this.nbtData = nbtData;
}
/**
* Get the type of block.
*
* @return the type
*/
public BlockType getType() {
return this.blockType;
throw new UnsupportedOperationException("This class is immutable.");
}
/**
@ -346,7 +236,7 @@ public class BaseBlock implements TileEntityBlock {
* @return if air
*/
public boolean isAir() {
return getType() == BlockTypes.AIR;
return getBlockType() == BlockTypes.AIR;
}
/**
@ -357,7 +247,7 @@ public class BaseBlock implements TileEntityBlock {
*/
@Deprecated
public int rotate90() {
int newData = BlockData.rotate90(getType().getLegacyId(), getData());
int newData = BlockData.rotate90(getBlockType().getLegacyId(), getData());
setData(newData);
return newData;
}
@ -370,7 +260,7 @@ public class BaseBlock implements TileEntityBlock {
*/
@Deprecated
public int rotate90Reverse() {
int newData = BlockData.rotate90Reverse(getType().getLegacyId(), getData());
int newData = BlockData.rotate90Reverse(getBlockType().getLegacyId(), getData());
setData((short) newData);
return newData;
}
@ -384,7 +274,7 @@ public class BaseBlock implements TileEntityBlock {
*/
@Deprecated
public int cycleData(int increment) {
int newData = BlockData.cycle(getType().getLegacyId(), getData(), increment);
int newData = BlockData.cycle(getBlockType().getLegacyId(), getData(), increment);
setData((short) newData);
return newData;
}
@ -397,7 +287,7 @@ public class BaseBlock implements TileEntityBlock {
*/
@Deprecated
public BaseBlock flip() {
setData((short) BlockData.flip(getType().getLegacyId(), getData()));
setData((short) BlockData.flip(getBlockType().getLegacyId(), getData()));
return this;
}
@ -410,7 +300,7 @@ public class BaseBlock implements TileEntityBlock {
*/
@Deprecated
public BaseBlock flip(FlipDirection direction) {
setData((short) BlockData.flip(getType().getLegacyId(), getData(), direction));
setData((short) BlockData.flip(getBlockType().getLegacyId(), getData(), direction));
return this;
}
@ -425,7 +315,7 @@ public class BaseBlock implements TileEntityBlock {
final BaseBlock otherBlock = (BaseBlock) o;
return getType() == otherBlock.getType() && getData() == otherBlock.getData();
return this.getState().equals(otherBlock.getState()) && Objects.equals(getNbtData(), otherBlock.getNbtData());
}
@ -436,7 +326,7 @@ public class BaseBlock implements TileEntityBlock {
* @return true if equal
*/
public boolean equalsFuzzy(BaseBlock o) {
if (!getType().equals(o.getType())) {
if (!getBlockType().equals(o.getBlockType())) {
return false;
}
@ -484,14 +374,16 @@ public class BaseBlock implements TileEntityBlock {
@Override
public int hashCode() {
int ret = getType().hashCode() << 3;
ret += getStates().hashCode();
int ret = getState().hashCode() << 3;
if (hasNbtData()) {
ret += getNbtData().hashCode();
}
return ret;
}
@Override
public String toString() {
return "Block{Type:" + getType().getId() + ", States: " + getStates().toString() + "}";
return "Block{State: " + this.getState().toString() + ", NBT: " + String.valueOf(getNbtData()) + "}";
}
}

View File

@ -19,12 +19,11 @@
package com.sk89q.worldedit.blocks;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.blocks.type.ItemType;
import com.sk89q.worldedit.blocks.type.ItemTypes;
import com.sk89q.worldedit.world.registry.BundledItemData;
import com.sk89q.worldedit.world.NbtValued;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
/**
* Represents an item, without an amount value. See {@link BaseItemStack}
@ -32,11 +31,11 @@ import java.util.Map;
*
* <p>This class may be removed in the future.</p>
*/
public class BaseItem {
public class BaseItem implements NbtValued {
private ItemType itemType;
private short damage;
private final Map<Integer, Integer> enchantments = new HashMap<>();
@Nullable
private CompoundTag nbtData;
/**
* Construct the object.
@ -45,7 +44,6 @@ public class BaseItem {
*/
@Deprecated
public BaseItem(int id) {
this(id, (short) 0);
}
/**
@ -57,27 +55,15 @@ public class BaseItem {
this.itemType = itemType;
}
/**
* Construct the object.
*
* @param id ID of the item
* @param data data value of the item
*/
@Deprecated
public BaseItem(int id, short data) {
setLegacyId(id);
this.damage = data;
}
/**
* Construct the object.
*
* @param itemType Type of the item
* @param damage Damage value of the item
* @param tag NBT Compound tag
*/
public BaseItem(ItemType itemType, short damage) {
public BaseItem(ItemType itemType, CompoundTag tag) {
this.itemType = itemType;
this.damage = damage;
this.nbtData = tag;
}
/**
@ -90,17 +76,6 @@ public class BaseItem {
return this.itemType.getLegacyId();
}
/**
* Set the type of item.
*
* @param id the id to set
*/
@Deprecated
public void setLegacyId(int id) {
ItemType type = ItemTypes.getItemType(BundledItemData.getInstance().fromLegacyId(id));
setType(type);
}
/**
* Get the type of item.
*
@ -119,50 +94,19 @@ public class BaseItem {
this.itemType = itemType;
}
/**
* Get the damage value.
*
* @return the damage
*/
public short getDamage() {
return this.damage;
@Override
public boolean hasNbtData() {
return this.nbtData != null;
}
/**
* Get the data value.
*
* @return the data
*/
@Deprecated
public short getData() {
return this.damage;
@Nullable
@Override
public CompoundTag getNbtData() {
return this.nbtData;
}
/**
* Set the data value.
*
* @param damage the damage to set
*/
public void setDamage(short damage) {
this.damage = damage;
}
/**
* Set the data value.
*
* @param data the damage to set
*/
@Deprecated
public void setData(short data) {
this.damage = data;
}
/**
* Get the map of enchantments.
*
* @return map of enchantments
*/
public Map<Integer, Integer> getEnchantments() {
return enchantments;
@Override
public void setNbtData(@Nullable CompoundTag nbtData) {
this.nbtData = nbtData;
}
}

View File

@ -19,6 +19,7 @@
package com.sk89q.worldedit.blocks;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.blocks.type.ItemType;
/**
@ -81,7 +82,7 @@ public class BaseItemStack extends BaseItem {
*/
@Deprecated
public BaseItemStack(int id, int amount, short data) {
super(id, data);
super(id);
this.amount = amount;
}
@ -89,11 +90,11 @@ public class BaseItemStack extends BaseItem {
* Construct the object.
*
* @param id The item type
* @param tag Tag value
* @param amount amount in the stack
* @param damage Damage value
*/
public BaseItemStack(ItemType id, int amount, short damage) {
super(id, damage);
public BaseItemStack(ItemType id, CompoundTag tag, int amount) {
super(id, tag);
this.amount = amount;
}

View File

@ -1540,7 +1540,7 @@ public enum BlockType {
addIdentities(BlockID.DOUBLE_WOODEN_STEP, 7); // rule 3
addIdentities(BlockID.WOODEN_STEP, 7); // rule 1
nonDataBlockBagItems.put(BlockID.COCOA_PLANT, new BaseItem(ItemID.INK_SACK, (short) (15 - ClothColor.ID.BROWN))); // rule 3
nonDataBlockBagItems.put(BlockID.COCOA_PLANT, new BaseItem(ItemID.INK_SACK)); // rule 3 TODO data removed
addIdentity(BlockID.SANDSTONE_STAIRS); // rule 1
nonDataBlockBagItems.put(BlockID.EMERALD_ORE, new BaseItem(ItemID.EMERALD)); // rule 5
addIdentity(BlockID.ENDER_CHEST); // rule 3
@ -1569,7 +1569,8 @@ public enum BlockType {
addIdentity(BlockID.HOPPER); // rule 1
addIdentities(BlockID.QUARTZ_BLOCK, 1); // rule 4
for (int i = 2; i <= 4; i++) {
dataBlockBagItems.put(typeDataKey(BlockID.QUARTZ_BLOCK, i), new BaseItem(BlockID.QUARTZ_BLOCK, (short) 2)); // rule 4, quartz pillars
dataBlockBagItems.put(typeDataKey(BlockID.QUARTZ_BLOCK, i), new BaseItem(BlockID.QUARTZ_BLOCK)); // rule 4, quartz pillars TODO data
// removed
}
addIdentity(BlockID.QUARTZ_STAIRS); // rule 1
addIdentity(BlockID.ACTIVATOR_RAIL); // rule 1
@ -1629,7 +1630,7 @@ public enum BlockType {
private static void addIdentities(int type, int maxData) {
for (int data = 0; data < maxData; ++data) {
dataBlockBagItems.put(typeDataKey(type, data), new BaseItem(type, (short) data));
dataBlockBagItems.put(typeDataKey(type, data), new BaseItem(type)); // TODO data removed
}
}

View File

@ -34,7 +34,7 @@ import java.util.Map;
* An immutable class that represents the state a block can be in.
*/
@SuppressWarnings("unchecked")
public class BlockState {
public class BlockState implements BlockStateHolder<BlockState> {
private final BlockType blockType;
private final Map<State, StateValue> values;
@ -67,7 +67,7 @@ public class BlockState {
for(final Map.Entry<State, StateValue> entry : this.values.entrySet()) {
final State state = entry.getKey();
state.getValues().stream().forEach(value -> {
state.getValues().forEach(value -> {
if(value != entry.getValue()) {
states.put(state, (StateValue) value, stateMap.get(this.withValue(state, (StateValue) value)));
}
@ -83,22 +83,12 @@ public class BlockState {
return values;
}
/**
* Get the block type
*
* @return The type
*/
@Override
public BlockType getBlockType() {
return this.blockType;
}
/**
* Returns a BlockState with the given state and value applied.
*
* @param state The state
* @param value The value
* @return The modified state, or same if could not be applied
*/
@Override
public BlockState with(State state, StateValue value) {
if (fuzzy) {
return setState(state, value);
@ -108,21 +98,12 @@ public class BlockState {
}
}
/**
* Gets the value at the given state
*
* @param state The state
* @return The value
*/
@Override
public StateValue getState(State state) {
return this.values.get(state);
}
/**
* Gets an immutable collection of the states.
*
* @return The states
*/
@Override
public Map<State, StateValue> getStates() {
return Collections.unmodifiableMap(this.values);
}
@ -136,7 +117,7 @@ public class BlockState {
* @param value The value
* @return The blockstate, for chaining
*/
BlockState setState(State state, StateValue value) {
private BlockState setState(State state, StateValue value) {
this.values.put(state, value);
return this;
}

View File

@ -0,0 +1,59 @@
/*
* 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.blocks.type;
import com.sk89q.worldedit.world.registry.state.State;
import com.sk89q.worldedit.world.registry.state.value.StateValue;
import java.util.Map;
public interface BlockStateHolder<T extends BlockStateHolder> {
/**
* Get the block type
*
* @return The type
*/
BlockType getBlockType();
/**
* Returns a BlockState with the given state and value applied.
*
* @param state The state
* @param value The value
* @return The modified state, or same if could not be applied
*/
T with(State state, StateValue value);
/**
* Gets the value at the given state
*
* @param state The state
* @return The value
*/
StateValue getState(State state);
/**
* Gets an immutable collection of the states.
*
* @return The states
*/
Map<State, StateValue> getStates();
}

View File

@ -34,6 +34,7 @@ import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.blocks.type.ItemTypes;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extension.input.ParserContext;
@ -277,7 +278,7 @@ public class SelectionCommands {
@CommandPermissions("worldedit.wand")
public void wand(Player player, LocalSession session, EditSession editSession, CommandContext args) throws WorldEditException {
player.giveItem(ItemTypes.getItemType(we.getConfiguration().wandItem).getLegacyId(), 1);
player.giveItem(new BaseItemStack(ItemTypes.getItemType(we.getConfiguration().wandItem), 1));
player.print("Left click: select pos #1; Right click: select pos #2");
}
@ -677,12 +678,12 @@ public class SelectionCommands {
player.print("# total blocks: " + size);
for (Countable<BaseBlock> c : distributionData) {
String name = c.getID().getType().getName();
String name = c.getID().getBlockType().getName();
String str = String.format("%-7s (%.3f%%) %s #%s%s",
String.valueOf(c.getAmount()),
c.getAmount() / (double) size * 100,
name,
c.getID().getType().getId(),
c.getID().getBlockType().getId(),
c.getID().getStates());
player.print(str);
}

View File

@ -214,7 +214,7 @@ public class ToolCommands {
session.setTool(itemStack.getType(), new LongRangeBuildTool(primary, secondary));
player.print("Long-range building tool bound to " + itemStack.getType().getName() + ".");
player.print("Left-click set to " + secondary.getType().getName() + "; right-click set to "
+ primary.getType().getName() + ".");
player.print("Left-click set to " + secondary.getBlockType().getName() + "; right-click set to "
+ primary.getBlockType().getName() + ".");
}
}

View File

@ -32,6 +32,7 @@ import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.type.BlockTypes;
import com.sk89q.worldedit.command.util.CreatureButcher;
import com.sk89q.worldedit.command.util.EntityRemover;
import com.sk89q.worldedit.entity.Entity;
@ -65,7 +66,6 @@ import com.sk89q.worldedit.util.formatting.component.CommandUsageBox;
import com.sk89q.worldedit.world.World;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@ -176,7 +176,7 @@ public class UtilityCommands {
double radius = Math.max(0, args.getDouble(0));
we.checkMaxRadius(radius);
int affected = editSession.fixLiquid(
session.getPlacementPosition(player), radius, 10, 11);
session.getPlacementPosition(player), radius, BlockTypes.FLOWING_LAVA, BlockTypes.LAVA);
player.print(affected + " block(s) have been changed.");
}
@ -194,7 +194,7 @@ public class UtilityCommands {
double radius = Math.max(0, args.getDouble(0));
we.checkMaxRadius(radius);
int affected = editSession.fixLiquid(
session.getPlacementPosition(player), radius, 8, 9);
session.getPlacementPosition(player), radius, BlockTypes.FLOWING_WATER, BlockTypes.WATER);
player.print(affected + " block(s) have been changed.");
}
@ -261,7 +261,7 @@ public class UtilityCommands {
int size = Math.max(1, args.getInteger(1, 50));
we.checkMaxRadius(size);
int affected = editSession.removeNear(session.getPlacementPosition(player), block.getType().getLegacyId(), size);
int affected = editSession.removeNear(session.getPlacementPosition(player), block.getBlockType().getLegacyId(), size);
player.print(affected + " block(s) have been removed.");
}

View File

@ -68,7 +68,7 @@ public class ItemUseParser extends SimpleCommand<Contextual<RegionFunction>> {
@Override
public String toString() {
return "application of the item " + item.getType() + ":" + item.getData();
return "application of the item " + item.getType() + ":" + item.getNbtData();
}
}

View File

@ -50,7 +50,7 @@ public class AreaPickaxe implements BlockTool {
int ox = clicked.getBlockX();
int oy = clicked.getBlockY();
int oz = clicked.getBlockZ();
BlockType initialType = clicked.getExtent().getBlock(clicked.toVector()).getType();
BlockType initialType = clicked.getExtent().getBlock(clicked.toVector()).getBlockType();
if (initialType == BlockTypes.AIR) {
return true;
@ -68,7 +68,7 @@ public class AreaPickaxe implements BlockTool {
for (int y = oy - range; y <= oy + range; ++y) {
for (int z = oz - range; z <= oz + range; ++z) {
Vector pos = new Vector(x, y, z);
if (editSession.getBlock(pos).getType() != initialType) {
if (editSession.getBlock(pos).getBlockType() != initialType) {
continue;
}

View File

@ -67,7 +67,7 @@ public class BlockReplacer implements DoubleActionBlockTool {
public boolean actSecondary(Platform server, LocalConfiguration config, Player player, LocalSession session, com.sk89q.worldedit.util.Location clicked) {
EditSession editSession = session.createEditSession(player);
targetBlock = (editSession).getBlock(clicked.toVector());
BlockType type = targetBlock.getType().getLegacyType();
BlockType type = targetBlock.getBlockType().getLegacyType();
if (type != null) {
player.print("Replacer tool switched to: " + type.getName());

View File

@ -81,7 +81,7 @@ public class FloatingTreeRemover implements BlockTool {
}
for (Vector blockVector : blockSet) {
final int typeId = editSession.getBlock(blockVector).getType().getLegacyId();
final int typeId = editSession.getBlock(blockVector).getBlockType().getLegacyId();
switch (typeId) {
case BlockID.LOG:
case BlockID.LOG2:

View File

@ -54,7 +54,7 @@ public class FloodFillTool implements BlockTool {
public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked) {
World world = (World) clicked.getExtent();
BlockType initialType = world.getLazyBlock(clicked.toVector()).getType();
BlockType initialType = world.getLazyBlock(clicked.toVector()).getBlockType();
if (initialType == BlockTypes.AIR) {
return true;
@ -87,7 +87,7 @@ public class FloodFillTool implements BlockTool {
visited.add(pos);
if (editSession.getBlock(pos).getType() == initialType) {
if (editSession.getBlock(pos).getBlockType() == initialType) {
editSession.setBlock(pos, pattern.apply(pos));
} else {
return;

View File

@ -55,7 +55,7 @@ public class LongRangeBuildTool extends BrushTool implements DoubleActionTraceTo
if (pos == null) return false;
EditSession eS = session.createEditSession(player);
try {
if (secondary.getType() == BlockTypes.AIR) {
if (secondary.getBlockType() == BlockTypes.AIR) {
eS.setBlock(pos.toVector(), secondary);
} else {
eS.setBlock(pos.getDirection(), secondary);
@ -74,7 +74,7 @@ public class LongRangeBuildTool extends BrushTool implements DoubleActionTraceTo
if (pos == null) return false;
EditSession eS = session.createEditSession(player);
try {
if (primary.getType() == BlockTypes.AIR) {
if (primary.getBlockType() == BlockTypes.AIR) {
eS.setBlock(pos.toVector(), primary);
} else {
eS.setBlock(pos.getDirection(), primary);

View File

@ -48,8 +48,8 @@ public class QueryTool implements BlockTool {
BaseBlock block = editSession.getBlock(clicked.toVector());
player.print("\u00A79@" + clicked.toVector() + ": " + "\u00A7e"
+ "#" + block.getType() + "\u00A77" + " ("
+ block.getType().getId() + ") "
+ "#" + block.getBlockType() + "\u00A77" + " ("
+ block.getBlockType().getId() + ") "
+ "\u00A7f"
+ "[" + block.getStates().toString() + "]" + " (" + world.getBlockLightLevel(clicked.toVector()) + "/" + world.getBlockLightLevel(clicked.toVector().add(0, 1, 0)) + ")");

View File

@ -53,7 +53,7 @@ public class RecursivePickaxe implements BlockTool {
public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, com.sk89q.worldedit.util.Location clicked) {
World world = (World) clicked.getExtent();
BlockType initialType = world.getBlock(clicked.toVector()).getType();
BlockType initialType = world.getBlock(clicked.toVector()).getBlockType();
if (initialType == BlockTypes.AIR) {
return true;
@ -89,7 +89,7 @@ public class RecursivePickaxe implements BlockTool {
visited.add(pos);
if (editSession.getBlock(pos).getType() != initialType) {
if (editSession.getBlock(pos).getBlockType() != initialType) {
return;
}

View File

@ -44,7 +44,7 @@ public class SinglePickaxe implements BlockTool {
@Override
public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, com.sk89q.worldedit.util.Location clicked) {
World world = (World) clicked.getExtent();
final BlockType blockType = world.getLazyBlock(clicked.toVector()).getType();
final BlockType blockType = world.getLazyBlock(clicked.toVector()).getBlockType();
if (blockType == BlockTypes.BEDROCK
&& !player.canDestroyBedrock()) {
return true;

View File

@ -24,7 +24,6 @@ import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.blocks.type.ItemType;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extent.inventory.BlockBag;
import com.sk89q.worldedit.util.HandSide;
@ -75,10 +74,9 @@ public interface Player extends Entity, Actor {
/**
* Gives the player an item.
*
* @param type The item id of the item to be given to the player
* @param amount How many items in the stack
* @param itemStack The item to give
*/
void giveItem(int type, int amount);
void giveItem(BaseItemStack itemStack);
/**
* Get this actor's block bag.

View File

@ -125,7 +125,7 @@ class DefaultBlockParser extends InputParser<BaseBlock> {
return blockInHand;
}
blockType = blockInHand.getType();
blockType = blockInHand.getBlockType();
blockStates = blockInHand.getStates();
} else if ("offhand".equalsIgnoreCase(typeString)) {
// Get the block type from the item in the user's off hand.
@ -134,7 +134,7 @@ class DefaultBlockParser extends InputParser<BaseBlock> {
return blockInHand;
}
blockType = blockInHand.getType();
blockType = blockInHand.getBlockType();
blockStates = blockInHand.getStates();
} else if ("pos1".equalsIgnoreCase(typeString)) {
// Get the block type from the "primary position"
@ -150,7 +150,7 @@ class DefaultBlockParser extends InputParser<BaseBlock> {
return blockInHand;
}
blockType = blockInHand.getType();
blockType = blockInHand.getBlockType();
blockStates = blockInHand.getStates();
} else {
// Attempt to lookup a block from ID or name.

View File

@ -33,45 +33,11 @@ public class DefaultItemParser extends InputParser<BaseItem> {
@Override
public BaseItem parseFromInput(String input, ParserContext context) throws InputParseException {
String[] tokens = input.split(":", 3);
BaseItem item;
short damage = 0;
try {
int id = Integer.parseInt(tokens[0]);
// Parse metadata
if (tokens.length == 2) {
try {
damage = Short.parseShort(tokens[1]);
} catch (NumberFormatException ignored) {
throw new InputParseException("Expected '" + tokens[1] + "' to be a damage value but it's not a number");
}
}
item = context.requireWorld().getWorldData().getItemRegistry().createFromId(id);
} catch (NumberFormatException e) {
String name = tokens[0];
if (input.length() >= 2) {
name += ":" + tokens[1];
}
// Parse metadata
if (tokens.length == 3) {
try {
damage = Short.parseShort(tokens[2]);
} catch (NumberFormatException ignored) {
throw new InputParseException("Expected '" + tokens[2] + "' to be a damage value but it's not a number");
}
}
item = context.requireWorld().getWorldData().getItemRegistry().createFromId(name);
}
BaseItem item = context.requireWorld().getWorldData().getItemRegistry().createFromId(input);
if (item == null) {
throw new InputParseException("'" + input + "' did not match any item");
} else {
item.setDamage(damage);
return item;
}
}

View File

@ -19,7 +19,6 @@
package com.sk89q.worldedit.extension.platform;
import com.sk89q.worldedit.NotABlockException;
import com.sk89q.worldedit.PlayerDirection;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEditException;
@ -366,9 +365,6 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable {
@Override
public BaseBlock getBlockInHand(HandSide handSide) throws WorldEditException {
final ItemType typeId = getItemInHand(handSide).getType();
if (!getWorld().isValidBlockType(typeId.getLegacyId())) {
throw new NotABlockException(typeId.getId());
}
return new BaseBlock(typeId.getLegacyId());
}

View File

@ -65,8 +65,8 @@ class PlayerProxy extends AbstractPlayerActor {
}
@Override
public void giveItem(int type, int amount) {
basePlayer.giveItem(type, amount);
public void giveItem(BaseItemStack itemStack) {
basePlayer.giveItem(itemStack);
}
@Override

View File

@ -34,7 +34,7 @@ import java.util.Map;
public class SignCompatibilityHandler implements NBTCompatibilityHandler {
@Override
public boolean isAffectedBlock(BaseBlock block) {
return block.getType() == BlockTypes.SIGN || block.getType() == BlockTypes.WALL_SIGN;
return block.getBlockType() == BlockTypes.SIGN || block.getBlockType() == BlockTypes.WALL_SIGN;
}
@Override

View File

@ -82,8 +82,8 @@ public class BlockBagExtent extends AbstractDelegateExtent {
public boolean setBlock(Vector position, BaseBlock block) throws WorldEditException {
if (blockBag != null) {
BaseBlock lazyBlock = getExtent().getLazyBlock(position);
int existing = lazyBlock.getType().getLegacyId();
final int type = block.getType().getLegacyId();
int existing = lazyBlock.getBlockType().getLegacyId();
final int type = block.getBlockType().getLegacyId();
if (type > 0) {
try {

View File

@ -19,28 +19,30 @@
package com.sk89q.worldedit.extent.inventory;
import com.sk89q.worldedit.blocks.type.ItemType;
/**
* Thrown when the target inventory of a block bag is full.
*/
public class OutOfSpaceException extends BlockBagException {
private int id;
private ItemType type;
/**
* Construct the object.
*
* @param id the ID of the block
* @param type the type of the block
*/
public OutOfSpaceException(int id) {
this.id = id;
public OutOfSpaceException(ItemType type) {
this.type = type;
}
/**
* Get the ID of the block
* Get the type of the block
*
* @return the id
* @return the type
*/
public int getID() {
return id;
public ItemType getType() {
return this.type;
}
}

View File

@ -94,21 +94,21 @@ public class MultiStageReorder extends AbstractDelegateExtent implements Reorder
return super.setBlock(location, block);
}
if (BlockType.shouldPlaceLast(block.getType().getLegacyId())) {
if (BlockType.shouldPlaceLast(block.getBlockType().getLegacyId())) {
// Place torches, etc. last
stage2.put(location.toBlockVector(), block);
return !(lazyBlock.getType() == block.getType() && lazyBlock.getData() == block.getData());
} else if (BlockType.shouldPlaceFinal(block.getType().getLegacyId())) {
return !(lazyBlock.getBlockType() == block.getBlockType() && lazyBlock.getData() == block.getData());
} else if (BlockType.shouldPlaceFinal(block.getBlockType().getLegacyId())) {
// Place signs, reed, etc even later
stage3.put(location.toBlockVector(), block);
return !(lazyBlock.getType() == block.getType() && lazyBlock.getData() == block.getData());
} else if (BlockType.shouldPlaceLast(lazyBlock.getType().getLegacyId())) {
return !(lazyBlock.getBlockType() == block.getBlockType() && lazyBlock.getData() == block.getData());
} else if (BlockType.shouldPlaceLast(lazyBlock.getBlockType().getLegacyId())) {
// Destroy torches, etc. first
super.setBlock(location, new BaseBlock(BlockTypes.AIR));
return super.setBlock(location, block);
} else {
stage1.put(location.toBlockVector(), block);
return !(lazyBlock.getType() == block.getType() && lazyBlock.getData() == block.getData());
return !(lazyBlock.getBlockType() == block.getBlockType() && lazyBlock.getData() == block.getData());
}
}
@ -150,7 +150,7 @@ public class MultiStageReorder extends AbstractDelegateExtent implements Reorder
final BaseBlock baseBlock = blockTypes.get(current);
final int type = baseBlock.getType().getLegacyId();
final int type = baseBlock.getBlockType().getLegacyId();
final int data = baseBlock.getData();
switch (type) {

View File

@ -138,7 +138,7 @@ public class BlockTransformExtent extends AbstractDelegateExtent {
if (value != null && value.getData() != null) {
DirectionalStateValue newValue = getNewStateValue((DirectionalState) state, transform, value.getDirection());
if (newValue != null) {
changedBlock.setState(state, newValue);
changedBlock.with(state, newValue);
}
}
}

View File

@ -51,7 +51,7 @@ public class DataValidatorExtent extends AbstractDelegateExtent {
@Override
public boolean setBlock(Vector location, BaseBlock block) throws WorldEditException {
final int y = location.getBlockY();
final BlockType type = block.getType();
final BlockType type = block.getBlockType();
if (y < 0 || y > world.getMaxY()) {
return false;
}

View File

@ -54,7 +54,7 @@ public class BlockQuirkExtent extends AbstractDelegateExtent {
@Override
public boolean setBlock(Vector position, BaseBlock block) throws WorldEditException {
BaseBlock lazyBlock = getExtent().getLazyBlock(position);
int existing = lazyBlock.getType().getLegacyId();
int existing = lazyBlock.getBlockType().getLegacyId();
if (BlockType.isContainerBlock(existing)) {
world.clearContainerBlockContents(position); // Clear the container block so that it doesn't drop items

View File

@ -104,7 +104,7 @@ public class ExtentBlockCopy implements RegionFunction {
builder.putByte("Rot", (byte) MCDirections.toRotation(newDirection));
return new BaseBlock(state.getType(), state.getStates(), builder.build());
return new BaseBlock(state.getState(), builder.build());
}
}
}

View File

@ -106,10 +106,10 @@ public class FloraGenerator implements RegionFunction {
public boolean apply(Vector position) throws WorldEditException {
BaseBlock block = editSession.getBlock(position);
if (block.getType() == BlockTypes.GRASS) {
if (block.getBlockType() == BlockTypes.GRASS) {
editSession.setBlock(position.add(0, 1, 0), temperatePattern.apply(position));
return true;
} else if (block.getType() == BlockTypes.SAND) {
} else if (block.getBlockType() == BlockTypes.SAND) {
editSession.setBlock(position.add(0, 1, 0), desertPattern.apply(position));
return true;
}

View File

@ -51,7 +51,7 @@ public class ForestGenerator implements RegionFunction {
@Override
public boolean apply(Vector position) throws WorldEditException {
BaseBlock block = editSession.getBlock(position);
BlockType t = block.getType();
BlockType t = block.getBlockType();
if (t == BlockTypes.GRASS || t == BlockTypes.DIRT) {
treeGenerator.generate(editSession, position.add(0, 1, 0));

View File

@ -163,7 +163,7 @@ public class GardenPatchGenerator implements RegionFunction {
position = position.add(0, 1, 0);
}
if (editSession.getBlock(position.add(0, -1, 0)).getType() != BlockTypes.GRASS) {
if (editSession.getBlock(position.add(0, -1, 0)).getBlockType() != BlockTypes.GRASS) {
return false;
}

View File

@ -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()));
return blocks.contains(block) || blocks.contains(new BaseBlock(block.getBlockType()));
}
@Nullable

View File

@ -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.getStates());
BaseBlock compare = new BaseBlock(lazyBlock.getState());
return Blocks.containsFuzzy(blocks, compare);
}
}

View File

@ -36,7 +36,7 @@ public class SolidBlockMask extends AbstractExtentMask {
public boolean test(Vector vector) {
Extent extent = getExtent();
BaseBlock lazyBlock = extent.getLazyBlock(vector);
return !BlockType.canPassThrough(lazyBlock.getType().getLegacyId(), lazyBlock.getData());
return !BlockType.canPassThrough(lazyBlock.getBlockType().getLegacyId(), lazyBlock.getData());
}
@Nullable

View File

@ -148,8 +148,8 @@ public class HeightMap {
BaseBlock existing = session.getBlock(new Vector(xr, curHeight, zr));
// Skip water/lava
if (existing.getType() != BlockTypes.WATER && existing.getType() != BlockTypes.FLOWING_WATER
&& existing.getType() != BlockTypes.LAVA && existing.getType() != BlockTypes.FLOWING_LAVA) {
if (existing.getBlockType() != BlockTypes.WATER && existing.getBlockType() != BlockTypes.FLOWING_WATER
&& existing.getBlockType() != BlockTypes.LAVA && existing.getBlockType() != BlockTypes.FLOWING_LAVA) {
session.setBlock(new Vector(xr, newHeight, zr), existing);
++blocksChanged;

View File

@ -99,7 +99,7 @@ public abstract class ArbitraryShape {
return null;
}
short newCacheEntry = (short) (material.getType().getLegacyId() | ((material.getData() + 1) << 8));
short newCacheEntry = (short) (material.getBlockType().getLegacyId() | ((material.getData() + 1) << 8));
if (newCacheEntry == 0) {
// type and data 0
newCacheEntry = -2;

View File

@ -103,7 +103,7 @@ public class TargetBlock {
boolean searchForLastBlock = true;
Location lastBlock = null;
while (getNextBlock() != null) {
if (world.getLazyBlock(getCurrentBlock().toVector()).getType() == BlockTypes.AIR) {
if (world.getLazyBlock(getCurrentBlock().toVector()).getBlockType() == BlockTypes.AIR) {
if (searchForLastBlock) {
lastBlock = getCurrentBlock();
if (lastBlock.getBlockY() <= 0 || lastBlock.getBlockY() >= world.getMaxY()) {
@ -125,7 +125,7 @@ public class TargetBlock {
* @return Block
*/
public Location getTargetBlock() {
while (getNextBlock() != null && world.getLazyBlock(getCurrentBlock().toVector()).getType() == BlockTypes.AIR) ;
while (getNextBlock() != null && world.getLazyBlock(getCurrentBlock().toVector()).getBlockType() == BlockTypes.AIR) ;
return getCurrentBlock();
}

View File

@ -20,8 +20,6 @@
package com.sk89q.worldedit.world;
import com.sk89q.worldedit.BlockVector2D;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock;
@ -34,7 +32,6 @@ import com.sk89q.worldedit.function.mask.BlockMask;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.util.Direction;
import com.sk89q.worldedit.util.TreeGenerator.TreeType;
import java.util.PriorityQueue;
@ -53,32 +50,6 @@ public abstract class AbstractWorld implements World {
return false;
}
@Override
public final boolean setBlockType(Vector position, int type) {
try {
return setBlock(position, new BaseBlock(type));
} catch (WorldEditException ignored) {
return false;
}
}
@Override
public final void setBlockData(Vector position, int data) {
try {
setBlock(position, new BaseBlock(getLazyBlock(position).getType().getLegacyId(), data));
} catch (WorldEditException ignored) {
}
}
@Override
public final boolean setTypeIdAndData(Vector position, int type, int data) {
try {
return setBlock(position, new BaseBlock(type, data));
} catch (WorldEditException ignored) {
return false;
}
}
@Override
public final boolean setBlock(Vector pt, BaseBlock block) throws WorldEditException {
return setBlock(pt, block, true);
@ -89,17 +60,6 @@ public abstract class AbstractWorld implements World {
return getMaximumPoint().getBlockY();
}
@Override
public boolean isValidBlockType(int type) {
return BlockType.fromID(type) != null;
}
@Override
public boolean usesBlockData(int type) {
// We future proof here by assuming all unknown blocks use data
return BlockType.usesData(type) || BlockType.fromID(type) == null;
}
@Override
public Mask createLiquidMask() {
return new BlockMask(this,
@ -124,7 +84,7 @@ public abstract class AbstractWorld implements World {
if (stack != null) {
final int amount = stack.getAmount();
if (amount > 1) {
dropItem(pt, new BaseItemStack(stack.getType(), 1, stack.getData()), amount);
dropItem(pt, new BaseItemStack(stack.getType(), stack.getNbtData(), 1), amount);
} else {
dropItem(pt, stack, amount);
}
@ -137,31 +97,6 @@ public abstract class AbstractWorld implements World {
}
}
@Override
public boolean generateTree(EditSession editSession, Vector pt) throws MaxChangedBlocksException {
return generateTree(TreeType.TREE, editSession, pt);
}
@Override
public boolean generateBigTree(EditSession editSession, Vector pt) throws MaxChangedBlocksException {
return generateTree(TreeType.BIG_TREE, editSession, pt);
}
@Override
public boolean generateBirchTree(EditSession editSession, Vector pt) throws MaxChangedBlocksException {
return generateTree(TreeType.BIRCH, editSession, pt);
}
@Override
public boolean generateRedwoodTree(EditSession editSession, Vector pt) throws MaxChangedBlocksException {
return generateTree(TreeType.REDWOOD, editSession, pt);
}
@Override
public boolean generateTallRedwoodTree(EditSession editSession, Vector pt) throws MaxChangedBlocksException {
return generateTree(TreeType.TALL_REDWOOD, editSession, pt);
}
@Override
public void checkLoadedChunk(Vector pt) {
}

View File

@ -34,7 +34,6 @@ import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Direction;
import com.sk89q.worldedit.util.TreeGenerator;
import com.sk89q.worldedit.util.TreeGenerator.TreeType;
import com.sk89q.worldedit.world.registry.WorldData;
/**
@ -56,24 +55,6 @@ public interface World extends Extent {
*/
int getMaxY();
/**
* Checks whether the given block ID is a valid block ID.
*
* @param id the block ID
* @return true if the block ID is a valid one
*/
@Deprecated
boolean isValidBlockType(int id);
/**
* Checks whether the given block ID uses data values for differentiating
* types of blocks.
*
* @param id the block ID
* @return true if the block uses data values
*/
boolean usesBlockData(int id);
/**
* Create a mask that matches all liquids.
*
@ -113,24 +94,6 @@ public interface World extends Extent {
*/
boolean setBlock(Vector position, BaseBlock block, boolean notifyAndLight) throws WorldEditException;
/**
* @deprecated Use {@link #setBlock(Vector, BaseBlock)}
*/
@Deprecated
boolean setBlockType(Vector position, int type);
/**
* @deprecated Use {@link #setBlock(Vector, BaseBlock)}
*/
@Deprecated
void setBlockData(Vector position, int data);
/**
* @deprecated Use {@link #setBlock(Vector, BaseBlock)}
*/
@Deprecated
boolean setTypeIdAndData(Vector position, int type, int data);
/**
* Get the light level at the given block.
*
@ -192,36 +155,6 @@ public interface World extends Extent {
*/
boolean generateTree(TreeGenerator.TreeType type, EditSession editSession, Vector position) throws MaxChangedBlocksException;
/**
* @deprecated Use {@link #generateTree(TreeType, EditSession, Vector)}
*/
@Deprecated
boolean generateTree(EditSession editSession, Vector position) throws MaxChangedBlocksException;
/**
* @deprecated Use {@link #generateTree(TreeType, EditSession, Vector)}
*/
@Deprecated
boolean generateBigTree(EditSession editSession, Vector position) throws MaxChangedBlocksException;
/**
* @deprecated Use {@link #generateTree(TreeType, EditSession, Vector)}
*/
@Deprecated
boolean generateBirchTree(EditSession editSession, Vector position) throws MaxChangedBlocksException;
/**
* @deprecated Use {@link #generateTree(TreeType, EditSession, Vector)}
*/
@Deprecated
boolean generateRedwoodTree(EditSession editSession, Vector position) throws MaxChangedBlocksException;
/**
* @deprecated Use {@link #generateTree(TreeType, EditSession, Vector)}
*/
@Deprecated
boolean generateTallRedwoodTree(EditSession editSession, Vector position) throws MaxChangedBlocksException;
/**
* Load the chunk at the given position if it isn't loaded.
*

View File

@ -118,8 +118,7 @@ public class AnvilChunk implements Chunk {
}
}
@Override
public int getBlockID(Vector position) throws DataException {
private int getBlockID(Vector position) throws DataException {
int x = position.getBlockX() - rootX * 16;
int y = position.getBlockY();
int z = position.getBlockZ() - rootZ * 16;
@ -130,9 +129,6 @@ public class AnvilChunk implements Chunk {
}
int yindex = y & 0x0F;
if (yindex < 0 || yindex >= 16) {
throw new DataException("Chunk does not contain position " + position);
}
int index = x + (z * 16 + (yindex * 16 * 16));
@ -155,8 +151,7 @@ public class AnvilChunk implements Chunk {
}
}
@Override
public int getBlockData(Vector position) throws DataException {
private int getBlockData(Vector position) throws DataException {
int x = position.getBlockX() - rootX * 16;
int y = position.getBlockY();
int z = position.getBlockZ() - rootZ * 16;
@ -167,10 +162,6 @@ public class AnvilChunk implements Chunk {
if (section < 0 || section >= blocks.length) {
throw new DataException("Chunk does not contain position " + position);
}
if (yIndex < 0 || yIndex >= 16) {
throw new DataException("Chunk does not contain position " + position);
}
int index = x + (z * 16 + (yIndex * 16 * 16));
boolean shift = index % 2 == 0;
@ -200,8 +191,7 @@ public class AnvilChunk implements Chunk {
for (Tag tag : tags) {
if (!(tag instanceof CompoundTag)) {
throw new InvalidFormatException(
"CompoundTag expected in TileEntities");
throw new InvalidFormatException("CompoundTag expected in TileEntities");
}
CompoundTag t = (CompoundTag) tag;
@ -268,21 +258,7 @@ public class AnvilChunk implements Chunk {
int data = getBlockData(position);
BaseBlock block;
/*if (id == BlockID.WALL_SIGN || id == BlockID.SIGN_POST) {
block = new SignBlock(id, data);
} else if (id == BlockID.CHEST) {
block = new ChestBlock(data);
} else if (id == BlockID.FURNACE || id == BlockID.BURNING_FURNACE) {
block = new FurnaceBlock(id, data);
} else if (id == BlockID.DISPENSER) {
block = new DispenserBlock(data);
} else if (id == BlockID.MOB_SPAWNER) {
block = new MobSpawnerBlock(data);
} else if (id == BlockID.NOTE_BLOCK) {
block = new NoteBlock(data);
} else {*/
block = new BaseBlock(id, data);
//}
block = new BaseBlock(id, data);
CompoundTag tileEntity = getBlockTileEntity(position);
if (tileEntity != null) {

View File

@ -27,25 +27,6 @@ import com.sk89q.worldedit.world.DataException;
* A 16 by 16 block chunk.
*/
public interface Chunk {
/**
* Get the block ID of a block.
*
* @param position the position of the block
* @return the type ID of the block
* @throws DataException thrown on data error
*/
public int getBlockID(Vector position) throws DataException;
/**
* Get the block data of a block.
*
* @param position the position of the block
* @return the data value of the block
* @throws DataException thrown on data error
*/
public int getBlockData(Vector position) throws DataException;
/**
* Get a block;
@ -54,6 +35,6 @@ public interface Chunk {
* @return block the block
* @throws DataException thrown on data error
*/
public BaseBlock getBlock(Vector position) throws DataException;
BaseBlock getBlock(Vector position) throws DataException;
}

View File

@ -28,6 +28,7 @@ import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.type.BlockTypes;
import com.sk89q.worldedit.world.DataException;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.storage.InvalidFormatException;
@ -76,43 +77,6 @@ public class OldChunk implements Chunk {
}
}
@Override
public int getBlockID(Vector position) throws DataException {
if(position.getBlockY() >= 128) return 0;
int x = position.getBlockX() - rootX * 16;
int y = position.getBlockY();
int z = position.getBlockZ() - rootZ * 16;
int index = y + (z * 128 + (x * 128 * 16));
try {
return blocks[index];
} catch (IndexOutOfBoundsException e) {
throw new DataException("Chunk does not contain position " + position);
}
}
@Override
public int getBlockData(Vector position) throws DataException {
if(position.getBlockY() >= 128) return 0;
int x = position.getBlockX() - rootX * 16;
int y = position.getBlockY();
int z = position.getBlockZ() - rootZ * 16;
int index = y + (z * 128 + (x * 128 * 16));
boolean shift = index % 2 == 0;
index /= 2;
try {
if (!shift) {
return (data[index] & 0xF0) >> 4;
} else {
return data[index] & 0xF;
}
} catch (IndexOutOfBoundsException e) {
throw new DataException("Chunk does not contain position " + position);
}
}
/**
* Used to load the tile entities.
*
@ -188,25 +152,33 @@ public class OldChunk implements Chunk {
@Override
public BaseBlock getBlock(Vector position) throws DataException {
int id = getBlockID(position);
int data = getBlockData(position);
BaseBlock block;
if(position.getBlockY() >= 128) new BaseBlock(BlockTypes.AIR);
int id, dataVal;
/*if (id == BlockID.WALL_SIGN || id == BlockID.SIGN_POST) {
block = new SignBlock(id, data);
} else if (id == BlockID.CHEST) {
block = new ChestBlock(data);
} else if (id == BlockID.FURNACE || id == BlockID.BURNING_FURNACE) {
block = new FurnaceBlock(id, data);
} else if (id == BlockID.DISPENSER) {
block = new DispenserBlock(data);
} else if (id == BlockID.MOB_SPAWNER) {
block = new MobSpawnerBlock(data);
} else if (id == BlockID.NOTE_BLOCK) {
block = new NoteBlock(data);
} else {*/
block = new BaseBlock(id, data);
//}
int x = position.getBlockX() - rootX * 16;
int y = position.getBlockY();
int z = position.getBlockZ() - rootZ * 16;
int index = y + (z * 128 + (x * 128 * 16));
try {
id = blocks[index];
} catch (IndexOutOfBoundsException e) {
throw new DataException("Chunk does not contain position " + position);
}
boolean shift = index % 2 == 0;
index /= 2;
try {
if (!shift) {
dataVal = (data[index] & 0xF0) >> 4;
} else {
dataVal = data[index] & 0xF;
}
} catch (IndexOutOfBoundsException e) {
throw new DataException("Chunk does not contain position " + position);
}
BaseBlock block = new BaseBlock(id, dataVal);
CompoundTag tileEntity = getBlockTileEntity(position);
if (tileEntity != null) {

View File

@ -53,13 +53,13 @@ public class BundledBlockRegistry implements BlockRegistry {
@Nullable
@Override
public BlockMaterial getMaterial(BaseBlock block) {
return BundledBlockData.getInstance().getMaterialById(block.getType().getId());
return BundledBlockData.getInstance().getMaterialById(block.getBlockType().getId());
}
@Nullable
@Override
public Map<String, ? extends State> getStates(BaseBlock block) {
return BundledBlockData.getInstance().getStatesById(block.getType().getId());
return BundledBlockData.getInstance().getStatesById(block.getBlockType().getId());
}
}