aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0165-Ability-to-apply-mending-to-XP-API.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0165-Ability-to-apply-mending-to-XP-API.patch')
-rw-r--r--patches/server/0165-Ability-to-apply-mending-to-XP-API.patch58
1 files changed, 58 insertions, 0 deletions
diff --git a/patches/server/0165-Ability-to-apply-mending-to-XP-API.patch b/patches/server/0165-Ability-to-apply-mending-to-XP-API.patch
new file mode 100644
index 0000000000..46d2cc7b09
--- /dev/null
+++ b/patches/server/0165-Ability-to-apply-mending-to-XP-API.patch
@@ -0,0 +1,58 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+Date: Wed, 20 Dec 2017 17:36:49 -0500
+Subject: [PATCH] Ability to apply mending to XP API
+
+This allows plugins that give players the ability to apply the experience
+points to the Item Mending formula, which will repair an item instead
+of giving the player experience points.
+
+Both an API To standalone mend, and apply mending logic to .giveExp has been added.
+
+== AT ==
+public net.minecraft.world.entity.ExperienceOrb durabilityToXp(I)I
+public net.minecraft.world.entity.ExperienceOrb xpToDurability(I)I
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index 7635c501d71273ef85e6500ff15434c6b89c9e3c..2928c835d2f99ea82db2bb06761cd273e1427caf 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -1624,7 +1624,37 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ }
+
+ @Override
+- public void giveExp(int exp) {
++ // Paper start
++ public int applyMending(int amount) {
++ ServerPlayer handle = this.getHandle();
++ // Logic copied from EntityExperienceOrb and remapped to unobfuscated methods/properties
++ final var stackEntry = net.minecraft.world.item.enchantment.EnchantmentHelper
++ .getRandomItemWith(net.minecraft.world.item.enchantment.Enchantments.MENDING, handle, net.minecraft.world.item.ItemStack::isDamaged);
++ final net.minecraft.world.item.ItemStack itemstack = stackEntry != null ? stackEntry.getValue() : net.minecraft.world.item.ItemStack.EMPTY;
++ if (!itemstack.isEmpty() && itemstack.getItem().components().has(net.minecraft.core.component.DataComponents.MAX_DAMAGE)) {
++ net.minecraft.world.entity.ExperienceOrb orb = net.minecraft.world.entity.EntityType.EXPERIENCE_ORB.create(handle.level());
++ orb.value = amount;
++ orb.spawnReason = org.bukkit.entity.ExperienceOrb.SpawnReason.CUSTOM;
++ 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);
++ i = event.getRepairAmount();
++ orb.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN);
++ if (!event.isCancelled()) {
++ amount -= orb.durabilityToXp(i);
++ itemstack.setDamageValue(itemstack.getDamageValue() - i);
++ }
++ }
++ return amount;
++ }
++
++ @Override
++ public void giveExp(int exp, boolean applyMending) {
++ if (applyMending) {
++ exp = this.applyMending(exp);
++ }
++ // Paper end
+ this.getHandle().giveExperiencePoints(exp);
+ }
+