aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0962-Don-t-lose-removed-data-components-in-ItemMeta.patch
blob: 04001583fcc9e2343181a565cdcd1e885588cb36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Fri, 26 Apr 2024 21:33:20 -0700
Subject: [PATCH] Don't lose removed data components in ItemMeta


diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
index 2cf89147025066f34c12b9956d18451487fb2799..bc5adcb7638d6672cad33ef4adf73e475bc16b7d 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
@@ -198,6 +198,13 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
             return this;
         }
 
+        // Paper start - support removing component types
+        <T> Applicator remove(DataComponentType<T> type) {
+            this.builder.remove(type);
+            return this;
+        }
+        // Paper end - support removing component types
+
         DataComponentPatch build() {
             return this.builder.build();
         }
@@ -428,7 +435,11 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
 
         Set<Map.Entry<DataComponentType<?>, Optional<?>>> keys = tag.entrySet();
         for (Map.Entry<DataComponentType<?>, Optional<?>> key : keys) {
-            if (!CraftMetaItem.getHandledTags().contains(key.getKey())) {
+            // Paper start - don't lose unhandled tags
+            if (key.getValue().isEmpty()) {
+                this.unhandledTags.remove(key.getKey());
+            } else if (!CraftMetaItem.getHandledTags().contains(key.getKey())) {
+                // Paper end - don't lose unhandled tags
                 key.getValue().ifPresent((value) -> {
                     this.unhandledTags.set((DataComponentType) key.getKey(), value);
                 });
@@ -864,9 +875,9 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
         }
 
         for (Map.Entry<DataComponentType<?>, Optional<?>> e : this.unhandledTags.build().entrySet()) {
-            e.getValue().ifPresent((value) -> {
+            e.getValue().ifPresentOrElse((value) -> {
                 itemTag.builder.set((DataComponentType) e.getKey(), value);
-            });
+            }, () -> itemTag.remove(e.getKey()));
         }
 
         for (DataComponentType<?> removed : this.removedTags) {