diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index 2ea7d9f3b..9471bcd71 100644 --- a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -1313,7 +1313,7 @@ public class BukkitWorld extends LocalWorld { } @Override - public boolean setBlock(Vector pt, com.sk89q.worldedit.foundation.Block block, boolean notifyAdjacent) { + public boolean setBlock(Vector pt, BaseBlock block, boolean notifyAdjacent) { if (!skipNmsSafeSet) { try { return (Boolean) nmsSetSafeMethod.invoke(null, this, pt, block, notifyAdjacent); diff --git a/src/legacy/java/com/sk89q/worldedit/foundation/Block.java b/src/legacy/java/com/sk89q/worldedit/foundation/Block.java new file mode 100644 index 000000000..44085daea --- /dev/null +++ b/src/legacy/java/com/sk89q/worldedit/foundation/Block.java @@ -0,0 +1,41 @@ +// $Id$ +/* + * This file is a part of WorldEdit. + * Copyright (c) sk89q + * Copyright (c) the 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 + * (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 + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with + * this program. If not, see . +*/ + +package com.sk89q.worldedit.foundation; + +import com.sk89q.worldedit.blocks.BaseBlock; + +/** + * @deprecated Use {@link BaseBlock} + */ +@Deprecated +public abstract class Block { + + public abstract int getId(); + + public abstract void setId(int id); + + public abstract int getData(); + + public abstract void setData(int data); + + public abstract void setIdAndData(int id, int data); + + public abstract boolean hasWildcardData(); + +} diff --git a/src/main/java/com/sk89q/worldedit/LocalWorld.java b/src/main/java/com/sk89q/worldedit/LocalWorld.java index 3e4571bfc..8b6d63aef 100644 --- a/src/main/java/com/sk89q/worldedit/LocalWorld.java +++ b/src/main/java/com/sk89q/worldedit/LocalWorld.java @@ -21,8 +21,7 @@ package com.sk89q.worldedit; import com.sk89q.worldedit.blocks.*; import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.foundation.Block; -import com.sk89q.worldedit.foundation.World; +import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.function.mask.BlockMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.operation.Operation; @@ -533,7 +532,7 @@ public abstract class LocalWorld implements World, Extent { } @Override - public boolean setBlock(Vector pt, Block block, boolean notifyAdjacent) { + public boolean setBlock(Vector pt, BaseBlock block, boolean notifyAdjacent) { boolean successful; // Default implementation will call the old deprecated methods diff --git a/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java b/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java index b65314fc9..f7f73321c 100644 --- a/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java +++ b/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java @@ -19,36 +19,216 @@ package com.sk89q.worldedit.blocks; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.jnbt.StringTag; +import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.CuboidClipboard.FlipDirection; import com.sk89q.worldedit.foundation.Block; +import com.sk89q.worldedit.world.DataException; import java.util.Collection; /** - * Represents a block. - * - * @see Block new class to replace this one - * @author sk89q + * Represents a mutable copy of a block that is not tied to any 'real' block in a world. + * A single instance of this can be set to multiple locations and each location would + * have a copy of this instance's data. + *

+ * Implementations can and should extend this class to allow native implementations + * of NBT data handling, primarily for performance reasons. Subclasses can only convert + * from and to WorldEdit-native NBT structures when absolutely necessary (a.k.a. when + * {@link #getNbtData()} and {@link #setNbtData(CompoundTag)} are called). When + * overriding the NBT methods, {@link #getNbtId()} should be overridden too, otherwise + * the default implementation will invoke {@link #getNbtData()}, a potentially costly + * operation when it is not needed. Implementations may want to cache converted NBT data + * structures if possible. */ -public class BaseBlock extends Block { - +public class BaseBlock extends Block implements TileEntityBlock { + /** - * Construct the block with its type, with default data value 0. - * - * @param type type ID of block + * Indicates the highest possible block ID (inclusive) that can be used. This value + * is subject to change depending on the implementation, but internally this class + * only supports a range of 4096 IDs (for space reasons), which coincides with the + * number of possible IDs that official Minecraft supports as of version 1.3. */ - public BaseBlock(int type) { - this(type, 0); + public static final int MAX_ID = 4095; + + /** + * Indicates the maximum data value (inclusive) that can be used. Minecraft 1.4 may + * abolish usage of data values and this value may be removed in the future. + */ + 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 short id; + private short data; + private CompoundTag nbtData; + + /** + * Construct a block with the given ID and a data value of 0. + * + * @param id ID value + * @see #setId(int) + */ + public BaseBlock(int id) { + internalSetId(id); + internalSetData(0); } /** - * Construct the block with its type and data. + * Construct a block with the given ID and data value. * - * @param type type ID of block + * @param id ID value * @param data data value + * @see #setId(int) + * @see #setData(int) */ - public BaseBlock(int type, int data) { - super(type, data); + public BaseBlock(int id, int data) { + internalSetId(id); + internalSetData(data); + } + + /** + * Construct a block with the given ID, data value, and NBT data structure. + * + * @param id ID value + * @param data data value + * @param nbtData NBT data + * @throws DataException if possibly the data is invalid + * @see #setId(int) + * @see #setData(int) + * @see #setNbtData(CompoundTag) + */ + public BaseBlock(int id, int data, CompoundTag nbtData) throws DataException { + setId(id); + setData(data); + setNbtData(nbtData); + } + + /** + * Get the ID of the block. + * + * @return ID (between 0 and {@link #MAX_ID}) + */ + public int getId() { + return id; + } + + /** + * Set the block ID. + * + * @param id block id (between 0 and {@link #MAX_ID}). + */ + protected final void internalSetId(int id) { + if (id > MAX_ID) { + throw new IllegalArgumentException("Can't have a block ID above " + + MAX_ID + " (" + id + " given)"); + } + + if (id < 0) { + throw new IllegalArgumentException("Can't have a block ID below 0"); + } + + this.id = (short) id; + } + + /** + * Set the block ID. + * + * @param id block id (between 0 and {@link #MAX_ID}). + */ + public void setId(int id) { + internalSetId(id); + } + + /** + * Get the block's data value. + * + * @return data value (0-15) + */ + public int getData() { + return data; + } + + /** + * Set the block's data value. + * + * @param data block data value (between 0 and {@link #MAX_DATA}). + */ + 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)"); + } + + if (data < -1) { + throw new IllegalArgumentException("Can't have a block data value below -1"); + } + + this.data = (short) data; + } + + /** + * Set the block's data value. + * + * @param data block data value (between 0 and {@link #MAX_DATA}). + */ + 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) + */ + public void setIdAndData(int id, int data) { + setId(id); + setData(data); + } + + /** + * Returns whether the data value is -1, indicating that this block is to be + * used as a wildcard matching block. + * + * @return true if the data value is -1 + */ + public boolean hasWildcardData() { + return getData() == -1; + } + + @Override + public boolean hasNbtData() { + return getNbtData() != null; + } + + @Override + public String getNbtId() { + CompoundTag nbtData = getNbtData(); + if (nbtData == null) { + return ""; + } + Tag idTag = nbtData.getValue().get("id"); + if (idTag != null && idTag instanceof StringTag) { + return ((StringTag) idTag).getValue(); + } else { + return ""; + } + } + + @Override + public CompoundTag getNbtData() { + return nbtData; + } + + @Override + public void setNbtData(CompoundTag nbtData) throws DataException { + this.nbtData = nbtData; } /** @@ -184,4 +364,17 @@ public class BaseBlock extends Block { } return false; } + + @Override + public int hashCode() { + int ret = getId() << 3; + if (getData() != (byte) -1) ret |= getData(); + return ret; + } + + @Override + public String toString() { + return "Block{ID:" + getId() + ", Data: " + getData() + "}"; + } + } diff --git a/src/main/java/com/sk89q/worldedit/blocks/BlockType.java b/src/main/java/com/sk89q/worldedit/blocks/BlockType.java index 5483f2ca6..10bc6c206 100644 --- a/src/main/java/com/sk89q/worldedit/blocks/BlockType.java +++ b/src/main/java/com/sk89q/worldedit/blocks/BlockType.java @@ -19,16 +19,10 @@ package com.sk89q.worldedit.blocks; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Random; -import java.util.Set; - import com.sk89q.util.StringUtil; import com.sk89q.worldedit.PlayerDirection; -import com.sk89q.worldedit.foundation.Block; + +import java.util.*; /** * Block types. @@ -552,7 +546,7 @@ public enum BlockType { * @param block * @return */ - public static boolean canPassThrough(Block block) { + public static boolean canPassThrough(BaseBlock block) { return canPassThrough(block.getId(), block.getData()); } @@ -649,7 +643,7 @@ public enum BlockType { * @param block * @return */ - public static double centralTopLimit(Block block) { + public static double centralTopLimit(BaseBlock block) { return centralTopLimit(block.getId(), block.getData()); } @@ -1053,7 +1047,7 @@ public enum BlockType { * @param block The block * @return true if the block type is naturally occuring */ - public static boolean isNaturalTerrainBlock(Block block) { + public static boolean isNaturalTerrainBlock(BaseBlock block) { return isNaturalTerrainBlock(block.getId(), block.getData()); } diff --git a/src/main/java/com/sk89q/worldedit/blocks/TileEntityBlock.java b/src/main/java/com/sk89q/worldedit/blocks/TileEntityBlock.java index 11d7fcc2f..d6e747eee 100644 --- a/src/main/java/com/sk89q/worldedit/blocks/TileEntityBlock.java +++ b/src/main/java/com/sk89q/worldedit/blocks/TileEntityBlock.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.blocks; -import com.sk89q.worldedit.foundation.NbtValued; +import com.sk89q.worldedit.world.NbtValued; /** * Indicates a block that contains extra data identified as an NBT structure. Compared diff --git a/src/main/java/com/sk89q/worldedit/foundation/Block.java b/src/main/java/com/sk89q/worldedit/foundation/Block.java deleted file mode 100644 index 35f922bd0..000000000 --- a/src/main/java/com/sk89q/worldedit/foundation/Block.java +++ /dev/null @@ -1,248 +0,0 @@ -// $Id$ -/* - * This file is a part of WorldEdit. - * Copyright (c) sk89q - * Copyright (c) the 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 - * (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 - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . -*/ - -package com.sk89q.worldedit.foundation; - -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.blocks.BaseBlock; -import com.sk89q.worldedit.blocks.TileEntityBlock; -import com.sk89q.worldedit.world.DataException; - -/** - * Represents a mutable copy of a block that is not tied to any 'real' block in a world. - * A single instance of this can be set to multiple locations and each location would - * have a copy of this instance's data. - *

- * Implementations can and should extend this class to allow native implementations - * of NBT data handling, primarily for performance reasons. Subclasses can only convert - * from and to WorldEdit-native NBT structures when absolutely necessary (a.k.a. when - * {@link #getNbtData()} and {@link #setNbtData(CompoundTag)} are called). When - * overriding the NBT methods, {@link #getNbtId()} should be overridden too, otherwise - * the default implementation will invoke {@link #getNbtData()}, a potentially costly - * operation when it is not needed. Implementations may want to cache converted NBT data - * structures if possible. - *

- * Currently, {@link BaseBlock} is used throughout WorldEdit and implementations, but - * eventually an API-breaking transition will occur to switch to this object instead. - * As-is, the definition of this class is complete, but may need changes in MC 1.4 - * because data values may be eradicated. - */ -public class Block implements TileEntityBlock { - - /** - * Indicates the highest possible block ID (inclusive) that can be used. This value - * is subject to change depending on the implementation, but internally this class - * only supports a range of 4096 IDs (for space reasons), which coincides with the - * number of possible IDs that official Minecraft supports as of version 1.3. - */ - public static final int MAX_ID = 4095; - - /** - * Indicates the maximum data value (inclusive) that can be used. Minecraft 1.4 may - * abolish usage of data values and this value may be removed in the future. - */ - 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 short id; - private short data; - private CompoundTag nbtData; - - /** - * Construct a block with the given ID and a data value of 0. - * - * @param id ID value - * @see #setId(int) - */ - public Block(int id) { - internalSetId(id); - internalSetData(0); - } - - /** - * Construct a block with the given ID and data value. - * - * @param id ID value - * @param data data value - * @see #setId(int) - * @see #setData(int) - */ - public Block(int id, int data) { - internalSetId(id); - internalSetData(data); - } - - /** - * Construct a block with the given ID, data value, and NBT data structure. - * - * @param id ID value - * @param data data value - * @param nbtData NBT data - * @throws DataException if possibly the data is invalid - * @see #setId(int) - * @see #setData(int) - * @see #setNbtData(CompoundTag) - */ - public Block(int id, int data, CompoundTag nbtData) throws DataException { - setId(id); - setData(data); - setNbtData(nbtData); - } - - /** - * Get the ID of the block. - * - * @return ID (between 0 and {@link #MAX_ID}) - */ - public int getId() { - return id; - } - - /** - * Set the block ID. - * - * @param id block id (between 0 and {@link #MAX_ID}). - */ - protected final void internalSetId(int id) { - if (id > MAX_ID) { - throw new IllegalArgumentException("Can't have a block ID above " - + MAX_ID + " (" + id + " given)"); - } - - if (id < 0) { - throw new IllegalArgumentException("Can't have a block ID below 0"); - } - - this.id = (short) id; - } - - /** - * Set the block ID. - * - * @param id block id (between 0 and {@link #MAX_ID}). - */ - public void setId(int id) { - internalSetId(id); - } - - /** - * Get the block's data value. - * - * @return data value (0-15) - */ - public int getData() { - return data; - } - - /** - * Set the block's data value. - * - * @param data block data value (between 0 and {@link #MAX_DATA}). - */ - 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)"); - } - - if (data < -1) { - throw new IllegalArgumentException("Can't have a block data value below -1"); - } - - this.data = (short) data; - } - - /** - * Set the block's data value. - * - * @param data block data value (between 0 and {@link #MAX_DATA}). - */ - 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) - */ - public void setIdAndData(int id, int data) { - setId(id); - setData(data); - } - - /** - * Returns whether the data value is -1, indicating that this block is to be - * used as a wildcard matching block. - * - * @return true if the data value is -1 - */ - public boolean hasWildcardData() { - return getData() == -1; - } - - @Override - public boolean hasNbtData() { - return getNbtData() != null; - } - - @Override - public String getNbtId() { - CompoundTag nbtData = getNbtData(); - if (nbtData == null) { - return ""; - } - Tag idTag = nbtData.getValue().get("id"); - if (idTag != null && idTag instanceof StringTag) { - return ((StringTag) idTag).getValue(); - } else { - return ""; - } - } - - @Override - public CompoundTag getNbtData() { - return nbtData; - } - - @Override - public void setNbtData(CompoundTag nbtData) throws DataException { - this.nbtData = nbtData; - } - - @Override - public int hashCode() { - int ret = getId() << 3; - if (getData() != (byte) -1) ret |= getData(); - return ret; - } - - @Override - public String toString() { - return "Block{ID:" + getId() + ", Data: " + getData() + "}"; - } - -} diff --git a/src/main/java/com/sk89q/worldedit/foundation/NbtValued.java b/src/main/java/com/sk89q/worldedit/world/NbtValued.java similarity index 98% rename from src/main/java/com/sk89q/worldedit/foundation/NbtValued.java rename to src/main/java/com/sk89q/worldedit/world/NbtValued.java index b92d966d1..70410030f 100644 --- a/src/main/java/com/sk89q/worldedit/foundation/NbtValued.java +++ b/src/main/java/com/sk89q/worldedit/world/NbtValued.java @@ -16,7 +16,7 @@ * this program. If not, see . */ -package com.sk89q.worldedit.foundation; +package com.sk89q.worldedit.world; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.world.DataException; diff --git a/src/main/java/com/sk89q/worldedit/foundation/World.java b/src/main/java/com/sk89q/worldedit/world/World.java similarity index 84% rename from src/main/java/com/sk89q/worldedit/foundation/World.java rename to src/main/java/com/sk89q/worldedit/world/World.java index d01a0abad..c7f250730 100644 --- a/src/main/java/com/sk89q/worldedit/foundation/World.java +++ b/src/main/java/com/sk89q/worldedit/world/World.java @@ -16,10 +16,12 @@ * this program. If not, see . */ -package com.sk89q.worldedit.foundation; +package com.sk89q.worldedit.world; import com.sk89q.worldedit.LocalWorld; import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.blocks.BaseBlock; +import com.sk89q.worldedit.foundation.Block; /** * Represents a world instance that can be modified. The world instance could be @@ -33,8 +35,8 @@ public interface World { /** * Change the block at the given location to the given block. The operation may - * not tie the given {@link Block} to the world, so future changes to the - * {@link Block} do not affect the world until this method is called again. + * not tie the given {@link BaseBlock} to the world, so future changes to the + * {@link BaseBlock} do not affect the world until this method is called again. *

* Implementations may or may not consider the value of the notifyAdjacent * parameter, and implementations may to choose to either apply physics anyway or @@ -47,23 +49,23 @@ public interface World { * occur and 'false' should be returned. If possible, the return value should be * accurate as possible, but implementations may choose to not provide an accurate * value if it is not possible to know. - * + * * @param location location of the block * @param block block to set * @param notifyAdjacent true to to notify adjacent (perform physics) * @return true if the block was successfully set (return value may not be accurate) */ - boolean setBlock(Vector location, Block block, boolean notifyAdjacent); - + boolean setBlock(Vector location, BaseBlock block, boolean notifyAdjacent); + /** * Get a copy of the block at the given location. May return null if the location * given is out of bounds. The returned block must not be tied to any real block * in the world, so changes to the returned {@link Block} have no effect until - * {@link #setBlock(Vector, Block, boolean)} is called. - * + * {@link #setBlock(Vector, BaseBlock, boolean)} is called. + * * @param location location of the block * @return the block, or null if the block does not exist */ - Block getBlock(Vector location); + BaseBlock getBlock(Vector location); }