package com.bioxx.tfc2.asm.transform;
import net.minecraft.launchwrapper.IClassTransformer;
import com.bioxx.tfc2.ASMConstants;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.*;
import squeek.asmhelper.com.bioxx.tfc2.ASMHelper;
import squeek.asmhelper.com.bioxx.tfc2.ObfHelper;
public class ModuleEntityRenderer implements IClassTransformer
{
@Override
public byte[] transform(String name, String transformedName, byte[] basicClass)
{
ClassNode classNode = ASMHelper.readClassFromBytes(basicClass);
if (!transformedName.equals(ASMConstants.ENTITY_RENDERER))
{
return ASMHelper.writeClassToBytes(classNode);
}
MethodNode methodNode = ASMHelper.findMethodNodeOfClass(classNode, "p", "addRainParticles", ASMHelper.toMethodDescriptor("V"));
if (methodNode != null)
{
addRainParticlesHook(classNode, methodNode);
return ASMHelper.writeClassToBytes(classNode);
}
else
throw new RuntimeException("EntityRenderer: addRainParticles (p) method not found");
}
private void addRainParticlesHook(ClassNode classNode, MethodNode method)
{
InsnList list = new InsnList();
if(!ObfHelper.isObfuscated())
{
list.add(new VarInsnNode(Opcodes.ALOAD, 0));
list.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/client/renderer/EntityRenderer", "random", "Ljava/util/Random;"));
list.add(new VarInsnNode(Opcodes.ALOAD, 0));
list.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/client/renderer/EntityRenderer", "rendererUpdateCount", "I"));
list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "com/bioxx/tfc2/rendering/WeatherRenderer","addRainParticles","(Ljava/util/Random;I)V", false));
list.add(new InsnNode(Opcodes.RETURN));
}
else
{
list.add(new VarInsnNode(Opcodes.ALOAD, 0));
list.add(new FieldInsnNode(Opcodes.GETFIELD, "bnz", "j", "Ljava/util/Random;"));
list.add(new VarInsnNode(Opcodes.ALOAD, 0));
list.add(new FieldInsnNode(Opcodes.GETFIELD, "bnz", "m", "I"));
list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "com/bioxx/tfc2/rendering/WeatherRenderer","addRainParticles","(Ljava/util/Random;I)V", false));
list.add(new InsnNode(Opcodes.RETURN));
}
method.instructions.insert(list);
}
}