Ошибка при использовании MCP и CodeChickenLib

Версия Minecraft
1.12.2
355
2
17
Добро, при изменении классов майна через MCP и использовании CodeChickenLib вылетает такая вот ошибка:

Java:
[15:03:40] [main/ERROR] [FML]: Exception caught during firing event net.minecraftforge.client.event.TextureStitchEvent$Pre@1609a3ed:
java.lang.RuntimeException: java.lang.NullPointerException
    at codechicken.lib.reflect.ReflectionManager.getField(ReflectionManager.java:237) ~[ReflectionManager.class:?]
    at codechicken.lib.model.loader.blockstate.CCBlockStateLoader.grabLoader(CCBlockStateLoader.java:238) ~[CCBlockStateLoader.class:?]
    at codechicken.lib.model.loader.blockstate.CCBlockStateLoader.onTextureStitchPre(CCBlockStateLoader.java:124) ~[CCBlockStateLoader.class:?]
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_84_CCBlockStateLoader_onTextureStitchPre_Pre.invoke(.dynamic) ~[?:?]
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90) ~[ASMEventHandler.class:2.8.1]
    at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182) [EventBus.class:2.8.1]
    at net.minecraftforge.client.ForgeHooksClient.onTextureStitchedPre(ForgeHooksClient.java:211) [ForgeHooksClient.class:2.8.1]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_25]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_25]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_25]
    at java.lang.reflect.Method.invoke(Method.java:483) ~[?:1.8.0_25]
    at Reflector.callVoid(Reflector.java:636) [Reflector.class:?]
    at net.minecraft.client.renderer.texture.TextureMap.func_174943_a(TextureMap.java:139) [cdp.class:?]
    at net.minecraft.client.renderer.block.model.ModelBakery.func_177572_j(ModelBakery.java:913) [cgb.class:?]
    at net.minecraft.client.renderer.block.model.ModelBakery.func_177570_a(ModelBakery.java:95) [cgb.class:?]
    at net.minecraft.client.renderer.block.model.ModelManager.func_110549_a(ModelManager.java:27) [cgc.class:?]
    at net.minecraft.client.resources.SimpleReloadableResourceManager.func_110542_a(SimpleReloadableResourceManager.java:121) [cev.class:?]
    at net.minecraft.client.Minecraft.func_71384_a(Minecraft.java:559) [bib.class:?]
    at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:421) [bib.class:?]
    at net.minecraft.client.main.Main.main(Main.java:154) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_25]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_25]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_25]
    at java.lang.reflect.Method.invoke(Method.java:483) ~[?:1.8.0_25]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [minecraft.jar:2.8.1]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [minecraft.jar:2.8.1]
Caused by: java.lang.NullPointerException
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:57) ~[?:1.8.0_25]
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) ~[?:1.8.0_25]
    at java.lang.reflect.Field.get(Field.java:387) ~[?:1.8.0_25]
    at codechicken.lib.reflect.ReflectionManager.getField(ReflectionManager.java:235) ~[ReflectionManager.class:?]
    ... 25 more

По сути я добавлю одно статическое поле в ModelManager, сталкивался может кто с таким? Может эти поля помечать как-то нужно для этой либы, чтобы она их не трогала?

UPD:
Чет какая-то дичь, даже если ничего не менять в этом файле и закидывать такой же из MCP (Меняются лишь локальный названия переменных), то уже вызывает эту же ошибку, которая вообще никак не связанна с файлом.
Рабочий файл выглядит так, рекомпелированный из MCP точно также, только вместо снеговиков нормальные названия.
Неужели снеговики как-то роляют? че?
1582469475800.png
 
Последнее редактирование:
Решение
Хуки с якорями

tox1cozZ

aka Agravaine
8,455
598
2,892
Я же сказал про хуки, а не АТ.
 
7,099
324
1,510
Хуки с якорями
 
355
2
17
Такс, подгрузил либу с якорями + добавил еще правки которые в конце статьи. В общем, если хукать по примеру ресайза и урона от падения, то хук работает и дебаг выводит. Но если пробовать выдрать локальное поле, то попросту ничего не происходит, дебаг не выводит.


Java:
    @Hook(at = @At(point = InjectionPoint.VAR_ASSIGNMENT, targetVar = 0, ordinal = 0))
    @SideOnly(Side.CLIENT)
    public static ModelBakery onResourceManagerReload(ModelManager modelManager, IResourceManager resourceManager,  @Hook.LocalVariable(0) ModelBakery value)
    {
        Logger.info(" Instance " + value);
        return value;
    }

А если без анотаций, вот так, то вылетает краш.

Java:
    @Hook
    @SideOnly(Side.CLIENT)
    public static void onResourceManagerReload(ModelManager modelManager, IResourceManager resourceManager, @Hook.LocalVariable(0) ModelBakery value)
    {
        Logger.info(" Instance " + value);
    }


Java:
java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    net/minecraft/client/renderer/block/model/ModelManager.onResourceManagerReload(Lnet/minecraft/client/resources/IResourceManager;)V @3: invokestatic
  Reason:
    Type 'net/minecraft/client/renderer/block/model/ModelManager' (current frame, stack[2]) is not assignable to 'net/minecraft/client/renderer/block/model/ModelBakery'
  Current Frame:
    bci: @3
    flags: { }
    locals: { 'net/minecraft/client/renderer/block/model/ModelManager', 'net/minecraft/client/resources/IResourceManager' }
    stack: { 'net/minecraft/client/renderer/block/model/ModelManager', 'net/minecraft/client/resources/IResourceManager', 'net/minecraft/client/renderer/block/model/ModelManager' }
  Bytecode:
    0x0000000: 2a2b 2ab8 002a bb00 2c59 2b2a b400 192a
    0x0000010: b400 20b7 002f 4d2a 2cb6 0033 b500 352a
    0x0000020: 2ab4 0035 b200 39b9 003f 0200 c000 41b5
    0x0000030: 0043 2ab4 0020 b600 462c b300 48b1

Что делаю не так? Единственное что пока приходит в голову как решение, открыть все поля в этом классе и переопределить этот метод в простом хуке.
 
Последнее редактирование:
7,099
324
1,510
355
2
17
Т.е. такой же хук на обычной хуклибе работает, а на якорной нет?
Ну вот так вот работает:
Java:
    @Hook
    @SideOnly(Side.CLIENT)
    public static void onResourceManagerReload(ModelManager modelManager, IResourceManager resourceManager)
    {
        Logger.info(" It's work! " );
    }

А вот если добавить аргумент с получением поля, уже не работает.

Java:
    @Hook
    @SideOnly(Side.CLIENT)
    public static void onResourceManagerReload(ModelManager modelManager, IResourceManager resourceManager, @Hook.LocalVariable(0) int var)
    {
        Logger.info(" Isn't work! " );
    }

Java:
java.lang.VerifyError: Bad local variable type
Exception Details:
  Location:
    net/minecraft/client/renderer/block/model/ModelManager.onResourceManagerReload(Lnet/minecraft/client/resources/IResourceManager;)V @2: iload_0
  Reason:
    Type 'net/minecraft/client/renderer/block/model/ModelManager' (current frame, locals[0]) is not assignable to integer
  Current Frame:
    bci: @2
    flags: { }
    locals: { 'net/minecraft/client/renderer/block/model/ModelManager', 'net/minecraft/client/resources/IResourceManager' }
    stack: { 'net/minecraft/client/renderer/block/model/ModelManager', 'net/minecraft/client/resources/IResourceManager' }
  Bytecode:
    0x0000000: 2a2b 1ab8 002a bb00 2c59 2b2a b400 192a
    0x0000010: b400 20b7 002f 4d2a 2cb6 0033 b500 352a
    0x0000020: 2ab4 0035 b200 39b9 003f 0200 c000 41b5
    0x0000030: 0043 2ab4 0020 b600 462c b300 48b1
Java:


В принципе оно понятно, я вызываю локальное поле 0, и попадаю в ALOAD, где-то сюда получается:
1582532449848.png
Сложна, ни пАнятна, слоооожна.
 
7,099
324
1,510
Переменная 0 - это this, это первый аргумент.
Попробуй использовать VariableIdHelper
 
355
2
17
Java:
[Client thread/INFO] [STDOUT]: [gloomyfolken.hooklib.asm.VariableIdHelper:printLocalVariables:53]: 0: net.minecraft.client.renderer.block.model.ModelManager this
[Client thread/INFO] [STDOUT]: [gloomyfolken.hooklib.asm.VariableIdHelper:printLocalVariables:53]: 1: net.minecraft.client.resources.IResourceManager resourceManager
[Client thread/INFO] [STDOUT]: [gloomyfolken.hooklib.asm.VariableIdHelper:printLocalVariables:53]: 2: net.minecraft.client.renderer.block.model.ModelBakery modelbakery
 
Последнее редактирование:
355
2
17
Ну там погода не меняется, проверял. Вот как выглядит ошибка если указывать нормальный тип:

Java:
    @Hook
    @SideOnly(Side.CLIENT)
    public static void onResourceManagerReload(ModelManager modelManager, IResourceManager resourceManager, @Hook.LocalVariable(2) ModelBakery modelBakery)
    {
        Logger.info(" Isn't work! " + modelBakery);
    }


Java:
java.lang.VerifyError: Bad local variable type
Exception Details:
  Location:
    net/minecraft/client/renderer/block/model/ModelManager.onResourceManagerReload(Lnet/minecraft/client/resources/IResourceManager;)V @2: aload_2
  Reason:
    Type top (current frame, locals[2]) is not assignable to reference type
  Current Frame:
    bci: @2
    flags: { }
    locals: { 'net/minecraft/client/renderer/block/model/ModelManager', 'net/minecraft/client/resources/IResourceManager' }
    stack: { 'net/minecraft/client/renderer/block/model/ModelManager', 'net/minecraft/client/resources/IResourceManager' }
  Bytecode:
    0x0000000: 2a2b 2cb8 002a bb00 2c59 2b2a b400 192a
    0x0000010: b400 20b7 002f 4d2a 2cb6 0033 b500 352a
    0x0000020: 2ab4 0035 b200 39b9 003f 0200 c000 41b5
    0x0000030: 0043 2ab4 0020 b600 462c b300 48b1
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Хук нужно в конец метода вставлять или после это переменной, у тебя же вставляется в самый верх метода и естественно никакие локальные переменные ещё не объявлены.
 
355
2
17
Хук нужно в конец метода вставлять или после это переменной, у тебя же вставляется в самый верх метода и естественно никакие локальные переменные ещё не объявлены.
Воо, добавил @At(point = InjectionPoint.RETURN) и завелось
 
Последнее редактирование:
Сверху