Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private byte[] transformBlockLeavesBase(byte[] bytecode, boolean obf) throws IOException {
- ClassNode classNode = new ClassNode();
- ClassReader classReader = new ClassReader(bytecode);
- classReader.accept(classNode, 0);
- //Решил рассмотреть добавление 1-го метода в тело класса
- String getCollisionBox = obf ? "b" : "getCollisionBoundingBoxFromPool";
- String world = obf ? "Labw;" : "Lnet/minecraft/world/World;";
- String axisAlignedBB = obf ? "Lasx;" : "Lnet/minecraft/util/AxisAlignedBB;";
- MethodNode method = new MethodNode(Opcodes.ASM4);
- method.name = getCollisionBox; //Имя метода
- method.desc = "(" + world + "III)" + axisAlignedBB; //описание метода
- method.access = 1; //число доступа ?
- method.maxLocals = 5; //число локальных переменных?Если нет считать самому в конце байт кода
- method.maxStack = 1; // Если метод НЕ абстрактный - то пишем
- method.instructions.add(new LabelNode()); //Добавление метки на которую можно будет прыгнуть с помощью инструкции JUMP
- method.instructions.add(new InsnNode(1)); //не понял почему 1,но что то вроде инструкции?
- method.instructions.add(new InsnNode(Opcodes.ARETURN)); //возврат значения соответствующего типа.Если чесно не понял,нашел таблицу со списком всех Opcodes и цифрами
- method.instructions.add(new LabelNode()); // http://asm.ow2.org/jdiff223to31/ASM%202.2.3/constant-values.html#org.objectweb.asm.Opcodes.ARETURN
- method.exceptions = new ArrayList<String>();
- classNode.methods.add(method);
- //Рассмотрение 2-го метода
- String entityCollided = obf ? "a" : "onEntityCollidedWithBlock";
- String entity = obf ? "Lnn;" : "Lnet/minecraft/entity/Entity;";
- method = new MethodNode(Opcodes.ASM4);
- method.name = entityCollided; //Имя метода
- method.desc = "(" + world + "III" + entity + ")V"; //Описание метода
- method.access = 1; //число доступа
- method.maxLocals = 6; //число локальных переменных(теперь точно уверен)
- method.maxStack = 1; //если метод НЕ абстрактный то пишем
- method.instructions.add(new LabelNode()); //Добавление метки на которую можно будет прыгнуть с помощью инструкции JUMP
- method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 5)); // "ALOAD"-тип аргумент(-а),(-ов) , "5" - это индекс локальной перемееной в методе?
- method.instructions.add(new MethodInsnNode(184, "HOOKS_CLASS", "inLeaves", "(" + entity + ")V")); /*опять же инструкция. 184 - оп код статичного метода.Т.е если вызов статичного метода,
- то пишем номер 184 ведь статичный метод - INVOKESTATIC а его номер в таблице 184.
- HOOKS_CLASS -класс где все методы, inLeaves -имя метода , потом его описание) */
- method.instructions.add(new LabelNode());
- method.instructions.add(new InsnNode(Opcodes.RETURN)); //возврат значения соответствующего типа.Если чесно не понял зачем это
- method.instructions.add(new LabelNode());
- method.exceptions = new ArrayList<String>();
- classNode.methods.add(method);
- ClassWriter writer = new ClassWriter(0);
- classNode.accept(writer);
- return writer.toByteArray();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement