From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath 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 bf0838f574fa3fb9654e087d602b8d380bd7fb28..6db9a3ea4c0dc1f0629bc8bf6466aeab00c498f6 100644 --- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java @@ -351,7 +351,7 @@ public class ExperienceOrb extends Entity { } private int repairPlayerItems(ServerPlayer player, int amount) { - Optional optional = EnchantmentHelper.getRandomItemWith(EnchantmentEffectComponents.REPAIR_WITH_XP, player, ItemStack::isDamaged); + Optional 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 33e7d2884195677c4d6340d8b84c1dd85c636ec1..239bd6e3d756dc4ecab6ca639fa84ccbf89418a7 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -681,6 +681,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 d8fc10f9cd0ab2c26e64613006569a86ce201550..73241113e50dc8be89ef8850d49d95ec31fb194f 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; @@ -588,4 +589,48 @@ public class EnchantmentHelper { return getItemEnchantmentLevel(getEnchantmentHolder(enchantment), stack); } // Purpur end - Enchantment convenience methods + + // Purpur start - Add option to mend the most damaged equipment first + public static Optional 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> 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; + } + + if (enchantment.matchingSlot(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 3e78e57f29e98db2dde7d650b65ee23f99238ff7..6b7a6a7889353f9557c6e3bfa8ff8caf66416c1b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -96,11 +96,13 @@ 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; public double tridentLoyaltyVoidReturnHeight = 0.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);