57 lines
3.7 KiB
Markdown
57 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`.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
При создании этого документа использовался ИИ.
|