From 7dc4b7923b486ed5f3335346b08572eb854597d5 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 7 May 2026 23:08:37 +0000 Subject: [PATCH 1/2] feat: add per-mod scale slider to HUD elements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each HUD mod now has a Scale setting (0.5x–3.0x, default 1.0x) that resizes its text and background using matrix transformation. Layout calculations for all orientations and custom positions account for the scaled dimensions so elements remain properly positioned. https://claude.ai/code/session_01SxKxSuPq5hqaTDD9tDJQk1 --- .../java/dsns/betterhud/BetterHUDGUI.java | 75 +++++++++---------- src/main/java/dsns/betterhud/ModMenu.java | 8 ++ .../java/dsns/betterhud/util/CustomText.java | 2 + .../java/dsns/betterhud/util/ModSettings.java | 1 + 4 files changed, 45 insertions(+), 41 deletions(-) diff --git a/src/main/java/dsns/betterhud/BetterHUDGUI.java b/src/main/java/dsns/betterhud/BetterHUDGUI.java index 7d2b187..df8f342 100644 --- a/src/main/java/dsns/betterhud/BetterHUDGUI.java +++ b/src/main/java/dsns/betterhud/BetterHUDGUI.java @@ -1,5 +1,6 @@ package dsns.betterhud; +import com.mojang.blaze3d.vertex.PoseStack; import dsns.betterhud.util.BaseMod; import dsns.betterhud.util.CustomText; import dsns.betterhud.util.ModSettings; @@ -79,48 +80,31 @@ public void onHudRender( for (CustomText text : topLeftText) { drawString(drawContext, text, x, y); - - y += - (client.font.lineHeight - 1) + - (verticalPadding * 2) + - lineHeight; + y += scaledElementHeight(text) + lineHeight; } y = client.getWindow().getGuiScaledHeight() - verticalMargin; for (CustomText text : bottomLeftList) { - y -= (client.font.lineHeight - 1) + (verticalPadding * 2); + y -= scaledElementHeight(text); drawString(drawContext, text, x, y); y -= lineHeight; } y = verticalMargin; for (CustomText text : topRightText) { - int offset = - (client.font.width(text.text) - 1) + - (horizontalPadding * 2) + - horizontalMargin; + int offset = scaledElementWidth(text) + horizontalMargin; x = client.getWindow().getGuiScaledWidth() - offset; drawString(drawContext, text, x, y); - - y += - (client.font.lineHeight - 1) + - (verticalPadding * 2) + - lineHeight; + y += scaledElementHeight(text) + lineHeight; } y = client.getWindow().getGuiScaledHeight() - verticalMargin; for (CustomText text : bottomRightText) { - int offset = - (client.font.width(text.text) - 1) + - (horizontalPadding * 2) + - horizontalMargin; + int offset = scaledElementWidth(text) + horizontalMargin; x = client.getWindow().getGuiScaledWidth() - offset; - - y -= (client.font.lineHeight - 1) + (verticalPadding * 2); - + y -= scaledElementHeight(text); drawString(drawContext, text, x, y); - y -= lineHeight; } @@ -130,17 +114,15 @@ public void onHudRender( int maxX = client.getWindow().getGuiScaledWidth() - - (horizontalPadding * 2) - - (client.font.width(text.text) - 1); + scaledElementWidth(text); int maxY = client.getWindow().getGuiScaledHeight() - - (verticalPadding * 2) - - (client.font.lineHeight - 1); + scaledElementHeight(text); - int scaledX = (int) (xPercent * maxX); - int scaledY = (int) (yPercent * maxY); + int posX = (int) (xPercent * maxX); + int posY = (int) (yPercent * maxY); - drawString(drawContext, text, scaledX, scaledY); + drawString(drawContext, text, posX, posY); } } @@ -150,23 +132,34 @@ private void drawString( int x, int y ) { - drawContext.fill( - x, - y, - x + - (client.font.width(text.text) - 1) + - (horizontalPadding * 2), - y + (client.font.lineHeight - 1) + (verticalPadding * 2), - text.backgroundColor - ); + PoseStack poses = drawContext.pose(); + poses.pushPose(); + poses.translate(x, y, 0); + poses.scale(text.scale, text.scale, 1.0f); + int w = (client.font.width(text.text) - 1) + (horizontalPadding * 2); + int h = (client.font.lineHeight - 1) + (verticalPadding * 2); + + drawContext.fill(0, 0, w, h, text.backgroundColor); drawContext.text( client.font, text.text, - x + horizontalPadding, - y + verticalPadding, + horizontalPadding, + verticalPadding, text.color, true ); + + poses.popPose(); + } + + private int scaledElementWidth(CustomText text) { + int w = (client.font.width(text.text) - 1) + (horizontalPadding * 2); + return (int) (w * text.scale); + } + + private int scaledElementHeight(CustomText text) { + int h = (client.font.lineHeight - 1) + (verticalPadding * 2); + return (int) (h * text.scale); } } diff --git a/src/main/java/dsns/betterhud/ModMenu.java b/src/main/java/dsns/betterhud/ModMenu.java index 70400af..082068c 100644 --- a/src/main/java/dsns/betterhud/ModMenu.java +++ b/src/main/java/dsns/betterhud/ModMenu.java @@ -88,6 +88,12 @@ public ConfigScreenFactory getModConfigScreenFactory() { .build() ); } else if (setting.getType().equals("double")) { + double min = Double.parseDouble( + setting.getPossibleValues()[0] + ); + double max = Double.parseDouble( + setting.getPossibleValues()[1] + ); category.addEntry( entryBuilder .startDoubleField( @@ -99,6 +105,8 @@ public ConfigScreenFactory getModConfigScreenFactory() { setting.getDefaultValue() ) ) + .setMin(min) + .setMax(max) .setSaveConsumer(value -> setting.setValue(String.valueOf(value)) ) diff --git a/src/main/java/dsns/betterhud/util/CustomText.java b/src/main/java/dsns/betterhud/util/CustomText.java index c6427f2..8e1b541 100644 --- a/src/main/java/dsns/betterhud/util/CustomText.java +++ b/src/main/java/dsns/betterhud/util/CustomText.java @@ -5,6 +5,7 @@ public class CustomText { public String text; public int color; // colors are in ARGB format public int backgroundColor; // colors are in ARGB format + public float scale = 1.0f; public boolean customPosition = false; public int customX = 0; public int customY = 0; @@ -21,6 +22,7 @@ public CustomText(String text, ModSettings settings) { settings.getSetting("Text Color").getColorValue(), settings.getSetting("Background Color").getColorValue() ); + this.scale = (float) settings.getSetting("Scale").getDoubleValue(); } public CustomText(String text, int color, ModSettings settings) { diff --git a/src/main/java/dsns/betterhud/util/ModSettings.java b/src/main/java/dsns/betterhud/util/ModSettings.java index 22a75a2..093cbdb 100644 --- a/src/main/java/dsns/betterhud/util/ModSettings.java +++ b/src/main/java/dsns/betterhud/util/ModSettings.java @@ -28,6 +28,7 @@ public ModSettings() { settings.put("Custom Position", Setting.createBooleanSetting(false)); settings.put("Custom X", Setting.createIntegerSetting(0, 0, 100)); settings.put("Custom Y", Setting.createIntegerSetting(0, 0, 100)); + settings.put("Scale", Setting.createDoubleSetting(1.0, 0.5, 3.0)); settings.put("Text Color", Setting.createColorSetting(0xffffffff)); settings.put( "Background Color", From 8bb759408f9ea49f878ff94194028ec1ca3b466f Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 7 May 2026 23:27:20 +0000 Subject: [PATCH 2/2] fix: use MC 26.x pose API for scaling (pushMatrix/popMatrix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In Minecraft 26.x, GuiGraphicsExtractor.pose() returns a 2D matrix stack with renamed methods. Replace the deprecated PoseStack (3D) API with the 2D equivalents: pushPose() → pushMatrix() translate(x,y,0) → translate(float,float) scale(x,y,1f) → scale(float,float) popPose() → popMatrix() Also remove the com.mojang.blaze3d.vertex.PoseStack import which is no longer the return type of pose() in this version. https://claude.ai/code/session_01SxKxSuPq5hqaTDD9tDJQk1 --- src/main/java/dsns/betterhud/BetterHUDGUI.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/dsns/betterhud/BetterHUDGUI.java b/src/main/java/dsns/betterhud/BetterHUDGUI.java index df8f342..886e709 100644 --- a/src/main/java/dsns/betterhud/BetterHUDGUI.java +++ b/src/main/java/dsns/betterhud/BetterHUDGUI.java @@ -1,6 +1,5 @@ package dsns.betterhud; -import com.mojang.blaze3d.vertex.PoseStack; import dsns.betterhud.util.BaseMod; import dsns.betterhud.util.CustomText; import dsns.betterhud.util.ModSettings; @@ -132,10 +131,10 @@ private void drawString( int x, int y ) { - PoseStack poses = drawContext.pose(); - poses.pushPose(); - poses.translate(x, y, 0); - poses.scale(text.scale, text.scale, 1.0f); + var poses = drawContext.pose(); + poses.pushMatrix(); + poses.translate((float) x, (float) y); + poses.scale(text.scale, text.scale); int w = (client.font.width(text.text) - 1) + (horizontalPadding * 2); int h = (client.font.lineHeight - 1) + (verticalPadding * 2); @@ -150,7 +149,7 @@ private void drawString( true ); - poses.popPose(); + poses.popMatrix(); } private int scaledElementWidth(CustomText text) {