Skip to content

Commit 37a0e72

Browse files
authored
[fix] ESP: not rendering all entities in shader and glow modes (#5884)
1 parent b334135 commit 37a0e72

File tree

3 files changed

+48
-19
lines changed

3 files changed

+48
-19
lines changed

src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import meteordevelopment.meteorclient.utils.render.color.Color;
1919
import net.minecraft.client.render.Frustum;
2020
import net.minecraft.client.render.entity.EntityRenderer;
21+
import net.minecraft.client.render.entity.EntityRendererFactory;
2122
import net.minecraft.client.render.entity.state.EntityHitbox;
2223
import net.minecraft.client.render.entity.state.EntityHitboxAndView;
2324
import net.minecraft.client.render.entity.state.EntityRenderState;
@@ -37,20 +38,34 @@
3738

3839
@Mixin(EntityRenderer.class)
3940
public abstract class EntityRendererMixin<T extends Entity, S extends EntityRenderState> {
41+
4042
@Unique private ESP esp;
43+
@Unique private NoRender noRender;
44+
45+
// meteor is already initialised at this point
46+
@Inject(method = "<init>", at = @At("TAIL"))
47+
private void onInit(EntityRendererFactory.Context context, CallbackInfo ci) {
48+
esp = Modules.get().get(ESP.class);
49+
noRender = Modules.get().get(NoRender.class);
50+
}
4151

4252
@Inject(method = "getDisplayName", at = @At("HEAD"), cancellable = true)
4353
private void onRenderLabel(T entity, CallbackInfoReturnable<Text> cir) {
44-
if (Modules.get().get(NoRender.class).noNametags()) cir.setReturnValue(null);
54+
if (noRender.noNametags()) cir.setReturnValue(null);
4555
if (!(entity instanceof PlayerEntity player)) return;
4656
if (Modules.get().get(Nametags.class).playerNametags() && !(EntityUtils.getGameMode(player) == null && Modules.get().get(Nametags.class).excludeBots()))
4757
cir.setReturnValue(null);
4858
}
4959

5060
@Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true)
5161
private void shouldRender(T entity, Frustum frustum, double x, double y, double z, CallbackInfoReturnable<Boolean> cir) {
52-
if (Modules.get().get(NoRender.class).noEntity(entity)) cir.setReturnValue(false);
53-
if (Modules.get().get(NoRender.class).noFallingBlocks() && entity instanceof FallingBlockEntity) cir.setReturnValue(false);
62+
if (noRender.noEntity(entity)) cir.setReturnValue(false);
63+
if (noRender.noFallingBlocks() && entity instanceof FallingBlockEntity) cir.setReturnValue(false);
64+
}
65+
66+
@Inject(method = "canBeCulled", at = @At("HEAD"), cancellable = true)
67+
void canBeCulled(T entity, CallbackInfoReturnable<Boolean> cir) {
68+
if (esp.forceRender()) cir.setReturnValue(false);
5469
}
5570

5671
@ModifyReturnValue(method = "getSkyLight", at = @At("RETURN"))
@@ -70,8 +85,8 @@ private int onGetLightLevel(int original) {
7085

7186
@Inject(method = "updateRenderState", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/entity/state/EntityRenderState;outlineColor:I", shift = At.Shift.AFTER))
7287
private void onGetOutlineColor(T entity, S state, float tickProgress, CallbackInfo ci) {
73-
if (getESP().isGlow() && !getESP().shouldSkip(entity)) {
74-
Color color = getESP().getColor(entity);
88+
if (esp.isGlow() && !esp.shouldSkip(entity)) {
89+
Color color = esp.getColor(entity);
7590

7691
if (color == null) return;
7792
state.outlineColor = color.getPacked();
@@ -80,23 +95,14 @@ private void onGetOutlineColor(T entity, S state, float tickProgress, CallbackIn
8095

8196
@Inject(method = "updateShadow(Lnet/minecraft/entity/Entity;Lnet/minecraft/client/render/entity/state/EntityRenderState;)V", at = @At("HEAD"), cancellable = true)
8297
private void updateShadow(Entity entity, EntityRenderState renderState, CallbackInfo ci) {
83-
if (Modules.get().get(NoRender.class).noDeadEntities() &&
98+
if (noRender.noDeadEntities() &&
8499
entity instanceof LivingEntity &&
85100
renderState instanceof LivingEntityRenderState livingEntityRenderState &&
86101
livingEntityRenderState.deathTime > 0) {
87102
ci.cancel();
88103
}
89104
}
90105

91-
@Unique
92-
private ESP getESP() {
93-
if (esp == null) {
94-
esp = Modules.get().get(ESP.class);
95-
}
96-
97-
return esp;
98-
}
99-
100106
// Hitboxes
101107

102108
@ModifyReturnValue(method = "createHitbox", at = @At("TAIL"))

src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package meteordevelopment.meteorclient.mixin;
77

8+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
89
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
910
import com.mojang.blaze3d.buffers.GpuBufferSlice;
1011
import it.unimi.dsi.fastutil.Stack;
@@ -35,6 +36,7 @@
3536
import net.minecraft.client.util.Handle;
3637
import net.minecraft.client.util.ObjectAllocator;
3738
import net.minecraft.client.util.math.MatrixStack;
39+
import net.minecraft.client.world.ClientWorld;
3840
import net.minecraft.entity.Entity;
3941
import net.minecraft.util.math.Vec3d;
4042
import org.joml.Matrix4f;
@@ -55,6 +57,17 @@
5557

5658
@Mixin(WorldRenderer.class)
5759
public abstract class WorldRendererMixin implements IWorldRenderer {
60+
61+
@Unique private NoRender noRender;
62+
@Unique private ESP esp;
63+
64+
// if a world exists, meteor is initialised
65+
@Inject(method = "setWorld", at = @At("TAIL"))
66+
private void onSetWorld(ClientWorld world, CallbackInfo ci) {
67+
esp = Modules.get().get(ESP.class);
68+
noRender = Modules.get().get(NoRender.class);
69+
}
70+
5871
@Inject(method = "checkEmpty", at = @At("HEAD"), cancellable = true)
5972
private void onCheckEmpty(MatrixStack matrixStack, CallbackInfo info) {
6073
info.cancel();
@@ -74,17 +87,17 @@ private boolean renderSetupTerrainModifyArg(boolean spectator) {
7487

7588
@WrapWithCondition(method = "method_62216", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WeatherRendering;renderPrecipitation(Lnet/minecraft/client/render/VertexConsumerProvider;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/client/render/state/WeatherRenderState;)V"))
7689
private boolean shouldRenderPrecipitation(WeatherRendering instance, VertexConsumerProvider vertexConsumers, Vec3d pos, WeatherRenderState weatherRenderState) {
77-
return !Modules.get().get(NoRender.class).noWeather();
90+
return !noRender.noWeather();
7891
}
7992

8093
@WrapWithCondition(method = "method_62216", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldBorderRendering;render(Lnet/minecraft/client/render/state/WorldBorderRenderState;Lnet/minecraft/util/math/Vec3d;DD)V"))
8194
private boolean shouldRenderWorldBorder(WorldBorderRendering instance, WorldBorderRenderState state, Vec3d cameraPos, double viewDistanceBlocks, double farPlaneDistance) {
82-
return !Modules.get().get(NoRender.class).noWorldBorder();
95+
return !noRender.noWorldBorder();
8396
}
8497

8598
@Inject(method = "hasBlindnessOrDarkness(Lnet/minecraft/client/render/Camera;)Z", at = @At("HEAD"), cancellable = true)
8699
private void hasBlindnessOrDarkness(Camera camera, CallbackInfoReturnable<Boolean> info) {
87-
if (Modules.get().get(NoRender.class).noBlindness() || Modules.get().get(NoRender.class).noDarkness()) info.setReturnValue(null);
100+
if (noRender.noBlindness() || noRender.noDarkness()) info.setReturnValue(null);
88101
}
89102

90103
// Entity Shaders
@@ -128,7 +141,7 @@ private void onPushEntityRenders(MatrixStack matrices, WorldRenderState worldSta
128141
}
129142

130143
draw(worldState, matrices, PostProcessShaders.CHAMS, entity -> Color.WHITE);
131-
draw(worldState, matrices, PostProcessShaders.ENTITY_OUTLINE, entity -> Modules.get().get(ESP.class).getColor(entity));
144+
draw(worldState, matrices, PostProcessShaders.ENTITY_OUTLINE, entity -> esp.getColor(entity));
132145
}
133146

134147
@Unique
@@ -170,6 +183,12 @@ private void draw(WorldRenderState worldState, MatrixStack matrices, EntityShade
170183
meteor$popEntityOutlineFramebuffer();
171184
}
172185

186+
@ModifyExpressionValue(method = "fillEntityRenderStates", at = @At(value= "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;isRenderingReady(Lnet/minecraft/util/math/BlockPos;)Z"))
187+
boolean fillEntityRenderStatesIsRenderingReady(boolean original) {
188+
if (esp.forceRender()) return true;
189+
return original;
190+
}
191+
173192
@Inject(method = "method_62214", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/OutlineVertexConsumerProvider;draw()V"))
174193
private void onRender(CallbackInfo ci) {
175194
PostProcessShaders.endRender();

src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,10 @@ private void onRender2D(Render2DEvent event) {
320320
Renderer2D.COLOR.render();
321321
}
322322

323+
public boolean forceRender() {
324+
return isActive() && (mode.get() == Mode.Shader || mode.get() == Mode.Glow);
325+
}
326+
323327
private boolean checkCorner(double x, double y, double z, Vector3d min, Vector3d max) {
324328
pos.set(x, y, z);
325329
if (!NametagUtils.to2D(pos, 1)) return true;

0 commit comments

Comments
 (0)