mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-26 20:46:59 +01:00
8cf2503804
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 19830133 PR-925: Add hit entity/block to events extending ProjectileHitEvent CraftBukkit Changes: 5a72c3c04 SPIGOT-7510: Try to fix broken reflection usage of plugins 6fa69f235 PR-1281: Add hit entity/block to events extending ProjectileHitEvent 224f733ac Fix NPE introduced in #f4d977e
70 lines
4.9 KiB
Diff
70 lines
4.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Thu, 20 Jan 2022 18:11:20 -0800
|
|
Subject: [PATCH] Expand PlayerItemMendEvent
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
|
|
index 37cd883f4920d5e1e58900ebdcfd4495a0abd2ae..6dac7cd4c9abfbde299f5d279acc2739195fc312 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
|
|
@@ -337,7 +337,7 @@ public class ExperienceOrb extends Entity {
|
|
ItemStack itemstack = (ItemStack) entry.getValue();
|
|
int j = Math.min(this.xpToDurability(this.value), itemstack.getDamageValue());
|
|
// CraftBukkit start
|
|
- org.bukkit.event.player.PlayerItemMendEvent event = CraftEventFactory.callPlayerItemMendEvent(player, this, itemstack, entry.getKey(), j);
|
|
+ org.bukkit.event.player.PlayerItemMendEvent event = CraftEventFactory.callPlayerItemMendEvent(player, this, itemstack, entry.getKey(), j, this::durabilityToXp); // Paper
|
|
j = event.getRepairAmount();
|
|
if (event.isCancelled()) {
|
|
return amount;
|
|
@@ -345,8 +345,13 @@ public class ExperienceOrb extends Entity {
|
|
// CraftBukkit end
|
|
|
|
itemstack.setDamageValue(itemstack.getDamageValue() - j);
|
|
- int k = amount - this.durabilityToXp(j);
|
|
+ int k = amount - event.getDurabilityToXpOperation().applyAsInt(j); // Paper
|
|
this.value = k; // CraftBukkit - update exp value of orb for PlayerItemMendEvent calls
|
|
+ // Paper start
|
|
+ if (j == 0 && amount == k) { // if repair amount is 0 and no xp was removed, don't do recursion; treat as cancelled
|
|
+ return k;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
return k > 0 ? this.repairPlayerItems(player, k) : 0;
|
|
} else {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index 42c6288d26dc866dae19031aa3310d88274a6fbf..2981475368094b7749cfec2e5a99ec0947248eee 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -1737,11 +1737,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
orb.setPosRaw(handle.getX(), handle.getY(), handle.getZ());
|
|
|
|
int i = Math.min(orb.xpToDurability(amount), itemstack.getDamageValue());
|
|
- org.bukkit.event.player.PlayerItemMendEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemMendEvent(handle, orb, itemstack, stackEntry.getKey(), i);
|
|
+ org.bukkit.event.player.PlayerItemMendEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemMendEvent(handle, orb, itemstack, stackEntry.getKey(), i, orb::durabilityToXp); // Paper
|
|
i = event.getRepairAmount();
|
|
orb.discard();
|
|
if (!event.isCancelled()) {
|
|
- amount -= orb.durabilityToXp(i);
|
|
+ amount -= event.getDurabilityToXpOperation().applyAsInt(i); // Paper
|
|
itemstack.setDamageValue(itemstack.getDamageValue() - i);
|
|
}
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
index 7c0fec2df265bc72cb5e2f8f400c6ad4c128705e..c562a0a970c83df3bfd4d600bb0ee97878b1649c 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
@@ -1322,10 +1322,10 @@ public class CraftEventFactory {
|
|
return event;
|
|
}
|
|
|
|
- public static PlayerItemMendEvent callPlayerItemMendEvent(net.minecraft.world.entity.player.Player entity, net.minecraft.world.entity.ExperienceOrb orb, net.minecraft.world.item.ItemStack nmsMendedItem, net.minecraft.world.entity.EquipmentSlot slot, int repairAmount) {
|
|
+ public static PlayerItemMendEvent callPlayerItemMendEvent(net.minecraft.world.entity.player.Player entity, net.minecraft.world.entity.ExperienceOrb orb, net.minecraft.world.item.ItemStack nmsMendedItem, net.minecraft.world.entity.EquipmentSlot slot, int repairAmount, java.util.function.IntUnaryOperator durabilityToXpOp) { // Paper
|
|
Player player = (Player) entity.getBukkitEntity();
|
|
org.bukkit.inventory.ItemStack bukkitStack = CraftItemStack.asCraftMirror(nmsMendedItem);
|
|
- PlayerItemMendEvent event = new PlayerItemMendEvent(player, bukkitStack, CraftEquipmentSlot.getSlot(slot), (ExperienceOrb) orb.getBukkitEntity(), repairAmount);
|
|
+ PlayerItemMendEvent event = new PlayerItemMendEvent(player, bukkitStack, CraftEquipmentSlot.getSlot(slot), (ExperienceOrb) orb.getBukkitEntity(), repairAmount, durabilityToXpOp); // Paper
|
|
Bukkit.getPluginManager().callEvent(event);
|
|
return event;
|
|
}
|