diff options
author | Thinkofdeath <thinkofdeath@spigotmc.org> | 2014-12-15 15:44:57 +0000 |
---|---|---|
committer | Thinkofdeath <thinkofdeath@spigotmc.org> | 2014-12-15 15:44:57 +0000 |
commit | 6b061e25815c76ca4d736826d2b1b89231f43948 (patch) | |
tree | fd9fd8d6bd90dcef339a743983aa11dc68d47713 | |
parent | e1070b9fbb5c50356338d9929bc318c3da8c57f2 (diff) | |
download | craftbukkit-6b061e25815c76ca4d736826d2b1b89231f43948.tar craftbukkit-6b061e25815c76ca4d736826d2b1b89231f43948.tar.gz craftbukkit-6b061e25815c76ca4d736826d2b1b89231f43948.tar.lz craftbukkit-6b061e25815c76ca4d736826d2b1b89231f43948.tar.xz craftbukkit-6b061e25815c76ca4d736826d2b1b89231f43948.zip |
SPIGOT-152, SPIGOT-197: Add a system to handle new tags before an api is ready for them
-rw-r--r-- | src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java index 78a0ab49..7ebb70bf 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java @@ -35,6 +35,9 @@ import org.bukkit.inventory.meta.Repairable; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Sets; +import java.util.Arrays; +import java.util.Set; /** * Children must include the following: @@ -205,6 +208,10 @@ class CraftMetaItem implements ItemMeta, Repairable { private int repairCost; private final NBTTagList attributes; + private static final Set<String> HANDLED_TAGS = Sets.newHashSet(); + + private final Map<String, NBTBase> unhandledTags = new HashMap<String, NBTBase>(); + CraftMetaItem(CraftMetaItem meta) { if (meta == null) { attributes = null; @@ -223,6 +230,7 @@ class CraftMetaItem implements ItemMeta, Repairable { this.repairCost = meta.repairCost; this.attributes = meta.attributes; + this.unhandledTags.putAll(meta.unhandledTags); } CraftMetaItem(NBTTagCompound tag) { @@ -298,6 +306,13 @@ class CraftMetaItem implements ItemMeta, Repairable { } else { attributes = null; } + + Set<String> keys = tag.c(); + for (String key : keys) { + if (!getHandledTags().contains(key)) { + unhandledTags.put(key, tag.get(key)); + } + } } static Map<Enchantment, Integer> buildEnchantments(NBTTagCompound tag, ItemMetaKey key) { @@ -373,6 +388,10 @@ class CraftMetaItem implements ItemMeta, Repairable { if (attributes != null) { itemTag.set(ATTRIBUTES.NBT, attributes); } + + for (Map.Entry<String, NBTBase> e : unhandledTags.entrySet()) { + itemTag.set(e.getKey(), e.getValue()); + } } static NBTTagList createStringList(List<String> list) { @@ -424,7 +443,7 @@ class CraftMetaItem implements ItemMeta, Repairable { @Overridden boolean isEmpty() { - return !(hasDisplayName() || hasEnchants() || hasLore() || hasAttributes() || hasRepairCost()); + return !(hasDisplayName() || hasEnchants() || hasLore() || hasAttributes() || hasRepairCost() || !unhandledTags.isEmpty()); } public String getDisplayName() { @@ -541,7 +560,8 @@ class CraftMetaItem implements ItemMeta, Repairable { && (this.hasEnchants() ? that.hasEnchants() && this.enchantments.equals(that.enchantments) : !that.hasEnchants()) && (this.hasLore() ? that.hasLore() && this.lore.equals(that.lore) : !that.hasLore()) && (this.hasAttributes() ? that.hasAttributes() && this.attributes.equals(that.attributes) : !that.hasAttributes()) - && (this.hasRepairCost() ? that.hasRepairCost() && this.repairCost == that.repairCost : !that.hasRepairCost()); + && (this.hasRepairCost() ? that.hasRepairCost() && this.repairCost == that.repairCost : !that.hasRepairCost()) + && (this.unhandledTags.equals(that.unhandledTags)); } /** @@ -567,6 +587,7 @@ class CraftMetaItem implements ItemMeta, Repairable { hash = 61 * hash + (hasEnchants() ? this.enchantments.hashCode() : 0); hash = 61 * hash + (hasAttributes() ? this.attributes.hashCode() : 0); hash = 61 * hash + (hasRepairCost() ? this.repairCost : 0); + hash = 61 * hash + unhandledTags.hashCode(); return hash; } @@ -668,4 +689,28 @@ class CraftMetaItem implements ItemMeta, Repairable { public final String toString() { return SerializableMeta.classMap.get(getClass()) + "_META:" + serialize(); // TODO: cry } + + public static Set<String> getHandledTags() { + if (HANDLED_TAGS.isEmpty()) { + HANDLED_TAGS.addAll(Arrays.asList( + DISPLAY.NBT, + REPAIR.NBT, + ATTRIBUTES.NBT, + ENCHANTMENTS.NBT, + CraftMetaMap.MAP_SCALING.NBT, + CraftMetaPotion.POTION_EFFECTS.NBT, + CraftMetaSkull.SKULL_OWNER.NBT, + CraftMetaTileEntity.BLOCK_ENTITY_TAG.NBT, + CraftMetaBook.BOOK_TITLE.NBT, + CraftMetaBook.BOOK_AUTHOR.NBT, + CraftMetaBook.BOOK_PAGES.NBT, + CraftMetaBook.RESOLVED.NBT, + CraftMetaBook.GENERATION.NBT, + CraftMetaFirework.FIREWORKS.NBT, + CraftMetaEnchantedBook.STORED_ENCHANTMENTS.NBT, + CraftMetaCharge.EXPLOSION.NBT + )); + } + return HANDLED_TAGS; + } } |