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 13, 2025
1 parent f1ecd54 commit 6cd7b5e
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 9 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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

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(EmptyHandler.INSTANCE));
InventoryHelper.registerEquipmentInventoryProvider(player -> CuriosApi.getCuriosInventory(player).<IItemHandler>map(ICuriosItemHandler::getEquippedCurios).orElse(EmptyHandler.INSTANCE));
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<XpPumpUpgradeWrapper, XpPumpUpgradeItem> implements ITickableUpgrade {
Expand Down Expand Up @@ -64,21 +68,37 @@ private void mendItems(Player player) {
return;
}

Map.Entry<EquipmentSlot, ItemStack> 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<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() && EnchantmentHelper.getTagEnchantmentLevel(Enchantments.MENDING, itemStack) > 0) {
matchingItems.add(itemStack);
}
}
}

return Util.getRandomSafe(matchingItems, player.getRandom());
}

private void interactWithPlayer(Player player) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -36,9 +36,20 @@ 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(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<Player, IItemHandler> provider) {
PLAYER_EQUIPMENT_INVENTORY_PROVIDERS.add(provider);
}

public static void registerPlayerInventoryProvider(Function<Player, IItemHandler> provider) {
Expand Down Expand Up @@ -489,4 +500,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 6cd7b5e

Please sign in to comment.