geforkt von Mirrors/Paper
f79c0daece
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: 5c21a63f PR-717: Add PlayerHideEntityEvent and PlayerShowEntityEvent CraftBukkit Changes: c26a7b54d PR-1000: Add PlayerHideEntityEvent and PlayerShowEntityEvent
55 Zeilen
2.7 KiB
Diff
55 Zeilen
2.7 KiB
Diff
From 0000000000000000000000000000000000000000 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/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index 32089b74ec209abebd7ec42ac432c10eb7cbff86..45914c7cf1ae300c47a43b23bcf868bbb96d911b 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -1249,7 +1249,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);
|
|
}
|
|
|