From 78e4c36d54af6e020340405b6302a90701061b50 Mon Sep 17 00:00:00 2001 From: johni0702 Date: Wed, 5 Aug 2015 17:09:54 +0200 Subject: [PATCH] Replace no name tag CT with mixin magic Fix nametags of sneaking players being displayed even though nametags are disabled --- .../replaymod/coremod/LoadingPlugin.java | 3 +- .../replaymod/coremod/NoNameTagCT.java | 56 ------------------- .../replaymod/coremod/asm_Hooks.java | 5 -- .../replaymod/mixin/MixinRender.java | 22 ++++++++ .../mixin/MixinRendererLivingEntity.java | 22 ++++++++ .../video/EntityRendererHandler.java | 7 --- src/main/resources/mixins.replaymod.json | 2 + 7 files changed, 47 insertions(+), 70 deletions(-) delete mode 100644 src/main/java/eu/crushedpixel/replaymod/coremod/NoNameTagCT.java delete mode 100644 src/main/java/eu/crushedpixel/replaymod/coremod/asm_Hooks.java create mode 100644 src/main/java/eu/crushedpixel/replaymod/mixin/MixinRender.java create mode 100644 src/main/java/eu/crushedpixel/replaymod/mixin/MixinRendererLivingEntity.java diff --git a/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java b/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java index e2774eea..04314bac 100755 --- a/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java +++ b/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java @@ -40,8 +40,7 @@ public class LoadingPlugin implements IFMLLoadingPlugin { @Override public String[] getASMTransformerClass() { return new String[]{ - ForceChunkLoadingCT.class.getName(), - NoNameTagCT.class.getName() + ForceChunkLoadingCT.class.getName() }; } diff --git a/src/main/java/eu/crushedpixel/replaymod/coremod/NoNameTagCT.java b/src/main/java/eu/crushedpixel/replaymod/coremod/NoNameTagCT.java deleted file mode 100644 index f6e7682d..00000000 --- a/src/main/java/eu/crushedpixel/replaymod/coremod/NoNameTagCT.java +++ /dev/null @@ -1,56 +0,0 @@ -package eu.crushedpixel.replaymod.coremod; - -import net.minecraft.launchwrapper.IClassTransformer; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.tree.*; - -import java.util.ListIterator; - -import static org.objectweb.asm.Opcodes.*; - -public class NoNameTagCT implements IClassTransformer { - - private static final String ASM_HOOKS = "eu/crushedpixel/replaymod/coremod/asm_Hooks"; - private static final String CLASS_NAME = "net.minecraft.client.renderer.entity.Render"; - - @Override - public byte[] transform(String name, String transformedName, byte[] bytes) { - if (CLASS_NAME.equals(transformedName)) { - if (name.equals(transformedName)) { - return transform(bytes, "renderLivingLabel", "(Lnet/minecraft/entity/Entity;Ljava/lang/String;DDDI)V"); - } else { - return transform(bytes, "a", "(Lwv;Ljava/lang/String;DDDI)V"); - } - } - return bytes; - } - - private byte[] transform(byte[] bytes, String name_method, String desc_method) { - ClassReader classReader = new ClassReader(bytes); - ClassNode classNode = new ClassNode(); - classReader.accept(classNode, 0); - - boolean success = false; - for (MethodNode m : classNode.methods) { - if (desc_method.equals(m.desc) && name_method.equals(m.name)) { - ListIterator iter = m.instructions.iterator(); - iter.add(new FieldInsnNode(GETSTATIC, ASM_HOOKS, "DO_NOT_RENDER_NAME_TAGS", "Z")); - iter.add(new InsnNode(ICONST_0)); - LabelNode label = new LabelNode(); - iter.add(new JumpInsnNode(IF_ICMPEQ, label)); - iter.add(new InsnNode(RETURN)); - iter.add(label); - iter.add(new FrameNode(F_SAME, 0, null, 0, null)); - success = true; - } - } - if (!success) { - throw new NoSuchMethodError(); - } - - ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); - classNode.accept(classWriter); - return classWriter.toByteArray(); - } -} diff --git a/src/main/java/eu/crushedpixel/replaymod/coremod/asm_Hooks.java b/src/main/java/eu/crushedpixel/replaymod/coremod/asm_Hooks.java deleted file mode 100644 index ec64029a..00000000 --- a/src/main/java/eu/crushedpixel/replaymod/coremod/asm_Hooks.java +++ /dev/null @@ -1,5 +0,0 @@ -package eu.crushedpixel.replaymod.coremod; - -public class asm_Hooks { - public static boolean DO_NOT_RENDER_NAME_TAGS; -} diff --git a/src/main/java/eu/crushedpixel/replaymod/mixin/MixinRender.java b/src/main/java/eu/crushedpixel/replaymod/mixin/MixinRender.java new file mode 100644 index 00000000..b6a1ad4c --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/mixin/MixinRender.java @@ -0,0 +1,22 @@ +package eu.crushedpixel.replaymod.mixin; + +import eu.crushedpixel.replaymod.video.EntityRendererHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +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(Render.class) +public abstract class MixinRender { + @Inject(method = "canRenderName", at = @At("HEAD"), cancellable = true) + private void areAllNamesHidden(Entity entity, CallbackInfoReturnable ci) { + EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).getHandler(); + if (handler != null && handler.getOptions().isHideNameTags()) { + ci.setReturnValue(false); + ci.cancel(); + } + } +} diff --git a/src/main/java/eu/crushedpixel/replaymod/mixin/MixinRendererLivingEntity.java b/src/main/java/eu/crushedpixel/replaymod/mixin/MixinRendererLivingEntity.java new file mode 100644 index 00000000..991234a8 --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/mixin/MixinRendererLivingEntity.java @@ -0,0 +1,22 @@ +package eu.crushedpixel.replaymod.mixin; + +import eu.crushedpixel.replaymod.video.EntityRendererHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.entity.EntityLivingBase; +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(RendererLivingEntity.class) +public abstract class MixinRendererLivingEntity { + @Inject(method = "canRenderName", at = @At("HEAD"), cancellable = true) + private void areAllNamesHidden(EntityLivingBase entity, CallbackInfoReturnable ci) { + EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).getHandler(); + if (handler != null && handler.getOptions().isHideNameTags()) { + ci.setReturnValue(false); + ci.cancel(); + } + } +} diff --git a/src/main/java/eu/crushedpixel/replaymod/video/EntityRendererHandler.java b/src/main/java/eu/crushedpixel/replaymod/video/EntityRendererHandler.java index 216ca14f..3130ae2a 100644 --- a/src/main/java/eu/crushedpixel/replaymod/video/EntityRendererHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/video/EntityRendererHandler.java @@ -1,6 +1,5 @@ package eu.crushedpixel.replaymod.video; -import eu.crushedpixel.replaymod.coremod.asm_Hooks; import eu.crushedpixel.replaymod.settings.RenderOptions; import eu.crushedpixel.replaymod.video.capturer.CaptureData; import eu.crushedpixel.replaymod.video.capturer.WorldRenderer; @@ -24,10 +23,6 @@ public class EntityRendererHandler implements WorldRenderer { public EntityRendererHandler(RenderOptions options) { this.options = options; - if (options.isHideNameTags()) { - asm_Hooks.DO_NOT_RENDER_NAME_TAGS = true; - } - ((IEntityRenderer) mc.entityRenderer).setHandler(this); } @@ -67,8 +62,6 @@ public class EntityRendererHandler implements WorldRenderer { @Override public void close() throws IOException { ((IEntityRenderer) mc.entityRenderer).setHandler(null); - - asm_Hooks.DO_NOT_RENDER_NAME_TAGS = false; } public static final class NoCullingClippingHelper extends ClippingHelper { diff --git a/src/main/resources/mixins.replaymod.json b/src/main/resources/mixins.replaymod.json index 5d534a4e..14693aa8 100644 --- a/src/main/resources/mixins.replaymod.json +++ b/src/main/resources/mixins.replaymod.json @@ -5,6 +5,8 @@ "MixinEffectRenderer", "MixinEntityRenderer", "MixinMinecraft", + "MixinRender", + "MixinRendererLivingEntity", "MixinRenderItem", "MixinRenderManager" ],