From 170ac5cc19c7b9349844c9a2a53cbbb28ef8d4d7 Mon Sep 17 00:00:00 2001 From: chri-k Date: Fri, 28 Nov 2025 09:23:06 +0200 Subject: [PATCH 1/5] [init] --- .../meteorclient/mixin/EntityRendererMixin.java | 5 +++++ .../meteorclient/mixin/WorldRendererMixin.java | 7 +++++++ .../meteorclient/systems/modules/render/ESP.java | 5 +++++ 3 files changed, 17 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java index 4e433a2128..a69a4fb485 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java @@ -53,6 +53,11 @@ private void shouldRender(T entity, Frustum frustum, double x, double y, double if (Modules.get().get(NoRender.class).noFallingBlocks() && entity instanceof FallingBlockEntity) cir.setReturnValue(false); } + @Inject(method = "canBeCulled", at = @At("HEAD"), cancellable = true) + void canBeCulled(T entity, CallbackInfoReturnable cir) { + if (Modules.get().get(ESP.class).forceRender()) cir.setReturnValue(false); + } + @ModifyReturnValue(method = "getSkyLight", at = @At("RETURN")) private int onGetSkyLight(int original) { return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.SKY), original); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java index bc0a525a9b..b2ecaad8b9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.mojang.blaze3d.buffers.GpuBufferSlice; import it.unimi.dsi.fastutil.Stack; @@ -170,6 +171,12 @@ private void draw(WorldRenderState worldState, MatrixStack matrices, EntityShade meteor$popEntityOutlineFramebuffer(); } + @ModifyExpressionValue(method = "fillEntityRenderStates", at = @At(value= "INVOKE", target="Lnet/minecraft/client/render/WorldRenderer;isRenderingReady(Lnet/minecraft/util/math/BlockPos;)Z")) + boolean fillEntityRenderStatesIsRenderingReady(boolean original) { + if (Modules.get().get(ESP.class).forceRender()) return true; + return original; + } + @Inject(method = "method_62214", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/OutlineVertexConsumerProvider;draw()V")) private void onRender(CallbackInfo ci) { PostProcessShaders.endRender(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java index 284eef7afe..22922d933b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.events.render.Render2DEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; +import meteordevelopment.meteorclient.events.world.ChunkOcclusionEvent; import meteordevelopment.meteorclient.renderer.Renderer2D; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; @@ -320,6 +321,10 @@ private void onRender2D(Render2DEvent event) { Renderer2D.COLOR.render(); } + public boolean forceRender() { + return mode.get() == Mode.Shader || mode.get() == Mode.Glow; + } + private boolean checkCorner(double x, double y, double z, Vector3d min, Vector3d max) { pos.set(x, y, z); if (!NametagUtils.to2D(pos, 1)) return true; From c2cef4ee88aa8e0aa1ac43f984dc25ec9493f9db Mon Sep 17 00:00:00 2001 From: chri-k Date: Fri, 28 Nov 2025 09:59:39 +0200 Subject: [PATCH 2/5] [fix] maybe don't `Module.get().get()` in loops --- .../mixin/EntityRendererMixin.java | 37 +++++++++++++++---- .../mixin/WorldRendererMixin.java | 25 ++++++++++--- 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java index a69a4fb485..5965659826 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java @@ -18,6 +18,7 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.render.Frustum; import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.state.EntityHitbox; import net.minecraft.client.render.entity.state.EntityHitboxAndView; import net.minecraft.client.render.entity.state.EntityRenderState; @@ -28,6 +29,8 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.text.Text; import net.minecraft.world.LightType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.NotNullByDefault; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -35,13 +38,24 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import javax.annotation.Nonnull; + @Mixin(EntityRenderer.class) public abstract class EntityRendererMixin { + @Unique private ESP esp; + @Unique private NoRender noRender; + + // meteor is already initialised at this point + @Inject(method = "", at = @At("TAIL")) + private void onInit(EntityRendererFactory.Context context, CallbackInfo ci) { + esp = Modules.get().get(ESP.class); + noRender = Modules.get().get(NoRender.class); + } @Inject(method = "getDisplayName", at = @At("HEAD"), cancellable = true) private void onRenderLabel(T entity, CallbackInfoReturnable cir) { - if (Modules.get().get(NoRender.class).noNametags()) cir.setReturnValue(null); + if (noRender.noNametags()) cir.setReturnValue(null); if (!(entity instanceof PlayerEntity player)) return; if (Modules.get().get(Nametags.class).playerNametags() && !(EntityUtils.getGameMode(player) == null && Modules.get().get(Nametags.class).excludeBots())) cir.setReturnValue(null); @@ -49,13 +63,13 @@ private void onRenderLabel(T entity, CallbackInfoReturnable cir) { @Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true) private void shouldRender(T entity, Frustum frustum, double x, double y, double z, CallbackInfoReturnable cir) { - if (Modules.get().get(NoRender.class).noEntity(entity)) cir.setReturnValue(false); - if (Modules.get().get(NoRender.class).noFallingBlocks() && entity instanceof FallingBlockEntity) cir.setReturnValue(false); + if (noRender.noEntity(entity)) cir.setReturnValue(false); + if (noRender.noFallingBlocks() && entity instanceof FallingBlockEntity) cir.setReturnValue(false); } @Inject(method = "canBeCulled", at = @At("HEAD"), cancellable = true) void canBeCulled(T entity, CallbackInfoReturnable cir) { - if (Modules.get().get(ESP.class).forceRender()) cir.setReturnValue(false); + if (esp.forceRender()) cir.setReturnValue(false); } @ModifyReturnValue(method = "getSkyLight", at = @At("RETURN")) @@ -75,8 +89,8 @@ private int onGetLightLevel(int original) { @Inject(method = "updateRenderState", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/entity/state/EntityRenderState;outlineColor:I", shift = At.Shift.AFTER)) private void onGetOutlineColor(T entity, S state, float tickProgress, CallbackInfo ci) { - if (getESP().isGlow() && !getESP().shouldSkip(entity)) { - Color color = getESP().getColor(entity); + if (esp.isGlow() && !esp.shouldSkip(entity)) { + Color color = esp.getColor(entity); if (color == null) return; state.outlineColor = color.getPacked(); @@ -85,7 +99,7 @@ private void onGetOutlineColor(T entity, S state, float tickProgress, CallbackIn @Inject(method = "updateShadow(Lnet/minecraft/entity/Entity;Lnet/minecraft/client/render/entity/state/EntityRenderState;)V", at = @At("HEAD"), cancellable = true) private void updateShadow(Entity entity, EntityRenderState renderState, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noDeadEntities() && + if (noRender.noDeadEntities() && entity instanceof LivingEntity && renderState instanceof LivingEntityRenderState livingEntityRenderState && livingEntityRenderState.deathTime > 0) { @@ -98,10 +112,17 @@ private ESP getESP() { if (esp == null) { esp = Modules.get().get(ESP.class); } - return esp; } + @Unique + private NoRender getNoRender() { + if (noRender == null) { + noRender = Modules.get().get(NoRender.class); + } + return noRender; + } + // Hitboxes @ModifyReturnValue(method = "createHitbox", at = @At("TAIL")) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java index b2ecaad8b9..0cda76e438 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java @@ -12,6 +12,7 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import meteordevelopment.meteorclient.mixininterface.IEntityRenderState; import meteordevelopment.meteorclient.mixininterface.IWorldRenderer; +import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BlockSelection; import meteordevelopment.meteorclient.systems.modules.render.ESP; @@ -24,8 +25,10 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.postprocess.EntityShader; import meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.render.*; +import net.minecraft.client.render.block.entity.BlockEntityRenderManager; import net.minecraft.client.render.command.OrderedRenderCommandQueue; import net.minecraft.client.render.command.RenderDispatcher; import net.minecraft.client.render.entity.EntityRenderManager; @@ -36,6 +39,7 @@ import net.minecraft.client.util.Handle; import net.minecraft.client.util.ObjectAllocator; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; import net.minecraft.util.math.Vec3d; import org.joml.Matrix4f; @@ -56,6 +60,17 @@ @Mixin(WorldRenderer.class) public abstract class WorldRendererMixin implements IWorldRenderer { + + @Unique private NoRender noRender = null; + @Unique private ESP esp = null; + + // if a world exists, meteor is initialised + @Inject(method = "setWorld", at = @At("TAIL")) + private void onSetWorld(ClientWorld world, CallbackInfo ci) { + esp = Modules.get().get(ESP.class); + noRender = Modules.get().get(NoRender.class); + } + @Inject(method = "checkEmpty", at = @At("HEAD"), cancellable = true) private void onCheckEmpty(MatrixStack matrixStack, CallbackInfo info) { info.cancel(); @@ -75,17 +90,17 @@ private boolean renderSetupTerrainModifyArg(boolean spectator) { @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")) private boolean shouldRenderPrecipitation(WeatherRendering instance, VertexConsumerProvider vertexConsumers, Vec3d pos, WeatherRenderState weatherRenderState) { - return !Modules.get().get(NoRender.class).noWeather(); + return !noRender.noWeather(); } @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")) private boolean shouldRenderWorldBorder(WorldBorderRendering instance, WorldBorderRenderState state, Vec3d cameraPos, double viewDistanceBlocks, double farPlaneDistance) { - return !Modules.get().get(NoRender.class).noWorldBorder(); + return !noRender.noWorldBorder(); } @Inject(method = "hasBlindnessOrDarkness(Lnet/minecraft/client/render/Camera;)Z", at = @At("HEAD"), cancellable = true) private void hasBlindnessOrDarkness(Camera camera, CallbackInfoReturnable info) { - if (Modules.get().get(NoRender.class).noBlindness() || Modules.get().get(NoRender.class).noDarkness()) info.setReturnValue(null); + if (noRender.noBlindness() || noRender.noDarkness()) info.setReturnValue(null); } // Entity Shaders @@ -129,7 +144,7 @@ private void onPushEntityRenders(MatrixStack matrices, WorldRenderState worldSta } draw(worldState, matrices, PostProcessShaders.CHAMS, entity -> Color.WHITE); - draw(worldState, matrices, PostProcessShaders.ENTITY_OUTLINE, entity -> Modules.get().get(ESP.class).getColor(entity)); + draw(worldState, matrices, PostProcessShaders.ENTITY_OUTLINE, entity -> esp.getColor(entity)); } @Unique @@ -173,7 +188,7 @@ private void draw(WorldRenderState worldState, MatrixStack matrices, EntityShade @ModifyExpressionValue(method = "fillEntityRenderStates", at = @At(value= "INVOKE", target="Lnet/minecraft/client/render/WorldRenderer;isRenderingReady(Lnet/minecraft/util/math/BlockPos;)Z")) boolean fillEntityRenderStatesIsRenderingReady(boolean original) { - if (Modules.get().get(ESP.class).forceRender()) return true; + if (esp.forceRender()) return true; return original; } From af2fee12b2d5866ed868717b66a9d314801338df Mon Sep 17 00:00:00 2001 From: chri-k Date: Fri, 28 Nov 2025 10:02:14 +0200 Subject: [PATCH 3/5] [cleanup] imports --- .../meteorclient/mixin/EntityRendererMixin.java | 4 ---- .../meteorclient/mixin/WorldRendererMixin.java | 3 --- 2 files changed, 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java index 5965659826..25d18a73f3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java @@ -29,8 +29,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.text.Text; import net.minecraft.world.LightType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.NotNullByDefault; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -38,8 +36,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import javax.annotation.Nonnull; - @Mixin(EntityRenderer.class) public abstract class EntityRendererMixin { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java index 0cda76e438..635da94f1d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java @@ -12,7 +12,6 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import meteordevelopment.meteorclient.mixininterface.IEntityRenderState; import meteordevelopment.meteorclient.mixininterface.IWorldRenderer; -import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BlockSelection; import meteordevelopment.meteorclient.systems.modules.render.ESP; @@ -25,10 +24,8 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.postprocess.EntityShader; import meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.render.*; -import net.minecraft.client.render.block.entity.BlockEntityRenderManager; import net.minecraft.client.render.command.OrderedRenderCommandQueue; import net.minecraft.client.render.command.RenderDispatcher; import net.minecraft.client.render.entity.EntityRenderManager; From bd9622fd2b8e415870454e943b01f32f9c8cf9f7 Mon Sep 17 00:00:00 2001 From: chri-k Date: Fri, 28 Nov 2025 10:07:34 +0200 Subject: [PATCH 4/5] [cleanup] dead code (too many premature commits) --- .../meteorclient/mixin/EntityRendererMixin.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java index 25d18a73f3..75526ced73 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java @@ -103,22 +103,6 @@ private void updateShadow(Entity entity, EntityRenderState renderState, Callback } } - @Unique - private ESP getESP() { - if (esp == null) { - esp = Modules.get().get(ESP.class); - } - return esp; - } - - @Unique - private NoRender getNoRender() { - if (noRender == null) { - noRender = Modules.get().get(NoRender.class); - } - return noRender; - } - // Hitboxes @ModifyReturnValue(method = "createHitbox", at = @At("TAIL")) From 5a4ea974b01125842614acadb50b8ee508c4ec5d Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Sat, 29 Nov 2025 17:58:06 +0000 Subject: [PATCH 5/5] cleanup --- .../meteorclient/mixin/WorldRendererMixin.java | 6 +++--- .../meteorclient/systems/modules/render/ESP.java | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java index 635da94f1d..570d45ecb0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java @@ -58,8 +58,8 @@ @Mixin(WorldRenderer.class) public abstract class WorldRendererMixin implements IWorldRenderer { - @Unique private NoRender noRender = null; - @Unique private ESP esp = null; + @Unique private NoRender noRender; + @Unique private ESP esp; // if a world exists, meteor is initialised @Inject(method = "setWorld", at = @At("TAIL")) @@ -183,7 +183,7 @@ private void draw(WorldRenderState worldState, MatrixStack matrices, EntityShade meteor$popEntityOutlineFramebuffer(); } - @ModifyExpressionValue(method = "fillEntityRenderStates", at = @At(value= "INVOKE", target="Lnet/minecraft/client/render/WorldRenderer;isRenderingReady(Lnet/minecraft/util/math/BlockPos;)Z")) + @ModifyExpressionValue(method = "fillEntityRenderStates", at = @At(value= "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;isRenderingReady(Lnet/minecraft/util/math/BlockPos;)Z")) boolean fillEntityRenderStatesIsRenderingReady(boolean original) { if (esp.forceRender()) return true; return original; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java index 22922d933b..cefd1c7170 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java @@ -7,7 +7,6 @@ import meteordevelopment.meteorclient.events.render.Render2DEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; -import meteordevelopment.meteorclient.events.world.ChunkOcclusionEvent; import meteordevelopment.meteorclient.renderer.Renderer2D; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; @@ -322,7 +321,7 @@ private void onRender2D(Render2DEvent event) { } public boolean forceRender() { - return mode.get() == Mode.Shader || mode.get() == Mode.Glow; + return isActive() && (mode.get() == Mode.Shader || mode.get() == Mode.Glow); } private boolean checkCorner(double x, double y, double z, Vector3d min, Vector3d max) {