Files
Purpur/patches/server/0040-Mending-mends-most-damages-equipment-first.patch
William Blake Galbreath c0c212bf48 Updated Upstream (Paper)
Upstream has released updates that appears to apply and compile correctly

Paper Changes:
b75eeca0 Boost light task priority to ensure it doesnt hold up chunk loads
3d2bc848 Ensure VillagerTrades doesn't load async - fixes #3495
e470f1ef Add more information to Timing Reports
f4a47db6 Improve Thread Pool usage to allow single threads for single cpu servers
a4fe910f Fix sounds when using worldedit regen command
70ad51a8 Updated Upstream (Bukkit/CraftBukkit)
d7cfa4fa Improve legacy format serialization more
2020-06-05 21:42:48 -05:00

111 lines
5.7 KiB
Diff

From 1a2bf40259378ed601f5aa34a4f834d412ac2e0e Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sun, 14 Jul 2019 19:52:47 -0500
Subject: [PATCH] Mending mends most damages equipment first
---
.../minecraft/server/EnchantmentManager.java | 25 ++++++++++++++++++-
.../minecraft/server/EntityExperienceOrb.java | 2 +-
.../java/net/minecraft/server/ItemStack.java | 9 +++++++
.../net/pl3x/purpur/PurpurWorldConfig.java | 2 ++
4 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/src/main/java/net/minecraft/server/EnchantmentManager.java b/src/main/java/net/minecraft/server/EnchantmentManager.java
index d96c03a1a1..da1cfc1d3f 100644
--- a/src/main/java/net/minecraft/server/EnchantmentManager.java
+++ b/src/main/java/net/minecraft/server/EnchantmentManager.java
@@ -246,9 +246,32 @@ public class EnchantmentManager {
return getEnchantmentLevel(Enchantments.CHANNELING, itemstack) > 0;
}
+ // Purpur start
+ @Nullable
+ public static Entry<EnumItemSlot, ItemStack> getMostDamagedEquipment(Enchantment enchantment, EntityLiving entityliving) {
+ Map<EnumItemSlot, ItemStack> map = enchantment.a(entityliving);
+ if (map.isEmpty()) {
+ return null;
+ }
+ Entry<EnumItemSlot, ItemStack> item = null;
+ float maxPercent = 0F;
+ for (Entry<EnumItemSlot, ItemStack> entry : map.entrySet()) {
+ ItemStack itemstack = entry.getValue();
+ if (!itemstack.isEmpty() && itemstack.isDamaged() && getEnchantmentLevel(enchantment, itemstack) > 0) {
+ float percent = itemstack.getDamagePercent();
+ if (item == null || percent > maxPercent) {
+ item = entry;
+ maxPercent = percent;
+ }
+ }
+ }
+ return item;
+ }
+ // Purpur end
+
// Paper - OBFHELPER
public static @javax.annotation.Nonnull ItemStack getRandomEquippedItemWithEnchant(Enchantment enchantment, EntityLiving entityliving) {
- Entry<EnumItemSlot, ItemStack> entry = b(enchantment, entityliving);
+ Entry<EnumItemSlot, ItemStack> entry = enchantment == Enchantments.MENDING && entityliving.world.purpurConfig.useBetterMending ? getMostDamagedEquipment(enchantment, entityliving) : b(enchantment, entityliving); // Purpur
return entry != null ? entry.getValue() : ItemStack.NULL_ITEM;
}
@Nullable
diff --git a/src/main/java/net/minecraft/server/EntityExperienceOrb.java b/src/main/java/net/minecraft/server/EntityExperienceOrb.java
index 53c6c33892..0fae3693c9 100644
--- a/src/main/java/net/minecraft/server/EntityExperienceOrb.java
+++ b/src/main/java/net/minecraft/server/EntityExperienceOrb.java
@@ -225,7 +225,7 @@ public class EntityExperienceOrb extends Entity {
if (this.d == 0 && entityhuman.bC == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(((EntityPlayer) entityhuman).getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper
entityhuman.bC = 2;
entityhuman.receive(this, 1);
- Entry<EnumItemSlot, ItemStack> entry = EnchantmentManager.b(Enchantments.MENDING, (EntityLiving) entityhuman);
+ Entry<EnumItemSlot, ItemStack> entry = world.purpurConfig.useBetterMending ? EnchantmentManager.getMostDamagedEquipment(Enchantments.MENDING, entityhuman) : EnchantmentManager.b(Enchantments.MENDING, entityhuman); // Purpur
if (entry != null) {
ItemStack itemstack = (ItemStack) entry.getValue();
diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java
index 413b888a04..ce6a466852 100644
--- a/src/main/java/net/minecraft/server/ItemStack.java
+++ b/src/main/java/net/minecraft/server/ItemStack.java
@@ -370,10 +370,19 @@ public final class ItemStack {
}
}
+ public boolean isDamaged() { return f(); } // Purpur - OBFHELPER
public boolean f() {
return this.e() && this.getDamage() > 0;
}
+ public float getDamagePercent() {
+ if (isDamaged()) {
+ return (float) getDamage() / (float) getItem().getMaxDurability();
+ } else {
+ return 0F;
+ }
+ }
+
public int getDamage() {
return this.tag == null ? 0 : this.tag.getInt("Damage");
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 7cbb1df7ab..b76a8c5bee 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -118,6 +118,7 @@ public class PurpurWorldConfig {
public Map<Block, Double> controllableMinecartsBlockSpeeds = new HashMap<>();
public boolean disableDropsOnCrammingDeath = false;
public boolean milkCuresBadOmen = true;
+ public boolean useBetterMending = false;
private void gameplayMechanicsSettings() {
controllableMinecarts = getBoolean("gameplay-mechanics.controllable-minecarts.enabled", controllableMinecarts);
controllableMinecartsPlaceAnywhere = getBoolean("gameplay-mechanics.controllable-minecarts.place-anywhere", controllableMinecartsPlaceAnywhere);
@@ -138,6 +139,7 @@ public class PurpurWorldConfig {
}
disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath);
milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
+ useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
}
public boolean idleTimeoutKick = true;
--
2.24.0