1 parent
1943996608
commit
f10b654953
34 files changed
+2099
-4576
No files matched your search
+51
-131
@@ -1,144 +1,64 @@
|
||||
# launcherpaths.h — LauncherPaths
|
||||
# launcherpaths.h
|
||||
|
||||
## Обзор
|
||||
`launcherpaths.h`, `launcherpaths.cpp`
|
||||
|
||||
`Minecraft_launcher` хранит собственные данные отдельно от папки игры: настройки, профили, описания
|
||||
сборок, архивы содержимого `.minecraft`, скачанные сборки Java и кэши каталогов. Пространство имён
|
||||
`LauncherPaths` — единственное место, где эти пути вычисляются.
|
||||
Все пути к данным лаунчера. Пространство имён `LauncherPaths` из свободных функций, состояния нет:
|
||||
каждая функция просто собирает строку.
|
||||
|
||||
Собственная папка `BiLauncher` лежит рядом со стандартной `.minecraft`, а не в системном
|
||||
каталоге данных приложения: так все файлы лаунчера остаются там же, где сама игра, и переносятся
|
||||
вместе с ней.
|
||||
Данные лаунчера лежат в папке `BiLauncher` рядом со стандартной папкой игры, а не в системном
|
||||
каталоге данных приложения. `QStandardPaths` не используется, поэтому имя приложения и организации
|
||||
из `main.cpp` на эти пути не влияют.
|
||||
|
||||
К этому заголовку обращается почти каждый сервис проекта — везде, где нужно прочитать или записать
|
||||
файл в папке лаунчера.
|
||||
## Где что лежит
|
||||
|
||||
## Пространства имён
|
||||
`containerDir()` — папка, в которой живут и игра, и лаунчер:
|
||||
|
||||
`LauncherPaths` группирует функции, возвращающие абсолютные пути, и одну функцию создания корневой
|
||||
папки. Состояния у пространства имён нет: все функции вычисляют путь заново при каждом вызове.
|
||||
| ОС | `containerDir()` | папка игры по умолчанию | `rootDir()` |
|
||||
|----|------------------|-------------------------|-------------|
|
||||
| Windows | `%USERPROFILE%/AppData/Roaming` | `.minecraft` | `BiLauncher` |
|
||||
| macOS | `~/Library/Application Support` | `minecraft` (без точки, как у официального лаунчера) | `BiLauncher` |
|
||||
| Linux | `~` | `.minecraft` | `BiLauncher` |
|
||||
|
||||
## Функции
|
||||
На Linux папка лаунчера получается `~/BiLauncher`, без точки, то есть видимая.
|
||||
|
||||
### Корневые каталоги
|
||||
Внутри `rootDir()`:
|
||||
|
||||
#### QString containerDir()
|
||||
|
||||
Родительская папка, в которой лежит `.minecraft`, а рядом с ней — `BiLauncher`. От неё
|
||||
отсчитываются и папка игры по умолчанию, и корень данных лаунчера.
|
||||
|
||||
#### QString rootDir()
|
||||
|
||||
Корень данных лаунчера — `<containerDir>/BiLauncher`.
|
||||
|
||||
#### 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());
|
||||
```
|
||||
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`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in new issue
Block a user