Forge и liteloader

Версия Minecraft
1.12.2
API
Forge
4
0
Появилась необходимость создать мод на Forge, который будет взаимодействовать с модом на Liteloader.
Решил начать с того, чтобы подключить liteloader и проверить, будет ли с ним запускаться клиент для разработки. Судя по сайту разработчика, liteloader можно установить как обычный мод для Forge, положив его в папку "mods". Эту операцию я проделал с обычным майнкрафтом. Использовал последнюю версию Forge для 1.12.2 (14.23.5.2855). Всё отлично работает - майнкрафт загружается, Liteloader работает.
Перешёл в клиент для разработки. Версия Forge та же (последняя, 14.23.5.2855). Подключил мод так, как обычно подключаются зависимые моды (если нет необходимости взаимодействовать с ними в коде):
Gradle (Groovy):
repositories {
    maven {
        name = 'mumfrey'
        url = 'http://repo.mumfrey.com/content/repositories/public'
    }
}

dependencies {
    runtimeOnly fg.deobf('com.mumfrey:liteloader:1.12.2-SNAPSHOT:release')
}

Мод не загрузился с сообщением о том, что в файле нет файла mcmod.info:
Код:
[13:50:15] [Client thread/DEBUG] [FML]: Examining file liteloader-1.12.2-SNAPSHOT_mapped_snapshot_20171003-1.12-release.jar for potential mods
[13:50:15] [Client thread/DEBUG] [FML]: The mod container liteloader-1.12.2-SNAPSHOT_mapped_snapshot_20171003-1.12-release.jar appears to be missing an mcmod.info file

Этого файла действительно в моде нет. Что же, решил добавить его вручную - использовал локальный репозиторий Gradle, отредактировал архив. Сообщение о том, что файла нет, пропало, однако на результат это никак не повлияло: майнкрафт всё равно запустился без Liteloader'а.

Как решить эту проблему? На том же сайте разработчика сказано, что в случае загрузки Liteloader'а другим модлоадером, он загружается благодаря некому "TweakClass" (что бы это ни значило). Может, необходимо подключить его каким-то другим образом? Надеюсь на помощь)
 
Это в некотором роде помогло - лайтлоадер начал загружаться. Но бросаются исключения, по всей видимости как-то связанные с миксинами. Лог: Forge+lightloader log - Pastebin.com. Начиная с 589 строки пишет, что не может найти классы. Дальше идут исключения.
 
Так, ну тут становится понятно, что :release версия не подойдет, ибо названия классов в миксинах и прочие вещи не деобфуцировались...
Попробуй поискать какую-нибудь :dev версию, либо пойти на совсем крайние меры (которые пришли мне в голову):
1. Создать чистый проект с LiteLoader с помощью плагина для Idea "Minecraft Dev".
2. Скомпилить тестовый проект и вручную вытащить зависимость либы LiteLoader оттуда.

Но лучше конечно поискать что-то типа :dev версии на мавене и скинуть сюда ссылку на нее, если получится
 
Dev версии видимо нет. Есть версия, в которой не встроены зависимости по миксинам (org.spongepowered. ...). Если использовать её и подключить зависимость через gradle (compile 'org.spongepowered:mixin:0.7.5-SNAPSHOT'), то исчезают ошибки по тиу @Mixin target pl was not found mixins.liteloader.core.json:MixinPlayerList, однако исключение всё равно бросается.
Исключение имеет следующий вид:
Код:
[19:11:01] [main/FATAL] [mixin]: Mixin apply failed mixins.liteloader.client.json:MixinMinecraft -> net.minecraft.client.Minecraft: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException @Inject annotation on handler$init$zzf000 could not find any targets matching 'func_71384_a' in the target class net.minecraft.client.Minecraft. Using refmap mixins.liteloader.client.refmap.json
org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: @Inject annotation on handler$init$zzf000 could not find any targets matching 'func_71384_a' in the target class net.minecraft.client.Minecraft. Using refmap mixins.liteloader.client.refmap.json
    at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.findMethods(InjectionInfo.java:421) ~[mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.readAnnotation(InjectionInfo.java:172) ~[mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:159) ~[mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:151) ~[mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.injection.struct.CallbackInjectionInfo.<init>(CallbackInjectionInfo.java:44) ~[mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:480) ~[mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.transformer.MixinTargetContext.prepareInjections(MixinTargetContext.java:1179) ~[mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.prepareInjections(MixinApplicatorStandard.java:900) ~[mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMixin(MixinApplicatorStandard.java:304) ~[mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:267) ~[mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:353) ~[mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.transformer.MixinTransformer.apply(MixinTransformer.java:724) [mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.transformer.MixinTransformer.applyMixins(MixinTransformer.java:703) [mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:509) [mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at org.spongepowered.asm.mixin.transformer.Proxy.transform(Proxy.java:72) [mixin-0.7.5-SNAPSHOT.jar:0.7.5-SNAPSHOT+unknown-b0.git-unknown]
    at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176) [launchwrapper-1.12.jar:?]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418) [?:1.8.0_281]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351) [?:1.8.0_281]
    at net.minecraft.client.main.Main.main(Main.java:42) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_281]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_281]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_281]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_281]
    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:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_281]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_281]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_281]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_281]
    at net.minecraftforge.legacydev.Main.start(Main.java:86) [legacydev-0.2.3.1-fatjar.jar:0.2.3.1+4+372be23]
    at net.minecraftforge.legacydev.MainClient.main(MainClient.java:29) [legacydev-0.2.3.1-fatjar.jar:0.2.3.1+4+372be23]

Я не очень понимаю, почему название поля обфусцировано. Если смотреть в подключаемый jar-файл через декомпилятор идеи, там все поля имеют нормальные названия. (Отрывок из кода класса, из-за которого бросается исключение, под спойлером)

Java:
    @Inject(
        method = {"init()V"},
        at = {@At(
    value = "NEW",
    target = "net/minecraft/client/renderer/EntityRenderer"
)}
    )
    private void init(CallbackInfo ci) {
        LiteLoaderTweaker.init();
        LiteLoaderTweaker.postInit();
    }

    @Inject(
        method = {"init()V"},
        at = {@At(
    value = "NEW",
    target = "net/minecraft/client/renderer/texture/TextureMap"
)}
    )
    private void initTextures(CallbackInfo ci) {
        LoadingBar.initTextures();
    }

    @Inject(
        method = {"init()V"},
        at = {@At("INVOKE")}
    )
    private void progress(CallbackInfo ci) {
        LoadingBar.incrementProgress();
    }

    @Inject(
        method = {"init()V"},
        at = {@At("RETURN")}
    )
    private void onStartupComplete(CallbackInfo ci) {
        this.broker = LiteLoaderEventBrokerClient.getInstance();
        if (this.broker == null) {
            throw new RuntimeException("LiteLoader failed to start up properly. The game is in an unstable state and must shut down now. Check the developer log for startup errors");
        } else {
            this.broker.onStartupComplete();
        }
    }

    @Inject(
        method = {"updateFramebufferSize()V"},
        at = {@At("HEAD")}
    )
    private void onResize(CallbackInfo ci) {
        if (this.broker != null) {
            this.broker.onResize((Minecraft)this);
        }

    }
 
А эту новую версию через fg.deobf() ты прогнал? В идее они отображаются нормально, потому что мавеном приложены исходники source.jar (если их убрать и посмотреть декомпилированную версию, будут именно func_abcd().
Получается остается пока что второй предложенный вариант. Он даст тебе нормальную деобфуцированную версию лайтлоадера под твои маппинги, но подключать ее придется как сторонний файловый джарник.
Вот build файл, который нагенерировал мне плагин, с которого я в дальнейшем вытащил либу лайтлоадера. Не забудьте подставить нужные маппинги и провернуть setupDevWorkspace.
build.gradle:
buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
        maven {
            name = "sonatype"
            url = "https://oss.sonatype.org/content/repositories/snapshots/"
        }
        maven {
            name = "forge"
            url = "https://files.minecraftforge.net/maven"
        }
        maven {
            name = 'sponge'
            url = 'https://repo.spongepowered.org/maven'
        }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT'
        classpath 'org.spongepowered:mixingradle:0.4-SNAPSHOT'
    }
}

apply plugin: 'net.minecraftforge.gradle.liteloader'
apply plugin: 'org.spongepowered.mixin'

group = 'g'
version = '1.0-SNAPSHOT'
archivesBaseName = 'spirit'

minecraft {
    version = '1.12'
    mappings = 'stable_39'
    runDir = "run"
}

mixin {
    defaultObfuscationEnv notch
}

jar {
    from litemod.outputs
}
v
 
Последнее редактирование:
А как именно нужно "вытащить" лайтлоадер? Возможно я что-то не так делаю. Проект создал, поставил нужный маппинг. Потом запустил setupDevWorkspace. Потом build. Взял этот jar (скрин под спойлером). Эффект тот же. Может не из того места jar взял?
Безымянный.png
 
он не дает форжу с лайтом соединить вместе
??
сам майндев? Я к тому, что мы же пишем всякое для того-же ведра(мост vault, например) почему бы не использовать этот принцип?
 
Мы примерно этим и занимаемся, только автор вылезая из кожи вон хочет, проводя аналогию с баккитом, запустить саму имплементацию баккита (одновременно с форжем) в среде разработки и чтобы все работало, как в продакшн среде.
Я тут уже не знаю чего посоветовать, раз последний вариант не сработал. У тебя в принципе есть API лайтлоадера и все необходимые вещи, чтобы скомпилировать мод. Проверять работоспособность в крайнем случае можно на продакшн версии.
По крайней мере, я всегда так делал, пытаясь связать мод с тем же баккитом.
 
Проверять работоспособность в крайнем случае можно на продакшн версии.
По крайней мере, я всегда так делал, пытаясь связать мод с тем же баккитом.
Ну, а по другому и не получится.
 
Назад
Сверху