Deep clone nbt tags in PDC

This commit is contained in:
SoSeDiK 2022-05-26 03:30:05 +03:00
parent 49778e042c
commit 4c8c367eee
2 changed files with 10 additions and 2 deletions

View file

@ -376,7 +376,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
this.maxDamage = meta.maxDamage;
this.unhandledTags.copy(meta.unhandledTags.build());
this.removedTags.addAll(meta.removedTags);
this.persistentDataContainer.putAll(meta.persistentDataContainer.getRaw());
this.persistentDataContainer.putAll(meta.persistentDataContainer.getTagsCloned()); // Paper - deep clone NBT tags
this.customTag = meta.customTag;
@ -1987,7 +1987,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
clone.customTag = this.customTag.copy();
}
clone.removedTags = Sets.newHashSet(this.removedTags);
clone.persistentDataContainer = new CraftPersistentDataContainer(this.persistentDataContainer.getRaw(), CraftMetaItem.DATA_TYPE_REGISTRY);
clone.persistentDataContainer = new CraftPersistentDataContainer(this.persistentDataContainer.getTagsCloned(), CraftMetaItem.DATA_TYPE_REGISTRY); // Paper - deep clone NBT tags
clone.hideFlag = this.hideFlag;
clone.hideTooltip = this.hideTooltip;
clone.tooltipStyle = this.tooltipStyle;

View file

@ -207,4 +207,12 @@ public class CraftPersistentDataContainer implements PersistentDataContainer {
}
}
// Paper end - byte array serialization
// Paper start - deep clone tags
public Map<String, Tag> getTagsCloned() {
final Map<String, Tag> tags = new HashMap<>();
this.customDataTags.forEach((key, tag) -> tags.put(key, tag.copy()));
return tags;
}
// Paper end - deep clone tags
}