diff --git a/gradle.properties b/gradle.properties index 4d23daa8..819caf73 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ loader_version_range=[4,) mod_id=sophisticatedcore mod_name=Sophisticated Core mod_license=All Rights Reserved -mod_version=1.2.10 +mod_version=1.2.11 mod_group_id=sophisticatedcore mod_authors=P3pp3rF1y mod_description=A library / shared functionality mod for Sophisticated Storage and Backpacks diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/curios/CuriosCompat.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/curios/CuriosCompat.java index d9cadf19..5b2ea0df 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/curios/CuriosCompat.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/curios/CuriosCompat.java @@ -15,5 +15,6 @@ public void setup() { private void addInventoryItemHandler() { InventoryHelper.registerPlayerInventoryProvider(player -> CuriosApi.getCuriosInventory(player).map(ICuriosItemHandler::getEquippedCurios).orElse(EmptyItemHandler.INSTANCE)); + InventoryHelper.registerEquipmentInventoryProvider(player -> CuriosApi.getCuriosInventory(player).map(ICuriosItemHandler::getEquippedCurios).orElse(EmptyItemHandler.INSTANCE)); } } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/xppump/XpPumpUpgradeWrapper.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/xppump/XpPumpUpgradeWrapper.java index 895a0f45..c8f1e1e1 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/xppump/XpPumpUpgradeWrapper.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/xppump/XpPumpUpgradeWrapper.java @@ -1,24 +1,34 @@ package net.p3pp3rf1y.sophisticatedcore.upgrades.xppump; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import net.minecraft.Util; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentEffectComponents; -import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.ItemEnchantments; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.fluids.FluidStack; import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.neoforge.items.IItemHandler; import net.p3pp3rf1y.sophisticatedcore.api.IStorageFluidHandler; import net.p3pp3rf1y.sophisticatedcore.api.IStorageWrapper; import net.p3pp3rf1y.sophisticatedcore.init.ModCoreDataComponents; import net.p3pp3rf1y.sophisticatedcore.init.ModFluids; import net.p3pp3rf1y.sophisticatedcore.upgrades.ITickableUpgrade; import net.p3pp3rf1y.sophisticatedcore.upgrades.UpgradeWrapperBase; +import net.p3pp3rf1y.sophisticatedcore.util.InventoryHelper; import net.p3pp3rf1y.sophisticatedcore.util.XpHelper; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; import java.util.function.Consumer; public class XpPumpUpgradeWrapper extends UpgradeWrapperBase implements ITickableUpgrade { @@ -62,23 +72,48 @@ private void mendItems(Player player) { return; } - EnchantmentHelper.getRandomItemWith(EnchantmentEffectComponents.REPAIR_WITH_XP, player, ItemStack::isDamaged) - .ifPresent(item -> { - ItemStack itemStack = item.itemStack(); + getRandomDamagedItemWithMending(player) + .ifPresent(itemStack -> { if (!itemStack.isEmpty() && itemStack.isDamaged() && itemStack.getXpRepairRatio() > 0) { float xpToTryDrain = Math.min(xpPumpUpgradeConfig.maxXpPointsPerMending.get(), itemStack.getDamageValue() / itemStack.getXpRepairRatio()); if (xpToTryDrain > 0) { storageWrapper.getFluidHandler().ifPresent(fluidHandler -> { FluidStack drained = fluidHandler.drain(ModFluids.EXPERIENCE_TAG, XpHelper.experienceToLiquid(xpToTryDrain), IFluidHandler.FluidAction.EXECUTE, false); float xpDrained = XpHelper.liquidToExperience(drained.getAmount()); - int durationToRepair = (int) (xpDrained * itemStack.getXpRepairRatio()); - itemStack.setDamageValue(itemStack.getDamageValue() - durationToRepair); + int durabilityToRepair = (int) (xpDrained * itemStack.getXpRepairRatio()); + itemStack.setDamageValue(itemStack.getDamageValue() - durabilityToRepair); }); } } }); } + private Optional getRandomDamagedItemWithMending(Player player) { + List matchingItems = new ArrayList<>(); + List equipmentHandlers = InventoryHelper.getEquipmentItemHandlersFromPlayer(player); + + for(IItemHandler handler : equipmentHandlers) { + for (int slot = 0; slot < handler.getSlots(); slot++) { + ItemStack itemStack = handler.getStackInSlot(slot); + + if (itemStack.isDamaged()) { + ItemEnchantments enchantments = itemStack.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY); + + for (Object2IntMap.Entry> enchantmentEntry : enchantments.entrySet()) { + Holder enchantmentHolder = enchantmentEntry.getKey(); + Enchantment enchantment = enchantmentHolder.value(); + + if (enchantment.effects().has(EnchantmentEffectComponents.REPAIR_WITH_XP)) { + matchingItems.add(itemStack); + } + } + } + } + } + + return Util.getRandomSafe(matchingItems, player.getRandom()); + } + private void interactWithPlayer(Player player) { storageWrapper.getFluidHandler().ifPresent(fluidHandler -> { int level = getLevel(); diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/InventoryHelper.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/InventoryHelper.java index 640f02be..6eece949 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/InventoryHelper.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/InventoryHelper.java @@ -17,6 +17,7 @@ import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.IItemHandlerModifiable; import net.neoforged.neoforge.items.ItemStackHandler; +import net.neoforged.neoforge.items.wrapper.*; import net.p3pp3rf1y.sophisticatedcore.inventory.IItemHandlerSimpleInserter; import net.p3pp3rf1y.sophisticatedcore.inventory.ITrackedContentsItemHandler; import net.p3pp3rf1y.sophisticatedcore.inventory.InventoryHandler; @@ -35,9 +36,19 @@ public class InventoryHelper { private InventoryHelper() {} private static final List> PLAYER_INVENTORY_PROVIDERS = new ArrayList<>(); + private static final List> PLAYER_EQUIPMENT_INVENTORY_PROVIDERS = new ArrayList<>(); static { registerPlayerInventoryProvider(player -> player.getCapability(Capabilities.ItemHandler.ENTITY)); + registerEquipmentInventoryProvider(player -> new CombinedInvWrapper( + new PlayerArmorInvWrapper(player.getInventory()), + new PlayerOffhandInvWrapper(player.getInventory()), + new RangedWrapper(new InvWrapper(player.getInventory()), player.getInventory().selected, player.getInventory().selected + 1)) + ); + } + + public static void registerEquipmentInventoryProvider(Function provider) { + PLAYER_EQUIPMENT_INVENTORY_PROVIDERS.add(provider); } public static void registerPlayerInventoryProvider(Function provider) { @@ -493,4 +504,13 @@ public static List getItemHandlersFromPlayerIncludingContainers(Pl }); return itemHandlers; } + + public static List getEquipmentItemHandlersFromPlayer(Player player) { + List itemHandlers = new ArrayList<>(); + PLAYER_EQUIPMENT_INVENTORY_PROVIDERS.forEach(provider -> { + IItemHandler itemHandler = provider.apply(player); + itemHandlers.add(itemHandler); + }); + return itemHandlers; + } }