From 4b8220399ffc28464a5d7db3bd397e290228d636 Mon Sep 17 00:00:00 2001 From: lukasabbe <67807954+lukasabbe@users.noreply.github.com> Date: Tue, 10 Feb 2026 16:36:20 +0100 Subject: [PATCH] Fixed speed, pitch & coords --- .../com/lukasabbe/simplehud/SimpleHudMod.java | 3 + .../lukasabbe/simplehud/config/Config.java | 3 + .../lukasabbe/simplehud/config/SpeedEnum.java | 14 +++++ .../lukasabbe/simplehud/huds/ElytraHud.java | 35 ++++++++++++ .../lukasabbe/simplehud/huds/SimpleHud.java | 33 ++++++++--- .../simplehud/tools/ElytraTools.java | 56 ++++++++++++++++++- 6 files changed, 134 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/lukasabbe/simplehud/config/SpeedEnum.java diff --git a/src/main/java/com/lukasabbe/simplehud/SimpleHudMod.java b/src/main/java/com/lukasabbe/simplehud/SimpleHudMod.java index cfbc797..cb00f91 100644 --- a/src/main/java/com/lukasabbe/simplehud/SimpleHudMod.java +++ b/src/main/java/com/lukasabbe/simplehud/SimpleHudMod.java @@ -3,7 +3,9 @@ package com.lukasabbe.simplehud; import com.lukasabbe.simplehud.config.Config; import com.lukasabbe.simplehud.huds.ElytraHud; import com.lukasabbe.simplehud.huds.SimpleHud; +import com.lukasabbe.simplehud.tools.ElytraTools; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.rendering.v1.hud.HudElementRegistry; import java.util.Arrays; @@ -22,5 +24,6 @@ public class SimpleHudMod implements ClientModInitializer { Config.HANDLER.load(); configInstance = Config.HANDLER.instance(); HUD_LIST.forEach(simpleHud -> HudElementRegistry.addFirst(simpleHud.getIdentifier(), simpleHud::render)); + ClientTickEvents.END_CLIENT_TICK.register(client -> ElytraTools.tickElytraTools()); } } diff --git a/src/main/java/com/lukasabbe/simplehud/config/Config.java b/src/main/java/com/lukasabbe/simplehud/config/Config.java index a2a23e9..cf609f1 100644 --- a/src/main/java/com/lukasabbe/simplehud/config/Config.java +++ b/src/main/java/com/lukasabbe/simplehud/config/Config.java @@ -25,6 +25,9 @@ public class Config { @SerialEntry public HudPosition hudPosition = HudPosition.CENTER; + @SerialEntry + public SpeedEnum speedEnum = SpeedEnum.kmh; + @SerialEntry public boolean ignoreSafeArea = false; diff --git a/src/main/java/com/lukasabbe/simplehud/config/SpeedEnum.java b/src/main/java/com/lukasabbe/simplehud/config/SpeedEnum.java new file mode 100644 index 0000000..bd5b428 --- /dev/null +++ b/src/main/java/com/lukasabbe/simplehud/config/SpeedEnum.java @@ -0,0 +1,14 @@ +package com.lukasabbe.simplehud.config; + +import dev.isxander.yacl3.api.NameableEnum; +import net.minecraft.network.chat.Component; + +public enum SpeedEnum implements NameableEnum { + kmh, + mph, + ms; + @Override + public Component getDisplayName() { + return null; + } +} diff --git a/src/main/java/com/lukasabbe/simplehud/huds/ElytraHud.java b/src/main/java/com/lukasabbe/simplehud/huds/ElytraHud.java index cd6ca94..ce3e5ab 100644 --- a/src/main/java/com/lukasabbe/simplehud/huds/ElytraHud.java +++ b/src/main/java/com/lukasabbe/simplehud/huds/ElytraHud.java @@ -1,6 +1,8 @@ package com.lukasabbe.simplehud.huds; import com.lukasabbe.simplehud.Constants; +import com.lukasabbe.simplehud.SimpleHudMod; +import com.lukasabbe.simplehud.tools.ElytraTools; import net.minecraft.client.DeltaTracker; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.Identifier; @@ -11,9 +13,42 @@ public class ElytraHud implements SimpleHud { if(!isHudActivated()) return; //if(!ElytraTools.isFlying()) return; if(client.noRender) return; + if(client.player == null) return; + + int[] pos = getCornerPos(); + int x = pos[0]; + int y = pos[1]; renderBackPlate(graphics); + int textX = 5; + float textScale = 0.6f; + int whiteColor = 0xFFFFFFFF; + + int pitchTextY = 5; + renderCenteredScaledText(graphics, String.format("%d°", ElytraTools.getPitch()), x + textX, y + pitchTextY, whiteColor, textScale); + + int speedTextY = 15; + renderCenteredScaledText(graphics, getSpeed(), x + textX, y + speedTextY, whiteColor, textScale); + + int coordinatesTextY = 25; + String coordinatesText = String.format("%.0f:%.0f:%.0f", client.player.getX(), client.player.getY(), client.player.getZ()); + + int maxAvailableWidth = 40; + int textWidth = client.font.width(coordinatesText); + + float maxScale = (float) maxAvailableWidth / textWidth; + float finalScale = Math.min(textScale, maxScale); + + renderCenteredScaledText(graphics, coordinatesText, x + textX, y + coordinatesTextY, whiteColor, finalScale); + } + + private String getSpeed(){ + return switch (SimpleHudMod.configInstance.speedEnum){ + case kmh -> String.format("%.1f km/h", ElytraTools.getSpeedKmh()); + case mph -> String.format("%.1f mph", ElytraTools.getSpeedMph()); + case ms -> String.format("%.1f m/s", ElytraTools.getSpeedMs()); + }; } @Override diff --git a/src/main/java/com/lukasabbe/simplehud/huds/SimpleHud.java b/src/main/java/com/lukasabbe/simplehud/huds/SimpleHud.java index d86d5a0..c376611 100644 --- a/src/main/java/com/lukasabbe/simplehud/huds/SimpleHud.java +++ b/src/main/java/com/lukasabbe/simplehud/huds/SimpleHud.java @@ -13,7 +13,6 @@ public interface SimpleHud { Minecraft client = Minecraft.getInstance(); Identifier backPlateAsset = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/backplate.png"); - void render(GuiGraphics graphics, DeltaTracker tracker); Identifier getIdentifier(); @@ -23,15 +22,9 @@ public interface SimpleHud { } default void renderBackPlate(GuiGraphics graphics){ - int screenWidth = client.getWindow().getGuiScaledWidth(); - int screenHeight = client.getWindow().getGuiScaledHeight(); - - //Creates pos for HUD based on config - int[] pos = calculateHudPosition(screenWidth, screenHeight, SimpleHudMod.configInstance.hudPosition); + int[] pos = getCornerPos(); int x = pos[0]; int y = pos[1]; - int centeredX = 50; - int centeredY = 60; int backPlateCornerX = 0; int backPlateCornerY = 0; @@ -42,7 +35,7 @@ public interface SimpleHud { graphics.blit( RenderPipelines.GUI_TEXTURED, backPlateAsset, - x - centeredX, y - centeredY, + x, y, backPlateCornerX, backPlateCornerY, backPlateWidth, backPlateHeight, backPlateWidth, backPlateHeight @@ -71,4 +64,26 @@ public interface SimpleHud { default -> new int[]{screenWidth / 2, screenHeight - 25}; // CENTER }; } + + default void renderCenteredScaledText(GuiGraphics graphics, String text, int centerX, int y, int color, float scale){ + var stack = graphics.pose(); + stack.pushMatrix(); + stack.translate(centerX, y); + stack.scale(scale, scale); + stack.translate(-centerX, -y); + graphics.drawString(client.font, text, centerX, y, color); + stack.popMatrix(); + } + + default int[] getCornerPos(){ + int backPlateCenteredX = 50; + int backPlateCenteredY = 60; + + int screenWidth = client.getWindow().getGuiScaledWidth(); + int screenHeight = client.getWindow().getGuiScaledHeight(); + int[] pos = calculateHudPosition(screenWidth, screenHeight, SimpleHudMod.configInstance.hudPosition); + int x = pos[0] - backPlateCenteredX; + int y = pos[1] - backPlateCenteredY; + return new int[]{x, y}; + } } diff --git a/src/main/java/com/lukasabbe/simplehud/tools/ElytraTools.java b/src/main/java/com/lukasabbe/simplehud/tools/ElytraTools.java index e565c31..6749585 100644 --- a/src/main/java/com/lukasabbe/simplehud/tools/ElytraTools.java +++ b/src/main/java/com/lukasabbe/simplehud/tools/ElytraTools.java @@ -2,11 +2,65 @@ package com.lukasabbe.simplehud.tools; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.phys.Vec3; +import org.jspecify.annotations.Nullable; public class ElytraTools { - private static final LocalPlayer player = Minecraft.getInstance().player; + private static Vec3 oldPos = null; + + private static double speed = 0; + + public static void tickElytraTools(){ + calculateSpeed(); + } + + public static void calculateSpeed(){ + var player = getLocalPlayer(); + if(player == null) return; + if(oldPos == null){ + oldPos = player.getPosition(0f); + return; + } + + Vec3 newPos = player.getPosition(0f); + double distance = newPos.distanceTo(oldPos); + oldPos = newPos; + speed = distance; + } + public static boolean isFlying(){ + var player = getLocalPlayer(); if(player == null) return false; return player.isFallFlying(); } + + public static int getPitch(){ + var player = getLocalPlayer(); + if(player == null) return 0; + return (int)player.getXRot(); + } + + public static int getYaw(){ + var player = getLocalPlayer(); + if(player == null) return 0; + return (int)player.getYRot(); + } + + private static @Nullable LocalPlayer getLocalPlayer() { + return Minecraft.getInstance().player; + } + + public static double getRawSpeed(){ + return speed; + } + public static double getSpeedMs(){ + return speed * 20; + } + public static double getSpeedKmh(){ + return getSpeedMs() * 3.6; + } + + public static double getSpeedMph(){ + return getSpeedMs() * 2.23694; + } }