package com.dynious.biota.asm.transformers; import com.dynious.biota.asm.ITransformer; import com.dynious.biota.asm.MethodFieldObfHelper; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.tree.*; import squeek.asmhelper.applecore.ObfHelper; import squeek.asmhelper.applecore.ObfRemappingClassWriter; import java.util.Iterator; public class BlockTransformer implements ITransformer { private final static String REGISTER = ObfHelper.isObfuscated() ? MethodFieldObfHelper.method("net.minecraft.block.Block", "func_149671_p") : "registerBlocks"; private final static String REGISTER_DESC = ObfHelper.desc("()V"); @Override public String[] getClasses() { return new String[] { "net.minecraft.block.Block" }; } @Override public byte[] transform(String transformedName, byte[] clazz) { //Biota.logger.debug("Transforming: " + transformedName); ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(clazz); classReader.accept(classNode, 0); for (MethodNode methodNode : classNode.methods) { if (methodNode.name.equals(REGISTER) && methodNode.desc.equals(REGISTER_DESC)) { Iterator<AbstractInsnNode> iterator = methodNode.instructions.iterator(); while (iterator.hasNext()) { AbstractInsnNode node = iterator.next(); if (node instanceof LdcInsnNode) { if ("grass".equals(((LdcInsnNode) node).cst)) { node = node.getNext(); ((TypeInsnNode) node).desc = "com/dynious/biota/block/BlockNewGrass"; node = node.getNext().getNext(); ((MethodInsnNode) node).owner = "com/dynious/biota/block/BlockNewGrass"; break; } } } } } ClassWriter classWriter = new ObfRemappingClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); classNode.accept(classWriter); return classWriter.toByteArray(); } }