Добавление слотов в клиентский GuiContainer

Версия Minecraft
1.12.2
1,560
86
204
Как можно добавлять и удалять слоты в своём GuiContainer на стороне клиента? Пробовал тупо inventorySlots.inventorySlots = new ArrayList(), но тогда если взаимодействовать с этим слотом, то в консоли вылазят ошибки.
 
7,099
324
1,509
Учитывай в transferStackInSlot шифт+клик, чтобы пока слот за пределами экрана - в него ниче не клалось.
 
1,417
44
594
Я делал так:
CJMinecraft01/BitOfEverything

Java:
public class ContainerBlockBreaker extends Container {

    /**
     * This tile entity and the item handler (inventory)
     */
    private TileEntityBlockBreaker te;
    private IItemHandler handler;

    /**
     * Tells the container where the slots are
     * @param playerInv The player's inventory
     * @param te The tile entity
     */
    public ContainerBlockBreaker(IInventory playerInv, TileEntityBlockBreaker te) {
        this.te = te;
        this.handler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); //Gets the inventory from our tile entity

        //Our tile entity slots
        this.addSlotToContainer(new SlotItemHandler(handler, 0, 62, 17));
        this.addSlotToContainer(new SlotItemHandler(handler, 1, 80, 17));
        this.addSlotToContainer(new SlotItemHandler(handler, 2, 98, 17));
        this.addSlotToContainer(new SlotItemHandler(handler, 3, 62, 35));
        this.addSlotToContainer(new SlotItemHandler(handler, 4, 80, 35));
        this.addSlotToContainer(new SlotItemHandler(handler, 5, 98, 35));
        this.addSlotToContainer(new SlotItemHandler(handler, 6, 62, 53));
        this.addSlotToContainer(new SlotItemHandler(handler, 7, 80, 53));
        this.addSlotToContainer(new SlotItemHandler(handler, 8, 98, 53));
        this.addSlotToContainer(new SlotEnchantedBook(handler, 9, 134, 17));

        //The player's inventory slots
        int xPos = 8; //The x position of the top left player inventory slot on our texture
        int yPos = 84; //The y position of the top left player inventory slot on our texture

        //Player slots
        for (int y = 0; y < 3; ++y) {
            for (int x = 0; x < 9; ++x) {
                this.addSlotToContainer(new Slot(playerInv, x + y * 9 + 9, xPos + x * 18, yPos + y * 18));
            }
        }

        for (int x = 0; x < 9; ++x) {
            this.addSlotToContainer(new Slot(playerInv, x, xPos + x * 18, yPos + 58));
        }
    }

    /**
     * Checks that the player can put items in and out of the container
     */
    @Override
    public boolean canInteractWith(EntityPlayer player) {
        return this.te.isUseableByPlayer(player);
    }

    /**
     * Called when the player presses shift and takes an item out of the container
     */
    @Override
    public ItemStack transferStackInSlot(EntityPlayer playerIn, int fromSlot) {
        ItemStack previous = ItemStack.EMPTY;
        Slot slot = (Slot) this.inventorySlots.get(fromSlot);

        if (slot != null && slot.getHasStack()) {
            ItemStack current = slot.getStack();
            previous = current.copy();

            if (fromSlot < this.handler.getSlots()) {
                // From the block breaker inventory to player's inventory
                if (!this.mergeItemStack(current, handler.getSlots(), handler.getSlots() + 36, true))
                    return ItemStack.EMPTY;
            } else {
                // From the player's inventory to block breaker's inventory
                if(current.getItem() == Items.ENCHANTED_BOOK) {
                    if(!this.mergeItemStack(current, 9, handler.getSlots(), false))
                        return ItemStack.EMPTY;
                }
                if (!this.mergeItemStack(current, 0, handler.getSlots(), false))
                    return ItemStack.EMPTY;
            }

            if (current.getCount() == 0) //Use func_190916_E() instead of stackSize 1.11 only 1.11.2 use getCount()
                slot.putStack(ItemStack.EMPTY); //Use ItemStack.field_190927_a instead of (ItemStack)null for a blank item stack. In 1.11.2 use ItemStack.EMPTY
            else
                slot.onSlotChanged();

            if (current.getCount() == previous.getCount())
                return null;
            slot.onTake(playerIn, current);
        }
        return previous;
    }

}
 
Сверху