forge 1.16.5 создание кастомного gui

Версия Minecraft
1.16.5
API
Forge
16
0
искал как создать gui нашёл только один способ для 1.16.5
класс самого Gui:
import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.AbstractGui;

import static net.minecraft.client.gui.AbstractGui.drawCenteredString;
import static org.hellomira.coftic.Coftic.LOGGER;

public class Gui extends AbstractGui {
        //отображаемый текст
        static String text = "Hello Gui!";

    public Gui(Minecraft mc, MatrixStack ms) {

            super();

            LOGGER.info("Gui");
            int width = mc.getMainRenderTarget().width;
            int height = mc.getMainRenderTarget().height;
            drawCenteredString(ms, mc.gui.getFont() , text, width / 2, (height / 2) - 4, 0xFFFFFF);
            // 10526880 это цвет текста
        }
}
Основной Класс мода:
@Mod("coftic")
public class Coftic {

    // Directly reference a log4j logger.
    static final Logger LOGGER = LogManager.getLogger();

    public Coftic() {
        MinecraftForge.EVENT_BUS.register(new RenderGuiHandler());
        // Register the setup method for modloading
        // Register the enqueueIMC method for modloading
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::enqueueIMC);
        // Register the processIMC method for modloading
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::processIMC);
        // Register the doClientStuff method for modloading
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);

        // Register ourselves for server and other game events we are interested in
        MinecraftForge.EVENT_BUS.register(this);
    }
    //Там дальше просто методы которые создаются автоматически


    private void doClientStuff(final FMLClientSetupEvent event) {
        // do something that can only be done on the client
        LOGGER.info("Got game settings {}", event.getMinecraftSupplier().get().options);
    }

    private void enqueueIMC(final InterModEnqueueEvent event) {
        // some example code to dispatch IMC to another mod
        InterModComms.sendTo("coftic", "helloworld", () -> {
            LOGGER.info("Hello world from the MDK");
            return "Hello world";
        });
    }

    private void processIMC(final InterModProcessEvent event) {
        // some example code to receive and process InterModComms from other mods
        LOGGER.info("Got IMC {}", event.getIMCStream().map(m -> m.getMessageSupplier().get()).collect(Collectors.toList()));
    }

    // You can use SubscribeEvent and let the Event Bus discover methods to call


    // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD
    // Event bus for receiving Registry Events)
    @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
    public static class RegistryEvents {
        @SubscribeEvent
        public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) {
            // register a new block here
            LOGGER.info("HELLO from Register Block");
        }
    }
}
Класс для вызова интерфейса:
public class RenderGuiHandler {

    @SubscribeEvent
    public void onRenderGui(RenderGameOverlayEvent.Post event) {
        LOGGER.info("onGui");
        if (event.getType() != RenderGameOverlayEvent.ElementType.EXPERIENCE) {

            new Gui(Minecraft.getInstance(), event.getMatrixStack()); //рендерим свой интерфейс
            return; //в моём случае, если у игрока зарендерилась полоска опыта
        }
        LOGGER.info("Gui1");
        new Gui(Minecraft.getInstance(), event.getMatrixStack()); //рендерим свой интерфейс

    }
}

ошибки в игре не появляются. Текст просто не выводится.
 
пришёл закрыть тему потому что понял что надо было использовать mc.gui.getFont() вместо mc.font но почему тут всё так же хотя я только что это строку заменил?
Не совсем понял, где тут всё так же, но тебе же выше всё написали:
Надо использовать mc.getWindow().getGuiScaledWidth().
Ты используешь высоту/ширину текущего framebuffer'a(в результате x и y твоего текста где-то вообще хз где).
 
Тут происходит полный...

1) Регистрировать GUI для 1.16.5 НЕ НАДО; достаточно создать класс, в родителях которого есть Screen. Это не касается Gui для контейнеров, там отдельная тема.
2) Для открытия гуи используется клиент майна: Minecraft.getInstance().setScreen(new ТвойГуи(арги))
3) HUD != GUI. GameOverlay == HUD. Ок? Не пытайся заменить полоску опыта (которая HUD) каким-то Screen.
4) Отмена эвента происходит иным способом: event.setCanceled(true) , и то, только для эвентов, которые можно отменить.
5) Рендер текста в гуи НЕ ПРОИСХОДИТ В КОНСТРУКТОРЕ. Боже, конструктор используется только для создания объекта (инициализация полей и т.д.), но никак не для рендера чего-либо. Для рендера есть отдельный метод в Screen, еси чо.
6) Логгеры используются для дебага, это правда; но в твоём случае больше подходят брейкпоинты.

Используй IDE при разработке мода, а не блокнот. (извините, но ощущение именно такое от скинутого выше кода)

Ну и наконец: если не знаешь как что-то сделать, то поищи гайды на английском; не нашёл, посмотри на то, что уже делали до тебя.
 
Два варианта на выбор:
1) Посмотри туториалы от Kaupegoe или как то так, на ютубе. Очень поможет, если ты хочешь начать делать моды. Особенно если подрубить нейропереводчик от яндекса. Хотя мне больше нравится по старинке, текстовые гайды.
2) Если ты хочешь без обучения, вот прям сразу прям щас, и именно то что ты хочешь, тогда используй чатжпт и попробуй попросить его написать мод за тебя. Ты помучаешься несколько часов, пытаясь делать по его советам, которые меняются на ходу от сообщения к сообщению, поймешь что это гиблое дело и либо пойдешь goto шаг 1, либо System.exit();
Хорошего вечера!
 
Тут происходит полный...

1) Регистрировать GUI для 1.16.5 НЕ НАДО; достаточно создать класс, в родителях которого есть Screen. Это не касается Gui для контейнеров, там отдельная тема.
2) Для открытия гуи используется клиент майна: Minecraft.getInstance().setScreen(new ТвойГуи(арги))
3) HUD != GUI. GameOverlay == HUD. Ок? Не пытайся заменить полоску опыта (которая HUD) каким-то Screen.
4) Отмена эвента происходит иным способом: event.setCanceled(true) , и то, только для эвентов, которые можно отменить.
5) Рендер текста в гуи НЕ ПРОИСХОДИТ В КОНСТРУКТОРЕ. Боже, конструктор используется только для создания объекта (инициализация полей и т.д.), но никак не для рендера чего-либо. Для рендера есть отдельный метод в Screen, еси чо.
6) Логгеры используются для дебага, это правда; но в твоём случае больше подходят брейкпоинты.

Используй IDE при разработке мода, а не блокнот. (извините, но ощущение именно такое от скинутого выше кода)

Ну и наконец: если не знаешь как что-то сделать, то поищи гайды на английском; не нашёл, посмотри на то, что уже делали до тебя.
я пишу в giga ide весь код я искал на другом форуме поэтому он такой грязный
 
Назад
Сверху