Files
BiLauncher/doc/cpp/ModLoaderVersionService.md
T

71 lines
4.4 KiB
Markdown
Raw Permalink Normal View History

2026-09-03 09:16:56 +03:00
# ModLoaderVersionService
2026-10-11 22:32:13 +03:00
`modloaderversionservice.h`, `modloaderversionservice.cpp`
2026-09-03 09:16:56 +03:00
2026-10-11 22:32:13 +03:00
Списки версий Forge, Fabric, NeoForge и Quilt. Устроен так же, как
[VersionManifestService](VersionManifestService.md): качает, хранит копию в
`<root>/cache/loader_<ключ>.json` и отвечает из неё, пока она моложе 6 часов.
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
Экземпляр держит [LauncherBackend](LauncherBackend.md). [ModLoaderInstaller](ModLoaderInstaller.md)
берёт отсюда ссылку на `installer.jar` через `find()`.
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
**Fabric и Quilt** спрашиваются отдельно под каждую версию игры:
`meta.fabricmc.net/v2/versions/loader/<игра>` и `meta.quiltmc.org/v3/versions/loader/<игра>`.
Признак стабильности берётся из ответа, а если его нет, угадывается по имени.
2026-09-03 09:16:56 +03:00
2026-10-11 22:32:13 +03:00
**Forge** — один `maven-metadata.xml` на все версии игры. Строка `1.20.1-47.4.0` делится по первому
дефису. Параллельно запрашивается `promotions_slim.json`, оттуда берутся отметки recommended. Если
он не ответил, список всё равно сохраняется, только без отметок.
2026-09-03 09:16:56 +03:00
2026-10-11 22:32:13 +03:00
**NeoForge** тоже из `maven-metadata.xml`, но версия игры в номере не записана. Её приходится
выводить: `21.1.248` → `1.21.1`, `20.4.80` → `1.20.4`, `21.0.x` → `1.21`. Для четырёхчастных
номеров вроде `25.1.0.1` правило другое: `25.1.0.1` → `25.1`. Вторым запросом читается старый
репозиторий `net/neoforged/forge` с первыми сборками NeoForge под 1.20.1, которые выходили под
именем артефакта `forge` и номерами в стиле Forge.
2026-09-03 09:16:56 +03:00
2026-10-11 22:32:13 +03:00
Ссылка на установщик собирается по схеме maven:
`<репозиторий>/<версия>/<артефакт>-<версия>-installer.jar`.
2026-09-03 09:16:56 +03:00
2026-10-11 22:32:13 +03:00
Версии внутри каждой версии игры отсортированы от новых к старым. Числа сравниваются как числа,
поэтому `47.10` новее `47.9`.
2026-09-03 09:16:56 +03:00
2026-10-11 22:32:13 +03:00
## ensureLoaded(loader, gameVersion, callback, forceRefresh)
2026-09-03 09:16:56 +03:00
2026-10-11 22:32:13 +03:00
Логика та же, что у манифеста версий. Отличие в том, что свежесть у Fabric и Quilt считается для
каждой версии игры отдельно, а у Forge и NeoForge для модлоадера целиком. По этому же ключу
объединяются одновременные запросы.
2026-09-03 09:16:56 +03:00
2026-10-11 22:32:13 +03:00
- Пустая `gameVersion` — сразу `ok` и пустой список.
- При первом обращении к модлоадеру читается кэш, и если он есть, испускается
`versionsChanged(key, gameVersion)`.
- Если сеть не ответила, но какие-то данные по модлоадеру есть, колбэк получит `ok = true` и
`warning`.
- Если ответ не разобрался, хороший кэш не затирается.
2026-09-03 09:16:56 +03:00
2026-10-11 22:32:13 +03:00
`versionsChanged(loaderKey, gameVersion)` испускается после каждого успешного обновления.
`refreshingChanged()` — в начале и в конце запроса. `isRefreshing(loader, gameVersion)` отвечает,
идёт ли запрос по этому ключу.
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
```json
{
"fetchedAt": "...",
"games": {
"1.20.1": { "fetchedAt": "...", "entries": [ { "loaderVersion": "47.4.0", ... } ] }
}
}
2026-09-03 09:16:56 +03:00
```
2026-10-11 22:32:13 +03:00
Верхний `fetchedAt` используется для Forge и NeoForge, `fetchedAt` внутри версии игры — для Fabric и
Quilt.
2026-09-03 09:16:56 +03:00
---
При создании этого документа использовался ИИ.