[Гайд][Легко][1.6+] Модификация чужого кода при запуске (трансфомеры)

1,200
37
237
Так а менеджмент этого всего? Да и имя архива ставить для очереди загрузки бред я считаю
 

tox1cozZ

aka Agravaine
8,454
598
2,890
А какой менеджмент-то? В конфиге проверять булев для нужного фикса и регать хук контейнер только если он тру.
Я уже говорил что можно в манифесте указать хуклибу в ClassPath и она загрузится раньше.
 
1,200
37
237
Я хочу прям как у форджей, чтобы краш и писало о дубликатах и прочих недостающих зависимостях (и не делать это внутри каждого хука с зависимостями), ну и описания для самих хуков.
 
7,099
324
1,509
Не надо пытаться написать что-то вроде registerHookContainer(MyHooks.class.getName()). Это тоже вызовет загрузку класса с хуками раньше чем надо.
Возможно, нашел ошибку:
Java:
public PrimaryClassTransformer() {
    this.classMetadataReader = MainHookLoader.getDeobfuscationMetadataReader();

    if (instance != null) {
        // переносим хуки, которые уже успели нарегистрировать
        this.hooksMap.putAll(PrimaryClassTransformer.instance.getHooksMap());
        PrimaryClassTransformer.instance.getHooksMap().clear();
    } else {
        registerHookContainer(SecondaryTransformerHook.class.getName());
    }
    instance = this;
}
registerHookContainer(SecondaryTransformerHook.class.getName());
Разве обращение к классу хук-контейнера при регистрации не вызовет его загрузку и загрузку классов к которым он обращается, тем самым опередив применение хука из этого контейнера?
 
7,099
324
1,509
Сделал в ExampleHookLoader так же - оно прекрасно загрузилось
registerHookContainer(AnnotationHooks.class.getName());
 
5,018
47
783
10 лукасов и я портану вашу хук либу на новые версии
она на них как бы и без тебя работает)))
P.S У меня тут почему то создание метода не работает. Всегда работало, а теперь нет:

Java:
@Hook(returnCondition = ReturnCondition.ON_TRUE)
    public static void init(BlockPlanks bg) {
        bg.setTickRandomly(true);
        System.out.println("hjf");
    }
    @Hook(createMethod = true)
    public static void updateTick(BlockPlanks bg, World world, BlockPos pos, IBlockState state, Random rand)
    {
        System.out.println("hjf");
          if (!world.isRemote)
            {
              for(EnumFacing f :  EnumFacing.HORIZONTALS) {
              if(world.getBlockState(pos.offset(f)).getMaterial() == Material.WATER) {
                  switch(state.getValue(BlockPlanks.VARIANT)) {
                  case OAK:
                      world.setBlockState(pos, RegBlocks.ROTTING_PLANKS.getDefaultState().withProperty(RottenPlanks.VARIANT, RottenPlanks.EnumType.ROTTEN_OAK));
                      default:
                      break;
                  case SPRUCE:
                      world.setBlockState(pos, RegBlocks.ROTTING_PLANKS.getDefaultState().withProperty(RottenPlanks.VARIANT, RottenPlanks.EnumType.ROTTEN_SPRUCE));
                      break;
                  case BIRCH:
                      world.setBlockState(pos, RegBlocks.ROTTING_PLANKS.getDefaultState().withProperty(RottenPlanks.VARIANT, RottenPlanks.EnumType.ROTTEN_BIRCH));
                      break;
                  case JUNGLE:
                      world.setBlockState(pos, RegBlocks.ROTTING_PLANKS.getDefaultState().withProperty(RottenPlanks.VARIANT, RottenPlanks.EnumType.ROTTEN_JUNGLE));
                      break;
                  case ACACIA: 
                      world.setBlockState(pos, RegBlocks.ROTTING_PLANKS.getDefaultState().withProperty(RottenPlanks.VARIANT, RottenPlanks.EnumType.ROTTEN_ACACIA));
                      break;
                  case DARK_OAK: 
                      world.setBlockState(pos, RegBlocks.ROTTING_PLANKS.getDefaultState().withProperty(RottenPlanks.VARIANT, RottenPlanks.EnumType.ROTTEN_DARK_OAK));
                      break;
                  
                  }
                  
        
              }
              }
            }
    }
 
5,018
47
783
7,099
324
1,509
1,111
47
420
А,я то про 1.12 подумал. 1.13 ваще не версия, и не надо ниче обновлять под нее, ящетаю
Ну как мы видим портировать и не будем.
За все время всего 8 лукасов, 2 из которых можно поставить под сомнения.
А учитывая, что я сюда приперся по велению фолкена, тут совершенно без шансов.

А еще муны зашкварились.
 
5,018
47
783
При попытке проверить хук из примера вылетает NPE.
Версия: 1.12.2
Лог:

Код:
[16:47:49] [Server thread/INFO] [STDOUT]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:debug:20]: [DEBUG] Injecting hooks into class net.minecraftforge.common.ForgeHooks
[16:47:49] [Server thread/INFO] [STDOUT]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:30]: [SEVERE] A problem has occurred during transformation of class net.minecraftforge.common.ForgeHooks.
[16:47:49] [Server thread/INFO] [STDOUT]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:30]: [SEVERE] Attached hooks:
[16:47:49] [Server thread/INFO] [STDOUT]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:30]: [SEVERE] AsmHook: net.minecraftforge.common.ForgeHooks#getTotalArmorValue(Lnet/minecraft/entity/player/EntityPlayer;)I -> ru.allformine.afmuf.hooks.AFMHookContainer#getTotalArmorValue(Lnet/minecraftforge/common/ForgeHooks;Lnet/minecraft/entity/player/EntityPlayer;I)I, ReturnCondition=ALWAYS, ReturnValue=HOOK_RETURN_VALUE, InjectorFactory: gloomyfolken.hooklib.asm.HookInjectorFactory$MethodExit, CreateMethod = false
[16:47:49] [Server thread/INFO] [STDOUT]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:30]: [SEVERE] Stack trace:
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]: java.lang.NullPointerException
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at gloomyfolken.hooklib.minecraft.MinecraftClassTransformer$1.isTargetMethod(MinecraftClassTransformer.java:94)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at gloomyfolken.hooklib.asm.HookInjectorClassVisitor.visitMethod(HookInjectorClassVisitor.java:38)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at org.objectweb.asm.ClassReader.b(Unknown Source)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at org.objectweb.asm.ClassReader.accept(Unknown Source)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at org.objectweb.asm.ClassReader.accept(Unknown Source)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at gloomyfolken.hooklib.asm.HookClassTransformer.transform(HookClassTransformer.java:57)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at gloomyfolken.hooklib.minecraft.MinecraftClassTransformer.transform(MinecraftClassTransformer.java:81)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraftforge.common.MinecraftForge.initialize(MinecraftForge.java:93)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraftforge.fml.common.FMLCommonHandler.beginLoading(FMLCommonHandler.java:160)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraftforge.fml.server.FMLServerHandler.<init>(FMLServerHandler.java:86)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraftforge.fml.server.FMLServerHandler.<clinit>(FMLServerHandler.java:77)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.java:332)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:125)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:486)
[16:47:49] [Server thread/INFO] [STDERR]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:severe:36]:     at java.lang.Thread.run(Thread.java:748)
[16:47:49] [Server thread/INFO] [STDOUT]: [gloomyfolken.hooklib.asm.HookLogger$SystemOutLogger:warning:25]: [WARNING] Can not find target method of hook AsmHook: net.minecraftforge.common.ForgeHooks#getTotalArmorValue(Lnet/minecraft/entity/player/EntityPlayer;)I -> ru.allformine.afmuf.hooks.AFMHookContainer#getTotalArmorValue(Lnet/minecraftforge/common/ForgeHooks;Lnet/minecraft/entity/player/EntityPlayer;I)I, ReturnCondition=ALWAYS, ReturnValue=HOOK_RETURN_VALUE, InjectorFactory: gloomyfolken.hooklib.asm.HookInjectorFactory$MethodExit, CreateMethod = false
Хук:

Java:
    @Hook(injectOnExit = true, returnCondition = ReturnCondition.ALWAYS)
    public static int getTotalArmorValue(ForgeHooks fh, EntityPlayer player, @Hook.ReturnValue int returnValue) {
        return returnValue / 2;
    }
 
Последнее редактирование:
7,099
324
1,509
В среде или в собранном моде? Если второе - проверь methods.bin

at gloomyfolken.hooklib.minecraft.MinecraftClassTransformer$1.isTargetMethod(MinecraftClassTransformer.java:94)
Покажи че там, в репе строчки не совпадают
 
Похоже, неправильно прочитал гайд и зря переименовал methods.bin. Теперь все нормально. Спасибо.
 
Последнее редактирование:
10
0
Помогите!Хуки в собранном моде не работают, methods.bin в файл (mod.jar/methods.bin) запаковал, когда я попытался methods.bin сгенерировать для своей версии, не работает.Может надо свою хуклибу в jar запихать, но как?
 
477
7
51
Как у травы убрать бокс? чтобы предметы которые в траве можно было наводиться на них
 
7,099
324
1,509
Хукнуть getBoundingBox(или как там называется этот метод, сам уточни) и верни из него нулевой AABB, как у воздуха, например
 
Сверху