package joshie.progression.asm;
import joshie.progression.lib.PInfo;
import org.objectweb.asm.*;
public class ASMFurnace extends AbstractASM {
@Override
public boolean isClass(String name) {
return name.equals("net.minecraft.tileentity.TileEntityFurnace") || name.equals("aqg");
}
@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, String name, String desc, String signature, String[] exceptions) {
MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions);
if (desc.equals("()Z") && (name.equals("canSmelt") || name.equals("o"))) {
return new MethodVisitor(Opcodes.ASM4, visitor) {
boolean canVisit = true;
@Override
public void visitVarInsn(int opcode, int var) {
if (!canVisit) {
canVisit = true;
} else super.visitVarInsn(opcode, var);
}
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
if (name.equals("getSmeltingResult") || (name.equals("a") && desc.equals("(Ladq;)Ladq;"))) {
String stacks = name.equals("getSmeltingResult") ? "furnaceItemStacks" : "field_145957_n";
mv.visitMethodInsn(opcode, owner, name, desc, itf);
mv.visitVarInsn(Opcodes.ASTORE, 1);
Label l3 = new Label();
mv.visitLabel(l3);
mv.visitFieldInsn(Opcodes.GETSTATIC, PInfo.ASMPATH + "crafting/ActionType", "FURNACEUSE", "L" + PInfo.ASMPATH + "crafting/ActionType;");
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/tileentity/TileEntityFurnace", stacks, "[Lnet/minecraft/item/ItemStack;");
mv.visitInsn(Opcodes.ICONST_0);
mv.visitInsn(Opcodes.AALOAD);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, PInfo.ASMPATH + "helpers/CraftingHelper", "canPerformAction", "(L" + PInfo.ASMPATH + "crafting/ActionType;Lnet/minecraft/tileentity/TileEntity;Lnet/minecraft/item/ItemStack;)Z", false);
Label l4 = new Label();
mv.visitJumpInsn(Opcodes.IFNE, l4);
mv.visitInsn(Opcodes.ICONST_0);
mv.visitInsn(Opcodes.IRETURN);
mv.visitLabel(l4);
mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "net/minecraft/item/ItemStack" }, 0, null);
mv.visitFieldInsn(Opcodes.GETSTATIC, PInfo.ASMPATH + "crafting/ActionType", "FURNACE", "L" + PInfo.ASMPATH + "crafting/ActionType;");
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, PInfo.ASMPATH + "helpers/CraftingHelper", "canPerformAction", "(L" + PInfo.ASMPATH + "crafting/ActionType;Lnet/minecraft/tileentity/TileEntity;Lnet/minecraft/item/ItemStack;)Z", false);
Label l5 = new Label();
mv.visitJumpInsn(Opcodes.IFNE, l5);
mv.visitInsn(Opcodes.ICONST_0);
mv.visitInsn(Opcodes.IRETURN);
mv.visitLabel(l5);
canVisit = false;
} else super.visitMethodInsn(opcode, owner, name, desc, itf);
}
};
}
return visitor;
}
}
}