List of usage examples for org.objectweb.asm.tree AbstractInsnNode getOpcode
public int getOpcode()
From source file:vazkii.quark.base.asm.ClassTransformer.java
License:Creative Commons License
private static byte[] transformEntityBoat(byte[] basicClass) { log("Transforming EntityBoat"); MethodSignature sig1 = new MethodSignature("attackEntityFrom", "func_70097_a", "a", "(Lnet/minecraft/util/DamageSource;F)Z"); MethodSignature sig2 = new MethodSignature("onUpdate", "func_70071_h_", "B_", "()V"); byte[] transClass = transform(basicClass, Pair.of(sig1, combine((AbstractInsnNode node) -> { // Filter return node.getOpcode() == Opcodes.POP; }, (MethodNode method, AbstractInsnNode node) -> { // Action InsnList newInstructions = new InsnList(); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); newInstructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, ASM_HOOKS, "dropBoatBanner", "(Lnet/minecraft/entity/item/EntityBoat;)V")); method.instructions.insertBefore(node, newInstructions); return true; })));//from ww w .ja v a 2 s . co m transClass = transform(transClass, Pair.of(sig2, combine((AbstractInsnNode node) -> { // Filter return true; }, (MethodNode method, AbstractInsnNode node) -> { // Action InsnList newInstructions = new InsnList(); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); newInstructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, ASM_HOOKS, "onBoatUpdate", "(Lnet/minecraft/entity/item/EntityBoat;)V")); method.instructions.insertBefore(node, newInstructions); return true; }))); return transClass; }
From source file:vazkii.quark.base.asm.ClassTransformer.java
License:Creative Commons License
private static byte[] transformRenderBoat(byte[] basicClass) { log("Transforming RenderBoat"); MethodSignature sig = new MethodSignature("doRender", "func_188300_b", "b", "(Lnet/minecraft/entity/item/EntityBoat;DDDFF)V"); return transform(basicClass, Pair.of(sig, combine((AbstractInsnNode node) -> { // Filter return (node.getOpcode() == Opcodes.INVOKEVIRTUAL || node.getOpcode() == Opcodes.INVOKEINTERFACE) && checkDesc(((MethodInsnNode) node).desc, "(Lnet/minecraft/entity/Entity;FFFFFF)V"); }, (MethodNode method, AbstractInsnNode node) -> { // Action InsnList newInstructions = new InsnList(); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 1)); newInstructions.add(new VarInsnNode(Opcodes.FLOAD, 9)); newInstructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, ASM_HOOKS, "renderBannerOnBoat", "(Lnet/minecraft/entity/item/EntityBoat;F)V")); method.instructions.insert(node, newInstructions); return true; })));//from ww w. j ava2s. c o m }
From source file:vazkii.quark.base.asm.ClassTransformer.java
License:Creative Commons License
private static byte[] transformBlockPistonBase(byte[] basicClass) { log("Transforming BlockPistonBase"); MethodSignature sig1 = new MethodSignature("doMove", "func_176319_a", "a", "(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/EnumFacing;Z)Z"); MethodSignature sig2 = new MethodSignature("canPush", "func_185646_a", "a", "(Lnet/minecraft/block/state/IBlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/EnumFacing;ZLnet/minecraft/util/EnumFacing;)Z"); byte[] transClass = transform(basicClass, Pair.of(sig1, combine((AbstractInsnNode node) -> { // Filter return node.getOpcode() == Opcodes.ASTORE && ((VarInsnNode) node).var == 11; }, (MethodNode method, AbstractInsnNode node) -> { // Action InsnList newInstructions = new InsnList(); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 1)); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 2)); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 6)); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 8)); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 11)); newInstructions.add(new VarInsnNode(Opcodes.ILOAD, 4)); newInstructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, ASM_HOOKS, "breakStuffWithSpikes", "(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Ljava/util/List;Ljava/util/List;Lnet/minecraft/util/EnumFacing;Z)Z")); // recalculate the list and array sizes LabelNode label = new LabelNode(); newInstructions.add(new JumpInsnNode(Opcodes.IFEQ, label)); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 6)); newInstructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, "java/util/List", "size", "()I")); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 8)); newInstructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, "java/util/List", "size", "()I")); newInstructions.add(new InsnNode(Opcodes.IADD)); newInstructions.add(new VarInsnNode(Opcodes.ISTORE, 9)); newInstructions.add(new VarInsnNode(Opcodes.ILOAD, 9)); AbstractInsnNode newNode = node.getPrevious(); while (true) { if (newNode.getOpcode() == Opcodes.ANEWARRAY) { newInstructions.add(new TypeInsnNode(Opcodes.ANEWARRAY, ((TypeInsnNode) newNode).desc)); break; }/* ww w. ja v a 2s .c o m*/ newNode = newNode.getPrevious(); } newInstructions.add(new VarInsnNode(Opcodes.ASTORE, 10)); newInstructions.add(label); method.instructions.insert(node, newInstructions); return true; }))); transClass = transform(transClass, Pair.of(sig2, combine((AbstractInsnNode node) -> { // Filter return node.getOpcode() == Opcodes.INVOKEVIRTUAL && ((MethodInsnNode) node).name.equals("hasTileEntity"); }, (MethodNode method, AbstractInsnNode node) -> { // Action InsnList newInstructions = new InsnList(); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); newInstructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, ASM_HOOKS, "shouldPistonMoveTE", "(ZLnet/minecraft/block/state/IBlockState;)Z")); method.instructions.insert(node, newInstructions); return true; }))); return transClass; }
From source file:vazkii.quark.base.asm.ClassTransformer.java
License:Creative Commons License
private static byte[] transformTransferStackInSlot(byte[] basicClass, int min, int max, String hook) { MethodSignature sig = new MethodSignature("transferStackInSlot", "func_82846_b", "b", "(Lnet/minecraft/entity/player/EntityPlayer;I)Lnet/minecraft/item/ItemStack;"); bipushCount = 0;/* www .j a v a 2 s . co m*/ return transform(basicClass, Pair.of(sig, combine((AbstractInsnNode node) -> { // Filte return node.getOpcode() == Opcodes.BIPUSH; }, (MethodNode method, AbstractInsnNode node) -> { // Action InsnList newInstructions = new InsnList(); bipushCount++; if (bipushCount != min && bipushCount != max) return false; log("Adding invokestatic to " + ((IntInsnNode) node).operand + "/" + bipushCount); newInstructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, ASM_HOOKS, hook, "(I)I")); method.instructions.insert(node, newInstructions); return bipushCount == max; }))); }
From source file:vazkii.quark.base.asm.ClassTransformer.java
License:Creative Commons License
private static byte[] transformTileEntityPiston(byte[] basicClass) { log("Transforming TileEntityPiston"); MethodSignature sig1 = new MethodSignature("clearPistonTileEntity", "func_145866_f", "j", "()V"); MethodSignature sig2 = new MethodSignature("update", "func_73660_a", "e", "()V"); MethodAction action = combine((AbstractInsnNode node) -> { // Filter return node.getOpcode() == Opcodes.INVOKEVIRTUAL && checkDesc(((MethodInsnNode) node).desc, "(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/state/IBlockState;I)Z"); }, (MethodNode method, AbstractInsnNode node) -> { // Action InsnList newInstructions = new InsnList(); newInstructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, ASM_HOOKS, "setPistonBlock", "(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/state/IBlockState;I)Z")); method.instructions.insert(node, newInstructions); method.instructions.remove(node); return true; });//from w w w .j av a2s. co m byte[] transClass = transform(basicClass, Pair.of(sig1, action)); return transform(transClass, Pair.of(sig2, action)); }
From source file:vazkii.quark.base.asm.ClassTransformer.java
License:Creative Commons License
private static byte[] transformBlockModelRenderer(byte[] basicClass) { log("Transforming BlockModelRenderer"); MethodSignature sig1 = new MethodSignature("renderQuadsFlat", "func_187496_a", "a", "(Lnet/minecraft/world/IBlockAccess;Lnet/minecraft/block/state/IBlockState;Lnet/minecraft/util/math/BlockPos;IZLnet/minecraft/client/renderer/BufferBuilder;Ljava/util/List;Ljava/util/BitSet;)V"); if (hasOptifine(sig1.toString())) return basicClass; return transform(basicClass, Pair.of(sig1, combine((AbstractInsnNode node) -> { // Filter return node.getOpcode() == Opcodes.INVOKEVIRTUAL && checkDesc(((MethodInsnNode) node).desc, "(DDD)V"); }, (MethodNode method, AbstractInsnNode node) -> { // Action InsnList newInstructions = new InsnList(); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 1)); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 2)); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 3)); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 6)); newInstructions.add(new VarInsnNode(Opcodes.ALOAD, 18)); newInstructions.add(new VarInsnNode(Opcodes.ILOAD, 4)); newInstructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, ASM_HOOKS, "putColorsFlat", "(Lnet/minecraft/world/IBlockAccess;Lnet/minecraft/block/state/IBlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/renderer/BufferBuilder;Lnet/minecraft/client/renderer/block/model/BakedQuad;I)V")); method.instructions.insertBefore(node, newInstructions); return true; })));/*from w w w . jav a2 s.com*/ }