Files
BiLauncher/doc/cpp/ModLoaderInstaller.md
T
2026-10-11 22:32:13 +03:00

79 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ModLoaderInstaller
`modloaderinstaller.h`, `modloaderinstaller.cpp`
Ставит модлоадер в `.minecraft`. Fabric и Quilt ставятся иначе, чем Forge и NeoForge, но снаружи у
них одинаковый интерфейс.
- **Fabric и Quilt** отдают готовое описание версии. Его достаточно положить в
`versions/<id>/<id>.json`, а остальное докачает [VersionInstaller](VersionInstaller.md).
- **Forge и NeoForge** при установке патчат клиентский jar, поэтому запускается их официальный
`installer.jar` без окна. После него проверяется, какой профиль появился в `versions/`.
Экземпляр держит [LauncherBackend](LauncherBackend.md). Геттеры прогресса устроены так же, как у
`VersionInstaller` (`label`, `stage`, `currentFile`, `bytesDone`, `bytesTotal`, `fraction`), и
панель загрузки читает их одинаково.
## install(gameDir, loader, gameVersion, loaderVersion, javaPreference)
Если установка уже идёт или не указана версия, сразу приходит `failed`. Иначе:
1. Список версий модлоадера через [ModLoaderVersionService](ModLoaderVersionService.md).
2. **Базовая версия игры.** Если её нет или не хватает файлов, она ставится через
`VersionInstaller`, и ход идёт дальше только после её `finished`. Без целой ванильной версии
модлоадер ставить некуда.
3. Дальше один из двух путей.
### Fabric и Quilt
Описание скачивается из `meta.fabricmc.net/v2/versions/loader/<игра>/<лоадер>/profile/json`
(у Quilt `meta.quiltmc.org/v3/...`). Проверяется, что в нём есть безопасный `id` и что
`inheritsFrom` совпадает с выбранной версией игры. Файл сохраняется, и `VersionInstaller` получает
этот `id`.
### Forge и NeoForge
1. Ссылка на установщик берётся из записи `ModLoaderVersionService::find()`. Если записи нет,
значит, эта пара версий несовместима. Установщик качается в
`<root>/cache/loaders/<ключ>-<версия>-installer.jar`.
2. Если в `.minecraft` нет `launcher_profiles.json`, создаётся заглушка. Без неё установщик
отказывается работать: он считает, что официальный лаунчер не установлен.
3. Java берётся через `JavaLocator::select()` по `javaMajor` базовой версии. `javaPreference` — это
та же Java, что выбрана для игры.
4. Запоминается список профилей в `versions/`.
5. Запуск: `java -jar installer.jar --installClient <gameDir>`. Рабочий каталог — папка загрузок
модлоадеров. На Linux в окружение процесса подставляется эталонный zlib (см.
[zlibreference.h](zlibreference.md)).
6. Вывод установщика построчно уходит в `log(line)`, бэкенд показывает его в журнале. Полностью он
пишется в `<root>/cache/loaders/<ключ>-<версия>-install.log`, а последние 12 строк хранятся в
памяти для текста ошибки.
7. Через 15 минут процесс убивается.
После успешного завершения новый профиль ищется как разница списков до и после. Угадывать имя по
строке нельзя: у Forge в разные годы оно составлялось по-разному. Если новых папок нет (установщик
переписал существующую), ищется профиль, который наследует базовую версию и содержит в имени версию
модлоадера. Если новых папок несколько, берётся та, где есть версия модлоадера.
Найденный профиль передаётся `VersionInstaller`, который докачивает библиотеки, не положенные
установщиком. Когда он отчитается, приходит `finished(loaderKey, gameVersion, loaderVersion,
producedVersionId)`. Бэкенд записывает `producedVersionId` в `resolvedVersionId` сборки.
### Если установщик упал
Все папки, которые он успел создать в `versions/`, удаляются. В текст ошибки идут код выхода,
хвост журнала и путь к полному журналу.
Если подменить zlib не удалось, а в журнале есть `Processor failed` или `invalid outputs`, к
сообщению добавляется прямая подсказка про zlib-ng. Почти наверняка дело в нём.
## cancel()
Обрывает загрузку, убивает процесс установщика и удаляет то, что он создал. Если ход уже передан
`VersionInstaller`, отменяется и он, а `canceled` придёт после его отчёта.
Деструктор убивает процесс установщика, если тот ещё работает.
---
При создании этого документа использовался ИИ.