From c66b0f99f230ac752840c1604fc886873b72467c Mon Sep 17 00:00:00 2001 From: HexedHero <6012891+HexedHero@users.noreply.github.com> Date: Mon, 18 Apr 2022 10:51:45 +0100 Subject: [PATCH] Add pre-unbreaking amount to PlayerItemDamageEvent (#7724) --- ...king-amount-to-PlayerItemDamageEvent.patch | 52 +++++++++++++++++++ ...king-amount-to-PlayerItemDamageEvent.patch | 23 ++++++++ .../papermc/paper/testplugin/TestPlugin.java | 7 +++ 3 files changed, 82 insertions(+) create mode 100644 patches/api/0378-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch create mode 100644 patches/server/0895-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch diff --git a/patches/api/0378-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch b/patches/api/0378-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch new file mode 100644 index 0000000000..5775b6f33c --- /dev/null +++ b/patches/api/0378-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch @@ -0,0 +1,52 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: HexedHero <6012891+HexedHero@users.noreply.github.com> +Date: Sun, 10 Apr 2022 06:21:19 +0100 +Subject: [PATCH] Add pre-unbreaking amount to PlayerItemDamageEvent + + +diff --git a/src/main/java/org/bukkit/event/player/PlayerItemDamageEvent.java b/src/main/java/org/bukkit/event/player/PlayerItemDamageEvent.java +index 2d049633998b3965ce0f4a6a4cea3169da0d5658..a2993c7434c9775483a1b4628f2f66454b0d666d 100644 +--- a/src/main/java/org/bukkit/event/player/PlayerItemDamageEvent.java ++++ b/src/main/java/org/bukkit/event/player/PlayerItemDamageEvent.java +@@ -15,12 +15,21 @@ public class PlayerItemDamageEvent extends PlayerEvent implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + private final ItemStack item; + private int damage; ++ private int originalDamage; // Paper - Add pre-reduction damage + private boolean cancelled = false; + ++ @Deprecated // Paper - Add pre-reduction damage + public PlayerItemDamageEvent(@NotNull Player player, @NotNull ItemStack what, int damage) { ++ // Paper start - Add pre-reduction damage ++ this(player, what, damage, damage); ++ } ++ ++ public PlayerItemDamageEvent(@NotNull Player player, @NotNull ItemStack what, int damage, int originalDamage) { + super(player); + this.item = what; + this.damage = damage; ++ this.originalDamage = originalDamage; ++ // Paper end + } + + /** +@@ -42,6 +51,19 @@ public class PlayerItemDamageEvent extends PlayerEvent implements Cancellable { + return damage; + } + ++ // Paper start - Add pre-reduction damage ++ /** ++ * Gets the amount of durability damage this item would have taken before ++ * the Unbreaking reduction. If the item has no Unbreaking level then ++ * this value will be the same as the {@link #getDamage()} value. ++ * ++ * @return pre-reduction damage amount ++ */ ++ public int getOriginalDamage() { ++ return originalDamage; ++ } ++ // Paper end ++ + public void setDamage(int damage) { + this.damage = damage; + } diff --git a/patches/server/0895-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch b/patches/server/0895-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch new file mode 100644 index 0000000000..eb5a640d95 --- /dev/null +++ b/patches/server/0895-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: HexedHero <6012891+HexedHero@users.noreply.github.com> +Date: Sun, 10 Apr 2022 06:26:32 +0100 +Subject: [PATCH] Add pre-unbreaking amount to PlayerItemDamageEvent + + +diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java +index dc4639f905fb71435daf29c61f64621a3e2cc533..6837c965592d4584cfc958a1008b98791a0fc780 100644 +--- a/src/main/java/net/minecraft/world/item/ItemStack.java ++++ b/src/main/java/net/minecraft/world/item/ItemStack.java +@@ -551,10 +551,11 @@ public final class ItemStack { + } + } + ++ int originalDamage = amount; // Paper + amount -= k; + // CraftBukkit start + if (player instanceof ServerPlayer serverPlayer) { // Paper +- PlayerItemDamageEvent event = new PlayerItemDamageEvent(serverPlayer.getBukkitEntity(), CraftItemStack.asCraftMirror(this), amount); // Paper ++ PlayerItemDamageEvent event = new PlayerItemDamageEvent(serverPlayer.getBukkitEntity(), CraftItemStack.asCraftMirror(this), amount, originalDamage); // Paper + event.getPlayer().getServer().getPluginManager().callEvent(event); + + if (amount != event.getDamage() || event.isCancelled()) { diff --git a/test-plugin/src/main/java/io/papermc/paper/testplugin/TestPlugin.java b/test-plugin/src/main/java/io/papermc/paper/testplugin/TestPlugin.java index a0c78b9d68..45279181cc 100644 --- a/test-plugin/src/main/java/io/papermc/paper/testplugin/TestPlugin.java +++ b/test-plugin/src/main/java/io/papermc/paper/testplugin/TestPlugin.java @@ -1,6 +1,8 @@ package io.papermc.paper.testplugin; +import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerItemDamageEvent; import org.bukkit.plugin.java.JavaPlugin; public final class TestPlugin extends JavaPlugin implements Listener { @@ -8,4 +10,9 @@ public final class TestPlugin extends JavaPlugin implements Listener { public void onEnable() { this.getServer().getPluginManager().registerEvents(this, this); } + + @EventHandler + public void a(PlayerItemDamageEvent event) { + System.out.println(event.getOriginalDamage() + " to " + event.getDamage()); + } }