HookLib with anchors

7,099
324
1,510
Щас, гляну. Ты вставляешь вместо метода, который че-то возвращает?
 
7,099
324
1,510
А откуда этот кусок кода? У мя там немного по-другому
 
7,099
324
1,510
А мест для вставки больше одного? ordinal чему равен?
 

tox1cozZ

aka Agravaine
8,455
598
2,892
А откуда этот кусок кода? У мя там немного по-другому
Я немного переделал, работает так же.
А мест для вставки больше одного? ordinal чему равен?
Разные варики пробовал, всегда руинит код, ифы мне повырезал половину, ваще хз что творится)
BEFORE и AFTER пашет отлично)
 
У меня такой вопрос: можно ли как-нибудь с помощью хуков изменить условие? Дело в том, что мне надо что вызывалась та часть условия, которая в else. Там находится вызов метода из суперкласса. По этой причине я не могу полностью изменить метод, так как врят-ли получится из метода хука вызвать метод из суперкласса целевого класса. Может есть какие-нибудь иные варианты до которых я не додумался?
 
7,099
324
1,510
Покажи конкретно, что нужно изменить и как
 
Класс GCEntityClientPlayerMP из мода Galacticraft. Метод выглядит так:
Java:
    @Override
    public void onLivingUpdate() {
        ClientProxyCore.playerClientHandler.onLivingUpdatePre(this);
        try {
            if (this.world.provider instanceof IZeroGDimension) {
                //Какой-то код который мне не нужно чтоб выполнялся
            } else {
                //Мне необходимо чтоб выполнялся именно этот код всегда
                super.onLivingUpdate();
            }
        } catch (RuntimeException e) {}
    }

Я пытался полностью заменить метод и вызывать метод из суперкласса своим хуком, но это приводило к StackOverflow , наверное потому что оно вызвало метод не из суперкласса а из наследуемого, который вызывал мой хук и так по кругу.
 
7,099
324
1,510
GCEntityClientPlayerMP он что наследует?
 
7,099
324
1,510
Хорошая таска) Сейчас ее можно решить только перекопированием содержимого super.onLivingUpdateв хук и полной заменой метода
 
А как сделать чтоб в собранном варианте оно видело классы других модов? Я уже пробовал и в methods.bin добавлять деобфусцированное название метода и просто название метода в хуке заменять на деобфусцированное, но все-равно при запуске выдает такую ошибку:
Java:
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:debug:20]: [DEBUG] Injecting hooks into class micdoodle8.mods.galacticraft.core.entities.player.GCEntityClientPlayerMP
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:30]: [SEVERE] A problem has occurred during transformation of class micdoodle8.mods.galacticraft.core.entities.player.GCEntityClientPlayerMP.
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:30]: [SEVERE] Attached hooks:
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:30]: [SEVERE] AsmHook: micdoodle8.mods.galacticraft.core.entities.player.GCEntityClientPlayerMP#onLivingUpdate() -> ru.kreatifchk.improvements.Hooks#onLivingUpdate(Lmicdoodle8/mods/galacticraft/core/entities/player/GCEntityClientPlayerMP;)V, ReturnCondition=ALWAYS, ReturnValue=VOID, InjectorFactory: author.hooklib.asm.HookInjectorFactory$ByAnchor, CreateMethod = false
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:30]: [SEVERE] Stack trace:
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]: java.lang.NullPointerException
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at author.hooklib.asm.HookClassTransformer.transform(HookClassTransformer.java:51)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at author.hooklib.minecraft.MinecraftClassTransformer.transform(MinecraftClassTransformer.java:66)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.block.BlockFire.func_149843_e(BlockFire.java:99)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.init.Bootstrap.func_151354_b(Bootstrap.java:499)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.client.Minecraft.<init>(Minecraft.java:365)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.client.main.Main.main(SourceFile:123)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at java.lang.reflect.Method.invoke(Method.java:497)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
[19:27:31] [Client thread/INFO]: [author.hooklib.asm.HookLogger$SystemOutLogger:warning:25]: [WARNING] Can not find target method of hook AsmHook: micdoodle8.mods.galacticraft.core.entities.player.GCEntityClientPlayerMP#onLivingUpdate() -> ru.kreatifchk.improvements.Hooks#onLivingUpdate(Lmicdoodle8/mods/galacticraft/core/entities/player/GCEntityClientPlayerMP;)V, ReturnCondition=ALWAYS, ReturnValue=VOID, InjectorFactory: author.hooklib.asm.HookInjectorFactory$ByAnchor, CreateMethod = false
[19:27:31] [Client thread/ERROR]: Unable to launch
java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_51]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
Caused by: java.lang.NoClassDefFoundError: micdoodle8/mods/galacticraft/core/entities/player/GCEntityClientPlayerMP
    at net.minecraft.block.BlockFire.func_149843_e(BlockFire.java:99) ~[aqq.class:?]
    at net.minecraft.init.Bootstrap.func_151354_b(Bootstrap.java:499) ~[ni.class:?]
    at net.minecraft.client.Minecraft.<init>(Minecraft.java:365) ~[bib.class:?]
    at net.minecraft.client.main.Main.main(SourceFile:123) ~[Main.class:?]
    ... 6 more
Caused by: java.lang.ClassNotFoundException: micdoodle8.mods.galacticraft.core.entities.player.GCEntityClientPlayerMP
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191) ~[launchwrapper-1.12.jar:?]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_51]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_51]
    at net.minecraft.block.BlockFire.func_149843_e(BlockFire.java:99) ~[aqq.class:?]
    at net.minecraft.init.Bootstrap.func_151354_b(Bootstrap.java:499) ~[ni.class:?]
    at net.minecraft.client.Minecraft.<init>(Minecraft.java:365) ~[bib.class:?]
    at net.minecraft.client.main.Main.main(SourceFile:123) ~[Main.class:?]
    ... 6 more
Caused by: java.lang.NullPointerException
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:182) ~[launchwrapper-1.12.jar:?]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_51]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_51]
    at net.minecraft.block.BlockFire.func_149843_e(BlockFire.java:99) ~[aqq.class:?]
    at net.minecraft.init.Bootstrap.func_151354_b(Bootstrap.java:499) ~[ni.class:?]
    at net.minecraft.client.Minecraft.<init>(Minecraft.java:365) ~[bib.class:?]
    at net.minecraft.client.main.Main.main(SourceFile:123) ~[Main.class:?]
 
7,099
324
1,510
Вместе с крашем всегда хук скидывай. INSTEAD все еще не пашет, и хз ,когда починю, там проблема заключается в очистке стэка
 
Java:
    @Hook(at = @At(point = InjectionPoint.HEAD), returnCondition = ReturnCondition.ALWAYS)
    public static void onLivingUpdate(GCEntityClientPlayerMP gc) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException, SecurityException, NoSuchMethodException {
        boolean gravPlayer = !ServerPacketHandler.gravPlayer;
        //С сервера приходит пакет, когда EntityPlayer оказывается в определенной зоне
        
        if (gravPlayer) {
            ClientProxyCore.playerClientHandler.onLivingUpdatePre(gc);
        }
        LivingHook.onLivingUpdate(gc);
        //В данном классе скопированы методы onLivingUpdate из EntityPlayerSP, EntityPlayer и EntityLivingBase
        if (gravPlayer) {
            ClientProxyCore.playerClientHandler.onLivingUpdatePost(gc);
        }
        
        ServerPacketHandler.gravPlayer = false;
    }

Как я уже сказал в среде этот хук работает. Я бы предположил, что дело в обфускации, но судя по крашу оно не может даже целевой класс найти. Попробовал вставить в аннотацию мод зависимость:
Java:
dependencies = "required-after:micdoodlecore;required-after:galacticraftcore")
, но это не помогло.
 
7,099
324
1,510
Хм, а у мя все работало с другими модами

at author.hooklib.asm.HookClassTransformer.transform(HookClassTransformer.java:51)
У мя на этой строчке boolean java7 = majorVersion > 50; И там npe неоткуда взяться, пхд, у тя старая версия. Скинь че у тя на той строчке
 
Java:
int majorVersion = ((bytecode[6] & 0xFF) << 8) | (bytecode[7] & 0xFF);
А то, что ты написал у меня на 52. Странно, сейчас сверю с гитхабом.
 
Скачал заново, теперь выдает ту же ошибку, только на 50 строке. Выглядит она так:
Java:
 int majorVersion = ((bytecode[6] & 0xFF) << 8) | (bytecode[7] & 0xFF);
 
Сверху