2026-09-03 09:16:56 +03:00
|
|
|
|
# ModLoaderInstaller
|
|
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
`modloaderinstaller.h`, `modloaderinstaller.cpp`
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Ставит модлоадер в `.minecraft`. Fabric и Quilt ставятся иначе, чем Forge и NeoForge, но снаружи у
|
|
|
|
|
|
них одинаковый интерфейс.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
- **Fabric и Quilt** отдают готовое описание версии. Его достаточно положить в
|
|
|
|
|
|
`versions/<id>/<id>.json`, а остальное докачает [VersionInstaller](VersionInstaller.md).
|
|
|
|
|
|
- **Forge и NeoForge** при установке патчат клиентский jar, поэтому запускается их официальный
|
|
|
|
|
|
`installer.jar` без окна. После него проверяется, какой профиль появился в `versions/`.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Экземпляр держит [LauncherBackend](LauncherBackend.md). Геттеры прогресса устроены так же, как у
|
|
|
|
|
|
`VersionInstaller` (`label`, `stage`, `currentFile`, `bytesDone`, `bytesTotal`, `fraction`), и
|
|
|
|
|
|
панель загрузки читает их одинаково.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## install(gameDir, loader, gameVersion, loaderVersion, javaPreference)
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Если установка уже идёт или не указана версия, сразу приходит `failed`. Иначе:
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
1. Список версий модлоадера через [ModLoaderVersionService](ModLoaderVersionService.md).
|
|
|
|
|
|
2. **Базовая версия игры.** Если её нет или не хватает файлов, она ставится через
|
|
|
|
|
|
`VersionInstaller`, и ход идёт дальше только после её `finished`. Без целой ванильной версии
|
|
|
|
|
|
модлоадер ставить некуда.
|
|
|
|
|
|
3. Дальше один из двух путей.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
### Fabric и Quilt
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Описание скачивается из `meta.fabricmc.net/v2/versions/loader/<игра>/<лоадер>/profile/json`
|
|
|
|
|
|
(у Quilt `meta.quiltmc.org/v3/...`). Проверяется, что в нём есть безопасный `id` и что
|
|
|
|
|
|
`inheritsFrom` совпадает с выбранной версией игры. Файл сохраняется, и `VersionInstaller` получает
|
|
|
|
|
|
этот `id`.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
### Forge и NeoForge
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
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 минут процесс убивается.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
После успешного завершения новый профиль ищется как разница списков до и после. Угадывать имя по
|
|
|
|
|
|
строке нельзя: у Forge в разные годы оно составлялось по-разному. Если новых папок нет (установщик
|
|
|
|
|
|
переписал существующую), ищется профиль, который наследует базовую версию и содержит в имени версию
|
|
|
|
|
|
модлоадера. Если новых папок несколько, берётся та, где есть версия модлоадера.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Найденный профиль передаётся `VersionInstaller`, который докачивает библиотеки, не положенные
|
|
|
|
|
|
установщиком. Когда он отчитается, приходит `finished(loaderKey, gameVersion, loaderVersion,
|
|
|
|
|
|
producedVersionId)`. Бэкенд записывает `producedVersionId` в `resolvedVersionId` сборки.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
### Если установщик упал
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Все папки, которые он успел создать в `versions/`, удаляются. В текст ошибки идут код выхода,
|
|
|
|
|
|
хвост журнала и путь к полному журналу.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Если подменить zlib не удалось, а в журнале есть `Processor failed` или `invalid outputs`, к
|
|
|
|
|
|
сообщению добавляется прямая подсказка про zlib-ng. Почти наверняка дело в нём.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## cancel()
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Обрывает загрузку, убивает процесс установщика и удаляет то, что он создал. Если ход уже передан
|
|
|
|
|
|
`VersionInstaller`, отменяется и он, а `canceled` придёт после его отчёта.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Деструктор убивает процесс установщика, если тот ещё работает.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
При создании этого документа использовался ИИ.
|