Создание собственного GUI

Версия Minecraft
1.16.5
API
Forge
26
1
Нужно создать своё гуи, которое открывается по кнопке. В нем должны быть кнопки для отправки информации. Как реализовать?
 
26
1
можно по подробнее как это всё устроено? Что мне конкретно нужно использоваться для реализования своей задумки? Я знаю, что мы берем наследие от класса Screen, что стоит делать дальше для рендера фигур, кнопок и т. д.?
 
127
10
14
Для добавления кнопок в методе init у класса, который наследует от Screen, вызываешь Screen#addButton. Должно быть что-то типа такого:
Java:
@Override
protected void init() {
    super.init();
    addButton(new Button(x, y, ширина, высота, текст, (Button.IPressable) button -> {
        тут то что должно происходить при нажатии на кнопку
    }));
}
Для рендера фигур, линий, текста и т.д. переопределяешь метод render. И потом разными методами рендеришь то, что тебе нужно. Например drawString, renderBackground, fillGradient, blit и т.д.
 
26
1
Не дает разрешить метод. Я наследую методы из класса Screen. Уточни, пожалуйста, где должен происходить рендер?


Java:
public class MainGui extends Screen {
    Minecraft mc = Minecraft.getInstance();
    private static ResourceLocation body = new ResourceLocation("examplemod", "icons/body.png");

    public MainGui() {
        super(new StringTextComponent("GUI Title"));
    }

    @Override
    protected void init() {
        addButton(new Button(width / 2 - 150, height / 2 - 20, 20, 20, new StringTextComponent("Доп.время"), button -> {
            this.mc.player.chat("Test");
        }));
        ;

    }

    public void render(MatrixStack mw, int q, int w, int e) {

    }

    public void onGUI(MatrixStack mw, int q, int w, int e) {
        this.renderBackground(mw);
        this.mc.getTextureManager().bind(body);
        int height = mc.getWindow().getHeight();
        int wight = mc.getWindow().getWidth();

        drawTexture(5.0D, 5.0D, (double) wight / 2 - 6.0D, (double) height / 2 - 5.0D);

        GL11.glPushMatrix();
        GL11.glEnable(3089);

        GL11.glScissor(height / 4, (int) ((double) height / 5.7 * this.getMinecraft().getWindow().getX()), this.width * 10, (int) ((double) wight / 1.73 * this.getMinecraft().getWindow().getY())
        );
        GL11.glDisable(3089);
        GL11.glPopMatrix();

    }


    public static void drawTexture(double posX, double posY, double width, double height) {
        GL11.glPushMatrix();
        GL11.glEnable(GL11.GL_QUADS);
        GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
        GL11.glTranslatef((float) posX, (float) posY, 2.0F);
        Tessellator tessellator = Tessellator.getInstance();
        BufferBuilder bf = tessellator.getBuilder();
        bf.begin(7, DefaultVertexFormats.POSITION_TEX);
        bf.vertex(1.0D, 1.0D, 1.0D);
        bf.vertex(1.0D, height, 1.0D);
        bf.vertex(width, height, 1.0D);
        bf.vertex(width, 1.0D, 1.0D);
        tessellator.end();
        GL11.glDisable(GL11.GL_QUADS);
        GL11.glPopMatrix();
    }
}
 
26
1
Java:
@Override
    public void render(MatrixStack mw, int q, int w, float e) {
        this.renderBackground(mw);
        this.mc.getTextureManager().bind(body);
        int height = mc.getWindow().getHeight();
        int wight = mc.getWindow().getWidth();

        AbstractGui.blit(mw, 10, 10, 10, 10, wight / 4, height / 4, 10, 10);
В рендере сделал что-то в этом роде, но в игре получил это:1720604802579.png
 
127
10
14
Ручками вписывать, или метод создать. Я такой сделал и вообще не парюсь :)
Java:
public static Tuple<Integer, Integer> getTextureSize(ResourceLocation textureRL) {
        RenderSystem.pushMatrix();
        Minecraft.getInstance().getTextureManager().bind(textureRL);
        Tuple<Integer, Integer> size = new Tuple<>(GlStateManager._getTexLevelParameter(GL11.GL_TEXTURE_2D,
                0, GL11.GL_TEXTURE_WIDTH), GlStateManager._getTexLevelParameter(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT));
        RenderSystem.popMatrix();
        return size;
}
 
Сверху