Add render option for hiding player name tags

This commit is contained in:
johni0702
2015-07-16 12:54:00 +02:00
parent 7790aee3cb
commit e6fcf4f094
5 changed files with 71 additions and 0 deletions

View File

@@ -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()

View File

@@ -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<AbstractInsnNode> 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();
}
}

View File

@@ -0,0 +1,5 @@
package eu.crushedpixel.replaymod.coremod;
public class asm_Hooks {
public static boolean DO_NOT_RENDER_NAME_TAGS;
}

View File

@@ -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;

View File

@@ -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<D extends CaptureData> 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<D extends CaptureData> implements eu.crushedpi
throw new Error(e);
}
asm_Hooks.DO_NOT_RENDER_NAME_TAGS = false;
spectatorRenderer.cleanup();
}