diff options
Diffstat (limited to 'patches/server/1038-Correctly-call-PlayerItemBreakEvent.patch')
-rw-r--r-- | patches/server/1038-Correctly-call-PlayerItemBreakEvent.patch | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/patches/server/1038-Correctly-call-PlayerItemBreakEvent.patch b/patches/server/1038-Correctly-call-PlayerItemBreakEvent.patch new file mode 100644 index 0000000000..6637cd6cd0 --- /dev/null +++ b/patches/server/1038-Correctly-call-PlayerItemBreakEvent.patch @@ -0,0 +1,34 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Bjarne Koll <[email protected]> +Date: Fri, 12 Jul 2024 19:09:44 +0200 +Subject: [PATCH] Correctly call PlayerItemBreakEvent + +The minecraft 1.21 update changed the invocation order in +ItemStack#hurtAndBreak, now first shrinking the itemstack to a count of +zero and then invoking the break callback. + +This leads to spigots logic no longer firing at all. This patch now +correctly executes on count of zero and temporarily bumps the count to +one before passing it to event handlers to maintain compatibility with +the event contracts. + +This fix was chosen over invoking the callback prior to shrinking the +stack to not disrupt potential new vanilla changes that might depend on +this behaviour. + +diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java +index 0f2b3c5ca88478a541bf9e61ae61cc99a7d08836..2c312c0b741fb96a008881e9e01fa660a1fb63ab 100644 +--- a/src/main/java/net/minecraft/world/item/ItemStack.java ++++ b/src/main/java/net/minecraft/world/item/ItemStack.java +@@ -731,8 +731,10 @@ public final class ItemStack implements DataComponentHolder { + + this.hurtAndBreak(amount, worldserver, entity, (item) -> { // Paper - Add EntityDamageItemEvent + // CraftBukkit start - Check for item breaking +- if (this.count == 1 && entity instanceof net.minecraft.world.entity.player.Player) { ++ if (this.count == 0 && entity instanceof net.minecraft.world.entity.player.Player) { // Paper - correctly call item break event - run if count reached 0 ++ this.setCount(1); // Paper - correctly call item break event - grow to count 1 + org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((net.minecraft.world.entity.player.Player) entity, this); ++ this.setCount(0); // Paper - correctly call item break event - reset to count 0 + } + // CraftBukkit end + if (slot != null) entity.onEquippedItemBroken(item, slot); // Paper - itemstack damage API - do not process entity related callbacks when damaging from API |