From 4c5972b83c8d32583aca2b4603d575aad16631d7 Mon Sep 17 00:00:00 2001 From: melody Date: Wed, 3 Jun 2026 20:13:39 +0800 Subject: [PATCH 1/2] Reapply Patch Optimize hasItemMeta (remove getItemMeta call) PaperMC#1279 --- .../java/org/bukkit/craftbukkit/inventory/CraftItemStack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java index 22f2a8c1ee40..7f83ef8d06c8 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java @@ -464,7 +464,7 @@ public boolean isSimilar(ItemStack stack) { @Override public boolean hasItemMeta() { - return CraftItemStack.hasItemMeta(this.handle) && !CraftItemFactory.instance().equals(this.getItemMeta(), null); + return CraftItemStack.hasItemMeta(this.handle) && (this.handle.getDamageValue() != 0 || this.handle.getComponentsPatch().size() >= (this.handle.getComponentsPatch().get(DataComponentMap.EMPTY, CraftMetaItem.DAMAGE.TYPE) != null ? 2 : 1)); // Paper - keep 1.12 CraftBukkit behavior without calling getItemMeta } static boolean hasItemMeta(net.minecraft.world.item.ItemStack item) { From e265e632818c0c7cacc05081592f7fa575b48124 Mon Sep 17 00:00:00 2001 From: melody Date: Thu, 4 Jun 2026 09:04:53 +0800 Subject: [PATCH 2/2] test additional ItemMeta damage cases --- .../craftbukkit/inventory/ItemMetaTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/paper-server/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/paper-server/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java index f375aea89cf9..8e1b265cace3 100644 --- a/paper-server/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java +++ b/paper-server/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.inventory; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.UUID; import net.minecraft.core.registries.BuiltInRegistries; @@ -176,6 +177,32 @@ public void testEntityTagMeta() { } // Paper end + private void testHasItemMeta(ItemStack stack) { + assertThat(stack.hasItemMeta(), is(false), "Should not have ItemMeta"); + + stack.setDurability((short) 0); + assertThat(stack.hasItemMeta(), is(false), "ItemStack with zero durability should not have ItemMeta"); + + stack.setDurability((short) 2); + assertThat(stack.hasItemMeta(), is(true), "ItemStack with non-zero durability should have ItemMeta"); + + stack.setLore(Collections.singletonList("Lore")); + assertThat(stack.hasItemMeta(), is(true), "ItemStack with lore and durability should have ItemMeta"); + + stack.setDurability((short) 0); + assertThat(stack.hasItemMeta(), is(true), "ItemStack with lore should have ItemMeta"); + + stack.setLore(null); + } + + @Test + public void testHasItemMeta() { + ItemStack itemStack = new ItemStack(Material.SHEARS); + + testHasItemMeta(itemStack); + testHasItemMeta(CraftItemStack.asCraftCopy(itemStack)); + } + @Test public void testEachExtraData() { final List providers = Arrays.asList(