From 4afd2944dbbc38ea454e530fc3884402de11f11c Mon Sep 17 00:00:00 2001 From: Meaglin Date: Tue, 14 Feb 2012 21:42:48 +0100 Subject: [PATCH] Fix Dispensers, Furnaces and remove redundant casts. --- .../sk89q/worldedit/blocks/ChestBlock.java | 12 ++--- .../worldedit/blocks/DispenserBlock.java | 44 ++++++++++++++---- .../sk89q/worldedit/blocks/FurnaceBlock.java | 46 ++++++++++++++----- 3 files changed, 73 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/sk89q/worldedit/blocks/ChestBlock.java b/src/main/java/com/sk89q/worldedit/blocks/ChestBlock.java index 5e9620b98..6964347bd 100644 --- a/src/main/java/com/sk89q/worldedit/blocks/ChestBlock.java +++ b/src/main/java/com/sk89q/worldedit/blocks/ChestBlock.java @@ -161,14 +161,10 @@ public class ChestBlock extends BaseBlock implements TileEntityBlock, ContainerB CompoundTag item = (CompoundTag) tag; Map itemValues = item.getValue(); - short id = (Short) ((ShortTag) Chunk.getChildTag(itemValues, "id", ShortTag.class)) - .getValue(); - short damage = (Short) ((ShortTag) Chunk.getChildTag(itemValues, "Damage", ShortTag.class)) - .getValue(); - byte count = (Byte) ((ByteTag) Chunk.getChildTag(itemValues, "Count", ByteTag.class)) - .getValue(); - byte slot = (Byte) ((ByteTag) Chunk.getChildTag(itemValues, "Slot", ByteTag.class)) - .getValue(); + short id = Chunk.getChildTag(itemValues, "id", ShortTag.class).getValue(); + short damage = Chunk.getChildTag(itemValues, "Damage", ShortTag.class).getValue(); + byte count = Chunk.getChildTag(itemValues, "Count", ByteTag.class).getValue(); + byte slot = Chunk.getChildTag(itemValues, "Slot", ByteTag.class).getValue(); if (slot >= 0 && slot <= 26) { BaseItemStack itemstack = new BaseItemStack(id, count, damage); diff --git a/src/main/java/com/sk89q/worldedit/blocks/DispenserBlock.java b/src/main/java/com/sk89q/worldedit/blocks/DispenserBlock.java index c123f06b6..d425f42f7 100644 --- a/src/main/java/com/sk89q/worldedit/blocks/DispenserBlock.java +++ b/src/main/java/com/sk89q/worldedit/blocks/DispenserBlock.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.HashMap; import java.util.List; import java.util.ArrayList; +import java.util.Map.Entry; /** * Represents dispensers. @@ -109,6 +110,21 @@ public class DispenserBlock extends BaseBlock implements TileEntityBlock, Contai data.put("Damage", new ShortTag("Damage", item.getDamage())); data.put("Count", new ByteTag("Count", (byte) item.getAmount())); data.put("Slot", new ByteTag("Slot", (byte) i)); + if(item.getEnchantments().size() > 0) { + Map ench = new HashMap(); + CompoundTag compound = new CompoundTag("tag", ench); + List list = new ArrayList(); + ListTag enchlist = new ListTag("ench", CompoundTag.class, list); + for(Entry entry : item.getEnchantments().entrySet()) { + Map enchantment = new HashMap(); + CompoundTag enchantcompound = new CompoundTag(null, ench); + enchantment.put("id", new ShortTag("id", entry.getKey().shortValue())); + enchantment.put("lvl", new ShortTag("lvl", entry.getValue().shortValue())); + list.add(enchantcompound); + } + ench.put("ench", enchlist); + data.put("tag", compound); + } itemsList.add(itemTag); } } @@ -135,7 +151,7 @@ public class DispenserBlock extends BaseBlock implements TileEntityBlock, Contai } ListTag items = (ListTag) Chunk.getChildTag(values, "Items", ListTag.class); - BaseItemStack[] newItems = new BaseItemStack[27]; + BaseItemStack[] newItems = new BaseItemStack[9]; for (Tag tag : items.getValue()) { if (!(tag instanceof CompoundTag)) { @@ -145,17 +161,25 @@ public class DispenserBlock extends BaseBlock implements TileEntityBlock, Contai CompoundTag item = (CompoundTag) tag; Map itemValues = item.getValue(); - short id = (Short) ((ShortTag) Chunk.getChildTag(itemValues, "id", ShortTag.class)) - .getValue(); - short damage = (Short) ((ShortTag) Chunk.getChildTag(itemValues, "Damage", ShortTag.class)) - .getValue(); - byte count = (Byte) ((ByteTag) Chunk.getChildTag(itemValues, "Count", ByteTag.class)) - .getValue(); - byte slot = (Byte) ((ByteTag) Chunk.getChildTag(itemValues, "Slot", ByteTag.class)) - .getValue(); + short id = Chunk.getChildTag(itemValues, "id", ShortTag.class).getValue(); + short damage = Chunk.getChildTag(itemValues, "Damage", ShortTag.class).getValue(); + byte count = Chunk.getChildTag(itemValues, "Count", ByteTag.class).getValue(); + byte slot = Chunk.getChildTag(itemValues, "Slot", ByteTag.class).getValue(); if (slot >= 0 && slot <= 8) { - newItems[slot] = new BaseItemStack(id, count, damage); + BaseItemStack itemstack = new BaseItemStack(id, count, damage); + + if(itemValues.containsKey("tag")) { + ListTag ench = (ListTag) Chunk.getChildTag(itemValues, "tag", CompoundTag.class).getValue().get("ench"); + for(Tag e : ench.getValue()) { + Map vars = ((CompoundTag) e).getValue(); + short enchid = Chunk.getChildTag(vars, "id", ShortTag.class).getValue(); + short enchlvl = Chunk.getChildTag(vars, "lvl", ShortTag.class).getValue(); + itemstack.getEnchantments().put((int) enchid, (int)enchlvl); + } + } + + newItems[slot] = itemstack; } } diff --git a/src/main/java/com/sk89q/worldedit/blocks/FurnaceBlock.java b/src/main/java/com/sk89q/worldedit/blocks/FurnaceBlock.java index c55c25db8..73791b1df 100644 --- a/src/main/java/com/sk89q/worldedit/blocks/FurnaceBlock.java +++ b/src/main/java/com/sk89q/worldedit/blocks/FurnaceBlock.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.HashMap; import java.util.List; import java.util.ArrayList; +import java.util.Map.Entry; /** * Represents furnaces. @@ -151,6 +152,21 @@ public class FurnaceBlock extends BaseBlock implements TileEntityBlock, Containe data.put("Damage", new ShortTag("Damage", item.getDamage())); data.put("Count", new ByteTag("Count", (byte) item.getAmount())); data.put("Slot", new ByteTag("Slot", (byte) i)); + if(item.getEnchantments().size() > 0) { + Map ench = new HashMap(); + CompoundTag compound = new CompoundTag("tag", ench); + List list = new ArrayList(); + ListTag enchlist = new ListTag("ench", CompoundTag.class, list); + for(Entry entry : item.getEnchantments().entrySet()) { + Map enchantment = new HashMap(); + CompoundTag enchantcompound = new CompoundTag(null, ench); + enchantment.put("id", new ShortTag("id", entry.getKey().shortValue())); + enchantment.put("lvl", new ShortTag("lvl", entry.getValue().shortValue())); + list.add(enchantcompound); + } + ench.put("ench", enchlist); + data.put("tag", compound); + } itemsList.add(itemTag); } } @@ -179,7 +195,7 @@ public class FurnaceBlock extends BaseBlock implements TileEntityBlock, Containe } ListTag items = (ListTag) Chunk.getChildTag(values, "Items", ListTag.class); - BaseItemStack[] newItems = new BaseItemStack[27]; + BaseItemStack[] newItems = new BaseItemStack[3]; for (Tag tag : items.getValue()) { if (!(tag instanceof CompoundTag)) { @@ -189,17 +205,25 @@ public class FurnaceBlock extends BaseBlock implements TileEntityBlock, Containe CompoundTag item = (CompoundTag) tag; Map itemValues = item.getValue(); - short id = (Short) ((ShortTag) Chunk.getChildTag(itemValues, "id", ShortTag.class)) - .getValue(); - short damage = (Short) ((ShortTag) Chunk.getChildTag(itemValues, "Damage", ShortTag.class)) - .getValue(); - byte count = (Byte) ((ByteTag) Chunk.getChildTag(itemValues, "Count", ByteTag.class)) - .getValue(); - byte slot = (Byte) ((ByteTag) Chunk.getChildTag(itemValues, "Slot", ByteTag.class)) - .getValue(); + short id = Chunk.getChildTag(itemValues, "id", ShortTag.class).getValue(); + short damage = Chunk.getChildTag(itemValues, "Damage", ShortTag.class).getValue(); + byte count = Chunk.getChildTag(itemValues, "Count", ByteTag.class).getValue(); + byte slot = Chunk.getChildTag(itemValues, "Slot", ByteTag.class).getValue(); - if (slot >= 0 && slot <= 26) { - newItems[slot] = new BaseItemStack(id, count, damage); + if (slot >= 0 && slot <= 2) { + BaseItemStack itemstack = new BaseItemStack(id, count, damage); + + if(itemValues.containsKey("tag")) { + ListTag ench = (ListTag) Chunk.getChildTag(itemValues, "tag", CompoundTag.class).getValue().get("ench"); + for(Tag e : ench.getValue()) { + Map vars = ((CompoundTag) e).getValue(); + short enchid = Chunk.getChildTag(vars, "id", ShortTag.class).getValue(); + short enchlvl = Chunk.getChildTag(vars, "lvl", ShortTag.class).getValue(); + itemstack.getEnchantments().put((int) enchid, (int)enchlvl); + } + } + + newItems[slot] = itemstack; } }