tests / package-smoke-linux (push) Skipped
tests / package-smoke-windows (push) Skipped
tests / package-smoke-macos (push) Skipped
tests / macos (push) Successful in 1m20s
tests / linux (push) Successful in 2m14s
tests / windows (push) Failing after 23m21s
version number Signed-off-by: galeon <dertiellis@gmail.com>
58 lines
3.7 KiB
Markdown
58 lines
3.7 KiB
Markdown
# gamedirimport.h
|
||
|
||
`gamedirimport.h`, `gamedirimport.cpp`
|
||
|
||
Пространство имён `GameDirImport`: что уже лежит в папке игры, когда лаунчер запускают впервые.
|
||
Состояния нет, сеть не нужна, файлы только читаются. Вызывает его
|
||
[LauncherBackend](LauncherBackend.md) при первом запуске, решение описано в
|
||
[ADR-0001](../adr/0001-import-existing-minecraft.md).
|
||
|
||
## detect(gameDir)
|
||
|
||
Возвращает `std::optional<Detected>`: `minecraftVersion`, `resolvedVersionId`, `loader`,
|
||
`loaderVersion` и `source` — откуда взята версия (`launcher_profiles`, `versions` или `content`).
|
||
|
||
`nullopt` — импортировать нечего: в `versions/` нет ни одной установленной версии и нет признаков
|
||
того, что в папке играли. Признаки — непустые `mods`, `saves`, `resourcepacks`, `shaderpacks`,
|
||
`config` или файлы `options.txt`, `servers.dat`. Служебные файлы других лаунчеров
|
||
(`launcher_log.txt`, `webcache2`) не считаются: иначе пустая папка официального лаунчера давала
|
||
бы сборку без версии.
|
||
|
||
Версия выбирается так:
|
||
|
||
1. профили из `launcher_profiles.json`, у которых `lastVersionId` установлен, по убыванию
|
||
`lastUsed` (профиль без даты считается самым старым). `latest-release` и `latest-snapshot` без
|
||
`lastVersionId` пропускаются: без манифеста не узнать, во что они разворачивались;
|
||
2. установленные версии по убыванию времени правки `<id>/<id>.json`.
|
||
|
||
Версия с нечитаемым описанием пропускается. Если в `mods/` есть хотя бы один `.jar`, сначала
|
||
ищется профиль с `inheritsFrom` (сперва в первом списке, потом во втором), и только потом берётся
|
||
что есть. Не нашлось ничего — `source` равен `content`, поля версии пустые.
|
||
|
||
У профиля с `inheritsFrom` версия игры — это `inheritsFrom`, а `resolvedVersionId` — его `id`,
|
||
поэтому запустится ровно найденный профиль, даже если модлоадер не опознан (OptiFine, LabyMod).
|
||
У профиля без `inheritsFrom` версия — сам `id`.
|
||
|
||
## loaderOf(versionJson)
|
||
|
||
Модлоадер по `libraries[].name` описания профиля:
|
||
|
||
| Библиотека | `key` | `version` |
|
||
|------------|-------|-----------|
|
||
| `net.fabricmc:fabric-loader:<v>` | `fabric` | `<v>` |
|
||
| `org.quiltmc:quilt-loader:<v>` | `quilt` | `<v>` |
|
||
| `net.neoforged:neoforge:<v>` | `neoforge` | `<v>` |
|
||
| `net.neoforged:forge:<mc>-<v>` | `neoforge` | `<v>` (NeoForge для 1.20.1) |
|
||
| `net.minecraftforge:forge:<mc>-<v>` | `forge` | `<v>` |
|
||
|
||
Префикс `<mc>-` срезается, хвост `-1.7.10` у старых Forge остаётся: в каталоге
|
||
[ModLoaderVersionService](ModLoaderVersionService.md) версии записаны так же, и карточка сборки
|
||
найдёт выбранную строку.
|
||
|
||
Если таких библиотек нет, смотрит на `id`, который дают установщики: `fabric-loader-<v>-<mc>`,
|
||
`quilt-loader-<v>-<mc>`, `neoforge-<v>`, `<mc>-forge-<v>`. Не опознано — пустой `key`.
|
||
|
||
---
|
||
|
||
При создании этого документа использовался ИИ.
|