package joshie.progression.asm; import joshie.progression.lib.PInfo; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import static org.objectweb.asm.Opcodes.*; public class ASMContainerPlayer extends AbstractASM { @Override public boolean isClass(String name) { return name.equals("net.minecraft.inventory.ContainerPlayer") || name.equals("abl"); } @Override public ClassVisitor newInstance(ClassWriter writer) { return new ASMVisitor(writer); } public class ASMVisitor extends ClassVisitor { public ASMVisitor(ClassWriter writer) { super(Opcodes.ASM4, writer); } @Override public MethodVisitor visitMethod(int access, final String name, String desc, String signature, String[] exceptions) { MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions); if (desc.equals("(Lnet/minecraft/inventory/IInventory;)V") || desc.equals("(Lqg;)V")) { if (name.equals("onCraftMatrixChanged") || name.equals("a") || name.equals("func_75130_a")) { return new MethodVisitor(Opcodes.ASM4, visitor) { @Override public void visitCode() { String matrix = name.equals("onCraftMatrixChanged") ? "craftMatrix" : "field_75181_e"; String result = name.equals("onCraftMatrixChanged") ? "craftResult" : "field_75179_f"; String player = name.equals("onCraftMatrixChanged") ? "thePlayer" : "field_82862_h"; String world = name.equals("onCraftMatrixChanged") ? "worldObj" : "field_70170_p"; mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "net/minecraft/inventory/ContainerPlayer", matrix, "Lnet/minecraft/inventory/InventoryCrafting;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "net/minecraft/inventory/ContainerPlayer", result, "Lnet/minecraft/inventory/IInventory;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "net/minecraft/inventory/ContainerPlayer", player, "Lnet/minecraft/entity/player/EntityPlayer;"); mv.visitFieldInsn(GETFIELD, "net/minecraft/entity/player/EntityPlayer", world, "Lnet/minecraft/world/World;"); mv.visitMethodInsn(INVOKESTATIC, PInfo.ASMPATH + "asm/helpers/VanillaHelper", "onContainerChanged", "(Lnet/minecraft/inventory/InventoryCrafting;Lnet/minecraft/inventory/IInventory;Lnet/minecraft/world/World;)V", false); mv.visitInsn(RETURN); } }; } } return visitor; } } }