mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-27 09:42:05 +01:00
#639: Deep clone itemmetas persistent container on clone
After this commit, spigot now creates a deep copy of the itemmeta's persistent data container when the itemmeta instance is cloned. This change fixes the bug that, after cloning itemmeta, the container instance the cloned meta would point to was equal to the original one. This resulted in two itemmeta instances sharing a single persistent container.
This commit is contained in:
parent
3d61a853e3
commit
6b00b14539
2 changed files with 18 additions and 1 deletions
|
@ -279,7 +279,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
||||||
|
|
||||||
private NBTTagCompound internalTag;
|
private NBTTagCompound internalTag;
|
||||||
private final Map<String, NBTBase> unhandledTags = new HashMap<String, NBTBase>();
|
private final Map<String, NBTBase> unhandledTags = new HashMap<String, NBTBase>();
|
||||||
private final CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(DATA_TYPE_REGISTRY);
|
private CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(DATA_TYPE_REGISTRY);
|
||||||
|
|
||||||
private int version = CraftMagicNumbers.INSTANCE.getDataVersion(); // Internal use only
|
private int version = CraftMagicNumbers.INSTANCE.getDataVersion(); // Internal use only
|
||||||
|
|
||||||
|
@ -1197,6 +1197,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
||||||
if (this.hasAttributeModifiers()) {
|
if (this.hasAttributeModifiers()) {
|
||||||
clone.attributeModifiers = LinkedHashMultimap.create(this.attributeModifiers);
|
clone.attributeModifiers = LinkedHashMultimap.create(this.attributeModifiers);
|
||||||
}
|
}
|
||||||
|
clone.persistentDataContainer = new CraftPersistentDataContainer(this.persistentDataContainer.getRaw(), DATA_TYPE_REGISTRY);
|
||||||
clone.hideFlag = this.hideFlag;
|
clone.hideFlag = this.hideFlag;
|
||||||
clone.unbreakable = this.unbreakable;
|
clone.unbreakable = this.unbreakable;
|
||||||
clone.damage = this.damage;
|
clone.damage = this.damage;
|
||||||
|
|
|
@ -310,4 +310,20 @@ public class PersistentDataContainerTest extends AbstractTestingBase {
|
||||||
return primitive;
|
return primitive;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testItemMetaClone() {
|
||||||
|
ItemMeta itemMeta = createNewItemMeta();
|
||||||
|
PersistentDataContainer container = itemMeta.getPersistentDataContainer();
|
||||||
|
itemMeta.getPersistentDataContainer().set(VALID_KEY, PersistentDataType.STRING, "notch");
|
||||||
|
|
||||||
|
ItemMeta clonedMeta = itemMeta.clone();
|
||||||
|
PersistentDataContainer clonedContainer = clonedMeta.getPersistentDataContainer();
|
||||||
|
|
||||||
|
assertNotSame(container, clonedContainer);
|
||||||
|
assertEquals(container, clonedContainer);
|
||||||
|
|
||||||
|
clonedContainer.set(VALID_KEY, PersistentDataType.STRING, "dinnerbone");
|
||||||
|
assertNotEquals(container, clonedContainer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue