ocome Posted January 22, 2022 Share Posted January 22, 2022 (edited) 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 January 27, 2022 by ocome Quote Link to comment Share on other sites More sharing options...
ocome Posted January 22, 2022 Author Share Posted January 22, 2022 oh All right. I'll try it right away. thank you Quote Link to comment Share on other sites More sharing options...
ocome Posted January 22, 2022 Author Share Posted January 22, 2022 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(); } .... Quote Link to comment Share on other sites More sharing options...
Luis_ST Posted January 22, 2022 Share Posted January 22, 2022 2 hours ago, ocome said: Does this solve the problem with OverlayRegistry? called it in FMLClientSetupEvent Quote Link to comment Share on other sites More sharing options...
ocome Posted January 22, 2022 Author Share Posted January 22, 2022 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. Quote Link to comment Share on other sites More sharing options...
Luis_ST Posted January 23, 2022 Share Posted January 23, 2022 read the javadoc of OverlayRegistry.registerOverlayBelow 1 Quote Link to comment Share on other sites More sharing options...
ocome Posted January 24, 2022 Author Share Posted January 24, 2022 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. Quote Link to comment Share on other sites More sharing options...
ocome Posted January 27, 2022 Author Share Posted January 27, 2022 (edited) 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 January 27, 2022 by ocome Quote Link to comment Share on other sites More sharing options...
ocome Posted January 27, 2022 Author Share Posted January 27, 2022 I solved problem is Hunger value is duplicated Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.