package openblocks.asm; import openmods.Log; import openmods.asm.MethodMatcher; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; public class EntityPlayerVisitor extends ClassVisitor { public static boolean IsInBedHookSuccess = false; private static class HookMethodVisitor extends MethodVisitor { public HookMethodVisitor(MethodVisitor mv) { super(Opcodes.ASM5, mv); } @Override public void visitCode() { mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); // EntityPlayer this mv.visitMethodInsn(Opcodes.INVOKESTATIC, "openblocks/Hooks", "isInBed", "(Lnet/minecraft/entity/player/EntityPlayer;)Z", false); Label skipReturn = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, skipReturn); mv.visitInsn(Opcodes.ICONST_1); mv.visitInsn(Opcodes.IRETURN); mv.visitLabel(skipReturn); IsInBedHookSuccess = true; Log.debug("isInBed patch applied. Enabling sleeping bags"); } } private final MethodMatcher isInBedMatcher; public EntityPlayerVisitor(String obfClassName, ClassVisitor cv) { super(Opcodes.ASM5, cv); isInBedMatcher = new MethodMatcher(obfClassName, "()Z", "isInBed", "func_71065_l"); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor parent = super.visitMethod(access, name, desc, signature, exceptions); return isInBedMatcher.match(name, desc)? new HookMethodVisitor(parent) : parent; } }