From 4e94a660fff2d93bc8aa54bdff05fcbed01e1aff Mon Sep 17 00:00:00 2001 From: Sen Date: Mon, 7 Jul 2025 00:38:38 +0200 Subject: [PATCH] remove arbitary item data --- .../java/client/gui/ingame/GuiRename.java | 2 +- .../common/ai/EntityAIControlledByPlayer.java | 2 +- .../common/enchantment/EnchantmentHelper.java | 66 +-- .../java/common/entity/item/EntityItem.java | 6 +- .../java/common/entity/npc/EntityNPC.java | 6 +- .../java/common/init/CraftingRegistry.java | 18 +- .../inventory/ContainerEnchantment.java | 11 +- .../common/inventory/InventoryHelper.java | 5 +- .../common/inventory/InventoryPlayer.java | 5 +- common/src/main/java/common/item/Item.java | 2 +- .../src/main/java/common/item/ItemStack.java | 400 +++++++----------- .../java/common/item/block/ItemBlock.java | 34 -- .../main/java/common/item/block/ItemSign.java | 2 +- .../common/item/block/ItemSmallBlock.java | 1 - .../common/item/tool/ItemCarrotOnAStick.java | 2 +- .../java/common/network/PacketBuffer.java | 33 +- .../common/village/MerchantRecipeList.java | 5 +- .../server/command/commands/CommandItem.java | 2 +- 18 files changed, 210 insertions(+), 392 deletions(-) diff --git a/client/src/main/java/client/gui/ingame/GuiRename.java b/client/src/main/java/client/gui/ingame/GuiRename.java index 3d8cb144..76fc093d 100644 --- a/client/src/main/java/client/gui/ingame/GuiRename.java +++ b/client/src/main/java/client/gui/ingame/GuiRename.java @@ -36,7 +36,7 @@ public class GuiRename extends Gui implements FieldCallback, ButtonCallback { } public GuiRename(int slot, ItemStack stack, Gui prev) { - this.itemName = stack.getItem().getDisplay(stack); + this.itemName = stack.getItem().getDisplay(); this.origName = stack.hasDisplayName() ? TextColor.stripCodes(stack.getDisplayName()) : ""; this.slot = slot; this.previous = prev; diff --git a/common/src/main/java/common/ai/EntityAIControlledByPlayer.java b/common/src/main/java/common/ai/EntityAIControlledByPlayer.java index 47fdf8fd..d3dccbd0 100755 --- a/common/src/main/java/common/ai/EntityAIControlledByPlayer.java +++ b/common/src/main/java/common/ai/EntityAIControlledByPlayer.java @@ -181,7 +181,7 @@ public class EntityAIControlledByPlayer extends EntityAIBase if (itemstack.size == 0) { ItemStack itemstack1 = new ItemStack(Items.fishing_rod); - itemstack1.setTag(itemstack.getTag()); + itemstack1.copyData(itemstack); entityplayer.inventory.mainInventory[entityplayer.inventory.currentItem] = itemstack1; } } diff --git a/common/src/main/java/common/enchantment/EnchantmentHelper.java b/common/src/main/java/common/enchantment/EnchantmentHelper.java index 769148bb..e0a00c38 100755 --- a/common/src/main/java/common/enchantment/EnchantmentHelper.java +++ b/common/src/main/java/common/enchantment/EnchantmentHelper.java @@ -3,6 +3,7 @@ package common.enchantment; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Map.Entry; import common.collect.Lists; @@ -16,7 +17,6 @@ import common.item.ItemStack; import common.item.material.ItemEnchantedBook; import common.rng.Random; import common.rng.WeightedList; -import common.tags.TagObject; public class EnchantmentHelper { @@ -34,7 +34,7 @@ public class EnchantmentHelper } else { - List list = stack.getEnchantmentTagList(); + Integer list = stack.getEnchantment(enchID); if (list == null) { @@ -42,18 +42,7 @@ public class EnchantmentHelper } else { - for (int i = 0; i < list.size(); ++i) - { - Enchantment j = Enchantment.getEnchantment(list.get(i).getString("id")); - - if (j == enchID) - { - int k = list.get(i).getShort("lvl"); - return k; - } - } - - return 0; + return list.intValue(); } } } @@ -65,17 +54,13 @@ public class EnchantmentHelper map.put(book.getEnchantment(), book.getLevel()); return map; } - List list = stack.getEnchantmentTagList(); + Set> list = stack.getEnchantments(); if (list != null) { - for (int i = 0; i < list.size(); ++i) + for (Entry enc : list) { - Enchantment j = Enchantment.getEnchantment(list.get(i).getString("id")); - if(j != null) { - int k = list.get(i).getShort("lvl"); - map.put(j, k); - } + map.put(enc.getKey(), enc.getValue()); } } @@ -88,34 +73,9 @@ public class EnchantmentHelper { Entry entry = new Random().pick(Lists.newArrayList(enchMap.entrySet())); stack.setItem(ItemEnchantedBook.getEnchantedBook(entry.getKey(), entry.getValue())); - if(stack.hasTag()) - stack.getTag().remove("ench"); } else { - List list = Lists.newArrayList(); - Iterator iterator = enchMap.keySet().iterator(); - - while (iterator.hasNext()) - { - Enchantment enchantment = iterator.next(); - - TagObject tag = new TagObject(); - tag.setString("id", enchantment.getName()); - tag.setShort("lvl", (short)enchMap.get(enchantment).intValue()); - list.add(tag); - } - - if (list.size() > 0) - { - if (!(stack.getItem() instanceof ItemEnchantedBook)) - { - stack.setTagInfo("ench", list); - } - } - else if (stack.hasTag()) - { - stack.getTag().remove("ench"); - } + stack.setEnchantments(enchMap); } } @@ -153,19 +113,13 @@ public class EnchantmentHelper { if (stack != null) { - List list = stack.getEnchantmentTagList(); + Set> list = stack.getEnchantments(); if (list != null) { - for (int i = 0; i < list.size(); ++i) + for (Entry enc : list) { - String j = list.get(i).getString("id"); - int k = list.get(i).getShort("lvl"); - - if (Enchantment.getEnchantment(j) != null) - { - modifier.calculateModifier(Enchantment.getEnchantment(j), k); - } + modifier.calculateModifier(enc.getKey(), enc.getValue()); } } } diff --git a/common/src/main/java/common/entity/item/EntityItem.java b/common/src/main/java/common/entity/item/EntityItem.java index 4c7c8588..6042aad3 100755 --- a/common/src/main/java/common/entity/item/EntityItem.java +++ b/common/src/main/java/common/entity/item/EntityItem.java @@ -223,11 +223,7 @@ public class EntityItem extends Entity { return false; } - else if (itemstack1.hasTag() ^ itemstack.hasTag()) - { - return false; - } - else if (itemstack1.hasTag() && !itemstack1.getTag().equals(itemstack.getTag())) + else if (!itemstack1.dataEquals(itemstack)) { return false; } diff --git a/common/src/main/java/common/entity/npc/EntityNPC.java b/common/src/main/java/common/entity/npc/EntityNPC.java index 9e790347..647b8fd8 100755 --- a/common/src/main/java/common/entity/npc/EntityNPC.java +++ b/common/src/main/java/common/entity/npc/EntityNPC.java @@ -1368,11 +1368,11 @@ public abstract class EntityNPC extends EntityLiving flag = itemsword.getDamageVsEntity() > itemsword1.getDamageVsEntity(); } else { - flag = stack.getItemDamage() > old.getItemDamage() || stack.hasTag() && !old.hasTag(); + flag = stack.getItemDamage() > old.getItemDamage() || stack.isItemEnchanted() && !old.isItemEnchanted(); } } else if(stack.getItem() instanceof ItemBow && old.getItem() instanceof ItemBow) { - flag = stack.hasTag() && !old.hasTag(); + flag = stack.isItemEnchanted() && !old.isItemEnchanted(); } else if(stack.getItem() instanceof ItemGunBase && !(old.getItem() instanceof ItemBow)) { flag = true; @@ -1395,7 +1395,7 @@ public abstract class EntityNPC extends EntityLiving flag = itemarmor.damageReduceAmount > itemarmor1.damageReduceAmount; } else { - flag = stack.getItemDamage() > old.getItemDamage() || stack.hasTag() && !old.hasTag(); + flag = stack.getItemDamage() > old.getItemDamage() || stack.isItemEnchanted() && !old.isItemEnchanted(); } } else { diff --git a/common/src/main/java/common/init/CraftingRegistry.java b/common/src/main/java/common/init/CraftingRegistry.java index 9dd28c2b..935d162b 100755 --- a/common/src/main/java/common/init/CraftingRegistry.java +++ b/common/src/main/java/common/init/CraftingRegistry.java @@ -787,7 +787,6 @@ public abstract class CraftingRegistry /** Is the ItemStack that you get when craft the recipe. */ private final ItemStack recipeOutput; - private boolean copyIngredientTag; public ShapedRecipes(int width, int height, ItemStack[] p_i1917_3_, ItemStack output) { @@ -893,22 +892,7 @@ public abstract class CraftingRegistry */ public ItemStack getCraftingResult(InventoryCrafting inv) { - ItemStack itemstack = this.getRecipeOutput().copy(); - - if (this.copyIngredientTag) - { - for (int i = 0; i < inv.getSizeInventory(); ++i) - { - ItemStack itemstack1 = inv.getStackInSlot(i); - - if (itemstack1 != null && itemstack1.hasTag()) - { - itemstack.setTag(itemstack1.getTag().copy()); - } - } - } - - return itemstack; + return this.getRecipeOutput().copy(); } /** diff --git a/common/src/main/java/common/inventory/ContainerEnchantment.java b/common/src/main/java/common/inventory/ContainerEnchantment.java index 8ab7cc09..1b69294c 100755 --- a/common/src/main/java/common/inventory/ContainerEnchantment.java +++ b/common/src/main/java/common/inventory/ContainerEnchantment.java @@ -330,14 +330,11 @@ public class ContainerEnchantment extends Container return null; } - if (itemstack1.hasTag() && itemstack1.size == 1) + if (itemstack1.size >= 1) { - ((Slot)this.inventorySlots.get(0)).putStack(itemstack1.copy()); - itemstack1.size = 0; - } - else if (itemstack1.size >= 1) - { - ((Slot)this.inventorySlots.get(0)).putStack(new ItemStack(itemstack1.getItem())); + ItemStack st = itemstack1.copy(); + st.size = 1; + ((Slot)this.inventorySlots.get(0)).putStack(st); --itemstack1.size; } } diff --git a/common/src/main/java/common/inventory/InventoryHelper.java b/common/src/main/java/common/inventory/InventoryHelper.java index b6cb6fb8..22886b31 100755 --- a/common/src/main/java/common/inventory/InventoryHelper.java +++ b/common/src/main/java/common/inventory/InventoryHelper.java @@ -52,10 +52,7 @@ public class InventoryHelper stack.size -= i; EntityItem entityitem = new EntityItem(worldIn, x + (double)f, y + (double)f1, z + (double)f2, new ItemStack(stack.getItem(), i)); - if (stack.hasTag()) - { - entityitem.getEntityItem().setTag(stack.getTag().copy()); - } + entityitem.getEntityItem().copyData(stack); float f3 = 0.05F; entityitem.motionX = RANDOM.gaussian() * (double)f3; diff --git a/common/src/main/java/common/inventory/InventoryPlayer.java b/common/src/main/java/common/inventory/InventoryPlayer.java index 6b4aa9be..9b0bae50 100755 --- a/common/src/main/java/common/inventory/InventoryPlayer.java +++ b/common/src/main/java/common/inventory/InventoryPlayer.java @@ -201,10 +201,7 @@ public class InventoryPlayer implements IInventory { this.mainInventory[j] = new ItemStack(item, 0); - if (itemStackIn.hasTag()) - { - this.mainInventory[j].setTag(itemStackIn.getTag().copy()); - } + this.mainInventory[j].copyData(itemStackIn); } int k = i; diff --git a/common/src/main/java/common/item/Item.java b/common/src/main/java/common/item/Item.java index c5033258..ba80fc30 100755 --- a/common/src/main/java/common/item/Item.java +++ b/common/src/main/java/common/item/Item.java @@ -87,7 +87,7 @@ public class Item { return this.maxDamage > 0; } - public final String getDisplay(ItemStack stack) { + public final String getDisplay() { return this.display; } diff --git a/common/src/main/java/common/item/ItemStack.java b/common/src/main/java/common/item/ItemStack.java index 4554a4b8..1250c0be 100755 --- a/common/src/main/java/common/item/ItemStack.java +++ b/common/src/main/java/common/item/ItemStack.java @@ -4,6 +4,7 @@ import java.text.DecimalFormat; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import common.attributes.Attribute; import common.attributes.UsageSlot; @@ -30,7 +31,11 @@ public final class ItemStack public int size; private Item item; - private TagObject tag; + private String name; + private int color = 0xffffffff; + private int damage; + private int repairCost; + private Map enchantments; public ItemStack(Item item) { @@ -62,9 +67,13 @@ public final class ItemStack public static ItemStack readFromTag(TagObject tag) { - ItemStack itemstack = new ItemStack(); - itemstack.readTags(tag); - return itemstack.getItem() != null ? itemstack : null; + Item item = tag.hasString("id") ? ItemRegistry.byName(tag.getString("id")) : null; + int size = tag.hasInt("size") ? tag.getInt("size") : 1; + if(item == null || size < 1) + return null; + ItemStack stack = new ItemStack(item, Math.min(item.getMaxAmount(), size)); + stack.readTag(tag); + return stack; } public static ItemStack getStack(String name, ItemStack def) { @@ -73,9 +82,27 @@ public final class ItemStack Item item = ItemRegistry.byName(name); return item == null ? def : new ItemStack(item); } + + public boolean dataEquals(ItemStack other) { + if(this.color != other.color || this.damage != other.damage || this.repairCost != other.repairCost || (this.name != null) != (other.name != null) || (this.name != null && !this.name.equals(other.name)) || (this.enchantments != null) != (other.enchantments != null) || (this.enchantments != null && this.enchantments.size() != other.enchantments.size())) + return false; + if(this.enchantments == null) + return true; + for(Entry ench : this.enchantments.entrySet()) { + if(!ench.getValue().equals(other.enchantments.get(ench.getKey()))) + return false; + } + return true; + } - private ItemStack() - { + public void copyData(ItemStack stack) { + this.color = stack.color; + this.damage = stack.damage; + this.repairCost = stack.repairCost; + this.name = stack.name; + this.enchantments = stack.enchantments == null ? null : Maps.newEnumMap(Enchantment.class); + if(this.enchantments != null) + this.enchantments.putAll(stack.enchantments); } /** @@ -85,10 +112,7 @@ public final class ItemStack { ItemStack itemstack = new ItemStack(this.item, amount); - if (this.tag != null) - { - itemstack.tag = this.tag.copy(); - } + itemstack.copyData(this); this.size -= amount; return itemstack; @@ -146,21 +170,54 @@ public final class ItemStack tag.setString("id", ItemRegistry.getName(this.item)); if(this.size != 1) tag.setInt("size", this.size); - if(this.tag != null) - tag.setObject("tag", this.tag); + if(this.color != 0xffffffff) + tag.setInt("color", this.color); + if(this.damage != 0) + tag.setInt("dmg", this.damage); + if(this.repairCost != 0) + tag.setInt("cost", this.repairCost); + if(this.name != null) + tag.setString("name", this.name); + if(this.enchantments != null) { + List list = Lists.newArrayList(); + for(Entry ench : this.enchantments.entrySet()) { + TagObject enc = new TagObject(); + enc.setString("id", ench.getKey().getName()); + if(ench.getValue() != 1) + enc.setShort("lvl", ench.getValue().shortValue()); + list.add(enc); + } + tag.setList("ench", list); + } return tag; } - private void readTags(TagObject tag) + public void readTag(TagObject tag) { - this.item = tag.hasString("id") ? ItemRegistry.byName(tag.getString("id")) : null; - this.size = tag.hasInt("size") ? tag.getInt("size") : 1; - this.tag = tag.hasObject("tag") ? tag.getObject("tag") : null; + this.color = tag.hasInt("color") ? tag.getInt("color") : 0xffffffff; + this.color = (this.color & 0xff000000) != 0 ? 0xffffffff : this.color; + this.damage = tag.hasInt("dmg") ? Math.max(0, tag.getInt("dmg")) : 0; + this.repairCost = tag.hasInt("cost") ? Math.max(0, tag.getInt("cost")) : 0; + this.name = tag.hasString("name") ? tag.getString("name") : null; + this.name = this.name != null && this.name.length() > 32 ? this.name.substring(0, 32) : this.name; + this.enchantments = tag.hasList("ench") ? Maps.newEnumMap(Enchantment.class) : null; + if(this.enchantments != null) { + List list = tag.getList("ench"); + for(TagObject enc : list) { + if(!enc.hasString("id")) + continue; + Enchantment ench = Enchantment.getEnchantment(enc.getString("id")); + if(ench != null) + this.enchantments.put(ench, enc.hasShort("lvl") ? (int)enc.getShort("lvl") : 1); + } + if(this.enchantments.isEmpty()) + this.enchantments = null; + } } public int getMaxStackSize() { - return this.getItem().getMaxAmount(); + return this.item.getMaxAmount(); } public boolean isStackable() @@ -178,29 +235,6 @@ public final class ItemStack return this.isItemStackDamageable() && this.getItemDamage() > 0; } - public int getItemDamage() - { - return this.isItemStackDamageable() && this.tag != null && this.tag.hasInt("dmg") ? this.tag.getInt("dmg") : 0; - } - - public void setItemDamage(int damage) - { - if(!this.isItemStackDamageable()) - return; - if(damage <= 0) { - if(this.tag != null) { - this.tag.remove("dmg"); - if(this.tag.isEmpty()) - this.tag = null; - } - } - else { - if(this.tag == null) - this.tag = new TagObject(); - this.tag.setInt("dmg", damage); - } - } - public int getMaxDamage() { return this.item.getMaxDamage(); @@ -319,17 +353,14 @@ public final class ItemStack { ItemStack itemstack = new ItemStack(this.item, this.size); - if (this.tag != null) - { - itemstack.tag = this.tag.copy(); - } + itemstack.copyData(this); return itemstack; } public static boolean areItemStackTagsEqual(ItemStack stackA, ItemStack stackB) { - return stackA == null && stackB == null ? true : (stackA != null && stackB != null ? (stackA.tag == null && stackB.tag != null ? false : stackA.tag == null || stackA.tag.equals(stackB.tag)) : false); + return stackA == null && stackB == null ? true : (stackA != null && stackB != null ? stackA.dataEquals(stackB) : false); } /** @@ -345,7 +376,7 @@ public final class ItemStack */ private boolean isItemStackEqual(ItemStack other) { - return this.size != other.size ? false : (this.item != other.item ? false : (this.tag == null && other.tag != null ? false : this.tag == null || this.tag.equals(other.tag))); + return this.size != other.size ? false : (this.item != other.item ? false : this.dataEquals(other)); } /** @@ -431,36 +462,21 @@ public final class ItemStack this.getItem().onPlayerStoppedUsing(this, worldIn, playerIn, timeLeft); } - public boolean hasTag() + public int getItemDamage() { - return this.tag != null; + return this.isItemStackDamageable() ? this.damage : 0; } - public TagObject getTag() + public void setItemDamage(int damage) { - return this.tag; - } - - public List getEnchantmentTagList() - { - return this.tag == null ? null : this.tag.getList("ench"); - } - - public void setTag(TagObject tag) - { - this.tag = tag; + if(!this.isItemStackDamageable()) + return; + this.damage = Math.max(0, damage); } public String getDisplayName() { - String s = this.getItem().getDisplay(this); - - if (this.tag != null && this.tag.hasString("Name")) - { - s = this.tag.getString("Name"); - } - - return s; + return this.name != null ? this.name : this.getItem().getDisplay(); } public String getColoredName() { @@ -471,36 +487,20 @@ public final class ItemStack return TextColor.DGRAY + "[" + this.getColor() + this.getDisplayName() + TextColor.DGRAY + "]" + reset; } - public ItemStack setStackDisplayName(String displayName) + public void setStackDisplayName(String displayName) { - if (this.tag == null) - { - this.tag = new TagObject(); - } - - this.tag.setString("Name", displayName); - return this; + this.name = displayName != null && !displayName.isEmpty() ? displayName : null; + this.name = this.name != null && this.name.length() > 32 ? this.name.substring(0, 32) : this.name; } public void clearCustomName() { - if (this.tag != null) - { - if (this.tag.hasString("Name")) - { - this.tag.remove("Name"); - - if (this.tag.isEmpty()) - { - this.setTag(null); - } - } - } + this.name = null; } public boolean hasDisplayName() { - return this.tag != null && this.tag.hasString("Name"); + return this.name != null; } public List getTooltip(EntityNPC playerIn) @@ -515,22 +515,11 @@ public final class ItemStack if(this.item.canBeDyed()) list.add("Farbe: #" + Integer.toHexString(this.getDyeColor()).toUpperCase()); - if (this.hasTag()) + if (this.enchantments != null) { - List ench = this.getEnchantmentTagList(); - - if (ench != null) + for (Entry enc : this.enchantments.entrySet()) { - for (int j = 0; j < ench.size(); ++j) - { - Enchantment k = Enchantment.getEnchantment(ench.get(j).getString("id")); - - if (k != null) - { - int l = ench.get(j).getShort("lvl"); - list.add(k.getFormattedName(l)); - } - } + list.add(enc.getKey().getFormattedName(enc.getValue())); } } @@ -567,27 +556,22 @@ public final class ItemStack } } - if (this.isItemStackDamageable()) + if (this.item.getMaxDamage() > 0) { - list.add(String.format("Haltbarkeit: %d" + (this.isItemDamaged() ? " / %d" : ""), - this.isItemDamaged() ? (this.getMaxDamage() - this.getItemDamage()) : this.getMaxDamage(), this.getMaxDamage())); + list.add(String.format("Haltbarkeit: %d" + (this.damage > 0 ? " / %d" : ""), + this.damage > 0 ? (this.item.getMaxDamage() - this.damage) : this.item.getMaxDamage(), this.item.getMaxDamage())); } - if(this.getRepairCost() > 0) - list.add("Reparaturkosten: " + this.getRepairCost() + " Mana"); + if(this.repairCost > 0) + list.add("Reparaturkosten: " + this.repairCost + " Mana"); - if(this.getMaxStackSize() == 1) + if(this.item.getMaxAmount() == 1) list.add("Nicht stapelbar"); else - list.add("Stapelbar bis " + this.getMaxStackSize()); + list.add("Stapelbar bis " + this.item.getMaxAmount()); list.add(TextColor.GRAY + ItemRegistry.getName(this.item)); - if (this.hasTag()) - { - list.add(TextColor.GRAY + String.format("Tags: %d", this.getTag().keySet().size())); - } - return list; } @@ -601,146 +585,70 @@ public final class ItemStack return this.getItem().getColor(this); } - /** - * True if it is a tool and has no enchantments to begin with - */ public boolean isItemEnchantable() { return !this.getItem().canEnchant(this) ? false : !this.isItemEnchanted(); } - /** - * Adds an enchantment with a desired level on the ItemStack. - */ - public void addEnchantment(Enchantment ench, int level) + public Set> getEnchantments() { - if (this.tag == null) - { - this.setTag(new TagObject()); - } - - if (!this.tag.hasList("ench")) - { - this.tag.setList("ench", Lists.newArrayList()); - } - - List list = this.tag.getList("ench"); - TagObject tag = new TagObject(); - tag.setString("id", ench.getName()); - tag.setShort("lvl", (short)(/* (byte) */ level)); - list.add(tag); + return this.enchantments == null ? null : this.enchantments.entrySet(); + } + + public Integer getEnchantment(Enchantment ench) + { + return this.enchantments == null ? null : this.enchantments.get(ench); + } + + public void addEnchantment(Enchantment ench, int level) + { + if (this.enchantments == null) + this.enchantments = Maps.newEnumMap(Enchantment.class); + this.enchantments.put(ench, level); } - /** - * Removes an enchantment from the ItemStack. - */ public boolean removeEnchantment(Enchantment ench) { - if(this.tag == null) { - return false; - } - if(!this.tag.hasList("ench")) { - return false; - } - List oldEnch = this.tag.getList("ench"); - List newEnch = Lists.newArrayList(); - boolean changed = false; - TagObject tag; - for(int z = 0; z < oldEnch.size(); z++) { - tag = oldEnch.get(z); - if(Enchantment.getEnchantment(tag.getString("id")) != ench) { - newEnch.add(tag); - } - else { - changed = true; - } - } - if(!changed) { + if(this.enchantments == null || this.enchantments.remove(ench) == null) return false; - } - if(newEnch.size() == 0) { - this.tag.remove("ench"); - if(this.tag.isEmpty()) { - this.tag = null; - } - } - else { - this.tag.setList("ench", newEnch); - } + if(this.enchantments.isEmpty()) + this.enchantments = null; return true; } - /** - * Removes all enchantments from the ItemStack. - */ public boolean clearEnchantments() { - if(this.tag == null) { - return false; + if(this.enchantments != null) { + this.enchantments = null; + return true; } - if(!this.tag.hasList("ench")) { - return false; - } - this.tag.remove("ench"); - if(this.tag.isEmpty()) { - this.tag = null; - } - return true; + return false; } - /** - * True if the item has enchantment data - */ public boolean isItemEnchanted() { - return this.tag != null && this.tag.hasList("ench"); + return this.enchantments != null; } - public void setTagInfo(String key, TagObject value) + public void setEnchantments(Map enchMap) { - if (this.tag == null) - { - this.setTag(new TagObject()); - } - - this.tag.setObject(key, value); - } - - public void setTagInfo(String key, List value) - { - if (this.tag == null) - { - this.setTag(new TagObject()); - } - - this.tag.setList(key, value); + if(enchMap == null || enchMap.isEmpty()) { + this.enchantments = null; + return; + } + if(this.enchantments == null) + this.enchantments = Maps.newEnumMap(Enchantment.class); + else + this.enchantments.clear(); + this.enchantments.putAll(enchMap); } public int getRepairCost() { - return this.hasTag() && this.tag.hasInt("RepairCost") ? this.tag.getInt("RepairCost") : 0; + return this.repairCost; } public void setRepairCost(int cost) { - if(cost == 0) { - if(this.tag == null) { - return; - } - if(!this.tag.hasInt("RepairCost")) { - return; - } - this.tag.remove("RepairCost"); - if(this.tag.isEmpty()) { - this.tag = null; - } - return; - } - - if (!this.hasTag()) - { - this.tag = new TagObject(); - } - - this.tag.setInt("RepairCost", cost); + this.repairCost = Math.max(0, cost); } public Map getAttributeModifiers(UsageSlot slot) { @@ -754,45 +662,41 @@ public final class ItemStack this.item = newItem; } + public boolean canBeDyed() + { + return this.item.canBeDyed(); + } + public boolean hasColor() { - return this.item.canBeDyed() && this.tag != null && this.tag.hasInt("color"); + return this.item.canBeDyed() && this.color != 0xffffffff; + } + + public int getRawColor() + { + if(!this.item.canBeDyed()) + return -1; + return this.color; } public int getDyeColor() { - if (!this.item.canBeDyed()) + if(!this.item.canBeDyed()) return -1; - - if (this.tag != null && this.tag.hasInt("color")) - { - return this.tag.getInt("color"); - } - - return this.item.getDefaultColor(); + return this.color != 0xffffffff ? this.color : this.item.getDefaultColor(); } public void removeColor() { - if (!this.item.canBeDyed()) + if(!this.item.canBeDyed()) throw new UnsupportedOperationException("Kann diesen Gegenstand nicht entfärben!"); - if (this.tag != null) - { - if (this.tag.hasInt("color")) - { - this.tag.remove("color"); - if(this.tag.isEmpty()) - this.tag = null; - } - } + this.color = 0xffffffff; } public void setColor(int color) { - if (!this.item.canBeDyed()) + if(!this.item.canBeDyed()) throw new UnsupportedOperationException("Kann diesen Gegenstand nicht einfärben!"); - if (this.tag == null) - this.tag = new TagObject(); - this.tag.setInt("color", color); + this.color = (color & 0xff000000) != 0 ? 0xffffffff : color; } } diff --git a/common/src/main/java/common/item/block/ItemBlock.java b/common/src/main/java/common/item/block/ItemBlock.java index 87d4365c..483b6be4 100755 --- a/common/src/main/java/common/item/block/ItemBlock.java +++ b/common/src/main/java/common/item/block/ItemBlock.java @@ -11,8 +11,6 @@ import common.item.ItemStack; import common.model.Model; import common.model.ModelProvider; import common.model.Transforms; -import common.tags.TagObject; -import common.tileentity.TileEntity; import common.util.BlockPos; import common.util.Facing; import common.world.State; @@ -81,7 +79,6 @@ public class ItemBlock extends Item if (iblockstate1.getBlock() == this.block) { - setTileData(worldIn, playerIn, pos, stack); this.block.onBlockPlacedBy(worldIn, pos, iblockstate1, playerIn, stack); } @@ -97,37 +94,6 @@ public class ItemBlock extends Item } } - public static boolean setTileData(World world, EntityNPC player, BlockPos pos, ItemStack stack) - { - if (stack.hasTag() && stack.getTag().hasObject("BlockEntityTag")) - { - TileEntity tile = world.getTileEntity(pos); - - if (tile != null) - { - if (!world.client && !player.connection.isAdmin()) - { - return false; - } - - TagObject tag = new TagObject(); - TagObject tileTag = tag.copy(); - tile.writeTags(tag); - TagObject stackTag = stack.getTag().getObject("BlockEntityTag"); - tag.merge(stackTag); - - if (!tag.equals(tileTag)) - { - tile.readTags(tag); - tile.markDirty(); - return true; - } - } - } - - return false; - } - public boolean canPlaceBlockOnSide(World worldIn, BlockPos pos, Facing side, EntityNPC player, ItemStack stack) { Block block = worldIn.getState(pos).getBlock(); diff --git a/common/src/main/java/common/item/block/ItemSign.java b/common/src/main/java/common/item/block/ItemSign.java index 97ac8d55..5a9a5720 100755 --- a/common/src/main/java/common/item/block/ItemSign.java +++ b/common/src/main/java/common/item/block/ItemSign.java @@ -74,7 +74,7 @@ public class ItemSign extends Item --stack.size; TileEntity tileentity = worldIn.getTileEntity(pos); - if (tileentity instanceof TileEntitySign && !ItemBlock.setTileData(worldIn, playerIn, pos, stack)) + if (tileentity instanceof TileEntitySign) { playerIn.openEditSign((TileEntitySign)tileentity); } diff --git a/common/src/main/java/common/item/block/ItemSmallBlock.java b/common/src/main/java/common/item/block/ItemSmallBlock.java index fb6f3723..6ff50c0f 100755 --- a/common/src/main/java/common/item/block/ItemSmallBlock.java +++ b/common/src/main/java/common/item/block/ItemSmallBlock.java @@ -40,7 +40,6 @@ public class ItemSmallBlock extends Item { newState = world.getState(pos); if(newState.getBlock() == this.block) { - ItemBlock.setTileData(world, player, pos, stack); newState.getBlock().onBlockPlacedBy(world, pos, newState, player, stack); } diff --git a/common/src/main/java/common/item/tool/ItemCarrotOnAStick.java b/common/src/main/java/common/item/tool/ItemCarrotOnAStick.java index 56da0739..0c099139 100755 --- a/common/src/main/java/common/item/tool/ItemCarrotOnAStick.java +++ b/common/src/main/java/common/item/tool/ItemCarrotOnAStick.java @@ -51,7 +51,7 @@ public class ItemCarrotOnAStick extends Item if (itemStackIn.size == 0) { ItemStack itemstack = new ItemStack(Items.fishing_rod); - itemstack.setTag(itemStackIn.getTag()); + itemstack.copyData(itemStackIn); return itemstack; } } diff --git a/common/src/main/java/common/network/PacketBuffer.java b/common/src/main/java/common/network/PacketBuffer.java index 863d2bb8..b6dc6f1c 100755 --- a/common/src/main/java/common/network/PacketBuffer.java +++ b/common/src/main/java/common/network/PacketBuffer.java @@ -2,7 +2,10 @@ package common.network; import java.io.IOException; import java.nio.charset.Charset; +import java.util.Set; +import java.util.Map.Entry; +import common.enchantment.Enchantment; import common.init.ItemRegistry; import common.item.ItemStack; import common.net.buffer.ByteBuf; @@ -119,16 +122,38 @@ public class PacketBuffer { } this.writeShort(ItemRegistry.getId(stack.getItem())); this.writeVarInt(stack.size); - this.writeTag(stack.getTag()); + if(stack.canBeDyed()) + this.writeVarInt(stack.getRawColor()); + if(stack.isItemStackDamageable()) + this.writeVarInt(stack.getItemDamage()); + this.writeVarInt(stack.getRepairCost()); + this.writeString(stack.hasDisplayName() ? stack.getDisplayName() : ""); + Set> ench = stack.getEnchantments(); + this.writeVarInt(ench == null ? 0 : ench.size()); + if(ench != null) { + for(Entry entry : ench) { + this.writeEnumValue(entry.getKey()); + this.writeShort(entry.getValue()); + } + } } public ItemStack readItemStack() throws IOException { int id = this.readShort(); if(id < 0) return null; - int amt = this.readVarInt(); - ItemStack stack = new ItemStack(ItemRegistry.byId(id), amt); - stack.setTag(this.readTag()); + ItemStack stack = new ItemStack(ItemRegistry.byId(id), this.readVarInt()); + if(stack.canBeDyed()) + stack.setColor(this.readVarInt()); + if(stack.isItemStackDamageable()) + stack.setItemDamage(this.readVarInt()); + stack.setRepairCost(this.readVarInt()); + stack.setStackDisplayName(this.readString(32)); + int num = this.readVarInt(); + for(int z = 0; z < num; z++) { + Enchantment enc = this.readEnumValue(Enchantment.class); + stack.addEnchantment(enc, this.readShort()); + } return stack; } diff --git a/common/src/main/java/common/village/MerchantRecipeList.java b/common/src/main/java/common/village/MerchantRecipeList.java index 53f82922..f0cd66c9 100755 --- a/common/src/main/java/common/village/MerchantRecipeList.java +++ b/common/src/main/java/common/village/MerchantRecipeList.java @@ -31,9 +31,8 @@ public class MerchantRecipeList extends ArrayList { } } - private static boolean areItemsSimilar(ItemStack stack1, ItemStack stack2) { - return ItemStack.areItemsEqual(stack1, stack2) - && (!stack2.hasTag() || stack1.hasTag() && TagObject.compare(stack2.getTag(), stack1.getTag())); + private static boolean areItemsSimilar(ItemStack given, ItemStack offer) { + return ItemStack.areItemsEqual(given, offer) && given.dataEquals(offer); } public void fromTags(List list) { diff --git a/server/src/main/java/server/command/commands/CommandItem.java b/server/src/main/java/server/command/commands/CommandItem.java index 8cdbf854..32a1c536 100644 --- a/server/src/main/java/server/command/commands/CommandItem.java +++ b/server/src/main/java/server/command/commands/CommandItem.java @@ -34,7 +34,7 @@ public class CommandItem extends Command { ItemStack stack = ItemStack.getStack(item, null); if(stack == null) throw new RunException("Gegenstand '%s' existiert nicht", item); - stack.setTag(tag); + stack.readTag(tag); int done = 0; int given = 0; for(EntityNPC player : players) {