Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[SOLVED][1.18]GUI is not displayed.


ocome
 Share

Recommended Posts

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
Link to comment
Share on other sites

    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();
    }
....
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites


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
Link to comment
Share on other sites

  • 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
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.