mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-02 13:07:06 +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.
This commit is contained in:
parent
25732f0487
commit
54b2707ba7
3 changed files with 17 additions and 11 deletions
|
@ -106,7 +106,8 @@ public final class ItemStack {
|
|||
this.count = nbttagcompound.getByte("Count");
|
||||
this.damage = nbttagcompound.getShort("Damage");
|
||||
if (nbttagcompound.hasKey("tag")) {
|
||||
this.tag = nbttagcompound.getCompound("tag");
|
||||
// CraftBukkit - clear name from compound
|
||||
this.tag = (NBTTagCompound) nbttagcompound.getCompound("tag").setName("");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -91,11 +91,7 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta {
|
|||
}
|
||||
|
||||
if (hasPages()) {
|
||||
NBTTagList itemPages = new NBTTagList(BOOK_PAGES.NBT);
|
||||
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);
|
||||
itemData.set(BOOK_PAGES.NBT, createStringList(pages, BOOK_PAGES));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -307,11 +307,7 @@ class CraftMetaItem implements ItemMeta, Repairable {
|
|||
}
|
||||
|
||||
if (hasLore()) {
|
||||
NBTTagList list = new NBTTagList(LORE.NBT);
|
||||
for (int i = 0; i < lore.size(); i++) {
|
||||
list.add(new NBTTagString(String.valueOf(i), lore.get(i)));
|
||||
}
|
||||
setDisplayTag(itemTag, LORE.NBT, list);
|
||||
setDisplayTag(itemTag, LORE.NBT, createStringList(lore, LORE));
|
||||
}
|
||||
|
||||
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) {
|
||||
if (enchantments == null || enchantments.size() == 0) {
|
||||
return;
|
||||
|
|
Loading…
Reference in a new issue