# launcherpaths.h — LauncherPaths ## Обзор `Minecraft_launcher` хранит собственные данные отдельно от папки игры: настройки, профили, описания сборок, архивы содержимого `.minecraft`, скачанные сборки Java и кэши каталогов. Пространство имён `LauncherPaths` — единственное место, где эти пути вычисляются. Собственная папка `galeonLauncher` лежит рядом со стандартной `.minecraft`, а не в системном каталоге данных приложения: так все файлы лаунчера остаются там же, где сама игра, и переносятся вместе с ней. К этому заголовку обращается почти каждый сервис проекта — везде, где нужно прочитать или записать файл в папке лаунчера. ## Пространства имён `LauncherPaths` группирует функции, возвращающие абсолютные пути, и одну функцию создания корневой папки. Состояния у пространства имён нет: все функции вычисляют путь заново при каждом вызове. ## Функции ### Корневые каталоги #### QString containerDir() Родительская папка, в которой лежит `.minecraft`, а рядом с ней — `galeonLauncher`. От неё отсчитываются и папка игры по умолчанию, и корень данных лаунчера. #### QString rootDir() Корень данных лаунчера — `/galeonLauncher`. #### QString defaultMinecraftDir() Стандартная папка игры. Используется, когда пользователь не задал свою в настройках. #### bool ensureRootExists(QString *error = nullptr) Создаёт папку лаунчера, если её ещё нет. Вызывается при каждом запуске и перед каждой записью. Возвращает `false` и заполняет `error`, если папку не удалось создать или в неё не пишется. Все остальные функции пространства имён только считают строки и в этом смысле не могут завершиться неудачей — проверять доступность каталога нужно этой функцией. ### Файлы состояния #### QString settingsFile() Файл настроек запуска: папка игры, путь к Java, память, аргументы JVM, размер окна. #### QString profilesFile() Файл профилей игрока. #### QString customBuildsFile() `/customBuilds.json` — пользовательские сборки. #### QString legacyCustomBuildsFile() `/versions.json` — как сборки назывались до переименования. Читается один раз при миграции и больше ни для чего не нужен. ### Сборки и их архивы #### QString buildStorageDir() `/builds` — архивы содержимого `.minecraft`, по одному на сборку. #### QString buildDir(int buildId) `/builds/` — папка одной сборки: её архив и, у сезонных, скачанный пак с описанием установленной ревизии. #### QString seasonalStateFile(int buildId) `/builds//season.json` — какая ревизия сезонной сборки установлена и какие файлы она принесла. Список файлов нужен, чтобы при обновлении убрать те, что из сборки ушли. ### Java #### QString javaDir() `/java` — сборки Java, скачанные лаунчером. Каждая в своей подпапке, имя подпапки — идентификатор сборки из каталога. #### QString javaCatalogFile() Слепок каталога доступных сборок Java с отметкой времени. #### QString javaDownloadDir() Каталог, куда качаются архивы Temurin до распаковки. ### Кэши и загрузки #### QString cacheDir() `/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()); ``` --- При создании этого документа использовался ИИ.