From 252c489f1520b9d7c8408714343f6e833e920330 Mon Sep 17 00:00:00 2001 From: Bjarne Koll Date: Sun, 5 May 2024 11:40:36 +0200 Subject: [PATCH] Keep components using single items in creative (#10664) The craftbukkit implementation stores the old and new data patch of an item during ItemStack#useOn(UseOnContext) to properly cancel events via comparison and change detection of the component patch. However, it uses #getComponentsPatch to fetch the new stack component patch, which always yields an empty patch set if an itemstack is considered empty by the game. As the restoration of an itemstack's count to its previous state is handled after the entire ItemStack#useOn method, items used in creative mode temporarily have a count of zero, which causes craftbukkit to consider their new component patch as EMPTY even tho said item may have data. The new patch is applied and, after useOn completes, the count is reset if the player is in creative mode, leading to lost data. This commit fixes said inconsistency by directly accessing the components of the item via components#asPatch, storing the proper component patch even for an item that temporarily has a count of zero. --- patches/server/General-ItemMeta-fixes.patch | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/patches/server/General-ItemMeta-fixes.patch b/patches/server/General-ItemMeta-fixes.patch index c953e58f68..687360564d 100644 --- a/patches/server/General-ItemMeta-fixes.patch +++ b/patches/server/General-ItemMeta-fixes.patch @@ -10,6 +10,15 @@ diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/ja index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java +@@ -0,0 +0,0 @@ public final class ItemStack implements DataComponentHolder { + } finally { + world.captureBlockStates = false; + } +- DataComponentPatch newData = this.getComponentsPatch(); ++ DataComponentPatch newData = this.components.asPatch(); // Paper - Directly access components as patch instead of getComponentsPatch as said method yields EMPTY on items with count 0 + int newCount = this.getCount(); + this.setCount(oldCount); + this.restorePatch(oldData); @@ -0,0 +0,0 @@ public final class ItemStack implements DataComponentHolder { public void setItem(Item item) { this.bukkitStack = null; // Paper