diff --git a/src/main/java/org/auraclient/auraclient/auth/AuraApi.java b/src/main/java/org/auraclient/auraclient/auth/AuraApi.java index 7a2b978..2921468 100644 --- a/src/main/java/org/auraclient/auraclient/auth/AuraApi.java +++ b/src/main/java/org/auraclient/auraclient/auth/AuraApi.java @@ -50,7 +50,7 @@ public class AuraApi { JsonObject jsonResponse = JsonParser.parseString(response.toString()).getAsJsonObject(); boolean success = jsonResponse.get("success").getAsBoolean(); - uuid = jsonResponse.get("uuid").getAsString(); + uuid = jsonResponse.get("uuid").getAsString().replace("-", ""); if (success) { AuraClient.LOGGER.info("Successfully authenticated"); diff --git a/src/main/java/org/auraclient/auraclient/mixin/AbstractClientPlayerEntityMixin.java b/src/main/java/org/auraclient/auraclient/mixin/AbstractClientPlayerEntityMixin.java index 7ea92d2..6d8550a 100644 --- a/src/main/java/org/auraclient/auraclient/mixin/AbstractClientPlayerEntityMixin.java +++ b/src/main/java/org/auraclient/auraclient/mixin/AbstractClientPlayerEntityMixin.java @@ -5,6 +5,7 @@ import net.fabricmc.api.Environment; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.util.SkinTextures; import net.minecraft.util.Identifier; + import org.auraclient.auraclient.cloaks.Cloaks; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -24,7 +25,7 @@ public abstract class AbstractClientPlayerEntityMixin { @Inject(method = "getSkinTextures", at = @At("RETURN"), cancellable = true) private void injectCustomTextures(CallbackInfoReturnable cir) { AbstractClientPlayerEntity player = (AbstractClientPlayerEntity) (Object) this; - String uuid = player.getUuid().toString(); + String uuid = player.getUuidAsString().replace("-", ""); Identifier cloakTexture = Cloaks.getCurrentCloakTexture(uuid); if (cloakTexture != null) { diff --git a/src/main/java/org/auraclient/auraclient/mixin/EntityRendererMixin.java b/src/main/java/org/auraclient/auraclient/mixin/EntityRendererMixin.java new file mode 100644 index 0000000..0b57e2b --- /dev/null +++ b/src/main/java/org/auraclient/auraclient/mixin/EntityRendererMixin.java @@ -0,0 +1,124 @@ +package org.auraclient.auraclient.mixin; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +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.util.math.MatrixStack; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import net.minecraft.client.render.LightmapTextureManager; + +import org.joml.Matrix4f; +import org.joml.Quaternionf; +import org.joml.Vector3f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(EntityRenderer.class) +public abstract class EntityRendererMixin { + private static final Identifier BADGE_TEXTURE = Identifier.of("auraclient", "textures/player.png"); + + @Shadow + public EntityRenderDispatcher dispatcher; + + @Overwrite + public void renderLabelIfPresent(S state, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light) { + + matrices.push(); + + matrices.translate(0.0f, 0.0f, 0.0f); + + int textWidth = MinecraftClient.getInstance().textRenderer.getWidth(text); + + double y = state.nameLabelPos.y; + + renderTextAtOrigin(y, text, matrices, vertexConsumers, light); + + if (state instanceof net.minecraft.client.render.entity.state.PlayerEntityRenderState) { + float yawAngle = 0.0f; + Quaternionf yawRotation = new Quaternionf().rotateY((float) Math.toRadians(yawAngle)); + matrices.multiply(yawRotation); + + Quaternionf cameraRotation = dispatcher.camera.getRotation(); + Vector3f leftVector = new Vector3f(-1, 0, 0).rotate(cameraRotation); + + float xOffset = textWidth * 0.018f; + + matrices.translate(leftVector.x * xOffset, y + 0.4f, leftVector.z * xOffset); + + matrices.scale(0.25F, 0.25F, 0.25F); + + renderBadgeIcon(matrices, vertexConsumers, light); + } + + matrices.pop(); + } + + private void renderTextAtOrigin(double y, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, + int light) { + // Push the current matrix stack + matrices.push(); + + // Translate to the origin (0, 0, 0) and adjust the vertical position slightly + matrices.translate(0.0f, y + 0.5f, 0.0f); + + // Apply the camera's rotation to face the text towards the camera + matrices.multiply(dispatcher.getRotation()); + + // Scale the text to a readable size + matrices.scale(0.025F, -0.025F, 0.025F); + + // Get the position matrix for rendering + Matrix4f matrix4f = matrices.peek().getPositionMatrix(); + + // Obtain the text renderer + net.minecraft.client.font.TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + + // Calculate the horizontal offset to center the text + float textWidth = (float) (-textRenderer.getWidth(text)) / 2.0F; + + // Determine the background opacity + int backgroundOpacity = (int) (MinecraftClient.getInstance().options.getTextBackgroundOpacity(0.25F) + * 255.0F) << 24; + + // Render the text with a background + textRenderer.draw(text, textWidth, 0, -2130706433, false, matrix4f, vertexConsumers, + net.minecraft.client.font.TextRenderer.TextLayerType.SEE_THROUGH, backgroundOpacity, light); + + // Render the text without a background if not sneaking + textRenderer.draw(text, textWidth, 0, -1, false, matrix4f, vertexConsumers, + net.minecraft.client.font.TextRenderer.TextLayerType.NORMAL, 0, + LightmapTextureManager.applyEmission(light, 2)); + + // Pop the matrix stack to restore the previous state + matrices.pop(); + } + + private void renderBadgeIcon(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light) { + float size = .5f; + Matrix4f matrix = matrices.peek().getPositionMatrix(); + VertexConsumer vertexConsumer = vertexConsumers + .getBuffer(RenderLayer.getEntityTranslucent(BADGE_TEXTURE)); + + // Apply rotation to make the icon face the camera + Quaternionf rotation = dispatcher.camera.getRotation(); + matrices.multiply(rotation); + + vertexConsumer.vertex(matrix, -size, -size, 0).color(255, 255, 255, 255).texture(0, 0).light(light) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + vertexConsumer.vertex(matrix, size, -size, 0).color(255, 255, 255, 255).texture(1, 0).light(light) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + vertexConsumer.vertex(matrix, size, size, 0).color(255, 255, 255, 255).texture(1, 1).light(light) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + vertexConsumer.vertex(matrix, -size, size, 0).color(255, 255, 255, 255).texture(0, 1).light(light) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + } +} \ No newline at end of file diff --git a/src/main/resources/assets/auraclient/icon.png b/src/main/resources/assets/auraclient/icon.png index dc3cbab..4961827 100644 Binary files a/src/main/resources/assets/auraclient/icon.png and b/src/main/resources/assets/auraclient/icon.png differ diff --git a/src/main/resources/assets/auraclient/textures/capes/glitch.gif b/src/main/resources/assets/auraclient/textures/cloaks/glitch.gif similarity index 100% rename from src/main/resources/assets/auraclient/textures/capes/glitch.gif rename to src/main/resources/assets/auraclient/textures/cloaks/glitch.gif diff --git a/src/main/resources/assets/auraclient/textures/player.png b/src/main/resources/assets/auraclient/textures/player.png new file mode 100644 index 0000000..559bc12 Binary files /dev/null and b/src/main/resources/assets/auraclient/textures/player.png differ diff --git a/src/main/resources/auraclient.mixins.json b/src/main/resources/auraclient.mixins.json index 06884ff..0322079 100644 --- a/src/main/resources/auraclient.mixins.json +++ b/src/main/resources/auraclient.mixins.json @@ -3,7 +3,7 @@ "minVersion": "0.8", "package": "org.auraclient.auraclient.mixin", "compatibilityLevel": "JAVA_17", - "client": ["AbstractClientPlayerEntityMixin"], + "client": ["AbstractClientPlayerEntityMixin", "EntityRendererMixin"], "injectors": { "defaultRequire": 1 }