aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/1034-Correctly-call-PlayerItemBreakEvent.patch
blob: 378457e6e40ca0332268f270ae1e0de85657198e (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
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Bjarne Koll <lynxplay101@gmail.com>
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 c133a52f96a783e81eac15621655ca1e3f6b6c25..b6a2f3e4f22f36e75a1630bd456c2f471edbb398 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