aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0170-Ability-to-apply-mending-to-XP-API.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0170-Ability-to-apply-mending-to-XP-API.patch')
-rw-r--r--patches/server/0170-Ability-to-apply-mending-to-XP-API.patch54
1 files changed, 54 insertions, 0 deletions
diff --git a/patches/server/0170-Ability-to-apply-mending-to-XP-API.patch b/patches/server/0170-Ability-to-apply-mending-to-XP-API.patch
new file mode 100644
index 0000000000..4adad63f75
--- /dev/null
+++ b/patches/server/0170-Ability-to-apply-mending-to-XP-API.patch
@@ -0,0 +1,54 @@
+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.
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index dd86f2055af67f35a5d265b78e99b12e7b7926ad..9f959cbb6e8685dacccec1d8df68d4a8a94ab81e 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -1444,7 +1444,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);
++ final net.minecraft.world.item.ItemStack itemstack = stackEntry != null ? stackEntry.getValue() : net.minecraft.world.item.ItemStack.EMPTY;
++ if (!itemstack.isEmpty() && itemstack.getItem().canBeDepleted()) {
++ 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, i);
++ i = event.getRepairAmount();
++ orb.discard();
++ 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);
+ }
+