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 java.util.ArrayList; import java.util.HashMap; import java.util.List; import static org.objectweb.asm.Opcodes.ALOAD; import static org.objectweb.asm.Opcodes.INVOKESTATIC; /** Moves the firing of the oncrafting event in slotcrafting * to firing when the onCrafting is called, instead of onPickupFrom Slot. */ public class ASMTransferCrafting extends AbstractASM { public static HashMap<String, String> acceptedMap = new HashMap(); public static List accepted = new ArrayList(); static { accepted.add("slimeknights.mantle.inventory.ContainerMultiModule"); acceptedMap.put("slimeknights.mantle.inventory.ContainerMultiModule", "notifySlotAfterTransfer"); accepted.add("net.minecraft.inventory.ContainerPlayer"); accepted.add("abd"); accepted.add("net.minecraft.inventory.ContainerWorkbench"); accepted.add("abl"); } @Override public boolean isClass(String name) { return accepted.contains(name); } @Override public ClassVisitor newInstance(String name, ClassWriter cw) { if (acceptedMap.containsKey(name)) { final String value = acceptedMap.get(name); return new ASMVisitor(cw) { @Override public boolean isNameValid(String name) { return name.equals(value); } }; } return new ASMVisitor(cw); } public class ASMVisitor extends ClassVisitor { public ASMVisitor(ClassWriter writer) { super(Opcodes.ASM4, writer); } public boolean isNameValid(String name) { return name.equals("transferStackInSlot") || name.equals("func_82846_b") || name.equals("b"); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions); if (isNameValid(name)) { return new MethodVisitor(Opcodes.ASM4, visitor) { boolean isDone = false; @Override public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { if ((((name.equals("onSlotChange") || name.equals("func_75220_a")) && desc.equals("(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemStack;)V")) || (name.equals("a") && desc.equals("(Ladq;Ladq;)V"))) && !isDone) { super.visitMethodInsn(opcode, owner, name, desc, itf); isDone = true; mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 4); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKESTATIC, PInfo.ASMPATH + "asm/helpers/TransferHelper", "onPickup", "(Ljava/lang/Object;Lnet/minecraft/inventory/Slot;Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/item/ItemStack;)V", false); } else super.visitMethodInsn(opcode, owner, name, desc, itf); } }; } return visitor; } } }