From b17b6a22deb138bdbc91ed9c2bf7ac1e9538e9c8 Mon Sep 17 00:00:00 2001 From: Fretux Date: Sat, 24 Jan 2026 09:16:16 +0100 Subject: [PATCH] Add configurable HUD bar positioning --- .../java/net/fretux/mindmotion/ConfigMM.java | 34 ++++++++++- .../mindmotion/client/SanityTempoOverlay.java | 57 ++++++++++++------- 2 files changed, 68 insertions(+), 23 deletions(-) diff --git a/src/main/java/net/fretux/mindmotion/ConfigMM.java b/src/main/java/net/fretux/mindmotion/ConfigMM.java index 4d1dfc5..18e3212 100644 --- a/src/main/java/net/fretux/mindmotion/ConfigMM.java +++ b/src/main/java/net/fretux/mindmotion/ConfigMM.java @@ -27,6 +27,12 @@ public final class ConfigMM { public final ForgeConfigSpec.BooleanValue DISABLE_SHADERS; public final ForgeConfigSpec.DoubleValue FLASH_STRENGTH_MULTIPLIER; public final ForgeConfigSpec.DoubleValue SANITY_DESAT_MULTIPLIER; + public final ForgeConfigSpec.IntValue BAR_WIDTH; + public final ForgeConfigSpec.IntValue BAR_HEIGHT; + public final ForgeConfigSpec.IntValue TEMPO_BAR_X_OFFSET; + public final ForgeConfigSpec.IntValue TEMPO_BAR_Y_OFFSET; + public final ForgeConfigSpec.IntValue SANITY_BAR_X_OFFSET; + public final ForgeConfigSpec.IntValue SANITY_BAR_Y_OFFSET; Client(ForgeConfigSpec.Builder b) { b.push("visual"); @@ -43,6 +49,32 @@ public final class ConfigMM { .comment("Intensity of desaturation from low sanity.") .defineInRange("sanityDesaturationMultiplier", 1.0, 0.0, 3.0); + b.pop().push("hud"); + + BAR_WIDTH = b + .comment("Width of sanity/tempo bars in pixels.") + .defineInRange("barWidth", 102, 40, 240); + + BAR_HEIGHT = b + .comment("Height of sanity/tempo bars in pixels.") + .defineInRange("barHeight", 9, 4, 30); + + TEMPO_BAR_X_OFFSET = b + .comment("Horizontal offset for the tempo bar relative to its default position.") + .defineInRange("tempoBarXOffset", 0, -300, 300); + + TEMPO_BAR_Y_OFFSET = b + .comment("Vertical offset for the tempo bar relative to its default position.") + .defineInRange("tempoBarYOffset", 0, -300, 300); + + SANITY_BAR_X_OFFSET = b + .comment("Horizontal offset for the sanity bar relative to its default position.") + .defineInRange("sanityBarXOffset", 0, -300, 300); + + SANITY_BAR_Y_OFFSET = b + .comment("Vertical offset for the sanity bar relative to its default position.") + .defineInRange("sanityBarYOffset", 0, -300, 300); + b.pop(); } } @@ -108,4 +140,4 @@ public final class ConfigMM { @SubscribeEvent public static void onReload(ModConfigEvent.Reloading e) { } -} \ No newline at end of file +} diff --git a/src/main/java/net/fretux/mindmotion/client/SanityTempoOverlay.java b/src/main/java/net/fretux/mindmotion/client/SanityTempoOverlay.java index 4bb65b5..b5cbce8 100644 --- a/src/main/java/net/fretux/mindmotion/client/SanityTempoOverlay.java +++ b/src/main/java/net/fretux/mindmotion/client/SanityTempoOverlay.java @@ -1,6 +1,7 @@ package net.fretux.mindmotion.client; import com.mojang.blaze3d.systems.RenderSystem; +import net.fretux.mindmotion.ConfigMM; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; @@ -12,8 +13,8 @@ import net.minecraftforge.fml.common.Mod; @Mod.EventBusSubscriber(modid = "mindmotion", value = Dist.CLIENT) public class SanityTempoOverlay { - private static final int BAR_WIDTH = 102; - private static final int BAR_HEIGHT = 9; + private static final int DEFAULT_LABEL_OFFSET = 10; + private static final int DEFAULT_VENT_OFFSET = 22; @SubscribeEvent public static void onRenderOverlay(RenderGuiOverlayEvent.Post event) { @@ -22,21 +23,29 @@ public class SanityTempoOverlay { GuiGraphics gui = event.getGuiGraphics(); int width = event.getWindow().getGuiScaledWidth(); int height = event.getWindow().getGuiScaledHeight(); - int y = height - 48; - int xTempo = 8; - int xSanity = width - BAR_WIDTH - 8; + int barWidth = ConfigMM.CLIENT.BAR_WIDTH.get(); + int barHeight = ConfigMM.CLIENT.BAR_HEIGHT.get(); + int labelOffset = Math.max(DEFAULT_LABEL_OFFSET, barHeight + 1); + int ventOffset = Math.max(DEFAULT_VENT_OFFSET, labelOffset + 12); + int baseY = height - 48; + int baseTempoX = 8; + int baseSanityX = width - barWidth - 8; + int xTempo = baseTempoX + ConfigMM.CLIENT.TEMPO_BAR_X_OFFSET.get(); + int yTempo = baseY + ConfigMM.CLIENT.TEMPO_BAR_Y_OFFSET.get(); + int xSanity = baseSanityX + ConfigMM.CLIENT.SANITY_BAR_X_OFFSET.get(); + int ySanity = baseY + ConfigMM.CLIENT.SANITY_BAR_Y_OFFSET.get(); float sanity = ClientData.SANITY; float insanity = ClientData.INSANITY; float tempo = ClientData.TEMPO; float sanityPercent = sanity / ClientData.MAX_SANITY; float insanityPercent = insanity / ClientData.MAX_SANITY; float tempoPercent = (float) tempo / (float) ClientData.MAX_TEMPO; - int sanityFill = (int) (BAR_WIDTH * sanityPercent); - int tempoFill = (int) (BAR_WIDTH * tempoPercent); - int insanityFill = (int) (BAR_WIDTH * insanityPercent); + int sanityFill = (int) (barWidth * sanityPercent); + int tempoFill = (int) (barWidth * tempoPercent); + int insanityFill = (int) (barWidth * insanityPercent); RenderSystem.enableBlend(); - drawRoundedBar(gui, xTempo, y, BAR_WIDTH, BAR_HEIGHT, 0xFF33AFFF, tempoFill); - gui.drawString(mc.font, Component.literal("Tempo"), xTempo, y - 10, 0x66CCFF, false); + drawRoundedBar(gui, xTempo, yTempo, barWidth, barHeight, 0xFF33AFFF, tempoFill); + gui.drawString(mc.font, Component.literal("Tempo"), xTempo, yTempo - labelOffset, 0x66CCFF, false); if (ClientData.VENT_COOLDOWN > 0) { int seconds = ClientData.VENT_COOLDOWN / 20; String ventText = "Vent: " + seconds + "s"; @@ -44,35 +53,39 @@ public class SanityTempoOverlay { mc.font, Component.literal(ventText), xTempo, - y - 22, + yTempo - ventOffset, 0x33AFFF, false ); } boolean insaneMode = sanity <= 0; if (!insaneMode) { - drawRoundedBar(gui, xSanity, y, BAR_WIDTH, BAR_HEIGHT, 0xFFFFFFFF, sanityFill); - gui.drawString(mc.font, Component.literal("Sanity"), xSanity + BAR_WIDTH - 30, y - 10, 0xFFFFFF, false); + drawRoundedBar(gui, xSanity, ySanity, barWidth, barHeight, 0xFFFFFFFF, sanityFill); + int sanityLabelWidth = mc.font.width("Sanity"); + int sanityLabelX = xSanity + barWidth - sanityLabelWidth; + gui.drawString(mc.font, Component.literal("Sanity"), sanityLabelX, ySanity - labelOffset, 0xFFFFFF, false); } else { int purple = 0xFFAA33FF; int darkPurple = 0xFF6611AA; - drawRoundedRect(gui, xSanity, y, BAR_WIDTH, BAR_HEIGHT, 0xDD000000); - drawRoundedRect(gui, xSanity, y, insanityFill, BAR_HEIGHT, purple, darkPurple); - gui.drawString(mc.font, Component.literal("Insanity"), xSanity + BAR_WIDTH - 42, y - 10, 0xCC66FF, false); + drawRoundedRect(gui, xSanity, ySanity, barWidth, barHeight, 0xDD000000); + drawRoundedRect(gui, xSanity, ySanity, insanityFill, barHeight, purple, darkPurple); + int insanityLabelWidth = mc.font.width("Insanity"); + int insanityLabelX = xSanity + barWidth - insanityLabelWidth; + gui.drawString(mc.font, Component.literal("Insanity"), insanityLabelX, ySanity - labelOffset, 0xCC66FF, false); } double mouseX = mc.mouseHandler.xpos() * width / (double) event.getWindow().getScreenWidth(); double mouseY = mc.mouseHandler.ypos() * height / (double) event.getWindow().getScreenHeight(); - if (isMouseOver(mouseX, mouseY, xTempo, y, BAR_WIDTH, BAR_HEIGHT)) { + if (isMouseOver(mouseX, mouseY, xTempo, yTempo, barWidth, barHeight)) { String text = String.format("%.0f%%", tempoPercent * 100f); - gui.drawCenteredString(mc.font, text, xTempo + BAR_WIDTH / 2, y - 12, 0x66CCFF); + gui.drawCenteredString(mc.font, text, xTempo + barWidth / 2, yTempo - (labelOffset + 2), 0x66CCFF); } - if (isMouseOver(mouseX, mouseY, xSanity, y, BAR_WIDTH, BAR_HEIGHT)) { + if (isMouseOver(mouseX, mouseY, xSanity, ySanity, barWidth, barHeight)) { if (!insaneMode) { String text = String.format("%.0f%%", sanityPercent * 100f); - gui.drawCenteredString(mc.font, text, xSanity + BAR_WIDTH / 2, y - 12, 0xFFFFFF); + gui.drawCenteredString(mc.font, text, xSanity + barWidth / 2, ySanity - (labelOffset + 2), 0xFFFFFF); } else { String text = String.format("%.0f%%", insanityPercent * 100f); - gui.drawCenteredString(mc.font, text, xSanity + BAR_WIDTH / 2, y - 12, 0xCC66FF); + gui.drawCenteredString(mc.font, text, xSanity + barWidth / 2, ySanity - (labelOffset + 2), 0xCC66FF); } } } @@ -99,4 +112,4 @@ public class SanityTempoOverlay { private static boolean isMouseOver(double mx, double my, int x, int y, int w, int h) { return mx >= x && mx <= x + w && my >= y && my <= y + h; } -} \ No newline at end of file +}