Проблемы с графическим интерфейсом пользователя

Версия Minecraft
1.12.2
28
0
Я прочитал эту статью, а затем я сделал GUI. Перевод - Графический интерфейс пользователя с блоком хранения
Я пытаюсь реализовать, что если я нажму кнопку «положить», элемент в первом слоте будет удален, индикатор будет заполнен один за другим, и если я нажму кнопку четыре раза, конкретный элемент будет быть добавлен в центральный слот. Все работает, но есть проблема: после удаления предмета из слота я закрываю инвентарь, снова кликаю на блок или щелкаю в слоте и возвращаюсь к нему до удаления предмета. Также, если я попытаюсь отнести добавленный предмет посередине к инвентарю, он будет удален; я хочу правильно удалить или добавить элементы в определенный слот в графическом интерфейсе. Я думаю, что есть проблема с запоминающим устройством, но я не знаю, как ее решить.


Container Class:
public class BreadContainer extends Container {

    private TileEntityBreadFurnace te;

    public static int bread_int = 0;

    public BreadContainer(IInventory inventory, TileEntityBreadFurnace te) {

        this.te = te;

        addCustomSlots(inventory);
        addPlayerSlots(inventory);
    }

    private void addPlayerSlots(IInventory inventory) {
        for(int row=0;row<3;++row) {
            for(int col = 0; col < 9; ++ col) {
                int x = 8 + col * 18;
                int y = row * 18 + 84;
                this.addSlotToContainer(new Slot(inventory,col + row * 9 + 10,x,y));
            }
        }
        for(int row = 0; row < 9; ++row) {
            int x = 8 + row * 18;
            int y = 58 + 84;
            this.addSlotToContainer(new Slot(inventory,row,x,y));
        }
    }

    private void addCustomSlots(IInventory inventory) {

        IItemHandler iItemHandler = this.te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null);

        int slotIndex = 0;
        addSlotToContainer(new SlotItemHandler(iItemHandler,slotIndex++,26,38));
        addSlotToContainer(new SlotItemHandler(iItemHandler,slotIndex++,79,33));
        addSlotToContainer(new SlotItemHandler(iItemHandler,slotIndex++,133,38));

        BreadContainerGui.slot0 = (SlotItemHandler)getSlot(0);
        BreadContainerGui.slot1 = (SlotItemHandler)getSlot(1);
        BreadContainerGui.slot2 = (SlotItemHandler)getSlot(2);
    }

    @Override
    public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) {

        ItemStack itemstack = ItemStack.EMPTY;
        Slot slot = this.inventorySlots.get(index);

        if (slot != null && slot.getHasStack()) {
            ItemStack itemstack1 = slot.getStack();
            itemstack = itemstack1.copy();
            if (index < TileEntityBreadFurnace.SIZE) {
                if (!this.mergeItemStack(itemstack1, TileEntityBreadFurnace.SIZE, this.inventorySlots.size(), true)) {
                    return ItemStack.EMPTY;
                }
            } else if (!this.mergeItemStack(itemstack1, 0, TileEntityBreadFurnace.SIZE, false)) {
                return ItemStack.EMPTY;
            }
            if (itemstack1.isEmpty()) {
                slot.putStack(ItemStack.EMPTY);
            } else {
                slot.onSlotChanged();
            }
        }

        return itemstack;
    }

    @Override
    public boolean canInteractWith(EntityPlayer playerIn) {
        return true;
}
    }

GuiContainer Class:
public class BreadContainerGui extends GuiContainer {

    public static final int WIDTH = 176, HEIGHT = 166;
    public static SlotItemHandler slot0,slot1,slot2;

    private static final ResourceLocation background = new ResourceLocation(ChickenSkin.MODID, "textures/gui/furnace.png");

    public BreadContainerGui(BreadContainer container) {
        super(container);

        xSize = WIDTH;
        ySize = HEIGHT;
    }

    @Override
    public void initGui() {
        super.initGui();

        this.buttonList.add(new GuiCustomButton(0,guiLeft + 15,guiTop + 60,fontRenderer.getStringWidth("ssss") + 7,12,"put"));
        this.buttonList.add(new GuiCustomButton(1,guiLeft + 122,guiTop + 60,fontRenderer.getStringWidth("ssss") + 7,12,"put"));
    }

    @Override
    protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
        drawCenteredString(mc.fontRenderer,"FISH MACHINE", 88,5,new Color(255,255,255).getRGB());
        drawCenteredString(mc.fontRenderer,String.valueOf(BreadContainer.bread_int),88,20,new Color(255,255,255).getRGB());
        mc.getTextureManager().bindTexture(background);
        if(BreadContainer.bread_int == 0) {
            drawTexturedModalRect(79,56,176,13,17,0);
        }
        else if(BreadContainer.bread_int == 1) {
            drawTexturedModalRect(79,56,176,13,17,6);
        }
        else if(BreadContainer.bread_int == 2) {
            drawTexturedModalRect(79,56,176,13,17,12);
        }
        else if(BreadContainer.bread_int == 3) {
            drawTexturedModalRect(79,56,176,13,17,18);
        }
        else if(BreadContainer.bread_int == 4) {
            drawTexturedModalRect(79,56,176,13,17,24);
        }
        else if(BreadContainer.bread_int >= 5) {
            slot1.putStack(new ItemStack(Items.COOKED_FISH));
            BreadContainer.bread_int = 0;
        }
    }

    @Override
    protected void actionPerformed(GuiButton button) throws IOException {

        switch (button.id) {
            case 0:
                if(slot0.getStack().getItem() == Items.FISH && slot2.getStack().getItem() == Items.FLINT_AND_STEEL) {
                    slot0.getStack().setCount(slot0.getStack().getCount() - 1);
                    slot2.getStack().setCount(slot0.getStack().getCount() - 1);
                    BreadContainer.bread_int++;
                }
        }
    }

    @Override
    public void updateScreen() {
        super.updateScreen();
    }

    @Override
    protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
        drawDefaultBackground();
        mc.getTextureManager().bindTexture(background);
        drawTexturedModalRect(guiLeft,guiTop,0,0,xSize,ySize);
    }
}

TileEntity Class:
public class TileEntityBreadFurnace extends TileEntity {

    public static final int SIZE = 3;

    private ItemStackHandler itemStackHandler = new ItemStackHandler(SIZE) {
        @Override
        protected void onContentsChanged(int slot) {
            TileEntityBreadFurnace.this.markDirty();
        }
    };

    @Override
    public void readFromNBT(NBTTagCompound compound) {
        super.readFromNBT(compound);

        if(compound.hasKey("items")) {
            itemStackHandler.deserializeNBT((NBTTagCompound)compound.getTag("items"));
        }
    }

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound) {
        super.writeToNBT(compound);
        compound.setTag("items", itemStackHandler.serializeNBT());
        return compound;
    }

    public boolean canInteractWith(EntityPlayer player) {
        return !isInvalid() && player.getDistanceSq(pos.add(0.5D,0.5D,0.5D)) <= 64D;
    }

    @Override
    public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) {
        if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
            return true;
        }
        return super.hasCapability(capability,facing);
    }

    @Override
    public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) {
        if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
            return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(itemStackHandler);
        }
        return super.getCapability(capability, facing);
    }
}
 
Сверху