Проверка решения

Версия Minecraft
1.19.2
API
Forge
14
1
Доброго времени форумчане :)

Занялся уже конкретно модификациями, вот задумал решить один кейс: отображать весь HUD пользователя только если у него надет железный шлем.
Долго я пытался разобраться.. Вроде много уроков прошел, так-то многое понятно, но пришлось попотеть.

Хотелось бы узнать компетентного взгляда, решение мое верное? Я правильно понял суть эвентов?
Или пинок под зад и обратно в туториалы :LOL:
Java:
    // Определяем переменную `isHelmet` для определения надет ли шлем.
    static boolean isHelmet = false;

    // Слушаем эвент брони и записываем надет ли на игроке железный шлем
    @SubscribeEvent
    public void onPlayerHelmet(RenderArmEvent event) {
        Player player = event.getPlayer();
        isHelmet = player.getItemBySlot(HEAD).getItem() == Items.IRON_HELMET;
    }

    // Слушаем эвенты рендера HUD, отключаем если шлема нет
    @SubscribeEvent
    public void onGameOverlayRenderPre(RenderGuiOverlayEvent.Pre event) {
        ResourceLocation overlay = event.getOverlay().id();

        if (!isHelmet) {
            if (VanillaGuiOverlay.AIR_LEVEL.id() == overlay) {
                event.setCanceled(true);
            } else if (VanillaGuiOverlay.ARMOR_LEVEL.id() == overlay) {
                event.setCanceled(true);
            } else if (VanillaGuiOverlay.EXPERIENCE_BAR.id() == overlay) {
                event.setCanceled(true);
            } else if (VanillaGuiOverlay.FOOD_LEVEL.id() == overlay) {
                event.setCanceled(true);
            } else if (VanillaGuiOverlay.PLAYER_HEALTH.id() == overlay) {
                event.setCanceled(true);
            } else if (VanillaGuiOverlay.MOUNT_HEALTH.id() == overlay) {
                event.setCanceled(true);
            } else if (VanillaGuiOverlay.HOTBAR.id() == overlay) {
                event.setCanceled(true);
            } else if (VanillaGuiOverlay.JUMP_BAR.id() == overlay) {
                event.setCanceled(true);
            } else if (VanillaGuiOverlay.POTION_ICONS.id() == overlay) {
                event.setCanceled(true);
            }
        }
    }

Заранее благодарности от меня!
 
1,470
132
266
Event - штука не из ваниллы.
HUD - штука из ваниллы.
Event вызывается, когда происходит необходимый нам процесс - тогда же и происходит вся их магия.
И узнать, можно ли отменой эвента отменить условный рендер, возможно просто взглянув на его доки. Там будет прописано cancellable. Ну или заглянуть под капот вызова - чуть сложнее, но нагляднее.
За примером долго ходить тоже не надо: WorldEvent.Load и PlayerInteractEvent (вроде так называются). Первый неотменяемый, а второй вполне себе.

Теперь что касается самого твоего кода.
1) Игрок у тебя в любом случае клиентский. И вместо static переменной (поля) лучше сразу в необходимом эвенте получать игрока через клиент игры. В твоём случае лучше запихать игрока в эвент рендера худа.
2) Если я не ошибаюсь, ты при помощи if-else if-else пробегаешься почти по всем вариантам рендера HUD. Почему бы тогда не действовать от обратного? Иначе говоря: вместо тысячи if сделать 1, но такой, который будет пропускать только нужные тебе элементы (TEXT и парочку других), а остальные все бросать в отмену?
3) Ну и на будущее: использование подобных static переменных (полей) не очень хорошо.
 
14
1
Теперь что касается самого твоего кода.
Спасибо большое за развернутый ответ.

По поводу первого пункта я не смог найти как запихнуть игрока в эвент рендера худа.. Покопаюсь еще.
Во втором - это действительно правда, заменить конструкцию ифов следовало бы, но у меня планы поэкспериментировать с худами. Попробовать сделать очки, которые апгрейдим и добавляется по худу. :unsure:
 
1,470
132
266
По поводу первого пункта я не смог найти как запихнуть игрока в эвент рендера худа.. Покопаюсь еще.
Minecraft.getInstance().getPlayer() - как-то так получается клиентский игрок.
Не забудь на null только проверить
Попробовать сделать очки, которые апгрейдим и добавляется по худу.
В таком случае, по-хорошему, нужно завести Enumerator, в который будем запихивать в зависимости от тира очков слои (уровни) рендера. Причём можно будет сделать некое сравнение этих тиров, и если тир A больше B, то тир A отображает его собственные данные + данные B (ну или что-то в таком духе).
В любом случае, пока оформилась лишь некая идея. Осталось её развить.
 
Сверху