From e6fcf4f0945e0e3e2e36123f794f54429f537121 Mon Sep 17 00:00:00 2001 From: johni0702 Date: Thu, 16 Jul 2015 12:54:00 +0200 Subject: [PATCH] Add render option for hiding player name tags --- .../replaymod/coremod/LoadingPlugin.java | 1 + .../replaymod/coremod/NoNameTagCT.java | 56 +++++++++++++++++++ .../replaymod/coremod/asm_Hooks.java | 5 ++ .../replaymod/settings/RenderOptions.java | 2 + .../video/entity/CustomEntityRenderer.java | 7 +++ 5 files changed, 71 insertions(+) create mode 100644 src/main/java/eu/crushedpixel/replaymod/coremod/NoNameTagCT.java create mode 100644 src/main/java/eu/crushedpixel/replaymod/coremod/asm_Hooks.java diff --git a/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java b/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java index 663d29fa..79bb6223 100755 --- a/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java +++ b/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java @@ -12,6 +12,7 @@ public class LoadingPlugin implements IFMLLoadingPlugin { CameraRollCT.class.getName(), ForceChunkLoadingCT.class.getName(), EntityRendererCT.class.getName(), + NoNameTagCT.class.getName(), RenderManagerCT.class.getName(), SoundManagerCT.class.getName(), EnchantmentTimerCT.class.getName() diff --git a/src/main/java/eu/crushedpixel/replaymod/coremod/NoNameTagCT.java b/src/main/java/eu/crushedpixel/replaymod/coremod/NoNameTagCT.java new file mode 100644 index 00000000..f6e7682d --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/coremod/NoNameTagCT.java @@ -0,0 +1,56 @@ +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 new file mode 100644 index 00000000..ec64029a --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/coremod/asm_Hooks.java @@ -0,0 +1,5 @@ +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/settings/RenderOptions.java b/src/main/java/eu/crushedpixel/replaymod/settings/RenderOptions.java index 685be13a..7f3b7a6e 100644 --- a/src/main/java/eu/crushedpixel/replaymod/settings/RenderOptions.java +++ b/src/main/java/eu/crushedpixel/replaymod/settings/RenderOptions.java @@ -21,6 +21,7 @@ public final class RenderOptions { // Advanced private boolean waitForChunks = true; private boolean isLinearMovement = false; + private boolean hideNameTags = true; private int skyColor = -1; private int width = Minecraft.getMinecraft().displayWidth; private int height = Minecraft.getMinecraft().displayHeight; @@ -50,6 +51,7 @@ public final class RenderOptions { copy.ignoreCameraRotation = this.ignoreCameraRotation; copy.waitForChunks = this.waitForChunks; copy.isLinearMovement = this.isLinearMovement; + copy.hideNameTags = this.hideNameTags; copy.skyColor = this.skyColor; copy.width = this.width; copy.height = this.height; diff --git a/src/main/java/eu/crushedpixel/replaymod/video/entity/CustomEntityRenderer.java b/src/main/java/eu/crushedpixel/replaymod/video/entity/CustomEntityRenderer.java index b6497bf5..e28435e7 100644 --- a/src/main/java/eu/crushedpixel/replaymod/video/entity/CustomEntityRenderer.java +++ b/src/main/java/eu/crushedpixel/replaymod/video/entity/CustomEntityRenderer.java @@ -1,5 +1,6 @@ package eu.crushedpixel.replaymod.video.entity; +import eu.crushedpixel.replaymod.coremod.asm_Hooks; import eu.crushedpixel.replaymod.renderer.SpectatorRenderer; import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.settings.RenderOptions; @@ -59,6 +60,10 @@ public class CustomEntityRenderer implements eu.crushedpi } catch (IllegalAccessException e) { throw new Error(e); } + + if (options.isHideNameTags()) { + asm_Hooks.DO_NOT_RENDER_NAME_TAGS = true; + } } @SuppressWarnings("unused") // Method called by ASM hook @@ -408,6 +413,8 @@ public class CustomEntityRenderer implements eu.crushedpi throw new Error(e); } + asm_Hooks.DO_NOT_RENDER_NAME_TAGS = false; + spectatorRenderer.cleanup(); }