diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java index 4e433a2128..75526ced73 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; @@ -37,11 +38,20 @@ @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,8 +59,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 (esp.forceRender()) cir.setReturnValue(false); } @ModifyReturnValue(method = "getSkyLight", at = @At("RETURN")) @@ -70,8 +85,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(); @@ -80,7 +95,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) { @@ -88,15 +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; - } - // 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 bc0a525a9b..570d45ecb0 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; @@ -35,6 +36,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; @@ -55,6 +57,17 @@ @Mixin(WorldRenderer.class) public abstract class WorldRendererMixin implements IWorldRenderer { + + @Unique private NoRender noRender; + @Unique private ESP esp; + + // 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(); @@ -74,17 +87,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 @@ -128,7 +141,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 @@ -170,6 +183,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 (esp.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..cefd1c7170 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java @@ -320,6 +320,10 @@ private void onRender2D(Render2DEvent event) { Renderer2D.COLOR.render(); } + public boolean forceRender() { + return isActive() && (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;