diff --git a/gradle.properties b/gradle.properties index f115fc08..439f6b7b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.daemon=false mod_id=sophisticatedcore mod_group_id=sophisticatedcore -mod_version=1.2.10 +mod_version=1.2.11 sonar_project_key=sophisticatedcore:SophisticatedCore github_package_url=https://maven.pkg.github.com/P3pp3rF1y/SophisticatedCore 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 435bd741..31bda610 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(EmptyHandler.INSTANCE)); + InventoryHelper.registerEquipmentInventoryProvider(player -> CuriosApi.getCuriosInventory(player).map(ICuriosItemHandler::getEquippedCurios).orElse(EmptyHandler.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 582ffb0b..38371dcd 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/xppump/XpPumpUpgradeWrapper.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/xppump/XpPumpUpgradeWrapper.java @@ -1,8 +1,8 @@ package net.p3pp3rf1y.sophisticatedcore.upgrades.xppump; +import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; @@ -11,16 +11,20 @@ import net.minecraft.world.phys.AABB; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandler; import net.p3pp3rf1y.sophisticatedcore.api.IStorageFluidHandler; import net.p3pp3rf1y.sophisticatedcore.api.IStorageWrapper; 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.NBTHelper; import net.p3pp3rf1y.sophisticatedcore.util.XpHelper; import javax.annotation.Nullable; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; import java.util.function.Consumer; public class XpPumpUpgradeWrapper extends UpgradeWrapperBase implements ITickableUpgrade { @@ -64,21 +68,37 @@ private void mendItems(Player player) { return; } - Map.Entry entry = EnchantmentHelper.getRandomItemWith(Enchantments.MENDING, player, ItemStack::isDamaged); - if (entry != null) { - ItemStack itemStack = entry.getValue(); + 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() && EnchantmentHelper.getTagEnchantmentLevel(Enchantments.MENDING, itemStack) > 0) { + matchingItems.add(itemStack); + } + } } + + return Util.getRandomSafe(matchingItems, player.getRandom()); } private void interactWithPlayer(Player player) { diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/InventoryHelper.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/InventoryHelper.java index ecabf6af..345977f9 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/InventoryHelper.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/InventoryHelper.java @@ -17,7 +17,7 @@ import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; -import net.minecraftforge.items.wrapper.EmptyHandler; +import net.minecraftforge.items.wrapper.*; import net.p3pp3rf1y.sophisticatedcore.inventory.IItemHandlerSimpleInserter; import net.p3pp3rf1y.sophisticatedcore.inventory.ITrackedContentsItemHandler; import net.p3pp3rf1y.sophisticatedcore.inventory.InventoryHandler; @@ -36,9 +36,20 @@ 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(ForgeCapabilities.ITEM_HANDLER).orElse(EmptyHandler.INSTANCE)); + 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) { @@ -489,4 +500,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; + } }