diff options
author | Wesley Wolfe <weswolf@aol.com> | 2013-03-28 20:01:01 -0500 |
---|---|---|
committer | Wesley Wolfe <weswolf@aol.com> | 2013-03-28 20:01:01 -0500 |
commit | acd637d48b7550254956b8aa8a09f69980050b39 (patch) | |
tree | 30dd8fd06581cb589860ef86f801321277a5aafa | |
parent | 1a7e5a75ae0cebd7ba9631b7d6001beaa76fe849 (diff) | |
download | craftbukkit-acd637d48b7550254956b8aa8a09f69980050b39.tar craftbukkit-acd637d48b7550254956b8aa8a09f69980050b39.tar.gz craftbukkit-acd637d48b7550254956b8aa8a09f69980050b39.tar.lz craftbukkit-acd637d48b7550254956b8aa8a09f69980050b39.tar.xz craftbukkit-acd637d48b7550254956b8aa8a09f69980050b39.zip |
Properly copy collection references in ItemMeta.clone(). Fixes BUKKIT-3913
When cloning an item, all references are copied to the new item. For
collections, this makes internal changes become visible in both the old and
new items.
In CraftMetaItem, clone was not making copies of the appropriate collections
and has been fixed for non-null values.
In CraftMetaEnchantedBook and CraftMetaPotion, clone was using possible empty
collection references and has been changed to explicitly null-check instead.
3 files changed, 12 insertions, 5 deletions
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaEnchantedBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaEnchantedBook.java index f975e867..8d44e55e 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaEnchantedBook.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaEnchantedBook.java @@ -106,8 +106,8 @@ class CraftMetaEnchantedBook extends CraftMetaItem implements EnchantmentStorage public CraftMetaEnchantedBook clone() { CraftMetaEnchantedBook meta = (CraftMetaEnchantedBook) super.clone(); - if (hasStoredEnchants()) { - meta.enchantments = new HashMap<Enchantment, Integer>(enchantments); + if (this.enchantments != null) { + meta.enchantments = new HashMap<Enchantment, Integer>(this.enchantments); } return meta; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java index 90e7ffc3..0e0bb32e 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java @@ -490,7 +490,14 @@ class CraftMetaItem implements ItemMeta, Repairable { @Override public CraftMetaItem clone() { try { - return (CraftMetaItem) super.clone(); + CraftMetaItem clone = (CraftMetaItem) super.clone(); + if (this.lore != null) { + clone.lore = new ArrayList<String>(this.lore); + } + if (this.enchantments != null) { + clone.enchantments = new HashMap<Enchantment, Integer>(this.enchantments); + } + return clone; } catch (CloneNotSupportedException e) { throw new Error(e); } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java index ca024d0b..e7d27d20 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java @@ -117,8 +117,8 @@ class CraftMetaPotion extends CraftMetaItem implements PotionMeta { @Override public CraftMetaPotion clone() { CraftMetaPotion clone = (CraftMetaPotion) super.clone(); - if (hasCustomEffects()) { - clone.customEffects = new ArrayList<PotionEffect>(customEffects); + if (this.customEffects != null) { + clone.customEffects = new ArrayList<PotionEffect>(this.customEffects); } return clone; } |