Jump to content

[Solved] [1.17.1] Is there any way to make a boss bar use a color that isn't BossBarColor enum?


Recommended Posts

Posted (edited)

Basically, I want to have an orange boss bar (or gold as it's called in the ChatFormatting enum) but I can't set the color of that boss bar to anything that isn't in the BossBarColor enum.
Is there any way to bypass that requirement and set it to, as I said, a custom color that already exists in ChatFormatting?

Edited by uSkizzik
Posted
7 hours ago, diesieben07 said:

You'd basically have to write your own network code for it (because the vanilla network code only supports the enum) and then write your own BossEvent class for the server and the client which can store the color. You would then need to make your own texture for it and use RenderGameOverlayEvent.BossInfo to change the rendering.

Sweet! All that work just for a Halloween update. I'll still try it out tho.

Posted
On 9/5/2021 at 10:38 AM, diesieben07 said:

You'd basically have to write your own network code for it (because the vanilla network code only supports the enum) and then write your own BossEvent class for the server and the client which can store the color. You would then need to make your own texture for it and use RenderGameOverlayEvent.BossInfo to change the rendering.

How exactly can I render my custom boss bar?
Vanilla seems to be handling the boss event packet by calling Gui.getBossOverlay().update(). Do I need a custom packet (which I already made) or I need to somehow use the vanilla packet? The issue with a custom packet is that the update method requires an instance of the vanilla boss event packet.

Posted
3 minutes ago, diesieben07 said:

You have to either

  • Use reflection to put your own data into BossHealthOverlay#events
  • Keep your own list of the events

Wait, don't I actually need a custom BossHealthOverlay class because most of it uses vanilla BossEvent and BossBarColor?

Posted
Just now, diesieben07 said:

I am not sure I understand your question.

My question is do I need a custom version of BossHealthOverlay that uses ChatFormatting instead of the BossBarColor or no?

Posted
Just now, diesieben07 said:

Of course, the vanilla one cannot store anything but the built in colors.

Well, how am I supposed to handle the custom boss event packet then?
As I said, in vanilla it gets the boss overlay from the GUI and then updates it.

Posted
Just now, diesieben07 said:

You have to write your own network code for it. The vanilla network packets can only handle the built in colors.

Yes, I already have a custom packet but what I don't understand is how exactly I'm supposed to handle it.
Currently I'm using this line:

Minecraft.getInstance().gui.getBossOverlay().update(this);

But getBossOverlay returns an instance of BossHealthOverlay which, as you said, won't do the job.

Posted (edited)
37 minutes ago, diesieben07 said:

You send a custom network packet which adds it to the map of bars.

You then use the event I mentioned earlier to customize its rendering.

I still don't understand how that makes the game use my custom BossHealthOverlay.
The Gui class still makes an instance of the vanilla class and uses only the vanilla class.

Edit: Does the Gui class even need to use my custom class?

Edited by uSkizzik
Posted
2 minutes ago, diesieben07 said:

Uhm, what?

Take a look at the render method of the BossHealthOverlay.
It sets a variable called event that is ForgeHooksClient.bossBarRenderPre.
That's on lines 37 and 38.

Posted
1 minute ago, diesieben07 said:

Yes... that is what I already told you, here:

My issue is that I need to call this event in my custom version of BossHealthOverlay but I can't because it requires a LerpingBossEvent and I'm using a custom version of that class too.

Posted
40 minutes ago, diesieben07 said:

Make a custom LerpingBossEvent.

And what do I do with it? You told me to add it to the events field but it only accepts vanilla LerpingBossEvent

Posted
5 hours ago, uSkizzik said:

events field but it only accepts vanilla LerpingBossEvent

So your custom one should extend it, or as diesieben said just store it yourself.

Then render the custom one in RenderOverlayEvent.

Posted
5 hours ago, poopoodice said:

So your custom one should extend it

Vanilla LerpingBossEvent extends vanilla BossBar which isn't what I want.

5 hours ago, poopoodice said:

or as diesieben said just store it yourself.

Then render the custom one in RenderOverlayEvent.

How would I render it via RenderOverlayEvent? 

Posted
Just now, diesieben07 said:

Then what do you want?

Well I need it to extend a custom version of BossBar, don't I?

1 minute ago, diesieben07 said:

You subscribe to the event and then render whatever you want on screen.

What method tho?

Posted
Just now, diesieben07 said:

No, why?

Well, I need to change the BossEvent.BossBarColor to ChatFormatting.

2 minutes ago, diesieben07 said:

Please elaborate.

I subscribe to the event, then what?

Posted
41 minutes ago, diesieben07 said:

You draw on the screen. Same as the vanilla boss bar rendering does, but adapted to your needs.

Alright, I'm running into issues with having a custom LerpingBossEvent because the vanilla events field requires a vanilla LerpingBossEvent.
I can't extend it because it itself extends BossEvent and I need it to extend my custom BossEvent.
I also can't make my own events field because then I'll have to call ForgeHooksClient#bossBarRenderPre myself and it also requires a vanilla LerpingBossEvent.
I have no idea what I'm doing and I might just give up...

Posted
1 minute ago, diesieben07 said:

Why?

56 minutes ago, uSkizzik said:

Well, I need to change the BossEvent.BossBarColor to ChatFormatting.

 

2 minutes ago, diesieben07 said:

If you make your own fields, ignore the whole vanilla system and use RenderGameOverlayEvent.Pre to render it

Yea I can actually just do that-

Posted

Alright, I finally got something!
The text is finally rendering (Don't know how, but it works without any errors). What I need now is the actual bar rendering.
I see that vanilla BossHealthOverlay has a method called "drawBar" which uses GuiComponent#blit to draw the bar. How would I do that in my class?
Here's what I currently have:

@Mod.EventBusSubscriber(modid = ProjectApple.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE)
public class PA_RenderGameOverlayEvent {
    private static final ResourceLocation GUI_BARS_LOCATION = new ResourceLocation("textures/gui/bars.png");
    private static final Minecraft minecraft = Minecraft.getInstance();

    @SubscribeEvent
    public static void registerBossBarRendering(RenderGameOverlayEvent.Pre event) {
        Map<UUID, PA_LerpingBossEvent> events = PA_BossEventPacket.getEvents();
        if (!events.isEmpty()) {
            int i = minecraft.getWindow().getGuiScaledWidth();
            int j = 12;

            for(PA_LerpingBossEvent lerpingEvent : events.values()) {
                int k = i / 2 - 91;
                if (!event.isCanceled()) {
                    RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
                    RenderSystem.setShaderTexture(0, GUI_BARS_LOCATION);
                    Component component = lerpingEvent.getName();
                    int l = minecraft.font.width(component);
                    int i1 = i / 2 - l / 2;
                    int j1 = j - 9;
                    minecraft.font.drawShadow(event.getMatrixStack(), component, (float)i1, (float)j1, 16777215);
                }

                if (j >= minecraft.getWindow().getGuiScaledHeight() / 3) {
                    break;
                }
            }
        }
    }
}

P.S.: I know that I need a custom bars texture. I'm using the vanilla one as a placeholder until I get the rendering done.

Posted
14 minutes ago, diesieben07 said:

Exactly the same way...?

I need an instance of BossHealthOverlay to actually call the blit method.

17 minutes ago, diesieben07 said:

This will be called many times every frame. You have to check event.getType.

Yea I actually noticed that but thought it's supposed to be like that.

19 minutes ago, diesieben07 said:

However in 1.17 there is also the overlay registry, which should be used instead, but I have not used it yet.

I'll stick with the getType method. I just have to check if it's RenderGameOverlayEvent.ElementType.BOSSINFO, right?

Posted (edited)
2 minutes ago, diesieben07 said:

No, you do not. blit is a static method of the GuiComponent class.

I was looking at the one that BossHealthOverlay uses and didn't see the other ones...

1 minute ago, diesieben07 said:

No, that no longer fires. You have to check for ALL I think.

I'll try it out

Edited by uSkizzik
Posted

At least it's something...
image.png.d7e36df1e3ec1371d91ff005942a374d.png
It manages to render in and out whenever needed but it also looks like this ^ and whenever another boss bar is rendered in, it doesn't move down.
Btw here's the method I'm using for the drawing (only difference from vanilla being that the offset is 80 instead of whatever it is in vanilla)

GuiComponent.blit(pose, windowWidth, windowHeight, 80, 0, bossEvent.getColor().ordinal() * 5 * 2, 182, 5, 265, 265);

 

Posted
2 minutes ago, diesieben07 said:

You'll have to code the moving down manually. And it won't cooperate with vanilla. This is why I originally told you to use an extension of the vanilla class and shove it into the list.

Yea that's gonna be a pain but I'll figure it out (I hope)
Now, about the issue with the texture... Any ideas of how to fix that?
Maybe it's related to the progress of the bar?

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...

×   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.

Announcements



×
×
  • Create New...

Important Information

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