package joshie.harvest.asm.transformers; import org.objectweb.asm.*; import static org.objectweb.asm.Opcodes.*; /** This gives me a hook in to renderByItem so i can do what vanilla does * with my entities, to render them in the inventory, this may seem bad, but before i was simply creating * a bunch of fake tile entities and renderers, so i could do this, which added a lot of bloat, * doing it this way i can pass the renderers the stack **/ public class RenderItemTransformer extends AbstractASM { private static final String RENDER_HOOK = "joshie/harvest/asm/RenderHook"; @Override public boolean isClass(String name) { return name.equals("net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer") || name.equals("bnx"); } @Override public ClassVisitor newInstance(ClassWriter writer) { return new Visitor(writer); } public class Visitor extends ClassVisitor { public Visitor(ClassWriter writer) { super(Opcodes.ASM4, writer); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions); if (((name.equals("renderByItem") || name.equals("func_179022_a")) && desc.equals("(Lnet/minecraft/item/ItemStack;)V")) || (name.equals("a") && desc.equals("(Ladz;)V"))) { return new MethodVisitor(Opcodes.ASM4, visitor) { @Override public void visitCode() { /** Calls render transformer for the item **/ Label l0 = new Label(); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESTATIC, RENDER_HOOK, "render", "(Lnet/minecraft/item/ItemStack;)Z", false); Label l1 = new Label(); mv.visitJumpInsn(IFEQ, l1); mv.visitInsn(RETURN); mv.visitLabel(l1); mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); super.visitCode(); } }; } return visitor; } } }