diff --git a/src/main/java/com/sk89q/worldedit/bags/BlockBag.java b/src/main/java/com/sk89q/worldedit/bags/BlockBag.java index 26fa77f1b..23bf0ced7 100644 --- a/src/main/java/com/sk89q/worldedit/bags/BlockBag.java +++ b/src/main/java/com/sk89q/worldedit/bags/BlockBag.java @@ -36,7 +36,7 @@ public abstract class BlockBag { * @throws BlockBagException */ public void storeDroppedBlock(int id, int data) throws BlockBagException { - BaseItem dropped = BlockType.getDroppedBlock(id, data); + BaseItem dropped = BlockType.getBlockBagItem(id, data); if (dropped == null) return; if (dropped.getType() == BlockID.AIR) return; @@ -121,6 +121,8 @@ public abstract class BlockBag { /** * Store a block. * + * Either this method or storeItem needs to be overridden + * * @param id * @throws BlockBagException */ @@ -131,6 +133,8 @@ public abstract class BlockBag { /** * Store a block. * + * Either this method or storeBlock needs to be overridden + * * @param item * @throws BlockBagException */ diff --git a/src/main/java/com/sk89q/worldedit/blocks/BlockType.java b/src/main/java/com/sk89q/worldedit/blocks/BlockType.java index 50e4bf0e7..7c021a74c 100644 --- a/src/main/java/com/sk89q/worldedit/blocks/BlockType.java +++ b/src/main/java/com/sk89q/worldedit/blocks/BlockType.java @@ -857,126 +857,151 @@ public enum BlockType { } /** - * HashMap for getDroppedBlock. + * HashMap for getBlockBagItem. */ - private static final Map dataBlockDrops = new HashMap(); - private static final Map nonDataBlockDrops = new HashMap(); + private static final Map dataBlockBagItems = new HashMap(); + private static final Map nonDataBlockBagItems = new HashMap(); private static final BaseItem doNotDestroy = new BaseItemStack(BlockID.AIR, 0); static { - // TODO: consider data values - - nonDataBlockDrops.put(BlockID.STONE, new BaseItem(BlockID.COBBLESTONE)); - nonDataBlockDrops.put(BlockID.GRASS, new BaseItem(BlockID.DIRT)); - nonDataBlockDrops.put(BlockID.DIRT, new BaseItem(BlockID.DIRT)); - nonDataBlockDrops.put(BlockID.COBBLESTONE, new BaseItem(BlockID.COBBLESTONE)); - nonDataBlockDrops.put(BlockID.WOOD, new BaseItem(BlockID.WOOD)); - nonDataBlockDrops.put(BlockID.SAPLING, new BaseItem(BlockID.SAPLING)); - nonDataBlockDrops.put(BlockID.BEDROCK, doNotDestroy); - nonDataBlockDrops.put(BlockID.SAND, new BaseItem(BlockID.SAND)); - nonDataBlockDrops.put(BlockID.GRAVEL, new BaseItem(BlockID.GRAVEL)); - nonDataBlockDrops.put(BlockID.GOLD_ORE, new BaseItem(BlockID.GOLD_ORE)); - nonDataBlockDrops.put(BlockID.IRON_ORE, new BaseItem(BlockID.IRON_ORE)); - nonDataBlockDrops.put(BlockID.COAL_ORE, new BaseItem(BlockID.COAL_ORE)); - nonDataBlockDrops.put(BlockID.LOG, new BaseItem(BlockID.LOG)); - nonDataBlockDrops.put(BlockID.LEAVES, new BaseItem(BlockID.LEAVES)); - nonDataBlockDrops.put(BlockID.SPONGE, new BaseItem(BlockID.SPONGE)); - nonDataBlockDrops.put(BlockID.GLASS, new BaseItem(BlockID.GLASS)); // Have to drop glass for //undo - nonDataBlockDrops.put(BlockID.LAPIS_LAZULI_ORE, new BaseItem(BlockID.LAPIS_LAZULI_ORE)); // Block damage drops not implemented - nonDataBlockDrops.put(BlockID.LAPIS_LAZULI_BLOCK, new BaseItem(BlockID.LAPIS_LAZULI_BLOCK)); - nonDataBlockDrops.put(BlockID.DISPENSER, new BaseItem(BlockID.DISPENSER)); - nonDataBlockDrops.put(BlockID.SANDSTONE, new BaseItem(BlockID.SANDSTONE)); - nonDataBlockDrops.put(BlockID.NOTE_BLOCK, new BaseItem(BlockID.NOTE_BLOCK)); - nonDataBlockDrops.put(BlockID.BED, new BaseItem(ItemID.BED_ITEM)); - nonDataBlockDrops.put(BlockID.POWERED_RAIL, new BaseItem(BlockID.POWERED_RAIL)); - nonDataBlockDrops.put(BlockID.DETECTOR_RAIL, new BaseItem(BlockID.DETECTOR_RAIL)); - nonDataBlockDrops.put(BlockID.WEB, new BaseItem(BlockID.WEB)); - nonDataBlockDrops.put(BlockID.PISTON_EXTENSION, doNotDestroy); - nonDataBlockDrops.put(BlockID.CLOTH, new BaseItem(BlockID.CLOTH)); - nonDataBlockDrops.put(BlockID.PISTON_MOVING_PIECE, doNotDestroy); - nonDataBlockDrops.put(BlockID.YELLOW_FLOWER, new BaseItem(BlockID.YELLOW_FLOWER)); - nonDataBlockDrops.put(BlockID.RED_FLOWER, new BaseItem(BlockID.RED_FLOWER)); - nonDataBlockDrops.put(BlockID.BROWN_MUSHROOM, new BaseItem(BlockID.BROWN_MUSHROOM)); - nonDataBlockDrops.put(BlockID.RED_MUSHROOM, new BaseItem(BlockID.RED_MUSHROOM)); - nonDataBlockDrops.put(BlockID.GOLD_BLOCK, new BaseItem(BlockID.GOLD_BLOCK)); - nonDataBlockDrops.put(BlockID.IRON_BLOCK, new BaseItem(BlockID.IRON_BLOCK)); - nonDataBlockDrops.put(BlockID.DOUBLE_STEP, new BaseItem(BlockID.DOUBLE_STEP)); - nonDataBlockDrops.put(BlockID.STEP, new BaseItem(BlockID.STEP)); - nonDataBlockDrops.put(BlockID.BRICK, new BaseItem(BlockID.BRICK)); - nonDataBlockDrops.put(BlockID.BOOKCASE, new BaseItem(BlockID.BOOKCASE)); - nonDataBlockDrops.put(BlockID.MOSSY_COBBLESTONE, new BaseItem(BlockID.MOSSY_COBBLESTONE)); - nonDataBlockDrops.put(BlockID.OBSIDIAN, new BaseItem(BlockID.OBSIDIAN)); - nonDataBlockDrops.put(BlockID.TORCH, new BaseItem(BlockID.TORCH)); - nonDataBlockDrops.put(BlockID.WOODEN_STAIRS, new BaseItem(BlockID.WOODEN_STAIRS)); - nonDataBlockDrops.put(BlockID.CHEST, new BaseItem(BlockID.CHEST)); - nonDataBlockDrops.put(BlockID.REDSTONE_WIRE, new BaseItem(ItemID.REDSTONE_DUST)); - nonDataBlockDrops.put(BlockID.DIAMOND_ORE, new BaseItem(ItemID.DIAMOND)); - nonDataBlockDrops.put(BlockID.DIAMOND_BLOCK, new BaseItem(BlockID.DIAMOND_BLOCK)); - nonDataBlockDrops.put(BlockID.WORKBENCH, new BaseItem(BlockID.WORKBENCH)); - nonDataBlockDrops.put(BlockID.CROPS, new BaseItem(ItemID.SEEDS)); - nonDataBlockDrops.put(BlockID.SOIL, new BaseItem(BlockID.SOIL)); - nonDataBlockDrops.put(BlockID.FURNACE, new BaseItem(BlockID.FURNACE)); - nonDataBlockDrops.put(BlockID.BURNING_FURNACE, new BaseItem(BlockID.FURNACE)); - nonDataBlockDrops.put(BlockID.SIGN_POST, new BaseItem(ItemID.SIGN)); - nonDataBlockDrops.put(BlockID.WOODEN_DOOR, new BaseItem(ItemID.WOODEN_DOOR_ITEM)); - nonDataBlockDrops.put(BlockID.LADDER, new BaseItem(BlockID.LADDER)); - nonDataBlockDrops.put(BlockID.MINECART_TRACKS, new BaseItem(BlockID.MINECART_TRACKS)); - nonDataBlockDrops.put(BlockID.COBBLESTONE_STAIRS, new BaseItem(BlockID.COBBLESTONE_STAIRS)); - nonDataBlockDrops.put(BlockID.WALL_SIGN, new BaseItem(ItemID.SIGN)); - nonDataBlockDrops.put(BlockID.LEVER, new BaseItem(BlockID.LEVER)); - nonDataBlockDrops.put(BlockID.STONE_PRESSURE_PLATE, new BaseItem(BlockID.STONE_PRESSURE_PLATE)); - nonDataBlockDrops.put(BlockID.IRON_DOOR, new BaseItem(ItemID.IRON_DOOR_ITEM)); - nonDataBlockDrops.put(BlockID.WOODEN_PRESSURE_PLATE, new BaseItem(BlockID.WOODEN_PRESSURE_PLATE)); - nonDataBlockDrops.put(BlockID.REDSTONE_ORE, new BaseItem(ItemID.REDSTONE_DUST)); - nonDataBlockDrops.put(BlockID.GLOWING_REDSTONE_ORE, new BaseItem(ItemID.REDSTONE_DUST)); - nonDataBlockDrops.put(BlockID.REDSTONE_TORCH_OFF, new BaseItem(BlockID.REDSTONE_TORCH_ON)); - nonDataBlockDrops.put(BlockID.REDSTONE_TORCH_ON, new BaseItem(BlockID.REDSTONE_TORCH_ON)); - nonDataBlockDrops.put(BlockID.STONE_BUTTON, new BaseItem(BlockID.STONE_BUTTON)); - nonDataBlockDrops.put(BlockID.SNOW, new BaseItem(ItemID.SNOWBALL)); - nonDataBlockDrops.put(BlockID.ICE, new BaseItem(BlockID.ICE)); - nonDataBlockDrops.put(BlockID.SNOW_BLOCK, new BaseItem(BlockID.SNOW_BLOCK)); - nonDataBlockDrops.put(BlockID.CLAY, new BaseItem(BlockID.CLAY)); - nonDataBlockDrops.put(BlockID.REED, new BaseItem(ItemID.SUGAR_CANE_ITEM)); - nonDataBlockDrops.put(BlockID.JUKEBOX, new BaseItem(BlockID.JUKEBOX)); - nonDataBlockDrops.put(BlockID.FENCE, new BaseItem(BlockID.FENCE)); - nonDataBlockDrops.put(BlockID.PUMPKIN, new BaseItem(BlockID.PUMPKIN)); - nonDataBlockDrops.put(BlockID.NETHERRACK, new BaseItem(BlockID.NETHERRACK)); - nonDataBlockDrops.put(BlockID.SLOW_SAND, new BaseItem(BlockID.SLOW_SAND)); - nonDataBlockDrops.put(BlockID.LIGHTSTONE, new BaseItem(ItemID.LIGHTSTONE_DUST)); - nonDataBlockDrops.put(BlockID.JACKOLANTERN, new BaseItem(BlockID.JACKOLANTERN)); - nonDataBlockDrops.put(BlockID.CAKE_BLOCK, new BaseItem(ItemID.CAKE_ITEM)); - nonDataBlockDrops.put(BlockID.REDSTONE_REPEATER_OFF, new BaseItem(ItemID.REDSTONE_REPEATER)); - nonDataBlockDrops.put(BlockID.REDSTONE_REPEATER_ON, new BaseItem(ItemID.REDSTONE_REPEATER)); - nonDataBlockDrops.put(BlockID.LOCKED_CHEST, new BaseItem(BlockID.LOCKED_CHEST)); - nonDataBlockDrops.put(BlockID.TRAP_DOOR, new BaseItem(BlockID.TRAP_DOOR)); - nonDataBlockDrops.put(BlockID.SILVERFISH_BLOCK, doNotDestroy); - nonDataBlockDrops.put(BlockID.STONE_BRICK, new BaseItem(BlockID.STONE_BRICK)); - nonDataBlockDrops.put(BlockID.BROWN_MUSHROOM_CAP, new BaseItem(BlockID.BROWN_MUSHROOM_CAP)); - nonDataBlockDrops.put(BlockID.RED_MUSHROOM_CAP, new BaseItem(BlockID.RED_MUSHROOM_CAP)); - nonDataBlockDrops.put(BlockID.IRON_BARS, new BaseItem(BlockID.IRON_BARS)); - nonDataBlockDrops.put(BlockID.GLASS_PANE, new BaseItem(BlockID.GLASS_PANE)); - nonDataBlockDrops.put(BlockID.MELON_BLOCK, new BaseItem(BlockID.MELON_BLOCK)); - nonDataBlockDrops.put(BlockID.PUMPKIN_STEM, new BaseItem(BlockID.PUMPKIN_STEM)); - nonDataBlockDrops.put(BlockID.MELON_STEM, new BaseItem(BlockID.MELON_STEM)); - nonDataBlockDrops.put(BlockID.VINE, doNotDestroy); - nonDataBlockDrops.put(BlockID.FENCE_GATE, new BaseItem(BlockID.FENCE_GATE)); - nonDataBlockDrops.put(BlockID.BRICK_STAIRS, new BaseItem(BlockID.BRICK)); - nonDataBlockDrops.put(BlockID.STONE_BRICK_STAIRS, new BaseItem(BlockID.STONE_BRICK)); - nonDataBlockDrops.put(BlockID.MYCELIUM, new BaseItem(BlockID.DIRT)); - nonDataBlockDrops.put(BlockID.LILY_PAD, new BaseItem(BlockID.LILY_PAD)); - nonDataBlockDrops.put(BlockID.NETHER_BRICK, new BaseItem(BlockID.NETHER_BRICK)); - nonDataBlockDrops.put(BlockID.NETHER_BRICK_FENCE, new BaseItem(BlockID.NETHER_BRICK_FENCE)); - nonDataBlockDrops.put(BlockID.NETHER_BRICK_STAIRS, new BaseItem(BlockID.NETHER_BRICK)); - nonDataBlockDrops.put(BlockID.NETHER_WART, new BaseItem(ItemID.NETHER_WART_SEED)); - nonDataBlockDrops.put(BlockID.ENCHANTMENT_TABLE, new BaseItem(BlockID.ENCHANTMENT_TABLE)); - nonDataBlockDrops.put(BlockID.BREWING_STAND, new BaseItem(ItemID.BREWING_STAND)); - nonDataBlockDrops.put(BlockID.CAULDRON, new BaseItem(ItemID.CAULDRON)); - nonDataBlockDrops.put(BlockID.END_PORTAL, doNotDestroy); - nonDataBlockDrops.put(BlockID.END_PORTAL_FRAME, doNotDestroy); - nonDataBlockDrops.put(BlockID.END_STONE, new BaseItem(BlockID.END_STONE)); + /* + * rules: + * + * 1. block yields itself => addIdentity + * 2. block is part of a 2-block object => drop an appropriate item for one of the 2 blocks + * 3. block can be placed by right-clicking an obtainable item on the ground => use that item + * 4. block yields more than one item => addIdentity + * 5. block yields exactly one item => use that item + * 6. block is a liquid => drop nothing + * 7. block is created from thin air by the game other than by the map generator => drop nothing + */ + + nonDataBlockBagItems.put(BlockID.STONE, new BaseItem(BlockID.COBBLESTONE)); // rule 5 + nonDataBlockBagItems.put(BlockID.GRASS, new BaseItem(BlockID.DIRT)); // rule 5 + addIdentity(BlockID.DIRT); // rule 1 + addIdentity(BlockID.COBBLESTONE); // rule 1 + addIdentity(BlockID.WOOD); // rule 1 + addIdentities(BlockID.SAPLING, 3); // rule 1 + nonDataBlockBagItems.put(BlockID.BEDROCK, doNotDestroy); // exception + // WATER, rule 6 + // STATIONARY_WATER, rule 6 + // LAVA, rule 6 + // STATIONARY_LAVA, rule 6 + addIdentity(BlockID.SAND); // rule 1 + addIdentity(BlockID.GRAVEL); // rule 1 + addIdentity(BlockID.GOLD_ORE); // rule 1 + addIdentity(BlockID.IRON_ORE); // rule 1 + nonDataBlockBagItems.put(BlockID.COAL_ORE, new BaseItem(ItemID.COAL)); // rule 5 + addIdentities(BlockID.LOG, 3); // rule 1 + addIdentities(BlockID.LEAVES, 4); // rule 1 with shears, otherwise rule 3 + addIdentity(BlockID.SPONGE); // rule 1 + addIdentity(BlockID.GLASS); // rule 3 + addIdentity(BlockID.LAPIS_LAZULI_ORE); // rule 4 + addIdentity(BlockID.LAPIS_LAZULI_BLOCK); // rule 1 + addIdentity(BlockID.DISPENSER); // rule 1 + addIdentity(BlockID.SANDSTONE); // rule 1 + addIdentity(BlockID.NOTE_BLOCK); // rule 1 + addIdentities(BlockID.BED, 8); // rule 2 + addIdentity(BlockID.POWERED_RAIL); // rule 1 + addIdentity(BlockID.DETECTOR_RAIL); // rule 1 + addIdentity(BlockID.PISTON_STICKY_BASE); + nonDataBlockBagItems.put(BlockID.WEB, new BaseItem(ItemID.STRING)); // rule 5 + // LONG_GRASS + // DEAD_BUSH + addIdentity(BlockID.PISTON_BASE); + nonDataBlockBagItems.put(BlockID.PISTON_EXTENSION, doNotDestroy); // rule 7 + addIdentities(BlockID.CLOTH, 16); // rule 1 + nonDataBlockBagItems.put(BlockID.PISTON_MOVING_PIECE, doNotDestroy); // rule 7 + addIdentity(BlockID.YELLOW_FLOWER); // rule 1 + addIdentity(BlockID.RED_FLOWER); // rule 1 + addIdentity(BlockID.BROWN_MUSHROOM); // rule 1 + addIdentity(BlockID.RED_MUSHROOM); // rule 1 + addIdentity(BlockID.GOLD_BLOCK); // rule 1 + addIdentity(BlockID.IRON_BLOCK); // rule 1 + addIdentities(BlockID.DOUBLE_STEP, 7); // rule 3 + addIdentities(BlockID.STEP, 7); // rule 1 + addIdentity(BlockID.BRICK); // rule 1 + addIdentity(BlockID.TNT); + addIdentity(BlockID.BOOKCASE); // rule 3 + addIdentity(BlockID.MOSSY_COBBLESTONE); // rule 1 + addIdentity(BlockID.OBSIDIAN); // rule 1 + addIdentity(BlockID.TORCH); // rule 1 + // FIRE + // MOB_SPAWNER + addIdentity(BlockID.WOODEN_STAIRS); // rule 3 + addIdentity(BlockID.CHEST); // rule 1 + nonDataBlockBagItems.put(BlockID.REDSTONE_WIRE, new BaseItem(ItemID.REDSTONE_DUST)); // rule 3 + nonDataBlockBagItems.put(BlockID.DIAMOND_ORE, new BaseItem(ItemID.DIAMOND)); // rule 5 + addIdentity(BlockID.DIAMOND_BLOCK); // rule 1 + addIdentity(BlockID.WORKBENCH); // rule 1 + nonDataBlockBagItems.put(BlockID.CROPS, new BaseItem(ItemID.SEEDS)); // rule 3 + nonDataBlockBagItems.put(BlockID.SOIL, new BaseItem(BlockID.DIRT)); // rule 5 + addIdentity(BlockID.FURNACE); // rule 1 + nonDataBlockBagItems.put(BlockID.BURNING_FURNACE, new BaseItem(BlockID.FURNACE)); + nonDataBlockBagItems.put(BlockID.SIGN_POST, new BaseItem(ItemID.SIGN)); // rule 3 + addIdentities(BlockID.WOODEN_DOOR, 8); // rule 2 + addIdentity(BlockID.LADDER); // rule 1 + addIdentity(BlockID.MINECART_TRACKS); // rule 1 + addIdentity(BlockID.COBBLESTONE_STAIRS); // rule 3 + nonDataBlockBagItems.put(BlockID.WALL_SIGN, new BaseItem(ItemID.SIGN)); // rule 3 + addIdentity(BlockID.LEVER); // rule 1 + addIdentity(BlockID.STONE_PRESSURE_PLATE); // rule 1 + addIdentities(BlockID.IRON_DOOR, 8); // rule 2 + addIdentity(BlockID.WOODEN_PRESSURE_PLATE); // rule 1 + addIdentity(BlockID.REDSTONE_ORE); // rule 4 + nonDataBlockBagItems.put(BlockID.GLOWING_REDSTONE_ORE, new BaseItem(BlockID.REDSTONE_ORE)); // rule 4 + nonDataBlockBagItems.put(BlockID.REDSTONE_TORCH_OFF, new BaseItem(BlockID.REDSTONE_TORCH_ON)); // rule 3 + addIdentity(BlockID.REDSTONE_TORCH_ON); // rule 1 + addIdentity(BlockID.STONE_BUTTON); // rule 1 + addIdentity(BlockID.SNOW); // rule 1 + addIdentity(BlockID.ICE); // exception + addIdentity(BlockID.SNOW_BLOCK); // rule 3 + addIdentity(BlockID.CACTUS); + addIdentity(BlockID.CLAY); // rule 3 + nonDataBlockBagItems.put(BlockID.REED, new BaseItem(ItemID.SUGAR_CANE_ITEM)); // rule 3 + addIdentity(BlockID.JUKEBOX); // rule 1 + addIdentity(BlockID.FENCE); // rule 1 + addIdentity(BlockID.PUMPKIN); // rule 1 + addIdentity(BlockID.NETHERRACK); // rule 1 + addIdentity(BlockID.SLOW_SAND); // rule 1 + addIdentity(BlockID.LIGHTSTONE); // rule 4 + // PORTAL + addIdentity(BlockID.JACKOLANTERN); // rule 1 + nonDataBlockBagItems.put(BlockID.CAKE_BLOCK, new BaseItem(ItemID.CAKE_ITEM)); // rule 3 + nonDataBlockBagItems.put(BlockID.REDSTONE_REPEATER_OFF, new BaseItem(ItemID.REDSTONE_REPEATER)); // rule 3 + nonDataBlockBagItems.put(BlockID.REDSTONE_REPEATER_ON, new BaseItem(ItemID.REDSTONE_REPEATER)); // rule 3 + addIdentity(BlockID.LOCKED_CHEST); // ??? + addIdentity(BlockID.TRAP_DOOR); // rule 1 + nonDataBlockBagItems.put(BlockID.SILVERFISH_BLOCK, doNotDestroy); // exception + addIdentity(BlockID.STONE_BRICK); // rule 1 + addIdentity(BlockID.BROWN_MUSHROOM_CAP); + addIdentity(BlockID.RED_MUSHROOM_CAP); + addIdentity(BlockID.IRON_BARS); // rule 1 + addIdentity(BlockID.GLASS_PANE); // rule 1 + addIdentity(BlockID.MELON_BLOCK); // rule 3 + nonDataBlockBagItems.put(BlockID.PUMPKIN_STEM, new BaseItem(ItemID.PUMPKIN_SEEDS)); // rule 3 + nonDataBlockBagItems.put(BlockID.MELON_STEM, new BaseItem(ItemID.MELON_SEEDS)); // rule 3 + nonDataBlockBagItems.put(BlockID.VINE, doNotDestroy); // exception + addIdentity(BlockID.FENCE_GATE); // rule 1 + addIdentity(BlockID.BRICK_STAIRS); // rule 3 + addIdentity(BlockID.STONE_BRICK_STAIRS); // rule 3 + + // 1.9 blocks + nonDataBlockBagItems.put(BlockID.MYCELIUM, new BaseItem(BlockID.DIRT)); + addIdentity(BlockID.LILY_PAD); + addIdentity(BlockID.NETHER_BRICK); + addIdentity(BlockID.NETHER_BRICK_FENCE); + addIdentity(BlockID.NETHER_BRICK_STAIRS); + nonDataBlockBagItems.put(BlockID.NETHER_WART, new BaseItem(ItemID.NETHER_WART_SEED)); + addIdentity(BlockID.ENCHANTMENT_TABLE); + nonDataBlockBagItems.put(BlockID.BREWING_STAND, new BaseItem(ItemID.BREWING_STAND)); + nonDataBlockBagItems.put(BlockID.CAULDRON, new BaseItem(ItemID.CAULDRON)); + nonDataBlockBagItems.put(BlockID.END_PORTAL, doNotDestroy); + nonDataBlockBagItems.put(BlockID.END_PORTAL_FRAME, doNotDestroy); + addIdentity(BlockID.END_STONE); } /** - * Get the block or item that would have been dropped. If nothing is + * Get the block or item that this block can be constructed from. If nothing is * dropped, a block with a BaseItemStack of type AIR and size 0 will be returned. * If the block should not be destroyed (i.e. bedrock), null will be returned. * @@ -984,11 +1009,11 @@ public enum BlockType { * @param data * @return */ - public static BaseItem getDroppedBlock(int type, int data) { - BaseItem dropped = nonDataBlockDrops.get(type); + public static BaseItem getBlockBagItem(int type, int data) { + BaseItem dropped = nonDataBlockBagItems.get(type); if (dropped != null) return dropped; - dropped = dataBlockDrops.get(typeDataKey(type, data)); + dropped = dataBlockBagItems.get(typeDataKey(type, data)); if (dropped == null) { return new BaseItemStack(BlockID.AIR, 0); @@ -1001,6 +1026,16 @@ public enum BlockType { return dropped; } + private static void addIdentity(int type) { + nonDataBlockBagItems.put(type, new BaseItem(type)); + } + + private static void addIdentities(int type, int maxData) { + for (int data = 0; data < maxData; ++data) { + dataBlockBagItems.put(typeDataKey(type, data), new BaseItem(BlockID.LEAVES, (short) data)); + } + } + /** * Get the block or item that would have been dropped. If nothing is * dropped, 0 will be returned. If the block should not be destroyed @@ -1012,7 +1047,7 @@ public enum BlockType { */ @Deprecated public static int getDroppedBlock(int id) { - BaseItem dropped = nonDataBlockDrops.get(id); + BaseItem dropped = nonDataBlockBagItems.get(id); if (dropped == null) { return BlockID.AIR; } diff --git a/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayerBlockBag.java b/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayerBlockBag.java index 08f682a44..aa76db272 100644 --- a/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayerBlockBag.java +++ b/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayerBlockBag.java @@ -26,6 +26,7 @@ import com.sk89q.worldedit.bags.*; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.blocks.BlockID; +import com.sk89q.worldedit.blocks.ItemType; public class BukkitPlayerBlockBag extends BlockBag { /** @@ -121,7 +122,7 @@ public class BukkitPlayerBlockBag extends BlockBag { final int damage = item.getDamage(); int amount = (item instanceof BaseItemStack) ? ((BaseItemStack) item).getAmount() : 1; assert(amount <= 64); - boolean usesDamageValue = false; // TODO: Use ItemType.usesDamageValue once it's fixed. + boolean usesDamageValue = ItemType.usesDamageValue(id); if (id == BlockID.AIR) { throw new IllegalArgumentException("Can't store air block"); @@ -137,7 +138,7 @@ public class BukkitPlayerBlockBag extends BlockBag { if (bukkitItem == null) { // Delay using up a free slot until we know there are no stacks // of this item to merge into - + if (freeSlot == -1) { freeSlot = slot; }