package com.xfestudio.mydimensionlord.platform;
import net.minecraft.world.item.ItemStack;
import net.neoforged.neoforge.items.IItemHandler;
import net.neoforged.neoforge.transfer.ResourceHandler;
import net.neoforged.neoforge.transfer.item.ItemResource;
import net.neoforged.neoforge.transfer.transaction.Transaction;
/** Keeps the builder's simulation/commit contract on NeoForge's transactional storage API. */
public record TransferItemHandler(ResourceHandler<ItemResource> handler) implements IItemHandler {
@Override public int getSlots() { return handler.size(); }
@Override public ItemStack getStackInSlot(int slot) { return handler.getResource(slot).toStack(handler.getAmountAsInt(slot)); }
@Override public int getSlotLimit(int slot) { return handler.getCapacityAsInt(slot, handler.getResource(slot)); }
@Override public boolean isItemValid(int slot, ItemStack stack) { return handler.isValid(slot, ItemResource.of(stack)); }
@Override public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
if (stack.isEmpty()) return ItemStack.EMPTY;
try (Transaction transaction = Transaction.openRoot()) {
int inserted = handler.insert(slot, ItemResource.of(stack), stack.getCount(), transaction);
if (!simulate) transaction.commit();
return stack.copyWithCount(stack.getCount() - inserted);
}
}
@Override public ItemStack extractItem(int slot, int amount, boolean simulate) {
if (amount <= 0) return ItemStack.EMPTY;
ItemResource resource = handler.getResource(slot);
if (resource.isEmpty()) return ItemStack.EMPTY;
try (Transaction transaction = Transaction.openRoot()) {
int extracted = handler.extract(slot, resource, amount, transaction);
if (!simulate) transaction.commit();
return resource.toStack(extracted);
}
}
}
package com.xfestudio.mydimensionlord.platform;
import net.minecraft.world.item.ItemStack;
import net.neoforged.neoforge.items.IItemHandler;
import net.neoforged.neoforge.transfer.ResourceHandler;
import net.neoforged.neoforge.transfer.item.ItemResource;
import net.neoforged.neoforge.transfer.transaction.Transaction;
/** Keeps the builder's simulation/commit contract on NeoForge's transactional storage API. */
public record TransferItemHandler(ResourceHandler<ItemResource> handler) implements IItemHandler {
@Override public int getSlots() { return handler.size(); }
@Override public ItemStack getStackInSlot(int slot) { return handler.getResource(slot).toStack(handler.getAmountAsInt(slot)); }
@Override public int getSlotLimit(int slot) { return handler.getCapacityAsInt(slot, handler.getResource(slot)); }
@Override public boolean isItemValid(int slot, ItemStack stack) { return handler.isValid(slot, ItemResource.of(stack)); }
@Override public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
if (stack.isEmpty()) return ItemStack.EMPTY;
try (Transaction transaction = Transaction.openRoot()) {
int inserted = handler.insert(slot, ItemResource.of(stack), stack.getCount(), transaction);
if (!simulate) transaction.commit();
return stack.copyWithCount(stack.getCount() - inserted);
}
}
@Override public ItemStack extractItem(int slot, int amount, boolean simulate) {
if (amount <= 0) return ItemStack.EMPTY;
ItemResource resource = handler.getResource(slot);
if (resource.isEmpty()) return ItemStack.EMPTY;
try (Transaction transaction = Transaction.openRoot()) {
int extracted = handler.extract(slot, resource, amount, transaction);
if (!simulate) transaction.commit();
return resource.toStack(extracted);
}
}
}