Advertisement
Guest User

Untitled

a guest
May 28th, 2015
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.09 KB | None | 0 0
  1. private byte[] transformBlockLeavesBase(byte[] bytecode, boolean obf) throws IOException {
  2.        
  3.         ClassNode classNode = new ClassNode();
  4.         ClassReader classReader = new ClassReader(bytecode);
  5.         classReader.accept(classNode, 0);
  6.  
  7.         //Решил рассмотреть добавление 1-го метода в тело класса
  8.         String getCollisionBox = obf ? "b" : "getCollisionBoundingBoxFromPool";
  9.         String world = obf ? "Labw;" : "Lnet/minecraft/world/World;";
  10.         String axisAlignedBB = obf ? "Lasx;" : "Lnet/minecraft/util/AxisAlignedBB;";
  11.        
  12.  
  13.         MethodNode method = new MethodNode(Opcodes.ASM4);
  14.         method.name = getCollisionBox;          //Имя метода
  15.         method.desc = "(" + world + "III)" + axisAlignedBB;     //описание метода
  16.         method.access = 1;          //число доступа ?
  17.         method.maxLocals = 5;       //число локальных переменных?Если нет считать самому в конце байт кода
  18.         method.maxStack = 1;        // Если метод НЕ абстрактный - то пишем                                                       
  19.         method.instructions.add(new LabelNode());     //Добавление метки на которую можно будет прыгнуть с помощью инструкции JUMP
  20.         method.instructions.add(new InsnNode(1));    //не понял почему 1,но что то вроде инструкции?
  21.         method.instructions.add(new InsnNode(Opcodes.ARETURN));         //возврат значения соответствующего типа.Если чесно не понял,нашел таблицу со списком всех Opcodes и цифрами
  22.         method.instructions.add(new LabelNode());                                           // http://asm.ow2.org/jdiff223to31/ASM%202.2.3/constant-values.html#org.objectweb.asm.Opcodes.ARETURN
  23.         method.exceptions = new ArrayList<String>();
  24.         classNode.methods.add(method);
  25.        
  26.         //Рассмотрение 2-го метода
  27.         String entityCollided = obf ? "a" : "onEntityCollidedWithBlock";
  28.         String entity = obf ? "Lnn;" : "Lnet/minecraft/entity/Entity;";
  29.        
  30.        
  31.         method = new MethodNode(Opcodes.ASM4);
  32.         method.name = entityCollided;       //Имя метода
  33.         method.desc = "(" + world + "III" + entity + ")V";      //Описание метода
  34.         method.access = 1;          //число доступа
  35.         method.maxLocals = 6;       //число локальных переменных(теперь точно уверен)
  36.         method.maxStack = 1;        //если метод НЕ абстрактный то пишем
  37.         method.instructions.add(new LabelNode());   //Добавление метки на которую можно будет прыгнуть с помощью инструкции JUMP
  38.         method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 5));     // "ALOAD"-тип аргумент(-а),(-ов) , "5" - это индекс локальной перемееной в методе?  
  39.         method.instructions.add(new MethodInsnNode(184, "HOOKS_CLASS", "inLeaves", "(" + entity + ")V"));       /*опять же инструкция. 184 - оп код статичного метода.Т.е если вызов статичного метода,
  40.         то пишем номер 184 ведь статичный метод - INVOKESTATIC а его номер в таблице 184.
  41.         HOOKS_CLASS -класс где все методы, inLeaves -имя метода , потом его описание) */
  42.         method.instructions.add(new LabelNode());      
  43.         method.instructions.add(new InsnNode(Opcodes.RETURN));      //возврат значения соответствующего типа.Если чесно не понял зачем это
  44.         method.instructions.add(new LabelNode());
  45.         method.exceptions = new ArrayList<String>();
  46.         classNode.methods.add(method);
  47.  
  48.        
  49.         ClassWriter writer = new ClassWriter(0);
  50.         classNode.accept(writer);
  51.         return writer.toByteArray();
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement