Как создать кнопку радом с книгой рецептов?

Версия Minecraft
1.20.1
API
Forge
Вот такой код пока накидал
MenuButton.java:
package com.danilon4ig.customtabs.gui;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.inventory.InventoryScreen;
import net.minecraft.network.chat.Component;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.ScreenEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

@Mod.EventBusSubscriber(modid = "customtabs", value = Dist.CLIENT)
public class MenuButton {

    @SubscribeEvent
    public static void onScreenInit(ScreenEvent.Init.Post event) {
        if (!(event.getScreen() instanceof InventoryScreen screen)) return;

        Minecraft mc = Minecraft.getInstance();

        int left = screen.getGuiLeft();
        int top = screen.getGuiTop();

        int x = left + 127;
        int y = top + 61;

        Button button = Button.builder(
                Component.literal("C"),
                b -> {
                    if (mc.player != null) {
                        mc.player.sendSystemMessage(Component.literal("Нажал кнопку"));
                    }
                }
        ).bounds(x, y, 20, 18).build();

        event.addListener(button);
    }
}
1774370875273.png



Проблема в том, что тут масштаб прикинутый на глазок и при открытии ресайпбука происходит вот такой мув

1774370947301.pngВопрос, собственно, в том, как поменять глобальные координаты на относительные (И относительно чего это реализуется проще)?





P.s. И при открытом ресайпбуке это происходит, соответственно, наоборот

1774371164488.png
 
Решение
Тяжело конешно все в этих ваших 1.20.1'нах, меня хватило только на такой ультра костыть

Костыль:
    private static Button gavno = null;

    @SubscribeEvent
    public static void onScreenInit(ScreenEvent.Init.Post e) {
        if (!(e.getScreen() instanceof InventoryScreen screen)) return;

        Minecraft mc = Minecraft.getInstance();

        int x = screen.getGuiLeft() + 127;
        int y = screen.height / 2 - 22;

        Button button = Button.builder(
                Component.literal("C"),
                b -> {
                    if (mc.player != null) {
                        mc.player.sendSystemMessage(Component.literal("Нажал кнопку"));
                    }
                }
        ).bounds(x, y, 20, 18).build()...
Посмотри как рассчитываются координаты кнопки "ресайпбука" и сделай также со смещением в право
Проблема в том, что тут берётся высота и ширина при инициализации, а, ввиду того, что я нуб, я не совсем понимаю, какую именно мне ширину брать:\ (Да и как реализовано обновление при открытии книжки тоже)

Java:
public void init(int p_100310_, int p_100311_, Minecraft p_100312_, boolean p_100313_, RecipeBookMenu<?> p_100314_) {
      this.minecraft = p_100312_;
      this.width = p_100310_;
      this.height = p_100311_;
      this.menu = p_100314_;
      this.widthTooNarrow = p_100313_;
      p_100312_.player.containerMenu = p_100314_;
      this.book = p_100312_.player.getRecipeBook();
      this.timesInventoryChanged = p_100312_.player.getInventory().getTimesChanged();
      this.visible = this.isVisibleAccordingToBookData();
      if (this.visible) {
         this.initVisuals();
      }

   }

   public void initVisuals() {
      this.xOffset = this.widthTooNarrow ? 0 : 86;
      int i = (this.width - 147) / 2 - this.xOffset;
      int j = (this.height - 166) / 2;
      this.stackedContents.clear();
      this.minecraft.player.getInventory().fillStackedContents(this.stackedContents);
      this.menu.fillCraftSlotsStackedContents(this.stackedContents);
      String s = this.searchBox != null ? this.searchBox.getValue() : "";
      this.searchBox = new EditBox(this.minecraft.font, i + 26, j + 14, 79, 9 + 3, Component.translatable("itemGroup.search"));
      this.searchBox.setMaxLength(50);
      this.searchBox.setVisible(true);
      this.searchBox.setTextColor(16777215);
      this.searchBox.setValue(s);
      this.searchBox.setHint(SEARCH_HINT);
      this.recipeBookPage.init(this.minecraft, i, j);
      this.recipeBookPage.addListener(this);
      this.filterButton = new StateSwitchingButton(i + 110, j + 12, 26, 16, this.book.isFiltering(this.menu));
      this.updateFilterButtonTooltip();
      this.initFilterButtonTextures();
      this.tabButtons.clear();
 
Тяжело конешно все в этих ваших 1.20.1'нах, меня хватило только на такой ультра костыть

Костыль:
    private static Button gavno = null;

    @SubscribeEvent
    public static void onScreenInit(ScreenEvent.Init.Post e) {
        if (!(e.getScreen() instanceof InventoryScreen screen)) return;

        Minecraft mc = Minecraft.getInstance();

        int x = screen.getGuiLeft() + 127;
        int y = screen.height / 2 - 22;

        Button button = Button.builder(
                Component.literal("C"),
                b -> {
                    if (mc.player != null) {
                        mc.player.sendSystemMessage(Component.literal("Нажал кнопку"));
                    }
                }
        ).bounds(x, y, 20, 18).build();

        gavno = button;

        e.addListener(button);
    }

    @SubscribeEvent
    public static void onScreenUpdate(ScreenEvent.Render e) {
        if (!(e.getScreen() instanceof InventoryScreen screen)) return;


        if (gavno != null) {
            int x = screen.getGuiLeft() + 127;
            int y = screen.height / 2 - 22;
            gavno.setX(x);
            gavno.setY(y);
        }
    }

ну вроде работает
2026-03-25_23.45.48.png2026-03-25_23.45.50.png

(Да и как реализовано обновление при открытии книжки тоже)
Оно в лямбде при нажатии на конопку применяется

Кнопка:
this.addRenderableWidget(new ImageButton(this.leftPos + 104, this.height / 2 - 22, 20, 18, 0, 0, 19, RECIPE_BUTTON_LOCATION, (p_289631_) -> {
    this.recipeBookComponent.toggleVisibility(); // тут изменяется состояние
    this.leftPos = this.recipeBookComponent.updateScreenPosition(this.width, this.imageWidth); // тут изменяется размер
    p_289631_.setPosition(this.leftPos + 104, this.height / 2 - 22);
    this.buttonClicked = true;
}));
 
Последнее редактирование:
Назад
Сверху