5.2 KiB
launcherpaths.h
launcherpaths.h, launcherpaths.cpp
Все пути к данным лаунчера. Пространство имён LauncherPaths из свободных функций, состояния нет:
каждая функция просто собирает строку.
Данные лаунчера лежат в папке BiLauncher рядом со стандартной папкой игры, а не в системном
каталоге данных приложения. QStandardPaths не используется, поэтому имя приложения и организации
из main.cpp на эти пути не влияют.
Где что лежит
containerDir() — папка, в которой живут и игра, и лаунчер:
| ОС | containerDir() |
папка игры по умолчанию | rootDir() |
|---|---|---|---|
| Windows | %USERPROFILE%/AppData/Roaming |
.minecraft |
BiLauncher |
| macOS | ~/Library/Application Support |
minecraft (без точки, как у официального лаунчера) |
BiLauncher |
| Linux | ~ |
.minecraft |
BiLauncher |
На Linux папка лаунчера получается ~/BiLauncher, без точки, то есть видимая.
BILAUNCHER_HOME
homeOverride() читает переменную окружения BILAUNCHER_HOME. Если в ней абсолютный путь, он
заменяет домашнюю папку (~ и %USERPROFILE% в таблице выше) для всех путей лаунчера, включая
папку игры по умолчанию. Пустое или относительное значение не учитывается. Остальной Qt
(QDir::homePath(), QStandardPaths) эту переменную не видит.
Переменная нужна тестам и дымовой проверке на Windows: там QDir::homePath() спрашивает профиль
у системы и USERPROFILE игнорирует, так что иначе их нельзя увести из настоящего
%APPDATA%\BiLauncher. Новых возможностей она не даёт: кто управляет окружением процесса, на
Linux и macOS и так подменит HOME. Чтобы случайно оставленную переменную было видно, main.cpp
при старте пишет в лог предупреждение с итоговой папкой лаунчера.
Внутри rootDir():
BiLauncher/
├── settings.json settingsFile()
├── profiles.json profilesFile()
├── customBuilds.json customBuildsFile()
├── versions.json legacyCustomBuildsFile() — старое имя, читается только при миграции
├── builds/ buildStorageDir()
│ ├── index.json журнал BuildSwitcher
│ └── <id>/ buildDir(id): архив сборки, скачанный пак
│ └── season.json seasonalStateFile(id)
├── java/ javaDir(): скачанные сборки Java, каждая в <id>/
├── runtime/ runtimeDir(): authlib-injector.jar
└── cache/ cacheDir(): всё, что можно удалить без потерь
├── version_manifest.json versionManifestFile()
├── java_runtimes.json javaCatalogFile()
├── seasonal_builds.json seasonalCatalogFile()
├── loader_<ключ>.json loaderCacheFile(key)
├── loaders/ loaderDownloadDir(): installer.jar и журналы установщиков
└── java/ javaDownloadDir(): архивы Temurin до распаковки
Папка игры задаётся в настройках (gameDir). defaultMinecraftDir() используется, только если
там пусто.
ensureRootExists(&error)
Создаёт rootDir, runtime, cache, cache/loaders, builds, java и cache/java, а затем
проверяет, что каждая из них действительно папка и в неё можно писать. mkpath возвращает true
и для существующей папки без прав на запись, и тогда, когда на месте папки лежит файл. Без этой
проверки сохранения потом молча не работали бы.
Вызывается при старте бэкенда, перед каждой записью JSON-файлов бэкенда, перед записью кэшей каталогов и перед установками. Остальные функции только собирают строки и ошибиться не могут.
launcherpaths.cpp подключает localization.h ради текста ошибки, заголовок зависит только от
QString.
При создании этого документа использовался ИИ.