From 38041b01cfbc3758fe50ae8c0dcb6341d0927fae Mon Sep 17 00:00:00 2001 From: RudideC Date: Thu, 19 Feb 2026 13:22:30 +0100 Subject: [PATCH 01/18] nametags module --- .../org/saturnclient/modules/ModManager.java | 3 +- .../saturnclient/modules/mods/Nametags.java | 54 +++++++++++++++++++ .../mixins/LivingEntityRenderStateMixin.java | 19 +++++++ .../mixins/LivingEntityRendererMixin.java | 21 ++++++++ .../modules/mods/mixins/NametagsMixin.java | 48 +++++++++++++++++ .../modules/mods/utils/HealthRenderState.java | 7 +++ src/main/resources/mods.mixins.json | 5 +- 7 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/saturnclient/modules/mods/Nametags.java create mode 100644 src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRenderStateMixin.java create mode 100644 src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRendererMixin.java create mode 100644 src/main/java/org/saturnclient/modules/mods/mixins/NametagsMixin.java create mode 100644 src/main/java/org/saturnclient/modules/mods/utils/HealthRenderState.java diff --git a/src/main/java/org/saturnclient/modules/ModManager.java b/src/main/java/org/saturnclient/modules/ModManager.java index 13bd833..ba44238 100644 --- a/src/main/java/org/saturnclient/modules/ModManager.java +++ b/src/main/java/org/saturnclient/modules/ModManager.java @@ -22,7 +22,8 @@ public class ModManager { new DayCounter(), new Speedometer(), new Zoom(), - new HealthDisplay() + new HealthDisplay(), + new Nametags() }; public static void init() { diff --git a/src/main/java/org/saturnclient/modules/mods/Nametags.java b/src/main/java/org/saturnclient/modules/mods/Nametags.java new file mode 100644 index 0000000..e15bb8a --- /dev/null +++ b/src/main/java/org/saturnclient/modules/mods/Nametags.java @@ -0,0 +1,54 @@ +package org.saturnclient.modules.mods; + +import org.saturnclient.modules.Module; +import org.saturnclient.modules.ModuleDetails; +import org.saturnclient.modules.mods.utils.HealthRenderState; +import org.saturnclient.saturnclient.config.Property; + +import net.minecraft.client.render.entity.state.LivingEntityRenderState; + +public class Nametags extends Module { + private static Property enabled = Property.bool(false); + private static Property healthDisplay = Property.bool(false); + + public Nametags() { + super( + new ModuleDetails("Nametags", "zoom") + .description("Allows you to modify entity nametags") + .tags("Camera", "Utility") + .version("0.1.0"), + enabled.named("Enabled"), + healthDisplay.named("Display health") + ); + } + + @Override + public void tick() { + + } + + + public static String getNametagString(LivingEntityRenderState state) { + if (state.customName == null) return null; + if (!healthDisplay.value) return state.customName.getString(); // name only + if (!(state instanceof HealthRenderState hrs)) return null; + + return state.customName.getString() + + " §c" + String.format("%.1f", hrs.saturn$getHealth()) + + " / " + String.format("%.1f", hrs.saturn$getMaxHealth()) + " ❤"; + } + + public static boolean shouldReplaceName() { + return enabled.value; + } + + @Override + public void onEnabled(boolean e) { + enabled.value = e; + } + + @Override + public boolean isEnabled() { + return enabled.value; + } +} diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRenderStateMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRenderStateMixin.java new file mode 100644 index 0000000..24e842d --- /dev/null +++ b/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRenderStateMixin.java @@ -0,0 +1,19 @@ +package org.saturnclient.modules.mods.mixins; + +import net.minecraft.client.render.entity.state.LivingEntityRenderState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(LivingEntityRenderState.class) +public class LivingEntityRenderStateMixin implements org.saturnclient.modules.mods.utils.HealthRenderState { + + @Unique private float saturn$health = 0f; + @Unique private float saturn$maxHealth = 1f; + + @Override public float saturn$getHealth() { return saturn$health; } + @Override public float saturn$getMaxHealth() { return saturn$maxHealth; } + @Override public void saturn$setHealth(float health, float maxHealth) { + this.saturn$health = health; + this.saturn$maxHealth = maxHealth; + } +} \ No newline at end of file diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRendererMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRendererMixin.java new file mode 100644 index 0000000..9551d00 --- /dev/null +++ b/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRendererMixin.java @@ -0,0 +1,21 @@ +package org.saturnclient.modules.mods.mixins; + +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.entity.state.LivingEntityRenderState; +import net.minecraft.entity.LivingEntity; +import org.saturnclient.modules.mods.utils.HealthRenderState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(LivingEntityRenderer.class) +public abstract class LivingEntityRendererMixin { + + @Inject(method = "updateRenderState", at = @At("TAIL")) + private void saturn$captureHealth(T entity, S state, float tickDelta, CallbackInfo ci) { + if (state instanceof HealthRenderState hrs) { + hrs.saturn$setHealth(entity.getHealth(), entity.getMaxHealth()); + } + } +} diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/NametagsMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/NametagsMixin.java new file mode 100644 index 0000000..be17d91 --- /dev/null +++ b/src/main/java/org/saturnclient/modules/mods/mixins/NametagsMixin.java @@ -0,0 +1,48 @@ +package org.saturnclient.modules.mods.mixins; + +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.state.EntityRenderState; +import net.minecraft.client.render.entity.state.LivingEntityRenderState; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; +import org.saturnclient.modules.mods.Nametags; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(EntityRenderer.class) +public abstract class NametagsMixin { + + @Unique + private static final ThreadLocal saturn$rendering = ThreadLocal.withInitial(() -> false); + + @Shadow + protected abstract void renderLabelIfPresent( + S state, Text text, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light + ); + + @Inject(method = "renderLabelIfPresent", at = @At("HEAD"), cancellable = true) + private void saturn$replaceNametag(S state, Text text, + MatrixStack matrices, VertexConsumerProvider vertexConsumers, + int light, CallbackInfo ci) { + + if (saturn$rendering.get()) return; + if (!Nametags.shouldReplaceName()) return; + if (!(state instanceof LivingEntityRenderState living)) return; + + String replacement = Nametags.getNametagString(living); + if (replacement == null) return; + + ci.cancel(); + saturn$rendering.set(true); + try { + renderLabelIfPresent(state, Text.literal(replacement), matrices, vertexConsumers, light); + } finally { + saturn$rendering.set(false); + } + } +} diff --git a/src/main/java/org/saturnclient/modules/mods/utils/HealthRenderState.java b/src/main/java/org/saturnclient/modules/mods/utils/HealthRenderState.java new file mode 100644 index 0000000..1912170 --- /dev/null +++ b/src/main/java/org/saturnclient/modules/mods/utils/HealthRenderState.java @@ -0,0 +1,7 @@ +package org.saturnclient.modules.mods.utils; + +public interface HealthRenderState { + float saturn$getHealth(); + float saturn$getMaxHealth(); + void saturn$setHealth(float health, float maxHealth); +} diff --git a/src/main/resources/mods.mixins.json b/src/main/resources/mods.mixins.json index fea0c0c..0fd1f99 100644 --- a/src/main/resources/mods.mixins.json +++ b/src/main/resources/mods.mixins.json @@ -9,7 +9,10 @@ "RenderMixin", "LightmapTextureManagerMixin", "BackgroundRendererMixin", - "GameRendererMixin" + "GameRendererMixin", + "NametagsMixin", + "LivingEntityRenderStateMixin", + "LivingEntityRendererMixin" ], "injectors": { "defaultRequire": 1 From 052a2ac06cc28b1992f3f7f0cde80d305aa5dc8a Mon Sep 17 00:00:00 2001 From: RudideC Date: Thu, 19 Feb 2026 13:33:54 +0100 Subject: [PATCH 02/18] fixed small issue --- src/main/java/org/saturnclient/modules/mods/Nametags.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/org/saturnclient/modules/mods/Nametags.java b/src/main/java/org/saturnclient/modules/mods/Nametags.java index e15bb8a..9a08332 100644 --- a/src/main/java/org/saturnclient/modules/mods/Nametags.java +++ b/src/main/java/org/saturnclient/modules/mods/Nametags.java @@ -32,10 +32,16 @@ public class Nametags extends Module { if (state.customName == null) return null; if (!healthDisplay.value) return state.customName.getString(); // name only if (!(state instanceof HealthRenderState hrs)) return null; + + float health = hrs.saturn$getHealth(); + float maxHealth = hrs.saturn$getMaxHealth(); + if (health <= 0f || maxHealth <= 0f || health > maxHealth) return null; + return state.customName.getString() + " §c" + String.format("%.1f", hrs.saturn$getHealth()) + " / " + String.format("%.1f", hrs.saturn$getMaxHealth()) + " ❤"; + } public static boolean shouldReplaceName() { From 2bcad834097b8a922da159d95c4d9bb4ba4983ed Mon Sep 17 00:00:00 2001 From: RudideC Date: Fri, 20 Feb 2026 09:34:55 +0100 Subject: [PATCH 03/18] added nametags logo --- .../org/saturnclient/modules/mods/Nametags.java | 8 +++++--- .../saturnclient/textures/gui/mod/nametags.png | Bin 0 -> 800 bytes 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/assets/saturnclient/textures/gui/mod/nametags.png diff --git a/src/main/java/org/saturnclient/modules/mods/Nametags.java b/src/main/java/org/saturnclient/modules/mods/Nametags.java index 9a08332..2ffc748 100644 --- a/src/main/java/org/saturnclient/modules/mods/Nametags.java +++ b/src/main/java/org/saturnclient/modules/mods/Nametags.java @@ -7,13 +7,15 @@ import org.saturnclient.saturnclient.config.Property; import net.minecraft.client.render.entity.state.LivingEntityRenderState; +// todo: rendering modes, player check + public class Nametags extends Module { private static Property enabled = Property.bool(false); private static Property healthDisplay = Property.bool(false); public Nametags() { super( - new ModuleDetails("Nametags", "zoom") + new ModuleDetails("Nametags", "nametags") .description("Allows you to modify entity nametags") .tags("Camera", "Utility") .version("0.1.0"), @@ -36,8 +38,8 @@ public class Nametags extends Module { float health = hrs.saturn$getHealth(); float maxHealth = hrs.saturn$getMaxHealth(); - if (health <= 0f || maxHealth <= 0f || health > maxHealth) return null; - + if (health < 0f || maxHealth < 0f || health > maxHealth) return null; + return state.customName.getString() + " §c" + String.format("%.1f", hrs.saturn$getHealth()) + " / " + String.format("%.1f", hrs.saturn$getMaxHealth()) + " ❤"; diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/nametags.png b/src/main/resources/assets/saturnclient/textures/gui/mod/nametags.png new file mode 100644 index 0000000000000000000000000000000000000000..90a1e97bca0163026f97d58c6ed30fc2f093cd70 GIT binary patch literal 800 zcmV+*1K<3KP)a`Tb^R zzHjFJW_HFo!!QiPFbuX*e!QK~s{)er(SG-SAd@5UvYj}^v;073mjv!p$A*}%~Lt3iOdE~dby7^gs8 zL-rN$-LJmy17(3cf@Fak8gjFM?=AJc9w-as5hM%j)fL_^V6=nZZs522?r|ldX8{EH zQ&Gb{q^kpo;zyChXnTq$ literal 0 HcmV?d00001 From 71a7721c526cb3c8ac2470db6cc8e2c207c34e25 Mon Sep 17 00:00:00 2001 From: RudideC Date: Fri, 20 Feb 2026 10:12:19 +0100 Subject: [PATCH 04/18] entity types --- .../mixins/LivingEntityRenderStateMixin.java | 13 ++++++++++--- .../mixins/LivingEntityRendererMixin.java | 19 ++++++++++++++++--- .../modules/mods/utils/HealthRenderState.java | 7 +++++++ 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRenderStateMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRenderStateMixin.java index 24e842d..dacee20 100644 --- a/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRenderStateMixin.java +++ b/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRenderStateMixin.java @@ -1,6 +1,8 @@ package org.saturnclient.modules.mods.mixins; import net.minecraft.client.render.entity.state.LivingEntityRenderState; + +import org.saturnclient.modules.mods.utils.HealthRenderState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -9,11 +11,16 @@ public class LivingEntityRenderStateMixin implements org.saturnclient.modules.mo @Unique private float saturn$health = 0f; @Unique private float saturn$maxHealth = 1f; + @Unique private HealthRenderState.EntityType saturn$entityType = HealthRenderState.EntityType.OTHER; - @Override public float saturn$getHealth() { return saturn$health; } - @Override public float saturn$getMaxHealth() { return saturn$maxHealth; } - @Override public void saturn$setHealth(float health, float maxHealth) { + public float saturn$getHealth() { return saturn$health; } + public float saturn$getMaxHealth() { return saturn$maxHealth; } + public void saturn$setHealth(float health, float maxHealth) { this.saturn$health = health; this.saturn$maxHealth = maxHealth; } + + public HealthRenderState.EntityType saturn$getEntityType() { return saturn$entityType; } + public void saturn$setEntityType(HealthRenderState.EntityType type) { this.saturn$entityType = type; } + } \ No newline at end of file diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRendererMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRendererMixin.java index 9551d00..34e5d1f 100644 --- a/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRendererMixin.java +++ b/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRendererMixin.java @@ -2,8 +2,11 @@ package org.saturnclient.modules.mods.mixins; import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.client.render.entity.state.LivingEntityRenderState; -import net.minecraft.entity.LivingEntity; import org.saturnclient.modules.mods.utils.HealthRenderState; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.mob.HostileEntity; +import net.minecraft.entity.passive.PassiveEntity; +import net.minecraft.entity.player.PlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -14,8 +17,18 @@ public abstract class LivingEntityRendererMixin Date: Fri, 20 Feb 2026 11:10:00 +0100 Subject: [PATCH 05/18] bugfix you can now activate hitboxes without opening emotes --- .../org/saturnclient/saturnclient/event/KeyInputHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java b/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java index 7f6ad17..87e1ea1 100644 --- a/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java +++ b/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java @@ -39,7 +39,7 @@ public class KeyInputHandler { client.setScreen(new ShiftMenu()); } - if (SaturnClientConfig.openEmoteWheel.wasKeyPressed() && client.currentScreen == null) { + if (SaturnClientConfig.openEmoteWheel.wasKeyPressed() && client.currentScreen == null && !InputUtil.isKeyPressed(client.getWindow().getHandle(), GLFW.GLFW_KEY_F3)) { client.setScreen(new EmoteWheel()); } From 9fe05722f946c2849ed91831014bb4ea03b10f45 Mon Sep 17 00:00:00 2001 From: RudideC Date: Mon, 23 Feb 2026 08:47:02 +0100 Subject: [PATCH 06/18] player, hostile, passive filter --- .../saturnclient/modules/mods/Nametags.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/saturnclient/modules/mods/Nametags.java b/src/main/java/org/saturnclient/modules/mods/Nametags.java index 2ffc748..a42717a 100644 --- a/src/main/java/org/saturnclient/modules/mods/Nametags.java +++ b/src/main/java/org/saturnclient/modules/mods/Nametags.java @@ -7,12 +7,16 @@ import org.saturnclient.saturnclient.config.Property; import net.minecraft.client.render.entity.state.LivingEntityRenderState; -// todo: rendering modes, player check +// todo: rendering modes, custom names public class Nametags extends Module { private static Property enabled = Property.bool(false); private static Property healthDisplay = Property.bool(false); - + private static Property players = Property.bool(true); + private static Property hostile = Property.bool(false); + private static Property passive = Property.bool(false); + + public Nametags() { super( new ModuleDetails("Nametags", "nametags") @@ -20,7 +24,10 @@ public class Nametags extends Module { .tags("Camera", "Utility") .version("0.1.0"), enabled.named("Enabled"), - healthDisplay.named("Display health") + healthDisplay.named("Display health"), + players.named("Players"), + hostile.named("Hostile"), + passive.named("Passive") ); } @@ -38,6 +45,12 @@ public class Nametags extends Module { float health = hrs.saturn$getHealth(); float maxHealth = hrs.saturn$getMaxHealth(); + HealthRenderState.EntityType type = hrs.saturn$getEntityType(); + if (type == HealthRenderState.EntityType.PASSIVE && !passive.value) return null; + if (type == HealthRenderState.EntityType.HOSTILE && !hostile.value) return null; + if (type == HealthRenderState.EntityType.PLAYER && !players.value) return null; + if (type == HealthRenderState.EntityType.OTHER) return null; + if (health < 0f || maxHealth < 0f || health > maxHealth) return null; return state.customName.getString() From 65c6c2a2846a8a67b312ca9e69958719aafc99ac Mon Sep 17 00:00:00 2001 From: RudideC Date: Mon, 23 Feb 2026 09:11:06 +0100 Subject: [PATCH 07/18] colors, can hide heart emoji --- .../saturnclient/modules/mods/Nametags.java | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/saturnclient/modules/mods/Nametags.java b/src/main/java/org/saturnclient/modules/mods/Nametags.java index a42717a..982ba53 100644 --- a/src/main/java/org/saturnclient/modules/mods/Nametags.java +++ b/src/main/java/org/saturnclient/modules/mods/Nametags.java @@ -7,7 +7,7 @@ import org.saturnclient.saturnclient.config.Property; import net.minecraft.client.render.entity.state.LivingEntityRenderState; -// todo: rendering modes, custom names +// todo: rendering modes, custom names, hide enemy nametags with §k public class Nametags extends Module { private static Property enabled = Property.bool(false); @@ -15,7 +15,30 @@ public class Nametags extends Module { private static Property players = Property.bool(true); private static Property hostile = Property.bool(false); private static Property passive = Property.bool(false); + private static Property heartEmoji = Property.bool(true); + private static Property healthColor = Property.select(12, + "Black", + "Dark Blue", + "Dark Green", + "Dark Aqua", + "Dark Red", + "Dark Purple", + "Gold", + "Gray", + "Dark Gray", + "Blue", + "Green", + "Aqua", + "Red", + "Light Purple", + "Yellow", + "White" + ); + private static final String[] COLOR_CODES = { + "§0", "§1", "§2", "§3", "§4", "§5", "§6", "§7", + "§8", "§9", "§a", "§b", "§c", "§d", "§e", "§f" + }; public Nametags() { super( @@ -27,7 +50,9 @@ public class Nametags extends Module { healthDisplay.named("Display health"), players.named("Players"), hostile.named("Hostile"), - passive.named("Passive") + passive.named("Passive"), + heartEmoji.named("Heart emoji"), + healthColor.named("Color") ); } @@ -35,7 +60,6 @@ public class Nametags extends Module { public void tick() { } - public static String getNametagString(LivingEntityRenderState state) { if (state.customName == null) return null; @@ -53,9 +77,11 @@ public class Nametags extends Module { if (health < 0f || maxHealth < 0f || health > maxHealth) return null; + String color = COLOR_CODES[healthColor.value]; + String heart = heartEmoji.value? " ❤" : ""; return state.customName.getString() - + " §c" + String.format("%.1f", hrs.saturn$getHealth()) - + " / " + String.format("%.1f", hrs.saturn$getMaxHealth()) + " ❤"; + + " " + color + String.format("%.1f", hrs.saturn$getHealth()) + + " / " + String.format("%.1f", hrs.saturn$getMaxHealth()) + heart; } From 02f8b486f3b0965b7795a20f46e842ceb6bcab64 Mon Sep 17 00:00:00 2001 From: RudideC Date: Mon, 23 Feb 2026 09:24:27 +0100 Subject: [PATCH 08/18] obfuscate names, name color --- .../saturnclient/modules/mods/Nametags.java | 40 +++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/saturnclient/modules/mods/Nametags.java b/src/main/java/org/saturnclient/modules/mods/Nametags.java index 982ba53..29d2cc9 100644 --- a/src/main/java/org/saturnclient/modules/mods/Nametags.java +++ b/src/main/java/org/saturnclient/modules/mods/Nametags.java @@ -7,7 +7,7 @@ import org.saturnclient.saturnclient.config.Property; import net.minecraft.client.render.entity.state.LivingEntityRenderState; -// todo: rendering modes, custom names, hide enemy nametags with §k +// todo: rendering modes, custom names public class Nametags extends Module { private static Property enabled = Property.bool(false); @@ -16,6 +16,25 @@ public class Nametags extends Module { private static Property hostile = Property.bool(false); private static Property passive = Property.bool(false); private static Property heartEmoji = Property.bool(true); + private static Property obfuscate = Property.bool(false); + private static Property nameColor = Property.select(15, + "Black", + "Dark Blue", + "Dark Green", + "Dark Aqua", + "Dark Red", + "Dark Purple", + "Gold", + "Gray", + "Dark Gray", + "Blue", + "Green", + "Aqua", + "Red", + "Light Purple", + "Yellow", + "White" + ); private static Property healthColor = Property.select(12, "Black", "Dark Blue", @@ -52,7 +71,9 @@ public class Nametags extends Module { hostile.named("Hostile"), passive.named("Passive"), heartEmoji.named("Heart emoji"), - healthColor.named("Color") + obfuscate.named("Obfuscate enemy names"), + nameColor.named("Name color"), + healthColor.named("Health color") ); } @@ -77,12 +98,17 @@ public class Nametags extends Module { if (health < 0f || maxHealth < 0f || health > maxHealth) return null; - String color = COLOR_CODES[healthColor.value]; - String heart = heartEmoji.value? " ❤" : ""; - return state.customName.getString() - + " " + color + String.format("%.1f", hrs.saturn$getHealth()) + String hpColor = COLOR_CODES[healthColor.value]; + String color = COLOR_CODES[nameColor.value]; + String heart = heartEmoji.value ? " ❤" : ""; + String obf = obfuscate.value ? "§k" : ""; + String reset = "§r"; + + String ret = color + obf + state.customName.getString() + + reset + " " + hpColor + String.format("%.1f", hrs.saturn$getHealth()) + " / " + String.format("%.1f", hrs.saturn$getMaxHealth()) + heart; - + + return ret; } public static boolean shouldReplaceName() { From 7b480d1b8bf07fd901d03973a66dcd8c29b4cdc0 Mon Sep 17 00:00:00 2001 From: RudideC Date: Mon, 23 Feb 2026 09:52:42 +0100 Subject: [PATCH 09/18] unit wow --- src/main/java/org/saturnclient/modules/mods/Nametags.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/saturnclient/modules/mods/Nametags.java b/src/main/java/org/saturnclient/modules/mods/Nametags.java index 29d2cc9..1f773de 100644 --- a/src/main/java/org/saturnclient/modules/mods/Nametags.java +++ b/src/main/java/org/saturnclient/modules/mods/Nametags.java @@ -17,6 +17,7 @@ public class Nametags extends Module { private static Property passive = Property.bool(false); private static Property heartEmoji = Property.bool(true); private static Property obfuscate = Property.bool(false); + private static Property unit = Property.select(0, "Health", "Hearts"); private static Property nameColor = Property.select(15, "Black", "Dark Blue", @@ -72,6 +73,7 @@ public class Nametags extends Module { passive.named("Passive"), heartEmoji.named("Heart emoji"), obfuscate.named("Obfuscate enemy names"), + unit.named("Unit"), nameColor.named("Name color"), healthColor.named("Health color") ); @@ -105,8 +107,8 @@ public class Nametags extends Module { String reset = "§r"; String ret = color + obf + state.customName.getString() - + reset + " " + hpColor + String.format("%.1f", hrs.saturn$getHealth()) - + " / " + String.format("%.1f", hrs.saturn$getMaxHealth()) + heart; + + reset + " " + hpColor + String.format("%.1f", hrs.saturn$getHealth() / (unit.value + 1)) + + " / " + String.format("%.1f", hrs.saturn$getMaxHealth() / (unit.value + 1)) + heart; return ret; } From bdd421e1da0a81b34c5e3a55113704c9bc77edb9 Mon Sep 17 00:00:00 2001 From: RudideC Date: Mon, 23 Feb 2026 10:20:41 +0100 Subject: [PATCH 10/18] nametag module finished yay --- .../saturnclient/modules/mods/Nametags.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/saturnclient/modules/mods/Nametags.java b/src/main/java/org/saturnclient/modules/mods/Nametags.java index 1f773de..c1ebeb9 100644 --- a/src/main/java/org/saturnclient/modules/mods/Nametags.java +++ b/src/main/java/org/saturnclient/modules/mods/Nametags.java @@ -18,6 +18,7 @@ public class Nametags extends Module { private static Property heartEmoji = Property.bool(true); private static Property obfuscate = Property.bool(false); private static Property unit = Property.select(0, "Health", "Hearts"); + private static Property format = Property.select(0, "Value", "Value / Total", "%"); private static Property nameColor = Property.select(15, "Black", "Dark Blue", @@ -74,6 +75,7 @@ public class Nametags extends Module { heartEmoji.named("Heart emoji"), obfuscate.named("Obfuscate enemy names"), unit.named("Unit"), + format.named("Format"), nameColor.named("Name color"), healthColor.named("Health color") ); @@ -84,6 +86,25 @@ public class Nametags extends Module { } + public static String getHealthString(LivingEntityRenderState state, HealthRenderState hrs, float health, float maxHealth) { + String ret = ""; + + switch (format.value){ + case 0: // value + ret = String.format("%.1f", health / (unit.value + 1)); + break; + + case 1: // value / total + ret = String.format("%.1f", health / (unit.value + 1)) + " / " + String.format("%.1f", maxHealth / (unit.value + 1)); + break; + + case 2: // % + ret = String.format("%.0f%%", (health / maxHealth) * 100); + break; + } + return ret; + } + public static String getNametagString(LivingEntityRenderState state) { if (state.customName == null) return null; if (!healthDisplay.value) return state.customName.getString(); // name only @@ -106,9 +127,7 @@ public class Nametags extends Module { String obf = obfuscate.value ? "§k" : ""; String reset = "§r"; - String ret = color + obf + state.customName.getString() - + reset + " " + hpColor + String.format("%.1f", hrs.saturn$getHealth() / (unit.value + 1)) - + " / " + String.format("%.1f", hrs.saturn$getMaxHealth() / (unit.value + 1)) + heart; + String ret = color + obf + state.customName.getString() + reset + " " + hpColor + getHealthString(state, hrs, health, maxHealth) + heart; return ret; } From ae8ec4b4efc7f0cff1fc7761d3112f87d7a0c89d Mon Sep 17 00:00:00 2001 From: RudideC Date: Mon, 23 Feb 2026 11:27:25 +0100 Subject: [PATCH 11/18] fixed modmenu scroll --- .../java/org/saturnclient/ui2/elements/Scroll.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/saturnclient/ui2/elements/Scroll.java b/src/main/java/org/saturnclient/ui2/elements/Scroll.java index 0b0e761..2ba9295 100644 --- a/src/main/java/org/saturnclient/ui2/elements/Scroll.java +++ b/src/main/java/org/saturnclient/ui2/elements/Scroll.java @@ -65,10 +65,14 @@ public class Scroll extends Element { @Override public Element dimensions(int width, int height) { + super.dimensions(width, height); + + maxScroll = 0; for (Element element : children) { - maxScroll = Math.max(maxScroll, element.y + element.height - height); + maxScroll = Math.max(maxScroll, (element.y + element.height + padding) - (height - padding * 2)); } - return super.dimensions(width, height); + + return this; } int calculateScrollBarHeight() { @@ -79,7 +83,8 @@ public class Scroll extends Element { int calculateScrollBarY() { int scrollBarHeight = calculateScrollBarHeight(); if (maxScroll <= 0) return scrollBarPadding.value; - return (scroll * (height - scrollBarHeight)) / maxScroll + scrollBarPadding.value; + int y = (scroll * (height - scrollBarHeight - scrollBarPadding.value * 2)) / maxScroll + scrollBarPadding.value; + return Math.min(y, height - scrollBarHeight - scrollBarPadding.value); } @Override From 3c1914c30abac28a330ed58779152236fe379a0a Mon Sep 17 00:00:00 2001 From: RudideC Date: Mon, 23 Feb 2026 11:27:34 +0100 Subject: [PATCH 12/18] added ping mod wow --- .../org/saturnclient/modules/ModManager.java | 3 +- .../org/saturnclient/modules/mods/Ping.java | 60 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/saturnclient/modules/mods/Ping.java diff --git a/src/main/java/org/saturnclient/modules/ModManager.java b/src/main/java/org/saturnclient/modules/ModManager.java index ba44238..c948d74 100644 --- a/src/main/java/org/saturnclient/modules/ModManager.java +++ b/src/main/java/org/saturnclient/modules/ModManager.java @@ -23,7 +23,8 @@ public class ModManager { new Speedometer(), new Zoom(), new HealthDisplay(), - new Nametags() + new Nametags(), + new Ping() }; public static void init() { diff --git a/src/main/java/org/saturnclient/modules/mods/Ping.java b/src/main/java/org/saturnclient/modules/mods/Ping.java new file mode 100644 index 0000000..f1ef188 --- /dev/null +++ b/src/main/java/org/saturnclient/modules/mods/Ping.java @@ -0,0 +1,60 @@ +package org.saturnclient.modules.mods; + +import org.saturnclient.modules.HudMod; +import org.saturnclient.modules.ModDimensions; +import org.saturnclient.modules.Module; +import org.saturnclient.modules.ModuleDetails; +import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.ui2.RenderScope; +import org.saturnclient.ui2.resources.Fonts; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; + +public class Ping extends Module implements HudMod { + private static Property enabled = Property.bool(false); + private static ModDimensions dimensions = new ModDimensions(60, Fonts.getHeight()); + + public Ping() { + super(new ModuleDetails("Ping Display", "fps") + .description("Displays ping") + .version("v0.1.0") + .tags("Utility"), + enabled.named("Enabled"), + dimensions.prop()); + } + + @Override + public void renderHud(RenderScope scope) { + MinecraftClient client = MinecraftClient.getInstance(); + ClientPlayNetworkHandler handler = client.getNetworkHandler(); + String text = "0 ms"; + if (handler != null) { + text = String.valueOf(handler.getPlayerListEntry(client.player.getUuid()).getLatency()) + " ms"; + } + scope.drawText(text, 0, 0, dimensions.font.value, dimensions.fgColor.value); + dimensions.width = Fonts.getWidth(text, dimensions.font.value); + } + + @Override + public void renderDummy(RenderScope scope) { + String text = "10 ms"; + scope.drawText(text, 0, 0, dimensions.font.value, dimensions.fgColor.value); + dimensions.width = Fonts.getWidth(text, dimensions.font.value); + } + + @Override + public boolean isEnabled() { + return enabled.value; + } + + @Override + public void onEnabled(boolean e) { + enabled.value = e; + } + + @Override + public ModDimensions getDimensions() { + return dimensions; + } +} From 77f535049671d6d8511a460ac74547200696e062 Mon Sep 17 00:00:00 2001 From: RudideC Date: Mon, 23 Feb 2026 11:38:57 +0100 Subject: [PATCH 13/18] forgot to add icon --- .../java/org/saturnclient/modules/mods/Ping.java | 2 +- .../assets/saturnclient/textures/gui/mod/ping.png | Bin 0 -> 197 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/main/resources/assets/saturnclient/textures/gui/mod/ping.png diff --git a/src/main/java/org/saturnclient/modules/mods/Ping.java b/src/main/java/org/saturnclient/modules/mods/Ping.java index f1ef188..e75d5ad 100644 --- a/src/main/java/org/saturnclient/modules/mods/Ping.java +++ b/src/main/java/org/saturnclient/modules/mods/Ping.java @@ -16,7 +16,7 @@ public class Ping extends Module implements HudMod { private static ModDimensions dimensions = new ModDimensions(60, Fonts.getHeight()); public Ping() { - super(new ModuleDetails("Ping Display", "fps") + super(new ModuleDetails("Ping Display", "ping") .description("Displays ping") .version("v0.1.0") .tags("Utility"), diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/ping.png b/src/main/resources/assets/saturnclient/textures/gui/mod/ping.png new file mode 100644 index 0000000000000000000000000000000000000000..01a53a659890cc42115fdbeab30d2deea838e4ed GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-&H|6fVg?3oVGw3ym^DWNC|K_4 z;uumf=k588yayO~4jcUczop7)7K5&h$7Xh8!)j4|?`jTBZpBo^B|0rrS|@Bu=J;u$ z=ehVX2m);nc?|*)`!(vd;HR+haxgEt_hi`ZwO;UYIlg q8c@th Date: Tue, 24 Feb 2026 09:19:17 +0100 Subject: [PATCH 14/18] rename --- .../java/org/saturnclient/modules/mods/HealthDisplay.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/saturnclient/modules/mods/HealthDisplay.java b/src/main/java/org/saturnclient/modules/mods/HealthDisplay.java index 169e6c7..a3cd80f 100644 --- a/src/main/java/org/saturnclient/modules/mods/HealthDisplay.java +++ b/src/main/java/org/saturnclient/modules/mods/HealthDisplay.java @@ -34,7 +34,7 @@ public class HealthDisplay extends Module implements HudMod { @Override public void renderDummy(RenderScope scope) { - renderSpeed(10, scope); + renderHealth(10, scope); } @Override @@ -44,10 +44,10 @@ public class HealthDisplay extends Module implements HudMod { case 1: health = health / 2; } - renderSpeed(health, scope); + renderHealth(health, scope); } - public void renderSpeed(float health, RenderScope scope) { + public void renderHealth(float health, RenderScope scope) { String text = ""; switch (decimals.value) { From 3c2f75e438fd1e739bd60521a5efa908da4e8021 Mon Sep 17 00:00:00 2001 From: RudideC Date: Tue, 24 Feb 2026 09:21:23 +0100 Subject: [PATCH 15/18] tps mod missing the image, will add later --- .../org/saturnclient/modules/ModManager.java | 3 +- .../org/saturnclient/modules/mods/Tps.java | 99 +++++++++++++++++++ .../modules/mods/mixins/TpsMixin.java | 18 ++++ src/main/resources/mods.mixins.json | 3 +- 4 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/saturnclient/modules/mods/Tps.java create mode 100644 src/main/java/org/saturnclient/modules/mods/mixins/TpsMixin.java diff --git a/src/main/java/org/saturnclient/modules/ModManager.java b/src/main/java/org/saturnclient/modules/ModManager.java index c948d74..e3a627a 100644 --- a/src/main/java/org/saturnclient/modules/ModManager.java +++ b/src/main/java/org/saturnclient/modules/ModManager.java @@ -24,7 +24,8 @@ public class ModManager { new Zoom(), new HealthDisplay(), new Nametags(), - new Ping() + new Ping(), + new Tps() }; public static void init() { diff --git a/src/main/java/org/saturnclient/modules/mods/Tps.java b/src/main/java/org/saturnclient/modules/mods/Tps.java new file mode 100644 index 0000000..5b45a9e --- /dev/null +++ b/src/main/java/org/saturnclient/modules/mods/Tps.java @@ -0,0 +1,99 @@ +package org.saturnclient.modules.mods; + +import org.saturnclient.modules.HudMod; +import org.saturnclient.modules.ModDimensions; +import org.saturnclient.modules.Module; +import org.saturnclient.modules.ModuleDetails; +import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.ui2.RenderScope; +import org.saturnclient.ui2.resources.Fonts; + +public class Tps extends Module implements HudMod { + private static Property enabled = Property.bool(false); + private static ModDimensions dimensions = new ModDimensions(60, Fonts.getHeight()); + + private static long lastWorldAge = -1; + private static long lastRealTime = -1; + private static double currentTps = 20.0; + + private static final int SAMPLE_COUNT = 2; + private static final double[] samples = new double[SAMPLE_COUNT]; + static { + java.util.Arrays.fill(samples, 20.0); + } + private static int sampleIndex = 0; + private static int samplesFilled = 0; + + public Tps() { + super(new ModuleDetails("TPS Display", "ping") // todo: change this + .description("Displays the TPS") + .version("v0.1.0") + .tags("Utility"), + enabled.named("Enabled"), + dimensions.prop() + ); + } + + public static void onTimePacket(long worldAge) { + long now = System.currentTimeMillis(); + + if (lastWorldAge != -1 && lastRealTime != -1) { + long tickDelta = worldAge - lastWorldAge; + long timeDelta = now - lastRealTime; + + if (timeDelta > 0 && tickDelta > 0) { + double sample = (tickDelta / (double) timeDelta) * 1000.0; + sample = Math.min(sample, 20.0); + + samples[sampleIndex % SAMPLE_COUNT] = sample; + sampleIndex++; + samplesFilled = Math.min(samplesFilled + 1, SAMPLE_COUNT); + + double sum = 0; + for (int i = 0; i < samplesFilled; i++) sum += samples[i]; + currentTps = sum / samplesFilled; + } + } + + lastWorldAge = worldAge; + lastRealTime = now; + } + + public static void reset() { + lastWorldAge = -1; + lastRealTime = -1; + currentTps = 20.0; + sampleIndex = 0; + samplesFilled = SAMPLE_COUNT; + for (int i = 0; i < SAMPLE_COUNT; i++) samples[i] = 20.0; + } + + @Override + public void renderHud(RenderScope scope) { + String text = String.format("%.1f TPS", currentTps); + scope.drawText(text, 0, 0, dimensions.font.value, dimensions.fgColor.value); + dimensions.width = Fonts.getWidth(text, dimensions.font.value); + } + + @Override + public void renderDummy(RenderScope scope) { + String text = "20.0 TPS"; + scope.drawText(text, 0, 0, dimensions.font.value, dimensions.fgColor.value); + dimensions.width = Fonts.getWidth(text, dimensions.font.value); + } + + @Override + public boolean isEnabled() { + return enabled.value; + } + + @Override + public void onEnabled(boolean e) { + enabled.value = e; + } + + @Override + public ModDimensions getDimensions() { + return dimensions; + } +} diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/TpsMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/TpsMixin.java new file mode 100644 index 0000000..7a9d15e --- /dev/null +++ b/src/main/java/org/saturnclient/modules/mods/mixins/TpsMixin.java @@ -0,0 +1,18 @@ +package org.saturnclient.modules.mods.mixins; + +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket; +import org.saturnclient.modules.mods.Tps; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ClientPlayNetworkHandler.class) +public class TpsMixin { + + @Inject(method = "onWorldTimeUpdate", at = @At("HEAD")) + private void onWorldTimeUpdate(WorldTimeUpdateS2CPacket packet, CallbackInfo ci) { + Tps.onTimePacket(packet.time()); + } +} diff --git a/src/main/resources/mods.mixins.json b/src/main/resources/mods.mixins.json index 0fd1f99..6cd236b 100644 --- a/src/main/resources/mods.mixins.json +++ b/src/main/resources/mods.mixins.json @@ -12,7 +12,8 @@ "GameRendererMixin", "NametagsMixin", "LivingEntityRenderStateMixin", - "LivingEntityRendererMixin" + "LivingEntityRendererMixin", + "TpsMixin" ], "injectors": { "defaultRequire": 1 From 008a0927b6dad04cd93dfef097e109a5478d31e2 Mon Sep 17 00:00:00 2001 From: RudideC Date: Tue, 24 Feb 2026 09:37:37 +0100 Subject: [PATCH 16/18] clock mod --- .../org/saturnclient/modules/ModManager.java | 3 +- .../org/saturnclient/modules/mods/Clock.java | 77 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/saturnclient/modules/mods/Clock.java diff --git a/src/main/java/org/saturnclient/modules/ModManager.java b/src/main/java/org/saturnclient/modules/ModManager.java index e3a627a..9a2ef26 100644 --- a/src/main/java/org/saturnclient/modules/ModManager.java +++ b/src/main/java/org/saturnclient/modules/ModManager.java @@ -25,7 +25,8 @@ public class ModManager { new HealthDisplay(), new Nametags(), new Ping(), - new Tps() + new Tps(), + new Clock() }; public static void init() { diff --git a/src/main/java/org/saturnclient/modules/mods/Clock.java b/src/main/java/org/saturnclient/modules/mods/Clock.java new file mode 100644 index 0000000..4e0be5e --- /dev/null +++ b/src/main/java/org/saturnclient/modules/mods/Clock.java @@ -0,0 +1,77 @@ +package org.saturnclient.modules.mods; + +import java.time.format.DateTimeFormatter; +import java.time.LocalTime; + +import org.saturnclient.modules.HudMod; +import org.saturnclient.modules.ModDimensions; +import org.saturnclient.modules.Module; +import org.saturnclient.modules.ModuleDetails; +import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.ui2.RenderScope; +import org.saturnclient.ui2.resources.Fonts; + +public class Clock extends Module implements HudMod { + private static Property enabled = Property.bool(false); + private static Property format = Property.select(0, "24 hour", "12 hour"); + private static Property seconds = Property.bool(false); + private static ModDimensions dimensions = new ModDimensions(60, Fonts.getHeight()); + + public Clock() { + super(new ModuleDetails("Clock", "ping") // todo: change this + .description("Displays the current real-world time") + .version("v0.1.0") + .tags("Utility"), + enabled.named("Enabled"), + format.named("Format"), + seconds.named("Show seconds"), + dimensions.prop() + ); + } + + @Override + public void renderDummy(RenderScope scope) { + renderClock(scope); + } + + @Override + public void renderHud(RenderScope scope) { + renderClock(scope); + } + + public void renderClock(RenderScope scope) { + String text = ""; + LocalTime currentTime = LocalTime.now(); + + switch (format.value) { + case 0: + if (seconds.value) { text = currentTime.format(DateTimeFormatter.ofPattern("HH:mm:ss")); } + else { text = currentTime.format(DateTimeFormatter.ofPattern("HH:mm")); } + break; + case 1: + if (seconds.value) { text = currentTime.format(DateTimeFormatter.ofPattern("hh:mm:ss a")); } + else { text = currentTime.format(DateTimeFormatter.ofPattern("hh:mm a")); } + break; + } + + scope.drawText(text, + 0, 0, dimensions.font.value, dimensions.fgColor.value); + dimensions.width = Fonts.getWidth(text, dimensions.font.value); + dimensions.height = 18 * text.split("\n").length; + } + + @Override + public boolean isEnabled() { + return enabled.value; + } + + @Override + public ModDimensions getDimensions() { + return dimensions; + } + + @Override + public void onEnabled(boolean e) { + enabled.value = e; + } +} \ No newline at end of file From 092fcfb0095190fd36672b563ca3dbe110261003 Mon Sep 17 00:00:00 2001 From: RudideC Date: Tue, 24 Feb 2026 09:40:06 +0100 Subject: [PATCH 17/18] new icons wow --- .../org/saturnclient/modules/mods/Clock.java | 2 +- .../java/org/saturnclient/modules/mods/Tps.java | 2 +- .../saturnclient/textures/gui/mod/clock.png | Bin 0 -> 1072 bytes .../assets/saturnclient/textures/gui/mod/tps.png | Bin 0 -> 777 bytes 4 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/assets/saturnclient/textures/gui/mod/clock.png create mode 100644 src/main/resources/assets/saturnclient/textures/gui/mod/tps.png diff --git a/src/main/java/org/saturnclient/modules/mods/Clock.java b/src/main/java/org/saturnclient/modules/mods/Clock.java index 4e0be5e..10170fa 100644 --- a/src/main/java/org/saturnclient/modules/mods/Clock.java +++ b/src/main/java/org/saturnclient/modules/mods/Clock.java @@ -18,7 +18,7 @@ public class Clock extends Module implements HudMod { private static ModDimensions dimensions = new ModDimensions(60, Fonts.getHeight()); public Clock() { - super(new ModuleDetails("Clock", "ping") // todo: change this + super(new ModuleDetails("Clock", "clock") .description("Displays the current real-world time") .version("v0.1.0") .tags("Utility"), diff --git a/src/main/java/org/saturnclient/modules/mods/Tps.java b/src/main/java/org/saturnclient/modules/mods/Tps.java index 5b45a9e..923adb9 100644 --- a/src/main/java/org/saturnclient/modules/mods/Tps.java +++ b/src/main/java/org/saturnclient/modules/mods/Tps.java @@ -25,7 +25,7 @@ public class Tps extends Module implements HudMod { private static int samplesFilled = 0; public Tps() { - super(new ModuleDetails("TPS Display", "ping") // todo: change this + super(new ModuleDetails("TPS Display", "tps") .description("Displays the TPS") .version("v0.1.0") .tags("Utility"), diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/clock.png b/src/main/resources/assets/saturnclient/textures/gui/mod/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..b8d46ec6fdb054ffb48f7d675973a0fd352cc79d GIT binary patch literal 1072 zcmV-01kd}4P)k7RCt{2n%i$pK@`SEv|1skyEh)C4gLw2y4RcHjqrj7uP$%I zaBsY2_!Y{e}s<=j_Xz(?fj8PEI>B->kJ~)|xeIZRh^u z9|bTOSPdKkP61DWPrx@l_WOz2tj{W-$<+dYMqmSQ4){)X3;<_=^+3Z&C@>b-3A_)4 z`U+eGc57wk+8YPz^)%^!*0u+@q%j`vfF1U7s-?s-;AJ4dEnp)sF$dQqU=z?4@Vx+9 zE4_`52NT`~7DeP=0^AMwk40Y{V5S5&d2HT^crZZm;l+jg3qnIM8924G6CD~`DwF4h}%CYy+@NMJMG0W5JD4m*ENY)v(& z!ipGxj==cKZ!ut3a89Ihu~kx}4!9?}j&hwF6e<`N7M(n%A_ico=-!uH6$NjD9>PUJ zWJN{=p0vGG$Mfp6F~-EP6)^ytMR~@RxK9iyBF!8CR#A~A-EaC6oiuaCstEY7D% zjlF7|5^1s{ff7HJiNrlsd>@k<%@Y{LM4Ielf+8OxaW{zXYc&*klc31kYADhhYisF3 z_9{V<{YAOcY^^B94on9git9DdqxkJW#MN#tW$fPlt}3_^4}uHXtfE3E0a#PY{d!lq z#}!|RNA`Cfo)`zBWdIEqQ?ZS}N+g6R%ZCfbe9$<_}RV^h9z!uGS+6@O_ojP?5+v(3S*Oj}ih7zNIJCbp2xr64dIxcoK24J~l>nU4? zP--7(UO4#>3k)S6?n}09X)}yI*Sp=-2>A7apQSDeS$#r-EGagx;!>8EX94gr+CxE(-adE_O#?*qzZ2TG@<(-;U zZ5pG;ez)jSv{!w7p1_A4+eYdO2#d|yEupL{KvwkYX1aDn6i9+4lr0x)w>IFUE?B+6 qM>Y2Qv0YEqXT`AhiT`kaKYjpf?zE0jXa!*a0000X0EEG%xEfr*K)XGX5 z0~Uft!90o-md3(DR0I)4h-;x(2`YjlTBzU)1qBfwY&KDmV7@T%zsa!V-kp_j?+wle z%aS?gOwPaaIy1%u0)apv5Qqm@0rUb-fKjqz6c_?}Y)-X`*aMWwA7!9Wi->Ur-UQl! z29ps$1JDi>mD6}tF`7=%NE|ac1L#z4!$4D#V{bGPCZ{kxGTli|Pvz8Ratg3bISwT` zjmW9d

0OwD6OhCNVjOYI)Ww1Xuuc0E1e9BbuJafkiPf&A=t#J@5;72b>31XCefc z4-6>e5AYaxpyVu%fW;Lt8-bGSUx54iwtNLzvJkRg?%#k7PWwuUu$*+-=c!7toCWIC zUI+B6{b3eDZp;1147L{8UN~*7YI_OPSNPYf-LgJyA$D#PH@AV$cA7bVA5Gf-Z99MI zNL$Et;EtU#F=fSX;G@%aPTlW~>2IIx{izD^EG4Fr0>h!$+Ow&L%=rV9Hlb-y(xen;j)fOWe3pzr1xd~V3TJ*JOB zrc(}!6)m^3> zhm)M5`$D^!tZ|Lb;WyZu>guq9@a$hBC7?12ig!Xe4ZI zyM2QTdKJkVC2tXqm?o9wgU-WU7K|u|F5fC55C{YUf&Z2XBhs5sctRvZ00000NkvXX Hu0mjfKKf7D literal 0 HcmV?d00001 From 1b16098121945946c488c7a52684913473fe455f Mon Sep 17 00:00:00 2001 From: RudideC Date: Tue, 24 Feb 2026 09:41:50 +0100 Subject: [PATCH 18/18] 0.0.7-alpha1 will do some testing and then move towards the beta release --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 013c631..bac900b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ yarn_mappings=1.21.4+build.7 loader_version=0.16.10 fabric_version=0.114.0+1.21.4 -mod_version = 0.0.6-beta1 +mod_version = 0.0.7-alpha1 maven_group = org.saturnclient archives_base_name = saturnclient