From 92a7c7958db002d56ff69933fe6ba5d8bd77f2f2 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Fri, 17 Mar 2023 18:58:02 -0400 Subject: [PATCH 01/18] HealthTags for mobs --- .../net/wurstclient/hacks/HealthTagsHack.java | 72 +++++++++++++++++-- .../net/wurstclient/util/RenderUtils.java | 57 +++++++++++++-- 2 files changed, 115 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index 573a2f17ae..ada650badf 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -7,21 +7,73 @@ */ package net.wurstclient.hacks; +import java.text.DecimalFormat; + +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.mob.MobEntity; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.wurstclient.Category; import net.wurstclient.SearchTags; +import net.wurstclient.events.RenderListener; import net.wurstclient.hack.Hack; +import net.wurstclient.settings.CheckboxSetting; +import net.wurstclient.util.RenderUtils; @SearchTags({"health tags"}) -public final class HealthTagsHack extends Hack +public final class HealthTagsHack extends Hack implements RenderListener { + private final CheckboxSetting mobs = new CheckboxSetting( + "Mobs", "Displays health tags above mobs also.", false); + private final CheckboxSetting round = new CheckboxSetting( + "Round health", true); + + private static final DecimalFormat DF = new DecimalFormat("0.##"); + public HealthTagsHack() { super("HealthTags"); setCategory(Category.RENDER); + addSetting(mobs); + addSetting(round); + } + + @Override + public void onEnable() + { + EVENTS.add(RenderListener.class, this); + } + + @Override + public void onDisable() + { + EVENTS.remove(RenderListener.class, this); + } + + @Override + public void onRender(MatrixStack matrixStack, float partialTicks) + { + if(!mobs.isChecked()) + return; + VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer()); + for(Entity e : MC.world.getEntities()) + if(e instanceof MobEntity entity) + { + String health = round.isChecked() ? Integer.toString((int)entity.getHealth()) + : DF.format(entity.getHealth()); + String maxHealth = round.isChecked() ? Integer.toString((int)entity.getMaxHealth()) + : DF.format(entity.getMaxHealth()); + Text text = Text.literal(health + "/" + maxHealth).formatted( + getColor(entity.getHealth(), entity.getMaxHealth())); + RenderUtils.renderTag(matrixStack, text, entity, immediate, 0xffffff, + !entity.hasCustomName() ? 0.5F : 1.0F, 75, partialTicks); + } + immediate.draw(); } public Text addHealth(LivingEntity entity, Text nametag) @@ -29,26 +81,32 @@ public Text addHealth(LivingEntity entity, Text nametag) if(!isEnabled()) return nametag; - int health = (int)entity.getHealth(); + String health = round.isChecked() ? Integer.toString((int)entity.getHealth()) + : DF.format(entity.getHealth()); MutableText formattedHealth = Text.literal(" ") - .append(Integer.toString(health)).formatted(getColor(health)); + .append(health).formatted(getColor(entity.getHealth(), entity.getMaxHealth())); return ((MutableText)nametag).append(formattedHealth); } - private Formatting getColor(int health) + private Formatting getColor(float health, float maxHealth) { - if(health <= 5) + if(health <= maxHealth * 0.25) return Formatting.DARK_RED; - if(health <= 10) + if(health <= maxHealth * 0.5) return Formatting.GOLD; - if(health <= 15) + if(health <= maxHealth * 0.75) return Formatting.YELLOW; return Formatting.GREEN; } + public boolean hasMobHealthTags() + { + return isEnabled() && mobs.isChecked(); + } + // See EntityRendererMixin.onRenderLabelIfPresent() } diff --git a/src/main/java/net/wurstclient/util/RenderUtils.java b/src/main/java/net/wurstclient/util/RenderUtils.java index 06674d9715..4dcaf4f071 100644 --- a/src/main/java/net/wurstclient/util/RenderUtils.java +++ b/src/main/java/net/wurstclient/util/RenderUtils.java @@ -14,24 +14,24 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.block.Blocks; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.font.TextRenderer.TextLayerType; import net.minecraft.client.gl.VertexBuffer; -import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.*; import net.minecraft.client.render.BufferBuilder.BuiltBuffer; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.DiffuseLighting; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.chunk.Chunk; import net.wurstclient.WurstClient; +import net.wurstclient.hacks.NameTagsHack; public enum RenderUtils { @@ -899,4 +899,47 @@ public static void drawItem(MatrixStack matrixStack, ItemStack stack, int x, matrixStack.pop(); } } + + public static void renderTag(MatrixStack matrixStack, Text text, Entity entity, VertexConsumerProvider provider, int color, + float height, int limit, float partialTicks) + { + NameTagsHack nameTagsHack = WurstClient.INSTANCE.getHax().nameTagsHack; + MinecraftClient MC = MinecraftClient.getInstance(); + EntityRenderDispatcher dispatcher = MC.getEntityRenderDispatcher(); + double dist = dispatcher.getSquaredDistanceToCamera(entity); + if(dist > limit * limit) + return; + matrixStack.push(); + + RenderUtils.applyCameraRotationOnly(); + Vec3d camPos = RenderUtils.getCameraPos(); + matrixStack.translate( + -camPos.x + entity.prevX + + (entity.getX() - entity.prevX) * partialTicks, + -camPos.y + entity.prevY + + (entity.getY() - entity.prevY) * partialTicks + entity.getHeight() + height, + -camPos.z + entity.prevZ + + (entity.getZ() - entity.prevZ) * partialTicks); + + matrixStack.multiply(dispatcher.getRotation()); + + float scale = 0.025F; + if(nameTagsHack.isEnabled()) + { + double distance = WurstClient.MC.player.distanceTo(entity); + + if(distance > 10) + scale *= distance / 10; + } + + matrixStack.scale(-scale, -scale, scale); + + Matrix4f matrix4f = matrixStack.peek().getPositionMatrix(); + float bgOpacity = MC.options.getTextBackgroundOpacity(0.25f); + int bgColor = (int)(bgOpacity * 255.0f) << 24; + int h = -MC.textRenderer.getWidth(text) / 2; + MC.textRenderer.draw(text, h, 0, color, false, matrix4f, provider, TextLayerType.NORMAL, bgColor, 15728880); + MC.textRenderer.draw(text, h, 0, -1, false, matrix4f, provider, TextLayerType.SEE_THROUGH, 0, 15728880); + matrixStack.pop(); + } } From 36c1044dca37f25e681a6fc7ece96b94754cfc1f Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Fri, 17 Mar 2023 19:43:09 -0400 Subject: [PATCH 02/18] Update RenderUtils.java --- src/main/java/net/wurstclient/util/RenderUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/wurstclient/util/RenderUtils.java b/src/main/java/net/wurstclient/util/RenderUtils.java index 4dcaf4f071..a4a088e774 100644 --- a/src/main/java/net/wurstclient/util/RenderUtils.java +++ b/src/main/java/net/wurstclient/util/RenderUtils.java @@ -934,12 +934,12 @@ public static void renderTag(MatrixStack matrixStack, Text text, Entity entity, matrixStack.scale(-scale, -scale, scale); - Matrix4f matrix4f = matrixStack.peek().getPositionMatrix(); + Matrix4f matrix = matrixStack.peek().getPositionMatrix(); float bgOpacity = MC.options.getTextBackgroundOpacity(0.25f); int bgColor = (int)(bgOpacity * 255.0f) << 24; - int h = -MC.textRenderer.getWidth(text) / 2; - MC.textRenderer.draw(text, h, 0, color, false, matrix4f, provider, TextLayerType.NORMAL, bgColor, 15728880); - MC.textRenderer.draw(text, h, 0, -1, false, matrix4f, provider, TextLayerType.SEE_THROUGH, 0, 15728880); + int labelX = -MC.textRenderer.getWidth(text) / 2; + MC.textRenderer.draw(text, labelX, 0, color, false, matrix, provider, TextLayerType.NORMAL, bgColor, 15728880); + MC.textRenderer.draw(text, labelX, 0, -1, false, matrix, provider, TextLayerType.SEE_THROUGH, 0, 15728880); matrixStack.pop(); } } From d5cd0eb66ee1dad5689dba60d65e803ea0a50cc4 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Sun, 28 May 2023 11:27:07 -0400 Subject: [PATCH 03/18] Display max health for players option --- src/main/java/net/wurstclient/hacks/HealthTagsHack.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index ada650badf..bf036f5d3a 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -30,6 +30,8 @@ public final class HealthTagsHack extends Hack implements RenderListener { private final CheckboxSetting mobs = new CheckboxSetting( "Mobs", "Displays health tags above mobs also.", false); + private final CheckboxSetting max = new CheckboxSetting( + "Display max health for players", false); private final CheckboxSetting round = new CheckboxSetting( "Round health", true); @@ -40,6 +42,7 @@ public HealthTagsHack() super("HealthTags"); setCategory(Category.RENDER); addSetting(mobs); + addSetting(max); addSetting(round); } @@ -83,9 +86,11 @@ public Text addHealth(LivingEntity entity, Text nametag) String health = round.isChecked() ? Integer.toString((int)entity.getHealth()) : DF.format(entity.getHealth()); + String maxHealth = round.isChecked() ? Integer.toString((int)entity.getMaxHealth()) + : DF.format(entity.getMaxHealth()); MutableText formattedHealth = Text.literal(" ") - .append(health).formatted(getColor(entity.getHealth(), entity.getMaxHealth())); + .append(max.isChecked() ? health + "/" + maxHealth : health).formatted(getColor(entity.getHealth(), entity.getMaxHealth())); return ((MutableText)nametag).append(formattedHealth); } From 686526d8dce48f7e92d78feb4b9c36421cf9bee2 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Sun, 28 May 2023 11:32:03 -0400 Subject: [PATCH 04/18] Unlimited range for mob health tags --- src/main/java/net/wurstclient/hacks/HealthTagsHack.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index bf036f5d3a..5f1338e341 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -30,6 +30,9 @@ public final class HealthTagsHack extends Hack implements RenderListener { private final CheckboxSetting mobs = new CheckboxSetting( "Mobs", "Displays health tags above mobs also.", false); + private final CheckboxSetting unlimitedRange = + new CheckboxSetting("Unlimited range", + "Displays mob health tags at any distance.", false); private final CheckboxSetting max = new CheckboxSetting( "Display max health for players", false); private final CheckboxSetting round = new CheckboxSetting( @@ -42,6 +45,7 @@ public HealthTagsHack() super("HealthTags"); setCategory(Category.RENDER); addSetting(mobs); + addSetting(unlimitedRange); addSetting(max); addSetting(round); } @@ -74,7 +78,7 @@ public void onRender(MatrixStack matrixStack, float partialTicks) Text text = Text.literal(health + "/" + maxHealth).formatted( getColor(entity.getHealth(), entity.getMaxHealth())); RenderUtils.renderTag(matrixStack, text, entity, immediate, 0xffffff, - !entity.hasCustomName() ? 0.5F : 1.0F, 75, partialTicks); + !entity.hasCustomName() ? 0.5F : 1.0F, unlimitedRange.isChecked() ? Integer.MAX_VALUE : 75, partialTicks); } immediate.draw(); } From f0ba058288f83bc36d9f623333f92a9ac14a5445 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Sun, 28 May 2023 18:41:06 -0400 Subject: [PATCH 05/18] Fix range overflowing --- src/main/java/net/wurstclient/hacks/HealthTagsHack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index 5f1338e341..03736e7580 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -78,7 +78,7 @@ public void onRender(MatrixStack matrixStack, float partialTicks) Text text = Text.literal(health + "/" + maxHealth).formatted( getColor(entity.getHealth(), entity.getMaxHealth())); RenderUtils.renderTag(matrixStack, text, entity, immediate, 0xffffff, - !entity.hasCustomName() ? 0.5F : 1.0F, unlimitedRange.isChecked() ? Integer.MAX_VALUE : 75, partialTicks); + !entity.hasCustomName() ? 0.5F : 1.0F, unlimitedRange.isChecked() ? 1000 : 75, partialTicks); } immediate.draw(); } From edd26ae307ba76d3dbfabdc0ab926d70b4a6453b Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Mon, 5 Jun 2023 01:44:08 +0000 Subject: [PATCH 06/18] Use double for height offset --- src/main/java/net/wurstclient/hacks/HealthTagsHack.java | 2 +- src/main/java/net/wurstclient/util/RenderUtils.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index 03736e7580..8c8c159ff3 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -78,7 +78,7 @@ public void onRender(MatrixStack matrixStack, float partialTicks) Text text = Text.literal(health + "/" + maxHealth).formatted( getColor(entity.getHealth(), entity.getMaxHealth())); RenderUtils.renderTag(matrixStack, text, entity, immediate, 0xffffff, - !entity.hasCustomName() ? 0.5F : 1.0F, unlimitedRange.isChecked() ? 1000 : 75, partialTicks); + !entity.hasCustomName() ? 0.5 : 1.0, unlimitedRange.isChecked() ? 1000 : 75, partialTicks); } immediate.draw(); } diff --git a/src/main/java/net/wurstclient/util/RenderUtils.java b/src/main/java/net/wurstclient/util/RenderUtils.java index a4a088e774..5a1fe91522 100644 --- a/src/main/java/net/wurstclient/util/RenderUtils.java +++ b/src/main/java/net/wurstclient/util/RenderUtils.java @@ -901,7 +901,7 @@ public static void drawItem(MatrixStack matrixStack, ItemStack stack, int x, } public static void renderTag(MatrixStack matrixStack, Text text, Entity entity, VertexConsumerProvider provider, int color, - float height, int limit, float partialTicks) + double height, int limit, float partialTicks) { NameTagsHack nameTagsHack = WurstClient.INSTANCE.getHax().nameTagsHack; MinecraftClient MC = MinecraftClient.getInstance(); From ae5ee29d8f8934e80316ec56e508cd8ade2dcba0 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Mon, 5 Jun 2023 01:45:31 +0000 Subject: [PATCH 07/18] Clean up --- src/main/java/net/wurstclient/hacks/HealthTagsHack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index 8c8c159ff3..b2798b0099 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -78,7 +78,7 @@ public void onRender(MatrixStack matrixStack, float partialTicks) Text text = Text.literal(health + "/" + maxHealth).formatted( getColor(entity.getHealth(), entity.getMaxHealth())); RenderUtils.renderTag(matrixStack, text, entity, immediate, 0xffffff, - !entity.hasCustomName() ? 0.5 : 1.0, unlimitedRange.isChecked() ? 1000 : 75, partialTicks); + !entity.hasCustomName() ? 0.5 : 1, unlimitedRange.isChecked() ? 1000 : 75, partialTicks); } immediate.draw(); } From cd0ca732108bdf2749dc1fcfef800bf26f37f766 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Wed, 7 Jun 2023 17:30:12 -0400 Subject: [PATCH 08/18] Cleanup --- src/main/java/net/wurstclient/util/RenderUtils.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/wurstclient/util/RenderUtils.java b/src/main/java/net/wurstclient/util/RenderUtils.java index 5a1fe91522..b0c66d1e81 100644 --- a/src/main/java/net/wurstclient/util/RenderUtils.java +++ b/src/main/java/net/wurstclient/util/RenderUtils.java @@ -900,8 +900,8 @@ public static void drawItem(MatrixStack matrixStack, ItemStack stack, int x, } } - public static void renderTag(MatrixStack matrixStack, Text text, Entity entity, VertexConsumerProvider provider, int color, - double height, int limit, float partialTicks) + public static void renderTag(MatrixStack matrixStack, Text text, Entity entity, + VertexConsumerProvider provider, int color, double height, int limit, float partialTicks) { NameTagsHack nameTagsHack = WurstClient.INSTANCE.getHax().nameTagsHack; MinecraftClient MC = MinecraftClient.getInstance(); @@ -926,7 +926,7 @@ public static void renderTag(MatrixStack matrixStack, Text text, Entity entity, float scale = 0.025F; if(nameTagsHack.isEnabled()) { - double distance = WurstClient.MC.player.distanceTo(entity); + double distance = MC.player.distanceTo(entity); if(distance > 10) scale *= distance / 10; From c1d374b1eefebcbabf8cde016cf8a44ec94979e3 Mon Sep 17 00:00:00 2001 From: Alexander01998 Date: Fri, 22 Dec 2023 10:40:14 +0100 Subject: [PATCH 09/18] Clean up --- .../net/wurstclient/hacks/HealthTagsHack.java | 57 ++++++++++++------- .../net/wurstclient/util/RenderUtils.java | 20 ++++--- 2 files changed, 49 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index b2798b0099..efbd4f0c52 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -28,18 +28,20 @@ @SearchTags({"health tags"}) public final class HealthTagsHack extends Hack implements RenderListener { - private final CheckboxSetting mobs = new CheckboxSetting( - "Mobs", "Displays health tags above mobs also.", false); - private final CheckboxSetting unlimitedRange = - new CheckboxSetting("Unlimited range", - "Displays mob health tags at any distance.", false); - private final CheckboxSetting max = new CheckboxSetting( - "Display max health for players", false); - private final CheckboxSetting round = new CheckboxSetting( - "Round health", true); - private static final DecimalFormat DF = new DecimalFormat("0.##"); + private final CheckboxSetting mobs = new CheckboxSetting("Mobs", + "Displays health tags above mobs also.", false); + + private final CheckboxSetting unlimitedRange = new CheckboxSetting( + "Unlimited range", "Displays mob health tags at any distance.", false); + + private final CheckboxSetting max = + new CheckboxSetting("Display max health for players", false); + + private final CheckboxSetting round = + new CheckboxSetting("Round health", true); + public HealthTagsHack() { super("HealthTags"); @@ -67,19 +69,29 @@ public void onRender(MatrixStack matrixStack, float partialTicks) { if(!mobs.isChecked()) return; - VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer()); + + VertexConsumerProvider.Immediate immediate = VertexConsumerProvider + .immediate(Tessellator.getInstance().getBuffer()); + for(Entity e : MC.world.getEntities()) if(e instanceof MobEntity entity) { - String health = round.isChecked() ? Integer.toString((int)entity.getHealth()) + String health = round.isChecked() + ? Integer.toString((int)entity.getHealth()) : DF.format(entity.getHealth()); - String maxHealth = round.isChecked() ? Integer.toString((int)entity.getMaxHealth()) + + String maxHealth = round.isChecked() + ? Integer.toString((int)entity.getMaxHealth()) : DF.format(entity.getMaxHealth()); + Text text = Text.literal(health + "/" + maxHealth).formatted( getColor(entity.getHealth(), entity.getMaxHealth())); - RenderUtils.renderTag(matrixStack, text, entity, immediate, 0xffffff, - !entity.hasCustomName() ? 0.5 : 1, unlimitedRange.isChecked() ? 1000 : 75, partialTicks); + + RenderUtils.renderTag(matrixStack, text, entity, immediate, + 0xffffff, !entity.hasCustomName() ? 0.5 : 1, + unlimitedRange.isChecked() ? 1000 : 75, partialTicks); } + immediate.draw(); } @@ -88,13 +100,18 @@ public Text addHealth(LivingEntity entity, Text nametag) if(!isEnabled()) return nametag; - String health = round.isChecked() ? Integer.toString((int)entity.getHealth()) - : DF.format(entity.getHealth()); - String maxHealth = round.isChecked() ? Integer.toString((int)entity.getMaxHealth()) - : DF.format(entity.getMaxHealth()); + String health = + round.isChecked() ? Integer.toString((int)entity.getHealth()) + : DF.format(entity.getHealth()); + + String maxHealth = + round.isChecked() ? Integer.toString((int)entity.getMaxHealth()) + : DF.format(entity.getMaxHealth()); MutableText formattedHealth = Text.literal(" ") - .append(max.isChecked() ? health + "/" + maxHealth : health).formatted(getColor(entity.getHealth(), entity.getMaxHealth())); + .append(max.isChecked() ? health + "/" + maxHealth : health) + .formatted(getColor(entity.getHealth(), entity.getMaxHealth())); + return ((MutableText)nametag).append(formattedHealth); } diff --git a/src/main/java/net/wurstclient/util/RenderUtils.java b/src/main/java/net/wurstclient/util/RenderUtils.java index 41c3b48102..a3c3003623 100644 --- a/src/main/java/net/wurstclient/util/RenderUtils.java +++ b/src/main/java/net/wurstclient/util/RenderUtils.java @@ -894,14 +894,15 @@ public static void drawItem(DrawContext context, ItemStack stack, int x, RenderSystem.setShaderColor(1, 1, 1, 1); } - public static void renderTag(MatrixStack matrixStack, Text text, Entity entity, - VertexConsumerProvider provider, int color, double height, int limit, float partialTicks) + public static void renderTag(MatrixStack matrixStack, Text text, + Entity entity, VertexConsumerProvider provider, int color, + double height, int limit, float partialTicks) { NameTagsHack nameTagsHack = WurstClient.INSTANCE.getHax().nameTagsHack; MinecraftClient MC = MinecraftClient.getInstance(); EntityRenderDispatcher dispatcher = MC.getEntityRenderDispatcher(); double dist = dispatcher.getSquaredDistanceToCamera(entity); - if(dist > limit * limit) + if(dist > limit * limit) return; matrixStack.push(); @@ -909,11 +910,12 @@ public static void renderTag(MatrixStack matrixStack, Text text, Entity entity, Vec3d camPos = RenderUtils.getCameraPos(); matrixStack.translate( -camPos.x + entity.prevX - + (entity.getX() - entity.prevX) * partialTicks, + + (entity.getX() - entity.prevX) * partialTicks, -camPos.y + entity.prevY - + (entity.getY() - entity.prevY) * partialTicks + entity.getHeight() + height, + + (entity.getY() - entity.prevY) * partialTicks + + entity.getHeight() + height, -camPos.z + entity.prevZ - + (entity.getZ() - entity.prevZ) * partialTicks); + + (entity.getZ() - entity.prevZ) * partialTicks); matrixStack.multiply(dispatcher.getRotation()); @@ -932,8 +934,10 @@ public static void renderTag(MatrixStack matrixStack, Text text, Entity entity, float bgOpacity = MC.options.getTextBackgroundOpacity(0.25f); int bgColor = (int)(bgOpacity * 255.0f) << 24; int labelX = -MC.textRenderer.getWidth(text) / 2; - MC.textRenderer.draw(text, labelX, 0, color, false, matrix, provider, TextLayerType.NORMAL, bgColor, 15728880); - MC.textRenderer.draw(text, labelX, 0, -1, false, matrix, provider, TextLayerType.SEE_THROUGH, 0, 15728880); + MC.textRenderer.draw(text, labelX, 0, color, false, matrix, provider, + TextLayerType.NORMAL, bgColor, 15728880); + MC.textRenderer.draw(text, labelX, 0, -1, false, matrix, provider, + TextLayerType.SEE_THROUGH, 0, 15728880); matrixStack.pop(); } } From 5a9db98cb1677e1569b37aa10ed1705216918ea5 Mon Sep 17 00:00:00 2001 From: Alexander01998 Date: Fri, 22 Dec 2023 11:33:50 +0100 Subject: [PATCH 10/18] Let NameTags handle the unlimited range option Also reverts the non-standard 75 block range back to 64. --- src/main/java/net/wurstclient/hacks/HealthTagsHack.java | 7 +------ src/main/java/net/wurstclient/util/RenderUtils.java | 8 ++++---- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index efbd4f0c52..8176493221 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -33,9 +33,6 @@ public final class HealthTagsHack extends Hack implements RenderListener private final CheckboxSetting mobs = new CheckboxSetting("Mobs", "Displays health tags above mobs also.", false); - private final CheckboxSetting unlimitedRange = new CheckboxSetting( - "Unlimited range", "Displays mob health tags at any distance.", false); - private final CheckboxSetting max = new CheckboxSetting("Display max health for players", false); @@ -47,7 +44,6 @@ public HealthTagsHack() super("HealthTags"); setCategory(Category.RENDER); addSetting(mobs); - addSetting(unlimitedRange); addSetting(max); addSetting(round); } @@ -88,8 +84,7 @@ public void onRender(MatrixStack matrixStack, float partialTicks) getColor(entity.getHealth(), entity.getMaxHealth())); RenderUtils.renderTag(matrixStack, text, entity, immediate, - 0xffffff, !entity.hasCustomName() ? 0.5 : 1, - unlimitedRange.isChecked() ? 1000 : 75, partialTicks); + 0xffffff, !entity.hasCustomName() ? 0.5 : 1, partialTicks); } immediate.draw(); diff --git a/src/main/java/net/wurstclient/util/RenderUtils.java b/src/main/java/net/wurstclient/util/RenderUtils.java index a3c3003623..25a23ca739 100644 --- a/src/main/java/net/wurstclient/util/RenderUtils.java +++ b/src/main/java/net/wurstclient/util/RenderUtils.java @@ -896,13 +896,13 @@ public static void drawItem(DrawContext context, ItemStack stack, int x, public static void renderTag(MatrixStack matrixStack, Text text, Entity entity, VertexConsumerProvider provider, int color, - double height, int limit, float partialTicks) + double height, float partialTicks) { - NameTagsHack nameTagsHack = WurstClient.INSTANCE.getHax().nameTagsHack; + NameTagsHack nameTags = WurstClient.INSTANCE.getHax().nameTagsHack; MinecraftClient MC = MinecraftClient.getInstance(); EntityRenderDispatcher dispatcher = MC.getEntityRenderDispatcher(); double dist = dispatcher.getSquaredDistanceToCamera(entity); - if(dist > limit * limit) + if(dist > 4096 && !nameTags.isUnlimitedRange()) return; matrixStack.push(); @@ -920,7 +920,7 @@ public static void renderTag(MatrixStack matrixStack, Text text, matrixStack.multiply(dispatcher.getRotation()); float scale = 0.025F; - if(nameTagsHack.isEnabled()) + if(nameTags.isEnabled()) { double distance = MC.player.distanceTo(entity); From 5307b2a3d3e221cdcb97a2c97f2a4e43775684ce Mon Sep 17 00:00:00 2001 From: Alexander01998 Date: Sat, 23 Dec 2023 14:40:58 +0100 Subject: [PATCH 11/18] Refactor max health setting and display logic --- .../net/wurstclient/hacks/HealthTagsHack.java | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index 8176493221..721e719aae 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -33,8 +33,9 @@ public final class HealthTagsHack extends Hack implements RenderListener private final CheckboxSetting mobs = new CheckboxSetting("Mobs", "Displays health tags above mobs also.", false); - private final CheckboxSetting max = - new CheckboxSetting("Display max health for players", false); + private final CheckboxSetting showMaxHealth = + new CheckboxSetting("Show max health", "Also displays the entity's" + + " maximum health in addition to its current health.", false); private final CheckboxSetting round = new CheckboxSetting("Round health", true); @@ -44,7 +45,7 @@ public HealthTagsHack() super("HealthTags"); setCategory(Category.RENDER); addSetting(mobs); - addSetting(max); + addSetting(showMaxHealth); addSetting(round); } @@ -70,22 +71,14 @@ public void onRender(MatrixStack matrixStack, float partialTicks) .immediate(Tessellator.getInstance().getBuffer()); for(Entity e : MC.world.getEntities()) - if(e instanceof MobEntity entity) - { - String health = round.isChecked() - ? Integer.toString((int)entity.getHealth()) - : DF.format(entity.getHealth()); - - String maxHealth = round.isChecked() - ? Integer.toString((int)entity.getMaxHealth()) - : DF.format(entity.getMaxHealth()); - - Text text = Text.literal(health + "/" + maxHealth).formatted( - getColor(entity.getHealth(), entity.getMaxHealth())); - - RenderUtils.renderTag(matrixStack, text, entity, immediate, - 0xffffff, !entity.hasCustomName() ? 0.5 : 1, partialTicks); - } + { + if(!(e instanceof MobEntity entity)) + continue; + + Text text = addHealth(entity, Text.literal("")); + RenderUtils.renderTag(matrixStack, text, entity, immediate, + 0xffffff, !entity.hasCustomName() ? 0.5 : 1, partialTicks); + } immediate.draw(); } @@ -95,17 +88,23 @@ public Text addHealth(LivingEntity entity, Text nametag) if(!isEnabled()) return nametag; - String health = - round.isChecked() ? Integer.toString((int)entity.getHealth()) - : DF.format(entity.getHealth()); + float curHealth = entity.getHealth(); + float maxHealth = entity.getMaxHealth(); - String maxHealth = - round.isChecked() ? Integer.toString((int)entity.getMaxHealth()) - : DF.format(entity.getMaxHealth()); + String curHealthString = + round.isChecked() ? "" + (int)curHealth : DF.format(curHealth); - MutableText formattedHealth = Text.literal(" ") - .append(max.isChecked() ? health + "/" + maxHealth : health) - .formatted(getColor(entity.getHealth(), entity.getMaxHealth())); + String maxHealthString = + round.isChecked() ? "" + (int)maxHealth : DF.format(maxHealth); + + String healthString = showMaxHealth.isChecked() + ? curHealthString + "/" + maxHealthString : curHealthString; + + if(!nametag.getString().isEmpty()) + nametag = ((MutableText)nametag).append(Text.literal(" ")); + + MutableText formattedHealth = Text.literal(healthString) + .formatted(getColor(curHealth, maxHealth)); return ((MutableText)nametag).append(formattedHealth); } From 2c3cc809209eb8358ab81b7bb6229ab8d066eadb Mon Sep 17 00:00:00 2001 From: Alexander01998 Date: Sat, 23 Dec 2023 14:47:54 +0100 Subject: [PATCH 12/18] Fix inconsistent number formatting --- src/main/java/net/wurstclient/hacks/HealthTagsHack.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index 721e719aae..c1510942f6 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -8,6 +8,8 @@ package net.wurstclient.hacks; import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; import net.minecraft.client.render.Tessellator; import net.minecraft.client.render.VertexConsumerProvider; @@ -28,7 +30,8 @@ @SearchTags({"health tags"}) public final class HealthTagsHack extends Hack implements RenderListener { - private static final DecimalFormat DF = new DecimalFormat("0.##"); + private static final DecimalFormat DF = + new DecimalFormat("0.##", new DecimalFormatSymbols(Locale.ENGLISH)); private final CheckboxSetting mobs = new CheckboxSetting("Mobs", "Displays health tags above mobs also.", false); From 684692f6ac6e8a4af1bb5e0a6de227b7cf5f3c39 Mon Sep 17 00:00:00 2001 From: Alexander01998 Date: Sat, 23 Dec 2023 15:40:10 +0100 Subject: [PATCH 13/18] Replace rounding checkbox with precision slider --- .../net/wurstclient/hacks/HealthTagsHack.java | 39 ++++++--------- .../mixin/EntityRendererMixin.java | 3 +- .../settings/RoundingPrecisionSetting.java | 50 +++++++++++++++++++ .../wurstclient/settings/SliderSetting.java | 3 ++ 4 files changed, 69 insertions(+), 26 deletions(-) create mode 100644 src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index c1510942f6..91572fdb5a 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -7,10 +7,6 @@ */ package net.wurstclient.hacks; -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; -import java.util.Locale; - import net.minecraft.client.render.Tessellator; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.util.math.MatrixStack; @@ -25,14 +21,12 @@ import net.wurstclient.events.RenderListener; import net.wurstclient.hack.Hack; import net.wurstclient.settings.CheckboxSetting; +import net.wurstclient.settings.RoundingPrecisionSetting; import net.wurstclient.util.RenderUtils; @SearchTags({"health tags"}) public final class HealthTagsHack extends Hack implements RenderListener { - private static final DecimalFormat DF = - new DecimalFormat("0.##", new DecimalFormatSymbols(Locale.ENGLISH)); - private final CheckboxSetting mobs = new CheckboxSetting("Mobs", "Displays health tags above mobs also.", false); @@ -40,8 +34,10 @@ public final class HealthTagsHack extends Hack implements RenderListener new CheckboxSetting("Show max health", "Also displays the entity's" + " maximum health in addition to its current health.", false); - private final CheckboxSetting round = - new CheckboxSetting("Round health", true); + private final RoundingPrecisionSetting precision = + new RoundingPrecisionSetting("Precision", + "Rounds the health value to the given number of decimal places.", 0, + 0, 3); public HealthTagsHack() { @@ -49,7 +45,7 @@ public HealthTagsHack() setCategory(Category.RENDER); addSetting(mobs); addSetting(showMaxHealth); - addSetting(round); + addSetting(precision); } @Override @@ -86,30 +82,23 @@ public void onRender(MatrixStack matrixStack, float partialTicks) immediate.draw(); } - public Text addHealth(LivingEntity entity, Text nametag) + public Text addHealth(LivingEntity entity, MutableText nametag) { if(!isEnabled()) return nametag; - float curHealth = entity.getHealth(); + float health = entity.getHealth(); float maxHealth = entity.getMaxHealth(); + Formatting color = getColor(health, maxHealth); - String curHealthString = - round.isChecked() ? "" + (int)curHealth : DF.format(curHealth); - - String maxHealthString = - round.isChecked() ? "" + (int)maxHealth : DF.format(maxHealth); - - String healthString = showMaxHealth.isChecked() - ? curHealthString + "/" + maxHealthString : curHealthString; + String healthString = precision.format(health); + if(showMaxHealth.isChecked()) + healthString += "/" + precision.format(maxHealth); if(!nametag.getString().isEmpty()) - nametag = ((MutableText)nametag).append(Text.literal(" ")); - - MutableText formattedHealth = Text.literal(healthString) - .formatted(getColor(curHealth, maxHealth)); + nametag = nametag.append(Text.literal(" ")); - return ((MutableText)nametag).append(formattedHealth); + return nametag.append(Text.literal(healthString).formatted(color)); } private Formatting getColor(float health, float maxHealth) diff --git a/src/main/java/net/wurstclient/mixin/EntityRendererMixin.java b/src/main/java/net/wurstclient/mixin/EntityRendererMixin.java index c8acb3fd70..596c90f1e5 100644 --- a/src/main/java/net/wurstclient/mixin/EntityRendererMixin.java +++ b/src/main/java/net/wurstclient/mixin/EntityRendererMixin.java @@ -23,6 +23,7 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.wurstclient.WurstClient; import net.wurstclient.hacks.NameTagsHack; @@ -44,7 +45,7 @@ private void onRenderLabelIfPresent(T entity, Text text, // add HealthTags info if(entity instanceof LivingEntity) text = WurstClient.INSTANCE.getHax().healthTagsHack - .addHealth((LivingEntity)entity, text); + .addHealth((LivingEntity)entity, (MutableText)text); // do NameTags adjustments wurstRenderLabelIfPresent(entity, text, matrixStack, diff --git a/src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java b/src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java new file mode 100644 index 0000000000..0463585de0 --- /dev/null +++ b/src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2014-2023 Wurst-Imperium and contributors. + * + * This source code is subject to the terms of the GNU General Public + * License, version 3. If a copy of the GPL was not distributed with this + * file, You can obtain one at: https://www.gnu.org/licenses/gpl-3.0.txt + */ +package net.wurstclient.settings; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; + +public final class RoundingPrecisionSetting extends SliderSetting +{ + private static final DecimalFormatSymbols SYMBOLS = + new DecimalFormatSymbols(Locale.ENGLISH); + + private final DecimalFormat[] FORMATS; + + public RoundingPrecisionSetting(String name, String description, int value, + int min, int max) + { + super(name, description, value, min, max, 1, + ValueDisplay.ROUNDING_PRECISION); + + FORMATS = new DecimalFormat[max + 1]; + } + + public DecimalFormat getFormat() + { + int value = getValueI(); + + if(FORMATS[value] == null) + { + String pattern = "0"; + if(value > 0) + pattern += "." + "#".repeat(value); + + FORMATS[value] = new DecimalFormat(pattern, SYMBOLS); + } + + return FORMATS[value]; + } + + public String format(double value) + { + return getFormat().format(value); + } +} diff --git a/src/main/java/net/wurstclient/settings/SliderSetting.java b/src/main/java/net/wurstclient/settings/SliderSetting.java index 0aa83bfb3e..0014f6f133 100644 --- a/src/main/java/net/wurstclient/settings/SliderSetting.java +++ b/src/main/java/net/wurstclient/settings/SliderSetting.java @@ -323,6 +323,9 @@ public String getValueString(double v) public static final ValueDisplay DEGREES = INTEGER.withSuffix("\u00b0"); + public static final ValueDisplay ROUNDING_PRECISION = + v -> (int)v == 0 ? "1" : "0." + "0".repeat((int)v - 1) + "1"; + public static final ValueDisplay NONE = v -> ""; public String getValueString(double value); From 8c907916911b3d3714c2a1185529de3b4c968108 Mon Sep 17 00:00:00 2001 From: Alexander01998 Date: Sat, 23 Dec 2023 16:55:23 +0100 Subject: [PATCH 14/18] Add validation for minimum value in RoundingPrecisionSetting --- .../net/wurstclient/settings/RoundingPrecisionSetting.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java b/src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java index 0463585de0..594c1c0fc3 100644 --- a/src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java +++ b/src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java @@ -24,6 +24,10 @@ public RoundingPrecisionSetting(String name, String description, int value, super(name, description, value, min, max, 1, ValueDisplay.ROUNDING_PRECISION); + if(min < 0) + throw new IllegalArgumentException( + "min must be greater than or equal to 0"); + FORMATS = new DecimalFormat[max + 1]; } From 92703c59fc5792641f4f42ff94fd0f080c75348c Mon Sep 17 00:00:00 2001 From: Alexander01998 Date: Sat, 23 Dec 2023 17:14:38 +0100 Subject: [PATCH 15/18] Remove unused hasMobHealthTags() method for now I'd prefer to add it back later when/if that other PR is merged. --- src/main/java/net/wurstclient/hacks/HealthTagsHack.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index 91572fdb5a..8a43065170 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -115,10 +115,5 @@ private Formatting getColor(float health, float maxHealth) return Formatting.GREEN; } - public boolean hasMobHealthTags() - { - return isEnabled() && mobs.isChecked(); - } - // See EntityRendererMixin.onRenderLabelIfPresent() } From 5cb8d272fb4637945f50b8d4abeb55ed12236a84 Mon Sep 17 00:00:00 2001 From: Alexander01998 Date: Tue, 26 Dec 2023 15:45:36 +0100 Subject: [PATCH 16/18] Partially refactor renderTag() method --- .../net/wurstclient/util/RenderUtils.java | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/main/java/net/wurstclient/util/RenderUtils.java b/src/main/java/net/wurstclient/util/RenderUtils.java index 25a23ca739..ca511dceef 100644 --- a/src/main/java/net/wurstclient/util/RenderUtils.java +++ b/src/main/java/net/wurstclient/util/RenderUtils.java @@ -14,7 +14,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.block.Blocks; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer.TextLayerType; import net.minecraft.client.gl.VertexBuffer; @@ -896,48 +895,48 @@ public static void drawItem(DrawContext context, ItemStack stack, int x, public static void renderTag(MatrixStack matrixStack, Text text, Entity entity, VertexConsumerProvider provider, int color, - double height, float partialTicks) + double vOffset, float partialTicks) { NameTagsHack nameTags = WurstClient.INSTANCE.getHax().nameTagsHack; - MinecraftClient MC = MinecraftClient.getInstance(); - EntityRenderDispatcher dispatcher = MC.getEntityRenderDispatcher(); + + EntityRenderDispatcher dispatcher = + WurstClient.MC.getEntityRenderDispatcher(); double dist = dispatcher.getSquaredDistanceToCamera(entity); if(dist > 4096 && !nameTags.isUnlimitedRange()) return; + matrixStack.push(); - RenderUtils.applyCameraRotationOnly(); Vec3d camPos = RenderUtils.getCameraPos(); - matrixStack.translate( - -camPos.x + entity.prevX - + (entity.getX() - entity.prevX) * partialTicks, - -camPos.y + entity.prevY - + (entity.getY() - entity.prevY) * partialTicks - + entity.getHeight() + height, - -camPos.z + entity.prevZ - + (entity.getZ() - entity.prevZ) * partialTicks); + Vec3d tagPos = EntityUtils.getLerpedPos(entity, partialTicks) + .subtract(camPos).add(0, entity.getHeight() + vOffset, 0); + matrixStack.translate(tagPos.x, tagPos.y, tagPos.z); matrixStack.multiply(dispatcher.getRotation()); float scale = 0.025F; if(nameTags.isEnabled()) { - double distance = MC.player.distanceTo(entity); - + double distance = WurstClient.MC.player.distanceTo(entity); if(distance > 10) scale *= distance / 10; } - matrixStack.scale(-scale, -scale, scale); + float bgOpacity = + WurstClient.MC.options.getTextBackgroundOpacity(0.25f); + int bgColor = (int)(bgOpacity * 255F) << 24; + Matrix4f matrix = matrixStack.peek().getPositionMatrix(); - float bgOpacity = MC.options.getTextBackgroundOpacity(0.25f); - int bgColor = (int)(bgOpacity * 255.0f) << 24; - int labelX = -MC.textRenderer.getWidth(text) / 2; - MC.textRenderer.draw(text, labelX, 0, color, false, matrix, provider, + TextRenderer tr = WurstClient.MC.textRenderer; + int labelX = -tr.getWidth(text) / 2; + + tr.draw(text, labelX, 0, color, false, matrix, provider, TextLayerType.NORMAL, bgColor, 15728880); - MC.textRenderer.draw(text, labelX, 0, -1, false, matrix, provider, + + tr.draw(text, labelX, 0, -1, false, matrix, provider, TextLayerType.SEE_THROUGH, 0, 15728880); + matrixStack.pop(); } } From ed1cb1f353f48961161f2398d6e050df55e5c903 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Tue, 2 Jan 2024 12:07:26 -0500 Subject: [PATCH 17/18] Year update --- .../java/net/wurstclient/settings/RoundingPrecisionSetting.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java b/src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java index 594c1c0fc3..d8d27c48b9 100644 --- a/src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java +++ b/src/main/java/net/wurstclient/settings/RoundingPrecisionSetting.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2023 Wurst-Imperium and contributors. + * Copyright (c) 2014-2024 Wurst-Imperium and contributors. * * This source code is subject to the terms of the GNU General Public * License, version 3. If a copy of the GPL was not distributed with this From 93149e41ac3c70baf6d9963df04827cb52bab635 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Tue, 22 Oct 2024 20:46:44 +0000 Subject: [PATCH 18/18] Fix issues with mobhealthtags NOTE: Rotating the tag only applies for 1.21 and above --- src/main/java/net/wurstclient/hacks/HealthTagsHack.java | 9 ++++----- src/main/java/net/wurstclient/util/RenderUtils.java | 5 ++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java index 125bc4859a..e299fdbe87 100644 --- a/src/main/java/net/wurstclient/hacks/HealthTagsHack.java +++ b/src/main/java/net/wurstclient/hacks/HealthTagsHack.java @@ -7,7 +7,6 @@ */ package net.wurstclient.hacks; -import net.minecraft.client.render.Tessellator; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; @@ -49,13 +48,13 @@ public HealthTagsHack() } @Override - public void onEnable() + protected void onEnable() { EVENTS.add(RenderListener.class, this); } @Override - public void onDisable() + protected void onDisable() { EVENTS.remove(RenderListener.class, this); } @@ -66,8 +65,8 @@ public void onRender(MatrixStack matrixStack, float partialTicks) if(!mobs.isChecked()) return; - VertexConsumerProvider.Immediate immediate = VertexConsumerProvider - .immediate(Tessellator.getInstance().getBuffer()); + VertexConsumerProvider.Immediate immediate = + MC.getBufferBuilders().getEntityVertexConsumers(); for(Entity e : MC.world.getEntities()) { diff --git a/src/main/java/net/wurstclient/util/RenderUtils.java b/src/main/java/net/wurstclient/util/RenderUtils.java index ed5fdae8a1..e032d2cd72 100644 --- a/src/main/java/net/wurstclient/util/RenderUtils.java +++ b/src/main/java/net/wurstclient/util/RenderUtils.java @@ -8,6 +8,7 @@ package net.wurstclient.util; import org.joml.Matrix4f; +import org.joml.Quaternionf; import org.joml.Vector3f; import org.lwjgl.opengl.GL11; @@ -19,6 +20,7 @@ import net.minecraft.client.gl.VertexBuffer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.*; +import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; @@ -781,7 +783,8 @@ public static void renderTag(MatrixStack matrixStack, Text text, .subtract(camPos).add(0, entity.getHeight() + vOffset, 0); matrixStack.translate(tagPos.x, tagPos.y, tagPos.z); - matrixStack.multiply(dispatcher.getRotation()); + matrixStack.multiply(dispatcher.getRotation().rotateY((float)Math.PI, + new Quaternionf())); float scale = 0.025F; if(nameTags.isEnabled())