# launcherpaths.h — LauncherPaths

## Обзор

`Minecraft_launcher` хранит собственные данные отдельно от папки игры: настройки, профили, описания
сборок, архивы содержимого `.minecraft`, скачанные сборки Java и кэши каталогов. Пространство имён
`LauncherPaths` — единственное место, где эти пути вычисляются.

Собственная папка `galeonLauncher` лежит рядом со стандартной `.minecraft`, а не в системном
каталоге данных приложения: так все файлы лаунчера остаются там же, где сама игра, и переносятся
вместе с ней.

К этому заголовку обращается почти каждый сервис проекта — везде, где нужно прочитать или записать
файл в папке лаунчера.

## Пространства имён

`LauncherPaths` группирует функции, возвращающие абсолютные пути, и одну функцию создания корневой
папки. Состояния у пространства имён нет: все функции вычисляют путь заново при каждом вызове.

## Функции

### Корневые каталоги

#### QString containerDir()

Родительская папка, в которой лежит `.minecraft`, а рядом с ней — `galeonLauncher`. От неё
отсчитываются и папка игры по умолчанию, и корень данных лаунчера.

#### QString rootDir()

Корень данных лаунчера — `<containerDir>/galeonLauncher`.

#### QString defaultMinecraftDir()

Стандартная папка игры. Используется, когда пользователь не задал свою в настройках.

#### bool ensureRootExists(QString *error = nullptr)

Создаёт папку лаунчера, если её ещё нет. Вызывается при каждом запуске и перед каждой записью.

Возвращает `false` и заполняет `error`, если папку не удалось создать или в неё не пишется. Все
остальные функции пространства имён только считают строки и в этом смысле не могут завершиться
неудачей — проверять доступность каталога нужно этой функцией.

### Файлы состояния

#### QString settingsFile()

Файл настроек запуска: папка игры, путь к Java, память, аргументы JVM, размер окна.

#### QString profilesFile()

Файл профилей игрока.

#### QString customBuildsFile()

`<root>/customBuilds.json` — пользовательские сборки.

#### QString legacyCustomBuildsFile()

`<root>/versions.json` — как сборки назывались до переименования. Читается один раз при миграции и
больше ни для чего не нужен.

### Сборки и их архивы

#### QString buildStorageDir()

`<root>/builds` — архивы содержимого `.minecraft`, по одному на сборку.

#### QString buildDir(int buildId)

`<root>/builds/<id>` — папка одной сборки: её архив и, у сезонных, скачанный пак с описанием
установленной ревизии.

#### QString seasonalStateFile(int buildId)

`<root>/builds/<id>/season.json` — какая ревизия сезонной сборки установлена и какие файлы она
принесла. Список файлов нужен, чтобы при обновлении убрать те, что из сборки ушли.

### Java

#### QString javaDir()

`<root>/java` — сборки Java, скачанные лаунчером. Каждая в своей подпапке, имя подпапки —
идентификатор сборки из каталога.

#### QString javaCatalogFile()

Слепок каталога доступных сборок Java с отметкой времени.

#### QString javaDownloadDir()

Каталог, куда качаются архивы Temurin до распаковки.

### Кэши и загрузки

#### QString cacheDir()

`<root>/cache` — данные, которые можно удалить без потерь.

#### QString versionManifestFile()

Слепок манифеста версий Mojang с отметкой времени.

#### QString seasonalCatalogFile()

Слепок каталога сезонных сборок с отметкой времени.

#### QString loaderCacheFile(const QString &loaderKey)

Слепок списка версий одного модлоадера. Параметр `loaderKey` принимает значения `forge`, `fabric`,
`neoforge` и `quilt` — те же ключи, что возвращает `loaderKey()` из [modloader.h](modloader.md).

#### QString loaderDownloadDir()

Каталог, куда качаются `installer.jar` модлоадеров.

#### QString runtimeDir()

Каталог, куда качается `authlib-injector` — библиотека, подменяющая сервер авторизации при входе
через Ely.by.

## Зависимости

Единственный подключаемый заголовок — `QString`. Пространство имён не зависит ни от одного класса
проекта, поэтому его можно подключать откуда угодно без риска циклических зависимостей.

## Пример использования

```cpp
QString error;
if (!LauncherPaths::ensureRootExists(&error)) {
    qWarning() << "папка лаунчера недоступна:" << error;
    return;
}

QFile file(LauncherPaths::customBuildsFile());
if (file.open(QIODevice::WriteOnly))
    file.write(document.toJson());
```

---

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