diff options
-rw-r--r-- | src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java | 81 |
1 files changed, 77 insertions, 4 deletions
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java index 4681262a..28871ab3 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java @@ -29,6 +29,7 @@ import org.bukkit.configuration.serialization.SerializableAs; import org.bukkit.craftbukkit.Overridden; import org.bukkit.craftbukkit.inventory.CraftMetaItem.ItemMetaKey.Specific; import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.Repairable; @@ -37,6 +38,8 @@ 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.EnumSet; +import java.util.HashSet; import java.util.Set; /** @@ -201,11 +204,14 @@ class CraftMetaItem implements ItemMeta, Repairable { static final ItemMetaKey ATTRIBUTES_UUID_HIGH = new ItemMetaKey("UUIDMost"); @Specific(Specific.To.NBT) static final ItemMetaKey ATTRIBUTES_UUID_LOW = new ItemMetaKey("UUIDLeast"); + @Specific(Specific.To.NBT) + static final ItemMetaKey HIDEFLAGS = new ItemMetaKey("ItemFlags", "hideFlags"); private String displayName; private List<String> lore; private Map<Enchantment, Integer> enchantments; private int repairCost; + private int hideFlag; private final NBTTagList attributes; private static final Set<String> HANDLED_TAGS = Sets.newHashSet(); @@ -230,6 +236,7 @@ class CraftMetaItem implements ItemMeta, Repairable { this.repairCost = meta.repairCost; this.attributes = meta.attributes; + this.hideFlag = meta.hideFlag; this.unhandledTags.putAll(meta.unhandledTags); } @@ -258,6 +265,9 @@ class CraftMetaItem implements ItemMeta, Repairable { repairCost = tag.getInt(REPAIR.NBT); } + if (tag.hasKey(HIDEFLAGS.NBT)) { + hideFlag = tag.getInt(HIDEFLAGS.NBT); + } if (tag.get(ATTRIBUTES.NBT) instanceof NBTTagList) { NBTTagList save = null; @@ -349,6 +359,19 @@ class CraftMetaItem implements ItemMeta, Repairable { } attributes = null; + + Set hideFlags = SerializableMeta.getObject(Set.class, map, HIDEFLAGS.BUKKIT, true); + if (hideFlags != null) { + for (Object hideFlagObject : hideFlags) { + String hideFlagString = (String) hideFlagObject; + try { + ItemFlag hideFlatEnum = ItemFlag.valueOf(hideFlagString); + addItemFlags(hideFlatEnum); + } catch (IllegalArgumentException ex) { + // Ignore when we got a old String which does not map to a Enum value anymore + } + } + } } static Map<Enchantment, Integer> buildEnchantments(Map<String, Object> map, ItemMetaKey key) { @@ -379,6 +402,10 @@ class CraftMetaItem implements ItemMeta, Repairable { setDisplayTag(itemTag, LORE.NBT, createStringList(lore)); } + if (hideFlag != 0) { + itemTag.setInt(HIDEFLAGS.NBT, hideFlag); + } + applyEnchantments(enchantments, itemTag, ENCHANTMENTS); if (hasRepairCost()) { @@ -443,7 +470,7 @@ class CraftMetaItem implements ItemMeta, Repairable { @Overridden boolean isEmpty() { - return !(hasDisplayName() || hasEnchants() || hasLore() || hasAttributes() || hasRepairCost() || !unhandledTags.isEmpty()); + return !(hasDisplayName() || hasEnchants() || hasLore() || hasAttributes() || hasRepairCost() || !unhandledTags.isEmpty() || hideFlag != 0); } public String getDisplayName() { @@ -510,6 +537,43 @@ class CraftMetaItem implements ItemMeta, Repairable { return checkConflictingEnchants(enchantments, ench); } + @Override + public void addItemFlags(ItemFlag... hideFlags) { + for (ItemFlag f : hideFlags) { + this.hideFlag |= getBitModifier(f); + } + } + + @Override + public void removeItemFlags(ItemFlag... hideFlags) { + for (ItemFlag f : hideFlags) { + this.hideFlag &= ~getBitModifier(f); + } + } + + @Override + public Set<ItemFlag> getItemFlags() { + Set<ItemFlag> currentFlags = EnumSet.noneOf(ItemFlag.class); + + for (ItemFlag f : ItemFlag.values()) { + if (hasItemFlag(f)) { + currentFlags.add(f); + } + } + + return currentFlags; + } + + @Override + public boolean hasItemFlag(ItemFlag flag) { + int bitModifier = getBitModifier(flag); + return (this.hideFlag & bitModifier) == bitModifier; + } + + private byte getBitModifier(ItemFlag hideFlag) { + return (byte) (1 << hideFlag.ordinal()); + } + public List<String> getLore() { return this.lore == null ? null : new ArrayList<String>(this.lore); } @@ -561,7 +625,7 @@ class CraftMetaItem implements ItemMeta, Repairable { && (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.unhandledTags.equals(that.unhandledTags)); + && (this.hideFlag == that.hideFlag); } /** @@ -587,7 +651,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(); + hash = 61 * hash + hideFlag; return hash; } @@ -602,6 +666,7 @@ class CraftMetaItem implements ItemMeta, Repairable { if (this.enchantments != null) { clone.enchantments = new HashMap<Enchantment, Integer>(this.enchantments); } + clone.hideFlag = this.hideFlag; return clone; } catch (CloneNotSupportedException e) { throw new Error(e); @@ -631,6 +696,14 @@ class CraftMetaItem implements ItemMeta, Repairable { builder.put(REPAIR.BUKKIT, repairCost); } + Set<String> hideFlags = new HashSet<String>(); + for (ItemFlag hideFlagEnum : getItemFlags()) { + hideFlags.add(hideFlagEnum.name()); + } + if (!hideFlags.isEmpty()) { + builder.put(HIDEFLAGS.BUKKIT, hideFlags); + } + return builder; } @@ -711,7 +784,7 @@ class CraftMetaItem implements ItemMeta, Repairable { CraftMetaEnchantedBook.STORED_ENCHANTMENTS.NBT, CraftMetaCharge.EXPLOSION.NBT )); - } +} return HANDLED_TAGS; } } |