Skip to content

Commit

Permalink
feat: ✨ Made Xp Pump Upgrade capable of repairing items with mending …
Browse files Browse the repository at this point in the history
…in curios slots
  • Loading branch information
P3pp3rF1y committed Feb 11, 2025
1 parent 7215fb7 commit 9a941c5
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 7 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ public void setup() {

private void addInventoryItemHandler() {
InventoryHelper.registerPlayerInventoryProvider(player -> CuriosApi.getCuriosInventory(player).<IItemHandler>map(ICuriosItemHandler::getEquippedCurios).orElse(EmptyItemHandler.INSTANCE));
InventoryHelper.registerEquipmentInventoryProvider(player -> CuriosApi.getCuriosInventory(player).<IItemHandler>map(ICuriosItemHandler::getEquippedCurios).orElse(EmptyItemHandler.INSTANCE));
}
}
Original file line number Diff line number Diff line change
@@ -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<XpPumpUpgradeWrapper, XpPumpUpgradeItem> implements ITickableUpgrade {
Expand Down Expand Up @@ -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<ItemStack> getRandomDamagedItemWithMending(Player player) {
List<ItemStack> matchingItems = new ArrayList<>();
List<IItemHandler> 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<Holder<Enchantment>> enchantmentEntry : enchantments.entrySet()) {
Holder<Enchantment> 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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -35,9 +36,19 @@ public class InventoryHelper {
private InventoryHelper() {}

private static final List<Function<Player, IItemHandler>> PLAYER_INVENTORY_PROVIDERS = new ArrayList<>();
private static final List<Function<Player, IItemHandler>> 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<Player, IItemHandler> provider) {
PLAYER_EQUIPMENT_INVENTORY_PROVIDERS.add(provider);
}

public static void registerPlayerInventoryProvider(Function<Player, IItemHandler> provider) {
Expand Down Expand Up @@ -493,4 +504,13 @@ public static List<IItemHandler> getItemHandlersFromPlayerIncludingContainers(Pl
});
return itemHandlers;
}

public static List<IItemHandler> getEquipmentItemHandlersFromPlayer(Player player) {
List<IItemHandler> itemHandlers = new ArrayList<>();
PLAYER_EQUIPMENT_INVENTORY_PROVIDERS.forEach(provider -> {
IItemHandler itemHandler = provider.apply(player);
itemHandlers.add(itemHandler);
});
return itemHandlers;
}
}

0 comments on commit 9a941c5

Please sign in to comment.