Смена режима красного камня в GUI

Версия Minecraft
1.15.2
103
2
2
Хочу чтобы в GUI можно было переключать кнопкой режимы (работать по сигналу редстоуна/работать всегда). Я почти это сделал (мне так кажется), но я не знаю как сделать кнопку и как в TE переключать переменную redstonecontrol. Ниже я приведу методы которые я пытался использовать. Текстура меняется если менять переменную в TE через класс.
blockbreaker tileentity:
public int redstoneControl = 1;

    protected final IIntArray blockbreakerData = new IIntArray() {
        public int get(int index) {
            switch(index) {
                case 0:
                    return redstoneControl;
                default:
                    return 0;
            }
        }

        public void set(int index, int value) {
            switch(index) {
                case 0:
                    redstoneControl = value;
                    break;
            }
        }

        public int size() {
            return 1;
        }

@Override
public void read(CompoundNBT tag) {
    super.read(tag);
    this.redstoneControl = tag.getInt("redstonecontrol");
}

@Override
public CompoundNBT write(CompoundNBT tag) {
    super.write(tag);
    tag.putInt("redstonecontrol", this.redstoneControl);
    return tag;
}
    };
blockbreaker container:
this.redstoneSignal = tileEntity.blockbreakerData.get(0);
blockbreaker gui:
@Override
    protected void drawGuiContainerForegroundLayer(final int mouseX, final int mouseY) {
        super.drawGuiContainerForegroundLayer(mouseX, mouseY);
        String s = this.title.getFormattedText();
        int textWidth = font.getStringWidth(s);
        int centerX = (this.xSize / 2) - (textWidth / 2);

        this.font.drawString(s, centerX, 6.0F, 0x404040);
        this.font.drawString(this.playerInventory.getDisplayName().getFormattedText(), 8.0F, (float) (this.ySize - 93), 0x404040);
        getMinecraft().getTextureManager().bindTexture(BACKGROUND_TEXTURE);
        if (this.container.redstoneSignal == 1) {
            this.blit(133, 35, 176, 0, 18, 18);//x,y,texturex,texturey,width,height
        }else{
            this.blit(133, 35, 194, 0, 18, 18);//x,y,texturex,texturey,width,height
        }
    }

    public boolean mouseClicked(double mouseX, double mouseY, int mouseButton)
    {
        super.mouseClicked(mouseX, mouseY, mouseButton);

        double mx = mouseX;
        double my = mouseY;

            if (mx >= 139 && my >= 35 && mx < 157 && my < 53)
            {
                this.minecraft.playerController.sendEnchantPacket((this.container).windowId, 0);
            }

        return super.mouseClicked(mouseX, mouseY, mouseButton);
    }
 
103
2
2
я думал почему у меня не работает кнопка и случайно обнаружил что просто клик работает, а в области где я указал нет. Клик должен быть в области с кнопкой где красный факел нарисован.
mouseClicked:
@Override
    public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) {
        if (super.mouseClicked(mouseX, mouseY, mouseButton)) {
            System.out.print("MOUSE CLICKED");
            if (mouseX >= 139 && mouseY >= 35 && mouseX < 157 && mouseY < 53) {
                System.out.print("MOUSE CLICKED IN AREA");
                if (this.container.redstoneSignal == 0) {
                    this.container.redstoneSignal = 1;
                } else {
                    this.container.redstoneSignal = 0;
                }
                return true;
            }
        }
        return super.mouseClicked(mouseX, mouseY, mouseButton);
    }
 

Вложения

  • blockbreakergui.PNG
    blockbreakergui.PNG
    137.6 KB · Просмотры: 26
Последнее редактирование:
103
2
2
клик работает в любой области, я начал выводить координаты мышки
System.out.print(String.format("MOUSE CLICKED" + "MX:" + mouseX + "MY:" + mouseY));
и там координаты всё время разные если менять размер окна, мне надо как-то получать координаты относительно GUI.
 
241
20
75
там координаты всё время разные если менять размер окна
 
103
2
2
Как рисовать относительно центра я знаю, проблема с считыванием координат мышки. В Game Maker например, была функция device_mouse_x_to_gui и там выдавались координаты мыши относительно слоя GUI, а не размера окна. Тоесть там можно было рендерить игру в 1080p, а GUI в 720р. И я хотел бы такую же функцию в майне или я чего-то не понимаю.
 
103
2
2
Я понял в чём проблема, я от GuiTop значение уменьшал, а надо было прибавлять. Но GuiTop это же вверх гуи. Или в майне используется перевёрнутая декартова система как в game maker?

Осталось только по нажатию кнопки менять переменную в TE, потому-что сейчас если я выйду из GUI, то изменения не сохраняются.
 
103
2
2
Я разобрался с нетворкингом частично, я могу отправлять пакеты и PACKET SEND выводится, но что писать в пакете чтобы он менял переменную у TE?
PacketChangeRedstoneControl:
public class PacketChangeRedstoneControl {
    public PacketChangeRedstoneControl(PacketBuffer buf){

    }

    public void toBytes(PacketBuffer buf){

    }

    public PacketChangeRedstoneControl(Container container){

    }

    public void handle(Supplier<NetworkEvent.Context> ctx){
        ctx.get().enqueueWork(() -> {
        System.out.print("PACKET SEND!");
            });
        ctx.get().setPacketHandled(true);
    }
}
 
Последнее редактирование:
103
2
2
Я попытался получить блокстейт хотя бы, но мне выдаёт ошибку at com.alexincube.allyouneed.setup.PacketChangeRedstoneControl.<init>(PacketChangeRedstoneControl.java:23) ~[main/:?] {re:classloading}
23 строка это blockpos = buf.readBlockPos();
PacketChangeRedstoneControl:
public class PacketChangeRedstoneControl {

    private final BlockPos blockpos;
    private final int rc;

    public PacketChangeRedstoneControl(PacketBuffer buf){
        blockpos = buf.readBlockPos();
        rc = buf.readInt();
    }

    public void toBytes(PacketBuffer buf){

    }

    public PacketChangeRedstoneControl(BlockPos blockpos, int rc){
        this.blockpos = blockpos;
        this.rc = rc;
    }

    public void handle(Supplier<NetworkEvent.Context> ctx){
        ctx.get().enqueueWork(() -> {
            BlockState blockstate = ctx.get().getSender().getServerWorld().getBlockState(blockpos);
            System.out.print(blockstate);
            });
        ctx.get().setPacketHandled(true);
    }
}
 
103
2
2
я забыл про toBytes, я вписал туда
buf.writeBlockPos(blockpos);
buf.writeInt(rc);
и ошибки нет, блокстейт выводит. но тайл я получить не могу

P.S. я тупанул, TE можно так получить TileEntity te = ctx.get().getSender().getServerWorld().getTileEntity(blockpos);

Только как мне изменить переменную, надо получить к ней доступ или как-то в NBT шаманить?
 
Последнее редактирование:
103
2
2
Я решил помучать NBT, но у меня не меняется ничего в пакете.
handle:
public void handle(Supplier<NetworkEvent.Context> ctx){
        ctx.get().enqueueWork(() -> {
            TileEntity te = ctx.get().getSender().getServerWorld().getTileEntity(blockpos);
            CompoundNBT compound = te.serializeNBT();
            compound.putInt("redstonecontrol",rc);
            System.out.print(te.serializeNBT());
            });
        ctx.get().setPacketHandled(true);
    }
 
Сверху