# 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`, без точки, то есть видимая. Внутри `rootDir()`: ``` BiLauncher/ ├── settings.json settingsFile() ├── profiles.json profilesFile() ├── customBuilds.json customBuildsFile() ├── versions.json legacyCustomBuildsFile() — старое имя, читается только при миграции ├── builds/ buildStorageDir() │ ├── index.json журнал BuildSwitcher │ └── / buildDir(id): архив сборки, скачанный пак │ └── season.json seasonalStateFile(id) ├── java/ javaDir(): скачанные сборки Java, каждая в / ├── 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`. --- При создании этого документа использовался ИИ.