aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0574-Add-EntityDamageItemEvent.patch
blob: fc8649b86d927afb76781d9d4c1fa10dc27c047b (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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Tue, 22 Dec 2020 13:52:48 -0800
Subject: [PATCH] Add EntityDamageItemEvent


diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
index d1eac70fbfe2d863d3a342ed0e83223c65c36c03..a98d76c90cd855e723e7a8d810eee88a882d8b5c 100644
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
@@ -646,14 +646,14 @@ public final class ItemStack implements DataComponentHolder {
         return (Integer) this.getOrDefault(DataComponents.MAX_DAMAGE, 0);
     }
 
-    public void hurtAndBreak(int amount, ServerLevel world, @Nullable ServerPlayer player, Consumer<Item> breakCallback) {
+    public void hurtAndBreak(int amount, ServerLevel world, @Nullable LivingEntity player, Consumer<Item> breakCallback) { // Paper - Add EntityDamageItemEvent
         if (this.isDamageableItem()) {
             if (player == null || !player.hasInfiniteMaterials()) {
                 if (amount > 0) {
                     amount = EnchantmentHelper.processDurabilityChange(world, this, amount);
                     // CraftBukkit start
-                    if (player != null) {
-                        PlayerItemDamageEvent event = new PlayerItemDamageEvent(player.getBukkitEntity(), CraftItemStack.asCraftMirror(this), amount);
+                    if (player instanceof ServerPlayer serverPlayer) { // Paper - Add EntityDamageItemEvent
+                        PlayerItemDamageEvent event = new PlayerItemDamageEvent(serverPlayer.getBukkitEntity(), CraftItemStack.asCraftMirror(this), amount); // Paper - Add EntityDamageItemEvent
                         event.getPlayer().getServer().getPluginManager().callEvent(event);
 
                         if (amount != event.getDamage() || event.isCancelled()) {
@@ -664,6 +664,14 @@ public final class ItemStack implements DataComponentHolder {
                         }
 
                         amount = event.getDamage();
+                        // Paper start - Add EntityDamageItemEvent
+                    } else if (player != null) {
+                        io.papermc.paper.event.entity.EntityDamageItemEvent event = new io.papermc.paper.event.entity.EntityDamageItemEvent(player.getBukkitLivingEntity(), CraftItemStack.asCraftMirror(this), amount);
+                        if (!event.callEvent()) {
+                            return;
+                        }
+                        amount = event.getDamage();
+                        // Paper end - Add EntityDamageItemEvent
                     }
                     // CraftBukkit end
                     if (amount <= 0) {
@@ -671,8 +679,8 @@ public final class ItemStack implements DataComponentHolder {
                     }
                 }
 
-                if (player != null && amount != 0) {
-                    CriteriaTriggers.ITEM_DURABILITY_CHANGED.trigger(player, this, this.getDamageValue() + amount);
+                if (player instanceof ServerPlayer serverPlayer && amount != 0) { // Paper - Add EntityDamageItemEvent
+                    CriteriaTriggers.ITEM_DURABILITY_CHANGED.trigger(serverPlayer, this, this.getDamageValue() + amount); // Paper - Add EntityDamageItemEvent
                 }
 
                 int j = this.getDamageValue() + amount;
@@ -681,8 +689,8 @@ public final class ItemStack implements DataComponentHolder {
                 if (j >= this.getMaxDamage()) {
                     Item item = this.getItem();
                     // CraftBukkit start - Check for item breaking
-                    if (this.count == 1 && player != null) {
-                        org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent(player, this);
+                    if (this.count == 1 && player != null && player instanceof final ServerPlayer serverPlayer) { // Paper - Add EntityDamageItemEvent
+                        org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent(serverPlayer, this); // Paper - Add EntityDamageItemEvent
                     }
                     // CraftBukkit end
 
@@ -706,7 +714,7 @@ public final class ItemStack implements DataComponentHolder {
                 entityplayer = null;
             }
 
-            this.hurtAndBreak(amount, worldserver, entityplayer, (item) -> {
+            this.hurtAndBreak(amount, worldserver, entity, (item) -> { // Paper - Add EntityDamageItemEvent
                 entity.onEquippedItemBroken(item, slot);
             });
         }
diff --git a/src/main/java/net/minecraft/world/item/enchantment/effects/DamageItem.java b/src/main/java/net/minecraft/world/item/enchantment/effects/DamageItem.java
index 70796eef426eece0bc93a173f54e90645377b502..82ac989ca836e3beef7c3773db0183a7e51780e0 100644
--- a/src/main/java/net/minecraft/world/item/enchantment/effects/DamageItem.java
+++ b/src/main/java/net/minecraft/world/item/enchantment/effects/DamageItem.java
@@ -16,8 +16,8 @@ public record DamageItem(LevelBasedValue amount) implements EnchantmentEntityEff
 
     @Override
     public void apply(ServerLevel world, int level, EnchantedItemInUse context, Entity user, Vec3 pos) {
-        ServerPlayer serverPlayer2 = context.owner() instanceof ServerPlayer serverPlayer ? serverPlayer : null;
-        context.itemStack().hurtAndBreak((int)this.amount.calculate(level), world, serverPlayer2, context.onBreak());
+        // ServerPlayer serverPlayer2 = context.owner() instanceof ServerPlayer serverPlayer ? serverPlayer : null; // Paper - always pass in entity
+        context.itemStack().hurtAndBreak((int)this.amount.calculate(level), world, context.owner(), context.onBreak()); // Paper - always pass in entity
     }
 
     @Override