Добавление в зависимости мода, имеющего строковые константы с обфусцированными именами

Версия Minecraft
1.12.2
API
Forge
7,166
329
1,544
Хочу добавить в воркспейс Geographicraft но в нем приколы с доступом к полям через рефлексию:
1728031782543.png
И в рантайме оно не находит этих полей в деобфусцированной среде.
fg.deobf не изменяет эти строковые константы, BON тоже.
Какие есть варианты нормально поставить это в среду?
 
Решение
Решил эту проблему следующим миксином:
Java:
@Mixin(Accessor.class)
public class GeographicraftAccessorFix {

    @Shadow
    String fieldName;


    @Inject(
            method = "setField(Ljava/lang/Class;)V",
            at = @At("HEAD")
    )
    public void deobfFieldName(Class classObject, CallbackInfo ci) {
        String internalClassName = FMLDeobfuscatingRemapper.INSTANCE.unmap(classObject.getName().replace('.', '/'));
        fieldName = FMLDeobfuscatingRemapper.INSTANCE.mapFieldName(internalClassName, fieldName, null);
    }
}
На самом деле тот код слегка лучше чем ReflectionHelper в аспекте того что он ищет поля во всех предках
Судя по отсутствию скриптов сборки в репозитории автора, он пишет код в блокноте и компилирует каждый файл в командной строке. Ему не знать что такое «среда разработки», если он об этом не позаботился об этом чисто даже для себя. Изобрёл какой-то очень странный и плохой велосипед, который хуже ReflectionHelper где эта проблема решена через перечисление всех возможных имён.

BON ничего изменять не должен. Для него это просто какая-то там строка. Для работы с обфой надо ещё понять к какому классу относится упоминаемая строка.
 
Решил эту проблему следующим миксином:
Java:
@Mixin(Accessor.class)
public class GeographicraftAccessorFix {

    @Shadow
    String fieldName;


    @Inject(
            method = "setField(Ljava/lang/Class;)V",
            at = @At("HEAD")
    )
    public void deobfFieldName(Class classObject, CallbackInfo ci) {
        String internalClassName = FMLDeobfuscatingRemapper.INSTANCE.unmap(classObject.getName().replace('.', '/'));
        fieldName = FMLDeobfuscatingRemapper.INSTANCE.mapFieldName(internalClassName, fieldName, null);
    }
}
На самом деле тот код слегка лучше чем ReflectionHelper в аспекте того что он ищет поля во всех предках
 
Назад
Сверху