Replace no name tag CT with mixin magic
Fix nametags of sneaking players being displayed even though nametags are disabled
This commit is contained in:
@@ -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()
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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<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();
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package eu.crushedpixel.replaymod.coremod;
|
||||
|
||||
public class asm_Hooks {
|
||||
public static boolean DO_NOT_RENDER_NAME_TAGS;
|
||||
}
|
||||
@@ -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<Boolean> ci) {
|
||||
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).getHandler();
|
||||
if (handler != null && handler.getOptions().isHideNameTags()) {
|
||||
ci.setReturnValue(false);
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<Boolean> ci) {
|
||||
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).getHandler();
|
||||
if (handler != null && handler.getOptions().isHideNameTags()) {
|
||||
ci.setReturnValue(false);
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"MixinEffectRenderer",
|
||||
"MixinEntityRenderer",
|
||||
"MixinMinecraft",
|
||||
"MixinRender",
|
||||
"MixinRendererLivingEntity",
|
||||
"MixinRenderItem",
|
||||
"MixinRenderManager"
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user