mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-24 09:16:06 +01:00
0708fa363b
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing CraftBukkit Changes:eb2e6578
SPIGOT-5116: Fix concurrent modification exception inside ChunkMapDistance989f9b3d
SPIGOT-4849: Fix server crash when accessing chunks during chunk load/unload/populate eventsf554183c
SPIGOT-5171: Don't fire PlayerTeleportEvent if not actually moving2349feb8
SPIGOT-5163: Cancelling PlayerBucketFillEvent visually removes the targeted block Spigot Changes: 9a643a6a Remove DataWatcher Locking
92 lines
4.1 KiB
Diff
92 lines
4.1 KiB
Diff
From c5579073dc8e3321aac94fdfa3adcf55b32eb834 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
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/net/minecraft/server/EnchantmentManager.java b/src/main/java/net/minecraft/server/EnchantmentManager.java
|
|
index 8c658079f..16e6d95cf 100644
|
|
--- a/src/main/java/net/minecraft/server/EnchantmentManager.java
|
|
+++ b/src/main/java/net/minecraft/server/EnchantmentManager.java
|
|
@@ -241,6 +241,11 @@ public class EnchantmentManager {
|
|
return getEnchantmentLevel(Enchantments.CHANNELING, itemstack) > 0;
|
|
}
|
|
|
|
+ // Paper - OBFHELPER
|
|
+ public static @Nullable ItemStack getRandomEquippedItemWithEnchant(Enchantment enchantment, EntityLiving entityliving) {
|
|
+ Entry<EnumItemSlot, ItemStack> entry = b(enchantment, entityliving);
|
|
+ return entry != null ? entry.getValue() : null;
|
|
+ }
|
|
@Nullable
|
|
public static Entry<EnumItemSlot, ItemStack> b(Enchantment enchantment, EntityLiving entityliving) {
|
|
Map<EnumItemSlot, ItemStack> map = enchantment.a(entityliving);
|
|
diff --git a/src/main/java/net/minecraft/server/EntityExperienceOrb.java b/src/main/java/net/minecraft/server/EntityExperienceOrb.java
|
|
index 8c2569566..6a5954889 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityExperienceOrb.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityExperienceOrb.java
|
|
@@ -251,10 +251,12 @@ public class EntityExperienceOrb extends Entity {
|
|
}
|
|
}
|
|
|
|
+ public int durToXp(int i) { return b(i); } // Paper OBFHELPER
|
|
private int b(int i) {
|
|
return i / 2;
|
|
}
|
|
|
|
+ public int xpToDur(int i) { return c(i); } // Paper OBFHELPER
|
|
private int c(int i) {
|
|
return i * 2;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index 9d2a8a2da..d8ce699e3 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -1063,8 +1063,39 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
return GameMode.getByValue(getHandle().playerInteractManager.getGameMode().getId());
|
|
}
|
|
|
|
+ // Paper start
|
|
@Override
|
|
- public void giveExp(int exp) {
|
|
+ public int applyMending(int amount) {
|
|
+ EntityPlayer handle = getHandle();
|
|
+ // Logic copied from EntityExperienceOrb and remapped to unobfuscated methods/properties
|
|
+ net.minecraft.server.ItemStack itemstack = net.minecraft.server.EnchantmentManager.getRandomEquippedItemWithEnchant(net.minecraft.server.Enchantments.MENDING, handle);
|
|
+ if (!itemstack.isEmpty() && itemstack.getItem().usesDurability()) {
|
|
+
|
|
+ net.minecraft.server.EntityExperienceOrb orb = net.minecraft.server.EntityTypes.EXPERIENCE_ORB.create(handle.world);
|
|
+ orb.value = amount;
|
|
+ orb.spawnReason = org.bukkit.entity.ExperienceOrb.SpawnReason.CUSTOM;
|
|
+ orb.locX = handle.locX;
|
|
+ orb.locY = handle.locY;
|
|
+ orb.locZ = handle.locZ;
|
|
+
|
|
+ int i = Math.min(orb.xpToDur(amount), itemstack.getDamage());
|
|
+ org.bukkit.event.player.PlayerItemMendEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemMendEvent(handle, orb, itemstack, i);
|
|
+ i = event.getRepairAmount();
|
|
+ orb.dead = true;
|
|
+ if (!event.isCancelled()) {
|
|
+ amount -= orb.durToXp(i);
|
|
+ itemstack.setDamage(itemstack.getDamage() - i);
|
|
+ }
|
|
+ }
|
|
+ return amount;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void giveExp(int exp, boolean applyMending) {
|
|
+ if (applyMending) {
|
|
+ exp = this.applyMending(exp);
|
|
+ }
|
|
+ // Paper end
|
|
getHandle().giveExp(exp);
|
|
}
|
|
|
|
--
|
|
2.22.0
|
|
|