mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
135 lines
6.8 KiB
Diff
135 lines
6.8 KiB
Diff
From 0000000000000000000000000000000000000000 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
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
|
|
index 15844971ce2cca8c679ad3aaa2dfe160e6d0b564..9743e3ed1bbccc44c39df864e980e64fc5e32e1d 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
|
|
@@ -347,7 +347,7 @@ public class ExperienceOrb extends Entity {
|
|
}
|
|
|
|
private int repairPlayerItems(ServerPlayer player, int amount) {
|
|
- Optional<EnchantedItemInUse> optional = EnchantmentHelper.getRandomItemWith(EnchantmentEffectComponents.REPAIR_WITH_XP, player, ItemStack::isDamaged);
|
|
+ Optional<EnchantedItemInUse> optional = level().purpurConfig.useBetterMending ? EnchantmentHelper.getMostDamagedItemWith(EnchantmentEffectComponents.REPAIR_WITH_XP, player) : EnchantmentHelper.getRandomItemWith(EnchantmentEffectComponents.REPAIR_WITH_XP, player, ItemStack::isDamaged); // Purpur - Add option to mend the most damaged equipment first
|
|
|
|
if (optional.isPresent()) {
|
|
ItemStack itemstack = ((EnchantedItemInUse) optional.get()).itemStack();
|
|
diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
index 312b57b4ef340935f4335989ce1d6a4b8b61532c..00665c3e81264b440cd27431f7632f3bc2b1ceef 100644
|
|
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
@@ -643,6 +643,26 @@ public final class ItemStack implements DataComponentHolder {
|
|
return this.isDamageableItem() && this.getDamageValue() > 0;
|
|
}
|
|
|
|
+ // Purpur start - Add option to mend the most damaged equipment first
|
|
+ public float getDamagePercent() {
|
|
+ if (this.has(DataComponents.UNBREAKABLE)) {
|
|
+ return 0.0F;
|
|
+ }
|
|
+
|
|
+ final int maxDamage = this.getOrDefault(DataComponents.MAX_DAMAGE, 0);
|
|
+ if (maxDamage == 0) {
|
|
+ return 0.0F;
|
|
+ }
|
|
+
|
|
+ final int damage = this.getOrDefault(DataComponents.DAMAGE, 0);
|
|
+ if (damage == 0) {
|
|
+ return 0.0F;
|
|
+ }
|
|
+
|
|
+ return (float) damage / maxDamage;
|
|
+ }
|
|
+ // Purpur end - Add option to mend the most damaged equipment first
|
|
+
|
|
public int getDamageValue() {
|
|
return Mth.clamp((Integer) this.getOrDefault(DataComponents.DAMAGE, 0), 0, this.getMaxDamage());
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java
|
|
index 97542361144a950f5b60021874688775226f292d..a33419a7a15aec82c7eaecffd927bd8fb8285c0b 100644
|
|
--- a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java
|
|
+++ b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java
|
|
@@ -6,6 +6,7 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry;
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.List;
|
|
+import java.util.Map;
|
|
import java.util.Optional;
|
|
import java.util.function.BiConsumer;
|
|
import java.util.function.Consumer;
|
|
@@ -569,4 +570,51 @@ public class EnchantmentHelper {
|
|
return getItemEnchantmentLevel(getEnchantmentHolder(enchantment), stack);
|
|
}
|
|
// Purpur end - Add utility methods to deal with enchantments a bit easier
|
|
+
|
|
+ // Purpur start - Add option to mend the most damaged equipment first
|
|
+ public static Optional<EnchantedItemInUse> getMostDamagedItemWith(DataComponentType<?> componentType, LivingEntity entity) {
|
|
+ ItemStack maxStack = null;
|
|
+ EquipmentSlot maxSlot = null;
|
|
+ float maxPercent = 0.0F;
|
|
+
|
|
+ equipmentSlotLoop:
|
|
+ for (EquipmentSlot equipmentSlot : EquipmentSlot.values()) {
|
|
+ ItemStack stack = entity.getItemBySlot(equipmentSlot);
|
|
+
|
|
+ // do not even check enchantments for item with lower or equal damage percent
|
|
+ float percent = stack.getDamagePercent();
|
|
+ if (percent <= maxPercent) {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ ItemEnchantments itemEnchantments = stack.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY);
|
|
+
|
|
+ for (Entry<Holder<Enchantment>> entry : itemEnchantments.entrySet()) {
|
|
+ Enchantment enchantment = entry.getKey().value();
|
|
+
|
|
+ net.minecraft.core.component.DataComponentMap effects = enchantment.effects();
|
|
+ if (!effects.has(componentType)) {
|
|
+ // try with another enchantment
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ List<EquipmentSlotGroup> slotGroups = enchantment.definition().slots();
|
|
+ for (EquipmentSlotGroup slotGroup : slotGroups) {
|
|
+ if (slotGroup.test(equipmentSlot)) {
|
|
+ maxStack = stack;
|
|
+ maxSlot = equipmentSlot;
|
|
+ maxPercent = percent;
|
|
+
|
|
+ // check another slot now
|
|
+ continue equipmentSlotLoop;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return maxStack != null
|
|
+ ? Optional.of(new EnchantedItemInUse(maxStack, maxSlot, entity))
|
|
+ : Optional.empty();
|
|
+ }
|
|
+ // Purpur end - Add option to mend the most damaged equipment first
|
|
}
|
|
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
|
index 94df007142fc6dc1c9dbbd9af5219b87ace4d65d..f980e39b09f38e1c8265a8fe65de91178579326f 100644
|
|
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
|
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
|
@@ -95,6 +95,7 @@ public class PurpurWorldConfig {
|
|
armorstandStepHeight = (float) getDouble("gameplay-mechanics.armorstand.step-height", armorstandStepHeight);
|
|
}
|
|
|
|
+ public boolean useBetterMending = false;
|
|
public boolean boatEjectPlayersOnLand = false;
|
|
public boolean disableDropsOnCrammingDeath = false;
|
|
public boolean milkCuresBadOmen = true;
|
|
@@ -102,6 +103,7 @@ public class PurpurWorldConfig {
|
|
public double voidDamageHeight = -64.0D;
|
|
public double voidDamageDealt = 4.0D;
|
|
private void miscGameplayMechanicsSettings() {
|
|
+ useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
|
|
boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand);
|
|
disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath);
|
|
milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
|