Mod GUI

Версия Minecraft
1.19+
API
Forge
Привет всем! Я хотел бы понять, как создать пользовательский мод gui, который будет открываться по нажатию горячей клавиши или по команде в консоли. Он должен иметь функциональность как минимум маркетплейса. Мод должен быть привязан к логике Forge API, Minecraft 1.19.

От каких классов я могу наследовать? Какие классы использовать? Как регистрировать? Может поделитесь опытом или статьями полезными. Буду очень благодарен!

P.S.: Сделать это через плагин не проблема, но для меня категорически важно сделать мод.
 
627
72
178
гуи наследуешь от класса Screen. открываешь через Minecraft.getInstance().setScreen(new YourMarketplaceScreen());
если тебе нужно делать со слотами - тут уже сложнее и дольше. читай про MenuType, AbstractContainerMenu, AbstractContainerScreen тут, на оф. форуме или в документации
 
Да, спасибо, я так и начал делать. Получилось сделать при открытие инвентаря доп. кнопку. Изучу классы о которых вы упомянули.

А пока еще вопрос: что передавать в конструктор в super наследника Screen? Пока туда передается заглушка
+ еще проблема в том, что я наследовался от InventoryScreen, чтобы при открытии инвентаря отображался инвентарь с кнопкой. Но инвентарь перестал реагировать на перемещение предметов. То есть предмет нельзя поместить в другой слот


Java:
public class CustomInventoryScreen extends InventoryScreen {

public CustomInventoryScreen(Player p_98839_) {
    super(p_98839_);
}

@Override
public final void init() {
    super.init();
    this.addRenderableWidget(new Button(10, 10, 10, 10, Component.literal("TEST"), CustomInventoryScreen::onPress));
}


private static void onPress(Button button) {
    System.out.println("Press");
}
}

Вот такой класс у меня

Java:
@Mod.EventBusSubscriber(modid = CusctomInventoryTest.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT)
public class CustomScreenHandler {

    private static CustomScreen lastInventory;
    @SubscribeEvent
    public static void openInventoryGui(TickEvent.RenderTickEvent e) {
        Minecraft minecraft = Minecraft.getInstance();
        if (minecraft.screen != null) {
            Screen current = minecraft.screen;
            if (current.passEvents) {
//                minecraft.setScreen(new CustomScreen());
                minecraft.setScreen(new CustomInventoryScreen(minecraft.player));
            }
//            lastInventory = current instanceof CustomScreen ? (CustomScreen) current : null;
        }
    }
}
 
Подожжи. Если ты хочешь просто добавить кнопку в инвентарь - лучше юзай ивент ScreenEvent.InitScreenEvent, не придётся ломать ванильный код.
Основная задача - это сделать свой гуи для инвентаря или просто отдельный гуи, который будет реализовывать основные функции для маркетплейса (как в разных плагинах). Это нужно реализовать именно модом. На данный момент предпринимались попытки создания класса, который наследует Screen и сеттинг как нового ( minecraft.setScreen(new CustomScreen())), но перестает работать основной инвентарь (не перекладываются вещи из слота в слот). Также пытался переопределить класс InventoryScreen, но проблема, как и выше. Решил начать с простого, а именно, с добавления кнопки к основному инвентарю. Логика: слушаю событие ScreenEvent, и устанавливаю в качестве виджета новую кнопку.
Код:
Java:
@SubscribeEvent
    public static void openInventoryGui(ScreenEvent e) {
        Minecraft minecraft = Minecraft.getInstance();
        if (minecraft.screen != null) {
            Screen current = e.getScreen();
            if (current.passEvents) {
                Button button = new Button(10, 10, 10, 10, Component.literal("TEST"), (a) -> {
                    System.out.println("Press");
                });
                e.getScreen().renderables.add(button);
            }
        }
    }

Но пока кнопка не функционирует (должна в консоль выводить текст).
По поводу ScreenEvent.InitScreenEvent - с ним я ничего не смог сделать (нет его в классе, такого эвента не нашел).

Что можно почитать или какие гайды посмотреть на эту тему? Или может у кого есть советы или опыт в данном вопросе?
 
Сверху