/* * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ package net.minecraftforge.items; import net.minecraft.world.entity.player.Player; import net.minecraft.world.Container; import net.minecraft.world.SimpleContainer; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; public class SlotItemHandler extends Slot { private static Container emptyInventory = new SimpleContainer(0); private final IItemHandler itemHandler; private final int index; public SlotItemHandler(IItemHandler itemHandler, int index, int xPosition, int yPosition) { super(emptyInventory, index, xPosition, yPosition); this.itemHandler = itemHandler; this.index = index; } @Override public boolean mayPlace(@NotNull ItemStack stack) { if (stack.isEmpty()) return false; return itemHandler.isItemValid(index, stack); } @Override @NotNull public ItemStack getItem() { return this.getItemHandler().getStackInSlot(index); } // Override if your IItemHandler does not implement IItemHandlerModifiable @Override public void set(@NotNull ItemStack stack) { ((IItemHandlerModifiable) this.getItemHandler()).setStackInSlot(index, stack); this.setChanged(); } // Override if your IItemHandler does not implement IItemHandlerModifiable // @Override public void initialize(ItemStack stack) { ((IItemHandlerModifiable) this.getItemHandler()).setStackInSlot(index, stack); this.setChanged(); } @Override public void onQuickCraft(@NotNull ItemStack oldStackIn, @NotNull ItemStack newStackIn) { } @Override public int getMaxStackSize() { return this.itemHandler.getSlotLimit(this.index); } @Override public int getMaxStackSize(@NotNull ItemStack stack) { ItemStack maxAdd = stack.copy(); int maxInput = stack.getMaxStackSize(); maxAdd.setCount(maxInput); IItemHandler handler = this.getItemHandler(); ItemStack currentStack = handler.getStackInSlot(index); if (handler instanceof IItemHandlerModifiable) { IItemHandlerModifiable handlerModifiable = (IItemHandlerModifiable) handler; handlerModifiable.setStackInSlot(index, ItemStack.EMPTY); ItemStack remainder = handlerModifiable.insertItem(index, maxAdd, true); handlerModifiable.setStackInSlot(index, currentStack); return maxInput - remainder.getCount(); } else { ItemStack remainder = handler.insertItem(index, maxAdd, true); int current = currentStack.getCount(); int added = maxInput - remainder.getCount(); return current + added; } } @Override public boolean mayPickup(Player playerIn) { return !this.getItemHandler().extractItem(index, 1, true).isEmpty(); } @Override @NotNull public ItemStack remove(int amount) { return this.getItemHandler().extractItem(index, amount, false); } public IItemHandler getItemHandler() { return itemHandler; } /* TODO Slot patches @Override public boolean isSameInventory(Slot other) { return other instanceof SlotItemHandler && ((SlotItemHandler) other).getItemHandler() == this.itemHandler; }*/ }