From 04b4941e65693f8d6b55f924781d7dd7cd26b1d5 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Sat, 18 May 2024 01:24:05 -0400 Subject: commands: EntityHighlight, improved MapLocate. --- .../trashyaddon/mixin/ClientWorldMixin.java | 13 ++++++ .../chrisoft/trashyaddon/mixin/EntityMixin.java | 25 +++++++++++ .../trashyaddon/mixin/WorldRendererMixin.java | 48 ++++++++++++++++++++++ .../meteorclient/PostProcessShadersMixin.java | 41 ++++++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 src/main/java/org/chrisoft/trashyaddon/mixin/ClientWorldMixin.java create mode 100644 src/main/java/org/chrisoft/trashyaddon/mixin/EntityMixin.java create mode 100644 src/main/java/org/chrisoft/trashyaddon/mixin/WorldRendererMixin.java create mode 100644 src/main/java/org/chrisoft/trashyaddon/mixin/meteorclient/PostProcessShadersMixin.java (limited to 'src/main/java/org/chrisoft/trashyaddon/mixin') diff --git a/src/main/java/org/chrisoft/trashyaddon/mixin/ClientWorldMixin.java b/src/main/java/org/chrisoft/trashyaddon/mixin/ClientWorldMixin.java new file mode 100644 index 0000000..da7d36a --- /dev/null +++ b/src/main/java/org/chrisoft/trashyaddon/mixin/ClientWorldMixin.java @@ -0,0 +1,13 @@ +package org.chrisoft.trashyaddon.mixin; + +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.Entity; +import net.minecraft.world.entity.EntityLookup; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(ClientWorld.class) +public interface ClientWorldMixin { + @Invoker("getEntityLookup") + public EntityLookup invokeGetEntityLookup(); +} diff --git a/src/main/java/org/chrisoft/trashyaddon/mixin/EntityMixin.java b/src/main/java/org/chrisoft/trashyaddon/mixin/EntityMixin.java new file mode 100644 index 0000000..39f6bb6 --- /dev/null +++ b/src/main/java/org/chrisoft/trashyaddon/mixin/EntityMixin.java @@ -0,0 +1,25 @@ +package org.chrisoft.trashyaddon.mixin; + +import com.mojang.logging.LogUtils; +import meteordevelopment.meteorclient.utils.render.color.Color; +import meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders; +import net.minecraft.entity.Entity; +import org.chrisoft.trashyaddon.commands.EntityHighlightCommand; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = Entity.class, priority = 1001) +public abstract class EntityMixin { + @Inject(method = "getTeamColorValue", at = @At("HEAD"), cancellable = true) + private void onGetTeamColorValue(CallbackInfoReturnable info) { + if (PostProcessShaders.rendering) { + Color color = EntityHighlightCommand.getEntityColor((Entity) (Object) this); + if (color != null) { + info.setReturnValue(color.getPacked()); + info.cancel(); + } + } + } +} diff --git a/src/main/java/org/chrisoft/trashyaddon/mixin/WorldRendererMixin.java b/src/main/java/org/chrisoft/trashyaddon/mixin/WorldRendererMixin.java new file mode 100644 index 0000000..f953e7e --- /dev/null +++ b/src/main/java/org/chrisoft/trashyaddon/mixin/WorldRendererMixin.java @@ -0,0 +1,48 @@ +package org.chrisoft.trashyaddon.mixin; + +import meteordevelopment.meteorclient.utils.render.color.Color; +import meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders; +import net.minecraft.client.gl.Framebuffer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.Entity; +import meteordevelopment.meteorclient.utils.render.postprocess.EntityShader; +import org.chrisoft.trashyaddon.commands.EntityHighlightCommand; +import org.chrisoft.trashyaddon.misc.AddonPostProcessingShaders; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = WorldRenderer.class, priority = 999) +public abstract class WorldRendererMixin { + @Shadow + private Framebuffer entityOutlinesFramebuffer; + @Shadow + protected abstract void renderEntity(Entity entity, double cameraX, double cameraY, double cameraZ, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers); + + @Inject(method = "renderEntity", at = @At("HEAD")) + private void renderEntity(Entity entity, double cameraX, double cameraY, double cameraZ, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, CallbackInfo info) { + for (EntityShader es : AddonPostProcessingShaders.entityShaders) { + drawShaded(entity, cameraX, cameraY, cameraZ, tickDelta, vertexConsumers, matrices, es, EntityHighlightCommand.getEntityColor(entity)); + } + } + + @Unique + private void drawShaded(Entity entity, double cameraX, double cameraY, double cameraZ, float tickDelta, VertexConsumerProvider vertexConsumers, MatrixStack matrices, EntityShader shader, Color color) { + if (shader.shouldDraw(entity) && !PostProcessShaders.isCustom(vertexConsumers) && color != null) { + Framebuffer prevBuffer = this.entityOutlinesFramebuffer; + this.entityOutlinesFramebuffer = shader.framebuffer; + PostProcessShaders.rendering = true; + + shader.vertexConsumerProvider.setColor(color.r, color.g, color.b, color.a); + renderEntity(entity, cameraX, cameraY, cameraZ, tickDelta, matrices, shader.vertexConsumerProvider); + + PostProcessShaders.rendering = false; + this.entityOutlinesFramebuffer = prevBuffer; + } + } +} diff --git a/src/main/java/org/chrisoft/trashyaddon/mixin/meteorclient/PostProcessShadersMixin.java b/src/main/java/org/chrisoft/trashyaddon/mixin/meteorclient/PostProcessShadersMixin.java new file mode 100644 index 0000000..565e670 --- /dev/null +++ b/src/main/java/org/chrisoft/trashyaddon/mixin/meteorclient/PostProcessShadersMixin.java @@ -0,0 +1,41 @@ +package org.chrisoft.trashyaddon.mixin.meteorclient; + +import com.mojang.logging.LogUtils; +import meteordevelopment.meteorclient.utils.render.postprocess.EntityShader; +import net.minecraft.client.render.VertexConsumerProvider; +import org.chrisoft.trashyaddon.misc.AddonPostProcessingShaders; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders.class, remap = false) +public abstract class PostProcessShadersMixin { + @Inject(method = "beginRender()V", at = @At("TAIL")) + private static void beginRender(CallbackInfo __) { + for (EntityShader es : AddonPostProcessingShaders.entityShaders) + es.beginRender(); + } + + @Inject(method = "endRender()V", at = @At("TAIL")) + private static void endRender(CallbackInfo __) { + for (EntityShader es : AddonPostProcessingShaders.entityShaders) + es.endRender(); + } + + @Inject(method = "onResized(II)V", at = @At("TAIL")) + private static void onResized(int width, int height, CallbackInfo __) { + for (EntityShader es : AddonPostProcessingShaders.entityShaders) + es.onResized(width, height); + } + + @Inject(method = "isCustom(Lnet/minecraft/client/render/VertexConsumerProvider;)Z", at = @At("HEAD"), cancellable = true, remap = true) + private static void isCustom(VertexConsumerProvider vcp, CallbackInfoReturnable info) { + for (EntityShader es : AddonPostProcessingShaders.entityShaders) + if (vcp == es.vertexConsumerProvider) { + info.setReturnValue(true); + info.cancel(); + } + } +} -- cgit v1.2.3