Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

I wanted to implement mana values, so I first tried to run it using Bosshealth, but nothing shows up!
I think it's not being called, but is it impossible to call it in init?

 

Mana health

public class ManaHealthOverlay extends GuiComponent {
    private final Minecraft minecraft;
    private static final ResourceLocation GUI_MANA_LOCATION = new ResourceLocation("textures/gui/bars.png");
    private static final int BAR_WIDTH = 182;
    private static final int BAR_HEIGHT = 5;
    private static final int OVERLAY_OFFSET = 80;
    final Map<UUID, LerpingBossEvent> events = Maps.newLinkedHashMap();

    private static final ManaHealthOverlay INSTANCE = new ManaHealthOverlay();
    public static void init()
    {
        MinecraftForge.EVENT_BUS.register(INSTANCE);
    }


    public ManaHealthOverlay() {
        this.minecraft = Minecraft.getInstance();
    }
  
  
    public void render(PoseStack p_93705_) {
        //if (!this.events.isEmpty()) {
            int i = this.minecraft.getWindow().getGuiScaledWidth();
            int j = 12;

            for(LerpingBossEvent lerpingbossevent : this.events.values()) {
                int k = i / 2 - 91;
......

main

    public Mod() {
        ManaHealthOverlay.init();

Edited by ocome

  • Author
    public ManaHealthOverlay() {
        this.minecraft = Minecraft.getInstance();

        OverlayRegistry.registerOverlayBelow(ForgeIngameGui.FOOD_LEVEL_ELEMENT , "Mana", this);
    }

Does this solve the problem with OverlayRegistry?
I thought I had implemented Mana based on the player's stats.
But nothing shows up.
Is it still not enough?

 

The second half is equivalent to playerhealth, only the values have been changed.

public class ManaOverlay extends GuiComponent  implements IIngameOverlay {
    protected int screenWidth;
    protected int screenHeight;
    protected int tickCount;
    protected int lastMana;
    protected int displayMana;
    protected long lastManaTime;
    protected long manaBlinkTime;
    private final Minecraft minecraft;
    protected final Random random = new Random();
    private static final ResourceLocation GUI_MANA_LOCATION = new ResourceLocation("textures/gui/bars.png");
    final Map<UUID, LerpingBossEvent> events = Maps.newLinkedHashMap();

    private static final  ManaOverlay INSTANCE = new ManaOverlay();
    public static void init()
    {
        MinecraftForge.EVENT_BUS.register(INSTANCE);
    }


    public ManaOverlay() {
        this.minecraft = Minecraft.getInstance();

        OverlayRegistry.registerOverlayBelow(ForgeIngameGui.FOOD_LEVEL_ELEMENT , "Mana", this);
    }

    private Player getCameraPlayer() {
        return !(this.minecraft.getCameraEntity() instanceof Player) ? null : (Player)this.minecraft.getCameraEntity();
    }
....
2 hours ago, ocome said:

Does this solve the problem with OverlayRegistry?

called it in FMLClientSetupEvent

  • Author

I added it like this

main

    private void doClientStuff(final FMLClientSetupEvent event) {
        event.enqueueWork(() -> {
            OverlayRegistry.registerOverlayBelow(ForgeIngameGui.FOOD_LEVEL_ELEMENT , "Mana", new ManaOverlay());
        });
    }

But it's not working.

 

I feel that you don't understand about main...
I'll try to find it.

  • Author

I see.
It says that enqueue is not necessary.
I was wondering if I had to call the event again somewhere.
I was able to call the existing health and see that the two rows of stats are displayed!
Thank you Luis.

  • Author

public class ManaOverlay extends Gui implements IIngameOverlay
{

    private final Minecraft mc;
    private Font font = null;
    public int left_height = 39;
    public int right_height = 49;
    private RenderGameOverlayEvent eventParent;
    public static final ResourceLocation GUI_MANA_LOCATION = new ResourceLocation("textures/gui/icons.png");
    private static final ManaOverlay INSTANCE = new ManaOverlay(Minecraft.getInstance());

    public ManaOverlay(Minecraft p_93005_) {
        super(p_93005_);

        this.mc = Minecraft.getInstance();
        this.font = mc.font;
        OverlayRegistry.registerOverlayTop("Mana ", (gui, mStack, partialTicks, screenWidth, screenHeight) -> {
            boolean isMounted = gui.minecraft.player.getVehicle() instanceof LivingEntity;
            if (!isMounted && !gui.minecraft.options.hideGui && gui.shouldDrawSurvivalElements())
            {
                setupOverlayRenderState(true, false);
                renderMana(screenWidth, screenHeight, mStack);
            }
        });

    }

    public void setupOverlayRenderState(boolean blend, boolean depthText)
    {
        setupOverlayRenderState(blend, depthText, GUI_MANA_LOCATION);
    }

    public void setupOverlayRenderState(boolean blend, boolean depthTest, @Nullable ResourceLocation texture)
    {
        if (blend)
        {
            RenderSystem.enableBlend();
            RenderSystem.defaultBlendFunc();
        }
        else
        {
            RenderSystem.disableBlend();
        }

        if (depthTest)
        {
            RenderSystem.enableDepthTest();
        }
        else
        {
            RenderSystem.disableDepthTest();
        }

        if (texture != null)
        {
            RenderSystem.enableTexture();
            bind(texture);
        }
        else
        {
            RenderSystem.disableTexture();
        }

        RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
        RenderSystem.setShader(GameRenderer::getPositionTexShader);
    }


    public static void init()
    {
        MinecraftForge.EVENT_BUS.register(INSTANCE);
    }

    public void renderMana(int width, int height, PoseStack mStack)
    {
        minecraft.getProfiler().push("mana");

        Player player = (Player)this.minecraft.getCameraEntity();
        RenderSystem.enableBlend();
        int left = width / 2 + 91;
        int top = height - right_height ;

        boolean unused = false;// Unused flag in vanilla, seems to be part of a 'fade out' mechanic

        FoodData stats = minecraft.player.getFoodData();
        int level = stats.getFoodLevel();

        for (int i = 0; i < 10; ++i)
        {
            int idx = i * 2 + 1;
            int x = left - i * 8 - 9;
            int y = top;
            int icon = 16;
            byte background = 0;

            if (minecraft.player.hasEffect(MobEffects.HUNGER))
            {
                icon += 36;
                background = 13;
            }
            if (unused) background = 1; //Probably should be a += 1 but vanilla never uses this

            if (player.getFoodData().getSaturationLevel() <= 0.0F && tickCount % (level * 3 + 1) == 0)
            {
                y = top + (random.nextInt(3) - 1);
            }

            blit(mStack, x, y, 16 + background * 9, 27, 9, 9);

            if (idx < level)
                blit(mStack, x, y, icon + 36, 27, 9, 9);
            else if (idx == level)
                blit(mStack, x, y, icon + 45, 27, 9, 9);
        }
        RenderSystem.disableBlend();
        minecraft.getProfiler().pop();
    }

    @Override
    public void render(ForgeIngameGui gui, PoseStack pStack, float partialTicks, int width, int height)
    {
        this.screenWidth = this.minecraft.getWindow().getGuiScaledWidth();
        this.screenHeight = this.minecraft.getWindow().getGuiScaledHeight();
        eventParent = new RenderGameOverlayEvent(pStack, partialTicks, this.minecraft.getWindow());

        if (pre(ALL, pStack)) return;

        font = minecraft.font;

        this.random.setSeed(tickCount * 312871L);

        OverlayRegistry.orderedEntries().forEach(entry -> {
            try
            {
                if (!entry.isEnabled()) return;
                IIngameOverlay overlay = entry.getOverlay();
                if (pre(overlay, pStack)) return;
                //overlay.render(this, pStack, partialTicks, screenWidth, screenHeight);
                post(overlay, pStack);
            }
            catch(Exception e)
            {

            }
        });

        RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);

        post(ALL, pStack);
    }


    private boolean pre(RenderGameOverlayEvent.ElementType type, PoseStack mStack)
    {
        return MinecraftForge.EVENT_BUS.post(new RenderGameOverlayEvent.Pre(mStack, eventParent, type));
    }
    private void post(RenderGameOverlayEvent.ElementType type, PoseStack mStack)
    {
        MinecraftForge.EVENT_BUS.post(new RenderGameOverlayEvent.Post(mStack, eventParent, type));
    }
    private boolean pre(IIngameOverlay overlay, PoseStack mStack)
    {
        return MinecraftForge.EVENT_BUS.post(new RenderGameOverlayEvent.PreLayer(mStack, eventParent, overlay));
    }
    private void post(IIngameOverlay overlay, PoseStack mStack)
    {
        MinecraftForge.EVENT_BUS.post(new RenderGameOverlayEvent.PostLayer(mStack, eventParent, overlay));
    }
    private void bind(ResourceLocation res)
    {
        RenderSystem.setShaderTexture(0, res);
    }
}

Thanks to you, I was able to display it.
However, the bar that uses the full hunger keeps shaking.
I wonder why that is?

Then I feel like it's getting heavier ...

Edited by ocome

  • ocome changed the title to [SOLVED][1.18]GUI is not displayed.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.