Files
BiLauncher/doc/cpp/gamedirimport.md
T
galeon 1d781b5324
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
fix #23 by adding validating on first startup and close #30 by adding
version number

Signed-off-by: galeon <dertiellis@gmail.com>
2026-10-23 09:55:15 +03:00

3.7 KiB
Raw Blame History

gamedirimport.h

gamedirimport.h, gamedirimport.cpp

Пространство имён GameDirImport: что уже лежит в папке игры, когда лаунчер запускают впервые. Состояния нет, сеть не нужна, файлы только читаются. Вызывает его LauncherBackend при первом запуске, решение описано в ADR-0001.

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 версии записаны так же, и карточка сборки найдёт выбранную строку.

Если таких библиотек нет, смотрит на id, который дают установщики: fabric-loader-<v>-<mc>, quilt-loader-<v>-<mc>, neoforge-<v>, <mc>-forge-<v>. Не опознано — пустой key.


При создании этого документа использовался ИИ.