Передача пакета с результатом нажатия на кнопку в GUI

Версия Minecraft
1.12.2
205
12
103
Доброго и не очень времени суток.

Есть GUI, в нём есть две кнопочки: повышающие и понижающие интовую переменную в тайле (По аналогии со счётчиком из учебника). Насколько мне известно, пакеты - довольно хрупкая и опасная система в плане уязвимостей, так что хотелось бы сразу понять как правильно передавать подобные простые действия.

Цель: Передать результат нажатия кнопочки в GUI, согласно результату изменить значение переменной.

Если я всё верно понял, делать нужно по следующей аналогии: GUI -> Контейнер -> Тайл. Но из этой серии мне более ничего не известно, поскольку руководства в интернете в этом плане весьма ограничены.

Тайл:
public class TileBarrier extends TileEntity {
    public static int multiplier;

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound tagCompound) {
        tagCompound.setInteger("multiplier", multiplier);
        return super.writeToNBT(tagCompound);
    }

    @Override
    public void readFromNBT(NBTTagCompound tagCompound) {
        this.multiplier = tagCompound.getInteger("multiplier");
        super.readFromNBT(tagCompound);
    }

    public static int getMultiplier() {
        return multiplier;
    }

    public void incrementMultiplier() {
        this.multiplier++;
        this.markDirty();
    }

    public void decrementMultiplier() {
        this.multiplier--;
        this.markDirty();
    }
}


GUI:
public class GuiBarrier extends GuiScreen {
    private GuiButtonExt buttonIncrement;
    private GuiButtonExt buttonDecrement;

    @Override
    public void initGui() {
        buttonIncrement = new GuiButtonExt(0, width / 2, height / 2 + 100, 100, 20, "+");
        buttonDecrement = new GuiButtonExt(1, width / 2, height / 2 + 100, 100, 20, "-");
        //Не обращаем внимания на координаты
        buttonList.add(buttonIncrement);
        buttonList.add(buttonDecrement);
    }

    @Override
    protected void keyTyped(char typedChar, int keyCode) throws IOException {
        super.keyTyped(typedChar, keyCode);
    }

    @Override
    protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
        super.mouseClicked(mouseX, mouseY, mouseButton);
    }

    @Override
    public void updateScreen() {
    }

    @Override
    public void drawScreen(int mouseX, int mouseY, float partialTicks) {
        drawDefaultBackground();
        super.drawScreen(mouseX, mouseY, partialTicks);
    }

    @Override
    protected void actionPerformed(GuiButton button) throws IOException {
        if (button == this.buttonIncrement) {
            //Повышение значение
        }

        if (button == this.buttonDecrement) {
            //Понижение значения
        }
    }
}

Как делать контейнер в этом случае - вообще не знаю, поскольку пока доводилось работать только с контейнерами обычных инвентарей.
 

Icosider

Kotliner
Администратор
3,603
99
664
Можно делать и без контейнера, ток уже сложно отследить какой конкретно тайл меняет игрок. В случаи с реализацией контейнера, глянь как это сделано в столе зачаровывания
 
7,099
324
1,510
Сделай гуи с контейнером. В контейнере переопредели enchantItem. Его первый аргумент - id кликнутой кнопки. С пакетами в этом случай разберется сам майн.
 
7,099
324
1,510
А от чего оно тогда зависит?
~~~
Чекнул код GuiContainer
Странно, но в последней версии нужно скопипастить реализацию mouseClicked из GuiEnchantment
Java:
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException
    {
        super.mouseClicked(mouseX, mouseY, mouseButton);
        int i = (this.width - this.xSize) / 2;
        int j = (this.height - this.ySize) / 2;

        for (int k = 0; k < 3; ++k)
        {
            int l = mouseX - (i + 60);
            int i1 = mouseY - (j + 14 + 19 * k);

            if (l >= 0 && i1 >= 0 && l < 108 && i1 < 19 && this.container.enchantItem(this.mc.player, k))
            {
                this.mc.playerController.sendEnchantPacket(this.container.windowId, k);
            }
        }
    }
Вроде, в каком-то билде оно было в GuiContainer, почему-то опять вернули :unsure:
 

Icosider

Kotliner
Администратор
3,603
99
664
Так и к чему этот код то? Если ты про первый аргумент говорил, то это id контейнера, а не кнопки. Второй аргумент число, которое будет передано в метод enchantItem, которое затем можно использовать для проверки или передачи некого числа. Я для кодового замка вообще так сделал:
Kotlin:
    override fun actionPerformed(btn: GuiButton) {
        if (btn.id == 10)
            this.code = ""
        else
            this.code += btn.id

        if (this.code.length > 3)
            this.mc.playerController.sendEnchantPacket(this.inventorySlots.windowId, code.toInt())
    }
 
Сверху