3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-12-24 07:10:10 +01:00

Fix discrepancies in NBT and ItemMeta. Fixes BUKKIT-3279

An ItemStack gains the tag name "tag" when the stack is serialized
to NBT, however items don't have a tag *until* they are serialized at
least once. So to solve this, we remove the tag name when loading the
NBT data.

Another problem with NBT are TagLists, when transferring tag lists
between the server and the client the names are lost, and so we
simply don't add a name to the tag.
Dieser Commit ist enthalten in:
feildmaster 2012-12-27 20:45:21 -06:00
Ursprung 25732f0487
Commit 54b2707ba7
3 geänderte Dateien mit 17 neuen und 11 gelöschten Zeilen

Datei anzeigen

@ -106,7 +106,8 @@ public final class ItemStack {
this.count = nbttagcompound.getByte("Count"); this.count = nbttagcompound.getByte("Count");
this.damage = nbttagcompound.getShort("Damage"); this.damage = nbttagcompound.getShort("Damage");
if (nbttagcompound.hasKey("tag")) { if (nbttagcompound.hasKey("tag")) {
this.tag = nbttagcompound.getCompound("tag"); // CraftBukkit - clear name from compound
this.tag = (NBTTagCompound) nbttagcompound.getCompound("tag").setName("");
} }
} }

Datei anzeigen

@ -91,11 +91,7 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta {
} }
if (hasPages()) { if (hasPages()) {
NBTTagList itemPages = new NBTTagList(BOOK_PAGES.NBT); itemData.set(BOOK_PAGES.NBT, createStringList(pages, BOOK_PAGES));
for (int i = 1; i < pages.size() + 1; i++) {
itemPages.add(new NBTTagString(String.valueOf(i), pages.get(i - 1)));
}
itemData.set(BOOK_PAGES.NBT, itemPages);
} }
} }

Datei anzeigen

@ -307,11 +307,7 @@ class CraftMetaItem implements ItemMeta, Repairable {
} }
if (hasLore()) { if (hasLore()) {
NBTTagList list = new NBTTagList(LORE.NBT); setDisplayTag(itemTag, LORE.NBT, createStringList(lore, LORE));
for (int i = 0; i < lore.size(); i++) {
list.add(new NBTTagString(String.valueOf(i), lore.get(i)));
}
setDisplayTag(itemTag, LORE.NBT, list);
} }
applyEnchantments(enchantments, itemTag, ENCHANTMENTS); applyEnchantments(enchantments, itemTag, ENCHANTMENTS);
@ -321,6 +317,19 @@ class CraftMetaItem implements ItemMeta, Repairable {
} }
} }
static NBTTagList createStringList(List<String> list, ItemMetaKey key) {
if (list == null || list.isEmpty()) {
return null;
}
NBTTagList tagList = new NBTTagList(key.NBT);
for (int i = 0; i < list.size(); i++) {
tagList.add(new NBTTagString("", list.get(i)));
}
return tagList;
}
static void applyEnchantments(Map<Enchantment, Integer> enchantments, NBTTagCompound tag, ItemMetaKey key) { static void applyEnchantments(Map<Enchantment, Integer> enchantments, NBTTagCompound tag, ItemMetaKey key) {
if (enchantments == null || enchantments.size() == 0) { if (enchantments == null || enchantments.size() == 0) {
return; return;