From 019730c756cd16f28599a3d2bbb45e9410122176 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 8 Apr 2026 20:23:58 +0200 Subject: [PATCH 1/7] Nametags 1.21.10 and color fix --- .../saturnclient/SaturnRenderState.java | 10 +++ .../saturnclient/mixin/NameTagMixin.java | 67 ------------------- .../mixin/PlayerEntityRendererMixin.java | 31 +++++++++ .../mixin/PlayerEntityRendererMixin.java | 8 ++- 4 files changed, 47 insertions(+), 69 deletions(-) create mode 100644 versions/1.21.10/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java delete mode 100644 versions/1.21.10/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java diff --git a/versions/1.21.10/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java b/versions/1.21.10/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java new file mode 100644 index 0000000..e34af31 --- /dev/null +++ b/versions/1.21.10/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java @@ -0,0 +1,10 @@ +package org.saturnclient.saturnclient; + +import org.saturnclient.client.player.SaturnPlayer; + +import net.fabricmc.fabric.api.client.rendering.v1.RenderStateDataKey; + +public class SaturnRenderState { + public static RenderStateDataKey saturnDataKey = RenderStateDataKey + .create(() -> "saturn-client-player"); +} diff --git a/versions/1.21.10/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/versions/1.21.10/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java deleted file mode 100644 index 453eae1..0000000 --- a/versions/1.21.10/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.saturnclient.saturnclient.mixin; - -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.EntityRenderManager; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.render.state.CameraRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import org.saturnclient.client.player.Roles; -import org.saturnclient.client.player.SaturnPlayer; - -import java.util.UUID; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(value = EntityRenderer.class, priority = 1800) -public abstract class NameTagMixin { - @Shadow - public EntityRenderManager dispatcher; - - /** - * @author HexLeo - * @reason Adds the Saturn Client icon to the player's name if they are online - * with Saturn Client - */ - @Inject(method = "renderLabelIfPresent", at = @At("HEAD"), cancellable = true) - protected void renderLabelIfPresent(S state, MatrixStack matrices, OrderedRenderCommandQueue queue, - CameraRenderState cameraRenderState, CallbackInfo ci) { - if (state.displayName == null) - return; - - UUID uuid = isSaturn(state); - - if (uuid != null) { - MutableText iconText = Text.literal(Roles.getSaturnIndicator()) - .styled(style -> style.withColor(Roles.getIconColor(uuid))); - - Text nameText = state.displayName.copy().styled(style -> style.withColor(Formatting.WHITE)); - - queue.submitLabel(matrices, state.nameLabelPos, 0, iconText.append(nameText), !state.sneaking, state.light, - state.squaredDistanceToCamera, cameraRenderState); - - ci.cancel(); - } - } - - private UUID isSaturn(S state) { - if (state instanceof PlayerEntityRenderState) { - String name = ((PlayerEntityRenderState) state).displayName.getString(); - SaturnPlayer player = SaturnPlayer.get(name); - if (player != null) { - return player.uuid; - } - } - - return null; - } -} diff --git a/versions/1.21.10/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java b/versions/1.21.10/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java index 0363dad..6da5ccb 100644 --- a/versions/1.21.10/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java +++ b/versions/1.21.10/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java @@ -1,14 +1,22 @@ package org.saturnclient.saturnclient.mixin; +import net.minecraft.client.network.ClientPlayerLikeEntity; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.client.render.entity.PlayerEntityRenderer; import net.minecraft.client.render.entity.model.PlayerEntityModel; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.entity.PlayerLikeEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.saturnclient.client.player.Roles; +import org.saturnclient.client.player.SaturnPlayer; import org.saturnclient.impl.cosmetics.CloakFeatureRenderer; import org.saturnclient.impl.cosmetics.HatFeatureRenderer; +import org.saturnclient.saturnclient.SaturnRenderState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -27,4 +35,27 @@ public abstract class PlayerEntityRendererMixin this.addFeature(new HatFeatureRenderer(this)); this.addFeature(new CloakFeatureRenderer(this, ctx.getEquipmentModelLoader())); } + + @Inject(method = "updateRenderState", at = @At("TAIL")) + public void updateRenderState( + A entity, PlayerEntityRenderState state, + float f, CallbackInfo ci) { + if (entity == null) { + return; + } + + SaturnPlayer player = SaturnPlayer.get(entity.getUuid()); + + state.setData(SaturnRenderState.saturnDataKey, player); + + if (player != null) { + MutableText iconText = Text.literal(Roles.getSaturnIndicator()) + .styled(style -> style.withColor(Roles.getIconColor(player.uuid))); + + state.displayName = Text.empty() + .append(iconText.copy()) + .append(Text.empty().formatted(Formatting.RESET)) + .append(state.displayName.copy()); + } + } } \ No newline at end of file diff --git a/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java b/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java index b6dce94..f165cfc 100644 --- a/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java +++ b/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java @@ -10,6 +10,7 @@ import net.minecraft.entity.PlayerLikeEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.text.MutableText; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import org.saturnclient.client.player.Roles; import org.saturnclient.client.player.SaturnPlayer; @@ -47,11 +48,14 @@ public abstract class PlayerEntityRendererMixin state.setData(SaturnRenderState.saturnDataKey, player); - if (player != null) { + if (player != null && state.displayName != null) { MutableText iconText = Text.literal(Roles.getSaturnIndicator()) .styled(style -> style.withColor(Roles.getIconColor(player.uuid))); - state.displayName = iconText.append(state.displayName); + state.displayName = Text.empty() + .append(iconText.copy()) + .append(Text.empty().formatted(Formatting.RESET)) + .append(state.displayName.copy()); } } } \ No newline at end of file From e165f6b65c271b3c05965b631910ad59029bb71a Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 8 Apr 2026 20:25:44 +0200 Subject: [PATCH 2/7] Removed nametag from all mixin files --- versions/1.21.10/src/main/resources/saturnclient.mixins.json | 1 - versions/1.21.4/src/main/resources/saturnclient.mixins.json | 1 - versions/1.21.5/src/main/resources/saturnclient.mixins.json | 1 - versions/1.21.6/src/main/resources/saturnclient.mixins.json | 1 - versions/1.21.7/src/main/resources/saturnclient.mixins.json | 1 - versions/1.21.8/src/main/resources/saturnclient.mixins.json | 1 - versions/1.21.9/src/main/resources/saturnclient.mixins.json | 1 - 7 files changed, 7 deletions(-) diff --git a/versions/1.21.10/src/main/resources/saturnclient.mixins.json b/versions/1.21.10/src/main/resources/saturnclient.mixins.json index 3bc9ccc..d831845 100644 --- a/versions/1.21.10/src/main/resources/saturnclient.mixins.json +++ b/versions/1.21.10/src/main/resources/saturnclient.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel": "JAVA_21", "client": [ "TabListMixin", - "NameTagMixin", "PlayerEntityRendererMixin", "WhoAmI", "DrawContextAccessor", diff --git a/versions/1.21.4/src/main/resources/saturnclient.mixins.json b/versions/1.21.4/src/main/resources/saturnclient.mixins.json index 3bc9ccc..d831845 100644 --- a/versions/1.21.4/src/main/resources/saturnclient.mixins.json +++ b/versions/1.21.4/src/main/resources/saturnclient.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel": "JAVA_21", "client": [ "TabListMixin", - "NameTagMixin", "PlayerEntityRendererMixin", "WhoAmI", "DrawContextAccessor", diff --git a/versions/1.21.5/src/main/resources/saturnclient.mixins.json b/versions/1.21.5/src/main/resources/saturnclient.mixins.json index 3bc9ccc..d831845 100644 --- a/versions/1.21.5/src/main/resources/saturnclient.mixins.json +++ b/versions/1.21.5/src/main/resources/saturnclient.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel": "JAVA_21", "client": [ "TabListMixin", - "NameTagMixin", "PlayerEntityRendererMixin", "WhoAmI", "DrawContextAccessor", diff --git a/versions/1.21.6/src/main/resources/saturnclient.mixins.json b/versions/1.21.6/src/main/resources/saturnclient.mixins.json index 3bc9ccc..d831845 100644 --- a/versions/1.21.6/src/main/resources/saturnclient.mixins.json +++ b/versions/1.21.6/src/main/resources/saturnclient.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel": "JAVA_21", "client": [ "TabListMixin", - "NameTagMixin", "PlayerEntityRendererMixin", "WhoAmI", "DrawContextAccessor", diff --git a/versions/1.21.7/src/main/resources/saturnclient.mixins.json b/versions/1.21.7/src/main/resources/saturnclient.mixins.json index 3bc9ccc..d831845 100644 --- a/versions/1.21.7/src/main/resources/saturnclient.mixins.json +++ b/versions/1.21.7/src/main/resources/saturnclient.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel": "JAVA_21", "client": [ "TabListMixin", - "NameTagMixin", "PlayerEntityRendererMixin", "WhoAmI", "DrawContextAccessor", diff --git a/versions/1.21.8/src/main/resources/saturnclient.mixins.json b/versions/1.21.8/src/main/resources/saturnclient.mixins.json index 3bc9ccc..d831845 100644 --- a/versions/1.21.8/src/main/resources/saturnclient.mixins.json +++ b/versions/1.21.8/src/main/resources/saturnclient.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel": "JAVA_21", "client": [ "TabListMixin", - "NameTagMixin", "PlayerEntityRendererMixin", "WhoAmI", "DrawContextAccessor", diff --git a/versions/1.21.9/src/main/resources/saturnclient.mixins.json b/versions/1.21.9/src/main/resources/saturnclient.mixins.json index 3bc9ccc..d831845 100644 --- a/versions/1.21.9/src/main/resources/saturnclient.mixins.json +++ b/versions/1.21.9/src/main/resources/saturnclient.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel": "JAVA_21", "client": [ "TabListMixin", - "NameTagMixin", "PlayerEntityRendererMixin", "WhoAmI", "DrawContextAccessor", From f288f9148c8bbc24b49648cab3e3ddf41f13dc20 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 8 Apr 2026 20:27:59 +0200 Subject: [PATCH 3/7] Removed nametag mixins --- .../saturnclient/mixin/NameTagMixin.java | 93 ------------------- .../saturnclient/mixin/NameTagMixin.java | 93 ------------------- .../saturnclient/mixin/NameTagMixin.java | 93 ------------------- .../saturnclient/mixin/NameTagMixin.java | 93 ------------------- .../saturnclient/mixin/NameTagMixin.java | 93 ------------------- .../saturnclient/mixin/NameTagMixin.java | 67 ------------- 6 files changed, 532 deletions(-) delete mode 100644 versions/1.21.4/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java delete mode 100644 versions/1.21.5/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java delete mode 100644 versions/1.21.6/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java delete mode 100644 versions/1.21.7/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java delete mode 100644 versions/1.21.8/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java delete mode 100644 versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java diff --git a/versions/1.21.4/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/versions/1.21.4/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java deleted file mode 100644 index 518494c..0000000 --- a/versions/1.21.4/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.saturnclient.saturnclient.mixin; - -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.font.TextRenderer.TextLayerType; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.Vec3d; - -import org.saturnclient.client.player.Roles; -import org.saturnclient.client.player.SaturnPlayer; -import org.saturnclient.saturnclient.SaturnClient; - -import java.util.UUID; - -import org.joml.Matrix4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(value = EntityRenderer.class, priority = 1800) -public abstract class NameTagMixin { - @Shadow - public EntityRenderDispatcher dispatcher; - - /** - * @author HexLeo - * @reason Adds the Saturn Client icon to the player's name if they are online - * with Saturn Client - */ - @Inject(method = "renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), cancellable = true) - private void onRenderLabelIfPresent(S state, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) { - - UUID uuid = isSaturn(state); - - if (uuid != null) { - MutableText iconText = Text.literal(Roles.getSaturnIndicator()) - .styled(style -> style.withColor(Roles.getIconColor(uuid))); - - Text nameText = text.copy().styled(style -> style.withColor(Formatting.WHITE)); - - renderLabel(state, iconText.append(nameText), matrices, - vertexConsumers, light); - - ci.cancel(); - } - } - - private UUID isSaturn(S state) { - if (state instanceof PlayerEntityRenderState) { - String name = ((PlayerEntityRenderState) state).name; - SaturnPlayer player = SaturnPlayer.get(name); - if (player != null) { - return player.uuid; - } - } - - return null; - } - - private void renderLabel(S state, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light) { - Vec3d vec3d = state.nameLabelPos; - if (vec3d != null) { - boolean bl = !state.sneaking; - int i = "deadmau5".equals(text.getString()) ? -10 : 0; - matrices.push(); - matrices.translate(vec3d.x, vec3d.y + 0.5, vec3d.z); - matrices.multiply(this.dispatcher.getRotation()); - matrices.scale(0.025F, -0.025F, 0.025F); - Matrix4f matrix4f = matrices.peek().getPositionMatrix(); - TextRenderer textRenderer = SaturnClient.client.textRenderer; - float f = (float) (-textRenderer.getWidth(text)) / 2.0F; - int j = (int) (SaturnClient.client.options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24; - textRenderer.draw(text, f, (float) i, -2130706433, false, matrix4f, vertexConsumers, - bl ? TextLayerType.SEE_THROUGH : TextLayerType.NORMAL, j, light); - if (bl) { - textRenderer.draw(text, f, (float) i, -1, false, matrix4f, vertexConsumers, TextLayerType.NORMAL, 0, - light); - } - matrices.pop(); - } - } -} diff --git a/versions/1.21.5/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/versions/1.21.5/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java deleted file mode 100644 index 518494c..0000000 --- a/versions/1.21.5/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.saturnclient.saturnclient.mixin; - -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.font.TextRenderer.TextLayerType; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.Vec3d; - -import org.saturnclient.client.player.Roles; -import org.saturnclient.client.player.SaturnPlayer; -import org.saturnclient.saturnclient.SaturnClient; - -import java.util.UUID; - -import org.joml.Matrix4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(value = EntityRenderer.class, priority = 1800) -public abstract class NameTagMixin { - @Shadow - public EntityRenderDispatcher dispatcher; - - /** - * @author HexLeo - * @reason Adds the Saturn Client icon to the player's name if they are online - * with Saturn Client - */ - @Inject(method = "renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), cancellable = true) - private void onRenderLabelIfPresent(S state, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) { - - UUID uuid = isSaturn(state); - - if (uuid != null) { - MutableText iconText = Text.literal(Roles.getSaturnIndicator()) - .styled(style -> style.withColor(Roles.getIconColor(uuid))); - - Text nameText = text.copy().styled(style -> style.withColor(Formatting.WHITE)); - - renderLabel(state, iconText.append(nameText), matrices, - vertexConsumers, light); - - ci.cancel(); - } - } - - private UUID isSaturn(S state) { - if (state instanceof PlayerEntityRenderState) { - String name = ((PlayerEntityRenderState) state).name; - SaturnPlayer player = SaturnPlayer.get(name); - if (player != null) { - return player.uuid; - } - } - - return null; - } - - private void renderLabel(S state, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light) { - Vec3d vec3d = state.nameLabelPos; - if (vec3d != null) { - boolean bl = !state.sneaking; - int i = "deadmau5".equals(text.getString()) ? -10 : 0; - matrices.push(); - matrices.translate(vec3d.x, vec3d.y + 0.5, vec3d.z); - matrices.multiply(this.dispatcher.getRotation()); - matrices.scale(0.025F, -0.025F, 0.025F); - Matrix4f matrix4f = matrices.peek().getPositionMatrix(); - TextRenderer textRenderer = SaturnClient.client.textRenderer; - float f = (float) (-textRenderer.getWidth(text)) / 2.0F; - int j = (int) (SaturnClient.client.options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24; - textRenderer.draw(text, f, (float) i, -2130706433, false, matrix4f, vertexConsumers, - bl ? TextLayerType.SEE_THROUGH : TextLayerType.NORMAL, j, light); - if (bl) { - textRenderer.draw(text, f, (float) i, -1, false, matrix4f, vertexConsumers, TextLayerType.NORMAL, 0, - light); - } - matrices.pop(); - } - } -} diff --git a/versions/1.21.6/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/versions/1.21.6/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java deleted file mode 100644 index 518494c..0000000 --- a/versions/1.21.6/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.saturnclient.saturnclient.mixin; - -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.font.TextRenderer.TextLayerType; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.Vec3d; - -import org.saturnclient.client.player.Roles; -import org.saturnclient.client.player.SaturnPlayer; -import org.saturnclient.saturnclient.SaturnClient; - -import java.util.UUID; - -import org.joml.Matrix4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(value = EntityRenderer.class, priority = 1800) -public abstract class NameTagMixin { - @Shadow - public EntityRenderDispatcher dispatcher; - - /** - * @author HexLeo - * @reason Adds the Saturn Client icon to the player's name if they are online - * with Saturn Client - */ - @Inject(method = "renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), cancellable = true) - private void onRenderLabelIfPresent(S state, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) { - - UUID uuid = isSaturn(state); - - if (uuid != null) { - MutableText iconText = Text.literal(Roles.getSaturnIndicator()) - .styled(style -> style.withColor(Roles.getIconColor(uuid))); - - Text nameText = text.copy().styled(style -> style.withColor(Formatting.WHITE)); - - renderLabel(state, iconText.append(nameText), matrices, - vertexConsumers, light); - - ci.cancel(); - } - } - - private UUID isSaturn(S state) { - if (state instanceof PlayerEntityRenderState) { - String name = ((PlayerEntityRenderState) state).name; - SaturnPlayer player = SaturnPlayer.get(name); - if (player != null) { - return player.uuid; - } - } - - return null; - } - - private void renderLabel(S state, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light) { - Vec3d vec3d = state.nameLabelPos; - if (vec3d != null) { - boolean bl = !state.sneaking; - int i = "deadmau5".equals(text.getString()) ? -10 : 0; - matrices.push(); - matrices.translate(vec3d.x, vec3d.y + 0.5, vec3d.z); - matrices.multiply(this.dispatcher.getRotation()); - matrices.scale(0.025F, -0.025F, 0.025F); - Matrix4f matrix4f = matrices.peek().getPositionMatrix(); - TextRenderer textRenderer = SaturnClient.client.textRenderer; - float f = (float) (-textRenderer.getWidth(text)) / 2.0F; - int j = (int) (SaturnClient.client.options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24; - textRenderer.draw(text, f, (float) i, -2130706433, false, matrix4f, vertexConsumers, - bl ? TextLayerType.SEE_THROUGH : TextLayerType.NORMAL, j, light); - if (bl) { - textRenderer.draw(text, f, (float) i, -1, false, matrix4f, vertexConsumers, TextLayerType.NORMAL, 0, - light); - } - matrices.pop(); - } - } -} diff --git a/versions/1.21.7/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/versions/1.21.7/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java deleted file mode 100644 index 518494c..0000000 --- a/versions/1.21.7/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.saturnclient.saturnclient.mixin; - -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.font.TextRenderer.TextLayerType; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.Vec3d; - -import org.saturnclient.client.player.Roles; -import org.saturnclient.client.player.SaturnPlayer; -import org.saturnclient.saturnclient.SaturnClient; - -import java.util.UUID; - -import org.joml.Matrix4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(value = EntityRenderer.class, priority = 1800) -public abstract class NameTagMixin { - @Shadow - public EntityRenderDispatcher dispatcher; - - /** - * @author HexLeo - * @reason Adds the Saturn Client icon to the player's name if they are online - * with Saturn Client - */ - @Inject(method = "renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), cancellable = true) - private void onRenderLabelIfPresent(S state, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) { - - UUID uuid = isSaturn(state); - - if (uuid != null) { - MutableText iconText = Text.literal(Roles.getSaturnIndicator()) - .styled(style -> style.withColor(Roles.getIconColor(uuid))); - - Text nameText = text.copy().styled(style -> style.withColor(Formatting.WHITE)); - - renderLabel(state, iconText.append(nameText), matrices, - vertexConsumers, light); - - ci.cancel(); - } - } - - private UUID isSaturn(S state) { - if (state instanceof PlayerEntityRenderState) { - String name = ((PlayerEntityRenderState) state).name; - SaturnPlayer player = SaturnPlayer.get(name); - if (player != null) { - return player.uuid; - } - } - - return null; - } - - private void renderLabel(S state, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light) { - Vec3d vec3d = state.nameLabelPos; - if (vec3d != null) { - boolean bl = !state.sneaking; - int i = "deadmau5".equals(text.getString()) ? -10 : 0; - matrices.push(); - matrices.translate(vec3d.x, vec3d.y + 0.5, vec3d.z); - matrices.multiply(this.dispatcher.getRotation()); - matrices.scale(0.025F, -0.025F, 0.025F); - Matrix4f matrix4f = matrices.peek().getPositionMatrix(); - TextRenderer textRenderer = SaturnClient.client.textRenderer; - float f = (float) (-textRenderer.getWidth(text)) / 2.0F; - int j = (int) (SaturnClient.client.options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24; - textRenderer.draw(text, f, (float) i, -2130706433, false, matrix4f, vertexConsumers, - bl ? TextLayerType.SEE_THROUGH : TextLayerType.NORMAL, j, light); - if (bl) { - textRenderer.draw(text, f, (float) i, -1, false, matrix4f, vertexConsumers, TextLayerType.NORMAL, 0, - light); - } - matrices.pop(); - } - } -} diff --git a/versions/1.21.8/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/versions/1.21.8/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java deleted file mode 100644 index 518494c..0000000 --- a/versions/1.21.8/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.saturnclient.saturnclient.mixin; - -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.font.TextRenderer.TextLayerType; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.Vec3d; - -import org.saturnclient.client.player.Roles; -import org.saturnclient.client.player.SaturnPlayer; -import org.saturnclient.saturnclient.SaturnClient; - -import java.util.UUID; - -import org.joml.Matrix4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(value = EntityRenderer.class, priority = 1800) -public abstract class NameTagMixin { - @Shadow - public EntityRenderDispatcher dispatcher; - - /** - * @author HexLeo - * @reason Adds the Saturn Client icon to the player's name if they are online - * with Saturn Client - */ - @Inject(method = "renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), cancellable = true) - private void onRenderLabelIfPresent(S state, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) { - - UUID uuid = isSaturn(state); - - if (uuid != null) { - MutableText iconText = Text.literal(Roles.getSaturnIndicator()) - .styled(style -> style.withColor(Roles.getIconColor(uuid))); - - Text nameText = text.copy().styled(style -> style.withColor(Formatting.WHITE)); - - renderLabel(state, iconText.append(nameText), matrices, - vertexConsumers, light); - - ci.cancel(); - } - } - - private UUID isSaturn(S state) { - if (state instanceof PlayerEntityRenderState) { - String name = ((PlayerEntityRenderState) state).name; - SaturnPlayer player = SaturnPlayer.get(name); - if (player != null) { - return player.uuid; - } - } - - return null; - } - - private void renderLabel(S state, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light) { - Vec3d vec3d = state.nameLabelPos; - if (vec3d != null) { - boolean bl = !state.sneaking; - int i = "deadmau5".equals(text.getString()) ? -10 : 0; - matrices.push(); - matrices.translate(vec3d.x, vec3d.y + 0.5, vec3d.z); - matrices.multiply(this.dispatcher.getRotation()); - matrices.scale(0.025F, -0.025F, 0.025F); - Matrix4f matrix4f = matrices.peek().getPositionMatrix(); - TextRenderer textRenderer = SaturnClient.client.textRenderer; - float f = (float) (-textRenderer.getWidth(text)) / 2.0F; - int j = (int) (SaturnClient.client.options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24; - textRenderer.draw(text, f, (float) i, -2130706433, false, matrix4f, vertexConsumers, - bl ? TextLayerType.SEE_THROUGH : TextLayerType.NORMAL, j, light); - if (bl) { - textRenderer.draw(text, f, (float) i, -1, false, matrix4f, vertexConsumers, TextLayerType.NORMAL, 0, - light); - } - matrices.pop(); - } - } -} diff --git a/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java deleted file mode 100644 index 453eae1..0000000 --- a/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.saturnclient.saturnclient.mixin; - -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.EntityRenderManager; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.render.state.CameraRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import org.saturnclient.client.player.Roles; -import org.saturnclient.client.player.SaturnPlayer; - -import java.util.UUID; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(value = EntityRenderer.class, priority = 1800) -public abstract class NameTagMixin { - @Shadow - public EntityRenderManager dispatcher; - - /** - * @author HexLeo - * @reason Adds the Saturn Client icon to the player's name if they are online - * with Saturn Client - */ - @Inject(method = "renderLabelIfPresent", at = @At("HEAD"), cancellable = true) - protected void renderLabelIfPresent(S state, MatrixStack matrices, OrderedRenderCommandQueue queue, - CameraRenderState cameraRenderState, CallbackInfo ci) { - if (state.displayName == null) - return; - - UUID uuid = isSaturn(state); - - if (uuid != null) { - MutableText iconText = Text.literal(Roles.getSaturnIndicator()) - .styled(style -> style.withColor(Roles.getIconColor(uuid))); - - Text nameText = state.displayName.copy().styled(style -> style.withColor(Formatting.WHITE)); - - queue.submitLabel(matrices, state.nameLabelPos, 0, iconText.append(nameText), !state.sneaking, state.light, - state.squaredDistanceToCamera, cameraRenderState); - - ci.cancel(); - } - } - - private UUID isSaturn(S state) { - if (state instanceof PlayerEntityRenderState) { - String name = ((PlayerEntityRenderState) state).displayName.getString(); - SaturnPlayer player = SaturnPlayer.get(name); - if (player != null) { - return player.uuid; - } - } - - return null; - } -} From 8a1e9b49bcaf99e33b2992f7a70078ea7fc54521 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 8 Apr 2026 20:34:21 +0200 Subject: [PATCH 4/7] Added 1.21.8-9 nametag --- .../saturnclient/saturnclient/SaturnRenderState.java | 10 ++++++++++ .../saturnclient/saturnclient/SaturnRenderState.java | 10 ++++++++++ 2 files changed, 20 insertions(+) create mode 100644 versions/1.21.8/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java create mode 100644 versions/1.21.9/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java diff --git a/versions/1.21.8/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java b/versions/1.21.8/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java new file mode 100644 index 0000000..e34af31 --- /dev/null +++ b/versions/1.21.8/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java @@ -0,0 +1,10 @@ +package org.saturnclient.saturnclient; + +import org.saturnclient.client.player.SaturnPlayer; + +import net.fabricmc.fabric.api.client.rendering.v1.RenderStateDataKey; + +public class SaturnRenderState { + public static RenderStateDataKey saturnDataKey = RenderStateDataKey + .create(() -> "saturn-client-player"); +} diff --git a/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java b/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java new file mode 100644 index 0000000..e34af31 --- /dev/null +++ b/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java @@ -0,0 +1,10 @@ +package org.saturnclient.saturnclient; + +import org.saturnclient.client.player.SaturnPlayer; + +import net.fabricmc.fabric.api.client.rendering.v1.RenderStateDataKey; + +public class SaturnRenderState { + public static RenderStateDataKey saturnDataKey = RenderStateDataKey + .create(() -> "saturn-client-player"); +} From 65c9454370992584b2297d1bf7619b3008f59e51 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 8 Apr 2026 20:39:03 +0200 Subject: [PATCH 5/7] Re-added old nametag to unsupported versions --- .../saturnclient/mixin/NameTagMixin.java | 93 +++++++++++++++++++ .../saturnclient/mixin/NameTagMixin.java | 93 +++++++++++++++++++ .../saturnclient/mixin/NameTagMixin.java | 93 +++++++++++++++++++ .../saturnclient/mixin/NameTagMixin.java | 93 +++++++++++++++++++ 4 files changed, 372 insertions(+) create mode 100644 versions/1.21.4/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java create mode 100644 versions/1.21.5/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java create mode 100644 versions/1.21.6/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java create mode 100644 versions/1.21.7/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java diff --git a/versions/1.21.4/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/versions/1.21.4/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java new file mode 100644 index 0000000..518494c --- /dev/null +++ b/versions/1.21.4/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java @@ -0,0 +1,93 @@ +package org.saturnclient.saturnclient.mixin; + +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.font.TextRenderer.TextLayerType; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.state.EntityRenderState; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.Vec3d; + +import org.saturnclient.client.player.Roles; +import org.saturnclient.client.player.SaturnPlayer; +import org.saturnclient.saturnclient.SaturnClient; + +import java.util.UUID; + +import org.joml.Matrix4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(value = EntityRenderer.class, priority = 1800) +public abstract class NameTagMixin { + @Shadow + public EntityRenderDispatcher dispatcher; + + /** + * @author HexLeo + * @reason Adds the Saturn Client icon to the player's name if they are online + * with Saturn Client + */ + @Inject(method = "renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), cancellable = true) + private void onRenderLabelIfPresent(S state, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) { + + UUID uuid = isSaturn(state); + + if (uuid != null) { + MutableText iconText = Text.literal(Roles.getSaturnIndicator()) + .styled(style -> style.withColor(Roles.getIconColor(uuid))); + + Text nameText = text.copy().styled(style -> style.withColor(Formatting.WHITE)); + + renderLabel(state, iconText.append(nameText), matrices, + vertexConsumers, light); + + ci.cancel(); + } + } + + private UUID isSaturn(S state) { + if (state instanceof PlayerEntityRenderState) { + String name = ((PlayerEntityRenderState) state).name; + SaturnPlayer player = SaturnPlayer.get(name); + if (player != null) { + return player.uuid; + } + } + + return null; + } + + private void renderLabel(S state, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light) { + Vec3d vec3d = state.nameLabelPos; + if (vec3d != null) { + boolean bl = !state.sneaking; + int i = "deadmau5".equals(text.getString()) ? -10 : 0; + matrices.push(); + matrices.translate(vec3d.x, vec3d.y + 0.5, vec3d.z); + matrices.multiply(this.dispatcher.getRotation()); + matrices.scale(0.025F, -0.025F, 0.025F); + Matrix4f matrix4f = matrices.peek().getPositionMatrix(); + TextRenderer textRenderer = SaturnClient.client.textRenderer; + float f = (float) (-textRenderer.getWidth(text)) / 2.0F; + int j = (int) (SaturnClient.client.options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24; + textRenderer.draw(text, f, (float) i, -2130706433, false, matrix4f, vertexConsumers, + bl ? TextLayerType.SEE_THROUGH : TextLayerType.NORMAL, j, light); + if (bl) { + textRenderer.draw(text, f, (float) i, -1, false, matrix4f, vertexConsumers, TextLayerType.NORMAL, 0, + light); + } + matrices.pop(); + } + } +} diff --git a/versions/1.21.5/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/versions/1.21.5/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java new file mode 100644 index 0000000..518494c --- /dev/null +++ b/versions/1.21.5/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java @@ -0,0 +1,93 @@ +package org.saturnclient.saturnclient.mixin; + +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.font.TextRenderer.TextLayerType; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.state.EntityRenderState; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.Vec3d; + +import org.saturnclient.client.player.Roles; +import org.saturnclient.client.player.SaturnPlayer; +import org.saturnclient.saturnclient.SaturnClient; + +import java.util.UUID; + +import org.joml.Matrix4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(value = EntityRenderer.class, priority = 1800) +public abstract class NameTagMixin { + @Shadow + public EntityRenderDispatcher dispatcher; + + /** + * @author HexLeo + * @reason Adds the Saturn Client icon to the player's name if they are online + * with Saturn Client + */ + @Inject(method = "renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), cancellable = true) + private void onRenderLabelIfPresent(S state, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) { + + UUID uuid = isSaturn(state); + + if (uuid != null) { + MutableText iconText = Text.literal(Roles.getSaturnIndicator()) + .styled(style -> style.withColor(Roles.getIconColor(uuid))); + + Text nameText = text.copy().styled(style -> style.withColor(Formatting.WHITE)); + + renderLabel(state, iconText.append(nameText), matrices, + vertexConsumers, light); + + ci.cancel(); + } + } + + private UUID isSaturn(S state) { + if (state instanceof PlayerEntityRenderState) { + String name = ((PlayerEntityRenderState) state).name; + SaturnPlayer player = SaturnPlayer.get(name); + if (player != null) { + return player.uuid; + } + } + + return null; + } + + private void renderLabel(S state, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light) { + Vec3d vec3d = state.nameLabelPos; + if (vec3d != null) { + boolean bl = !state.sneaking; + int i = "deadmau5".equals(text.getString()) ? -10 : 0; + matrices.push(); + matrices.translate(vec3d.x, vec3d.y + 0.5, vec3d.z); + matrices.multiply(this.dispatcher.getRotation()); + matrices.scale(0.025F, -0.025F, 0.025F); + Matrix4f matrix4f = matrices.peek().getPositionMatrix(); + TextRenderer textRenderer = SaturnClient.client.textRenderer; + float f = (float) (-textRenderer.getWidth(text)) / 2.0F; + int j = (int) (SaturnClient.client.options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24; + textRenderer.draw(text, f, (float) i, -2130706433, false, matrix4f, vertexConsumers, + bl ? TextLayerType.SEE_THROUGH : TextLayerType.NORMAL, j, light); + if (bl) { + textRenderer.draw(text, f, (float) i, -1, false, matrix4f, vertexConsumers, TextLayerType.NORMAL, 0, + light); + } + matrices.pop(); + } + } +} diff --git a/versions/1.21.6/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/versions/1.21.6/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java new file mode 100644 index 0000000..518494c --- /dev/null +++ b/versions/1.21.6/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java @@ -0,0 +1,93 @@ +package org.saturnclient.saturnclient.mixin; + +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.font.TextRenderer.TextLayerType; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.state.EntityRenderState; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.Vec3d; + +import org.saturnclient.client.player.Roles; +import org.saturnclient.client.player.SaturnPlayer; +import org.saturnclient.saturnclient.SaturnClient; + +import java.util.UUID; + +import org.joml.Matrix4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(value = EntityRenderer.class, priority = 1800) +public abstract class NameTagMixin { + @Shadow + public EntityRenderDispatcher dispatcher; + + /** + * @author HexLeo + * @reason Adds the Saturn Client icon to the player's name if they are online + * with Saturn Client + */ + @Inject(method = "renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), cancellable = true) + private void onRenderLabelIfPresent(S state, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) { + + UUID uuid = isSaturn(state); + + if (uuid != null) { + MutableText iconText = Text.literal(Roles.getSaturnIndicator()) + .styled(style -> style.withColor(Roles.getIconColor(uuid))); + + Text nameText = text.copy().styled(style -> style.withColor(Formatting.WHITE)); + + renderLabel(state, iconText.append(nameText), matrices, + vertexConsumers, light); + + ci.cancel(); + } + } + + private UUID isSaturn(S state) { + if (state instanceof PlayerEntityRenderState) { + String name = ((PlayerEntityRenderState) state).name; + SaturnPlayer player = SaturnPlayer.get(name); + if (player != null) { + return player.uuid; + } + } + + return null; + } + + private void renderLabel(S state, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light) { + Vec3d vec3d = state.nameLabelPos; + if (vec3d != null) { + boolean bl = !state.sneaking; + int i = "deadmau5".equals(text.getString()) ? -10 : 0; + matrices.push(); + matrices.translate(vec3d.x, vec3d.y + 0.5, vec3d.z); + matrices.multiply(this.dispatcher.getRotation()); + matrices.scale(0.025F, -0.025F, 0.025F); + Matrix4f matrix4f = matrices.peek().getPositionMatrix(); + TextRenderer textRenderer = SaturnClient.client.textRenderer; + float f = (float) (-textRenderer.getWidth(text)) / 2.0F; + int j = (int) (SaturnClient.client.options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24; + textRenderer.draw(text, f, (float) i, -2130706433, false, matrix4f, vertexConsumers, + bl ? TextLayerType.SEE_THROUGH : TextLayerType.NORMAL, j, light); + if (bl) { + textRenderer.draw(text, f, (float) i, -1, false, matrix4f, vertexConsumers, TextLayerType.NORMAL, 0, + light); + } + matrices.pop(); + } + } +} diff --git a/versions/1.21.7/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/versions/1.21.7/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java new file mode 100644 index 0000000..518494c --- /dev/null +++ b/versions/1.21.7/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java @@ -0,0 +1,93 @@ +package org.saturnclient.saturnclient.mixin; + +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.font.TextRenderer.TextLayerType; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.state.EntityRenderState; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.Vec3d; + +import org.saturnclient.client.player.Roles; +import org.saturnclient.client.player.SaturnPlayer; +import org.saturnclient.saturnclient.SaturnClient; + +import java.util.UUID; + +import org.joml.Matrix4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(value = EntityRenderer.class, priority = 1800) +public abstract class NameTagMixin { + @Shadow + public EntityRenderDispatcher dispatcher; + + /** + * @author HexLeo + * @reason Adds the Saturn Client icon to the player's name if they are online + * with Saturn Client + */ + @Inject(method = "renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), cancellable = true) + private void onRenderLabelIfPresent(S state, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) { + + UUID uuid = isSaturn(state); + + if (uuid != null) { + MutableText iconText = Text.literal(Roles.getSaturnIndicator()) + .styled(style -> style.withColor(Roles.getIconColor(uuid))); + + Text nameText = text.copy().styled(style -> style.withColor(Formatting.WHITE)); + + renderLabel(state, iconText.append(nameText), matrices, + vertexConsumers, light); + + ci.cancel(); + } + } + + private UUID isSaturn(S state) { + if (state instanceof PlayerEntityRenderState) { + String name = ((PlayerEntityRenderState) state).name; + SaturnPlayer player = SaturnPlayer.get(name); + if (player != null) { + return player.uuid; + } + } + + return null; + } + + private void renderLabel(S state, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light) { + Vec3d vec3d = state.nameLabelPos; + if (vec3d != null) { + boolean bl = !state.sneaking; + int i = "deadmau5".equals(text.getString()) ? -10 : 0; + matrices.push(); + matrices.translate(vec3d.x, vec3d.y + 0.5, vec3d.z); + matrices.multiply(this.dispatcher.getRotation()); + matrices.scale(0.025F, -0.025F, 0.025F); + Matrix4f matrix4f = matrices.peek().getPositionMatrix(); + TextRenderer textRenderer = SaturnClient.client.textRenderer; + float f = (float) (-textRenderer.getWidth(text)) / 2.0F; + int j = (int) (SaturnClient.client.options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24; + textRenderer.draw(text, f, (float) i, -2130706433, false, matrix4f, vertexConsumers, + bl ? TextLayerType.SEE_THROUGH : TextLayerType.NORMAL, j, light); + if (bl) { + textRenderer.draw(text, f, (float) i, -1, false, matrix4f, vertexConsumers, TextLayerType.NORMAL, 0, + light); + } + matrices.pop(); + } + } +} From cdd6ae8ec998315c871191066de0c6fc15f384dc Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 8 Apr 2026 20:40:47 +0200 Subject: [PATCH 6/7] 1.21.9 nametags --- .../mixin/PlayerEntityRendererMixin.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java b/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java index 0363dad..9bf40dd 100644 --- a/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java +++ b/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java @@ -1,19 +1,29 @@ package org.saturnclient.saturnclient.mixin; +import net.minecraft.client.network.ClientPlayerLikeEntity; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.client.render.entity.PlayerEntityRenderer; import net.minecraft.client.render.entity.model.PlayerEntityModel; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.entity.PlayerLikeEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.saturnclient.client.player.Roles; +import org.saturnclient.client.player.SaturnPlayer; import org.saturnclient.impl.cosmetics.CloakFeatureRenderer; import org.saturnclient.impl.cosmetics.HatFeatureRenderer; +import org.saturnclient.saturnclient.SaturnRenderState; 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; +import com.kitfox.svg.A; + @Mixin(PlayerEntityRenderer.class) public abstract class PlayerEntityRendererMixin extends LivingEntityRenderer { @@ -27,4 +37,27 @@ public abstract class PlayerEntityRendererMixin this.addFeature(new HatFeatureRenderer(this)); this.addFeature(new CloakFeatureRenderer(this, ctx.getEquipmentModelLoader())); } + + @Inject(method = "updateRenderState", at = @At("TAIL")) + public void updateRenderState( + A entity, PlayerEntityRenderState state, + float f, CallbackInfo ci) { + if (entity == null) { + return; + } + + SaturnPlayer player = SaturnPlayer.get(entity.getUuid()); + + state.setData(SaturnRenderState.saturnDataKey, player); + + if (player != null) { + MutableText iconText = Text.literal(Roles.getSaturnIndicator()) + .styled(style -> style.withColor(Roles.getIconColor(player.uuid))); + + state.displayName = Text.empty() + .append(iconText.copy()) + .append(Text.empty().formatted(Formatting.RESET)) + .append(state.displayName.copy()); + } + } } \ No newline at end of file From daddd0a0052ecbe0ddb433fce928aacdf4a96ad1 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 8 Apr 2026 20:42:29 +0200 Subject: [PATCH 7/7] 1.21.8 implementation --- .../mixin/PlayerEntityRendererMixin.java | 30 +++++++++++++++++++ .../mixin/PlayerEntityRendererMixin.java | 2 -- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/versions/1.21.8/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java b/versions/1.21.8/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java index 0363dad..5a22bbb 100644 --- a/versions/1.21.8/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java +++ b/versions/1.21.8/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java @@ -1,14 +1,21 @@ package org.saturnclient.saturnclient.mixin; +import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.client.render.entity.PlayerEntityRenderer; import net.minecraft.client.render.entity.model.PlayerEntityModel; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.saturnclient.client.player.Roles; +import org.saturnclient.client.player.SaturnPlayer; import org.saturnclient.impl.cosmetics.CloakFeatureRenderer; import org.saturnclient.impl.cosmetics.HatFeatureRenderer; +import org.saturnclient.saturnclient.SaturnRenderState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -27,4 +34,27 @@ public abstract class PlayerEntityRendererMixin this.addFeature(new HatFeatureRenderer(this)); this.addFeature(new CloakFeatureRenderer(this, ctx.getEquipmentModelLoader())); } + + @Inject(method = "updateRenderState", at = @At("TAIL")) + public void updateRenderState( + AbstractClientPlayerEntity entity, PlayerEntityRenderState state, + float f, CallbackInfo ci) { + if (entity == null) { + return; + } + + SaturnPlayer player = SaturnPlayer.get(entity.getUuid()); + + state.setData(SaturnRenderState.saturnDataKey, player); + + if (player != null) { + MutableText iconText = Text.literal(Roles.getSaturnIndicator()) + .styled(style -> style.withColor(Roles.getIconColor(player.uuid))); + + state.displayName = Text.empty() + .append(iconText.copy()) + .append(Text.empty().formatted(Formatting.RESET)) + .append(state.displayName.copy()); + } + } } \ No newline at end of file diff --git a/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java b/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java index 9bf40dd..6da5ccb 100644 --- a/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java +++ b/versions/1.21.9/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java @@ -22,8 +22,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.kitfox.svg.A; - @Mixin(PlayerEntityRenderer.class) public abstract class PlayerEntityRendererMixin extends LivingEntityRenderer {