From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jake Potrebic 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 9874406f42531699538ba46f261016394f1c4b04..5dd726c50b0a174dfd2715683e56cd9744c7a28e 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 + Applicator remove(DataComponentType 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, Optional>> keys = tag.entrySet(); for (Map.Entry, 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, 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) {