mirror of
https://github.com/PaperMC/Paper.git
synced 2024-09-18 18:01:10 +02:00
63 lines
3.8 KiB
Diff
63 lines
3.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: SoSeDiK <mrsosedik@gmail.com>
|
|
Date: Thu, 26 May 2022 03:30:05 +0300
|
|
Subject: [PATCH] Deep clone unhandled nbt tags
|
|
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
|
index 039197efb05432b8139fbabe92338572c1bf078e..8762a7a22723150a1a42b3459f3744b8235da142 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
|
@@ -305,7 +305,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
|
private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry();
|
|
|
|
private CompoundTag internalTag;
|
|
- final Map<String, Tag> unhandledTags = new TreeMap<String, Tag>(); // Visible for testing only // Paper
|
|
+ Map<String, Tag> unhandledTags = new TreeMap<String, Tag>(); // Visible for testing only // Paper // Paper - remove final
|
|
private CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(CraftMetaItem.DATA_TYPE_REGISTRY);
|
|
|
|
private int version = CraftMagicNumbers.INSTANCE.getDataVersion(); // Internal use only
|
|
@@ -346,8 +346,10 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
|
this.destroyableKeys = new java.util.HashSet<>(meta.destroyableKeys);
|
|
}
|
|
// Paper end
|
|
- this.unhandledTags.putAll(meta.unhandledTags);
|
|
- this.persistentDataContainer.putAll(meta.persistentDataContainer.getRaw());
|
|
+ // Paper start - Deep clone unhandled nbt tags
|
|
+ meta.unhandledTags.forEach((key, tag) -> this.unhandledTags.put(key, tag.copy()));
|
|
+ this.persistentDataContainer.putAll(meta.persistentDataContainer.getTagsCloned());
|
|
+ // Paper end
|
|
|
|
this.internalTag = meta.internalTag;
|
|
if (this.internalTag != null) {
|
|
@@ -1395,7 +1397,11 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
|
if (this.hasAttributeModifiers()) {
|
|
clone.attributeModifiers = LinkedHashMultimap.create(this.attributeModifiers);
|
|
}
|
|
- clone.persistentDataContainer = new CraftPersistentDataContainer(this.persistentDataContainer.getRaw(), CraftMetaItem.DATA_TYPE_REGISTRY);
|
|
+ // Paper start - Deep clone unhandled nbt tags
|
|
+ clone.persistentDataContainer = new CraftPersistentDataContainer(this.persistentDataContainer.getTagsCloned(), CraftMetaItem.DATA_TYPE_REGISTRY);
|
|
+ clone.unhandledTags = new TreeMap<>(this.unhandledTags);
|
|
+ clone.unhandledTags.replaceAll((key, tag) -> tag.copy());
|
|
+ // Paper end - Deep clone unhandled nbt tags
|
|
clone.hideFlag = this.hideFlag;
|
|
clone.unbreakable = this.unbreakable;
|
|
clone.damage = this.damage;
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java b/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java
|
|
index 416d2ca909d30e267fb97082a0aaac90444510de..9d61756689d1f5a71bcdb3ae4859cb0a60e7d850 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java
|
|
@@ -203,4 +203,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
|
|
}
|