9.1 KiB
BiLauncher: устройство проекта
Лаунчер Minecraft на Qt 6. Интерфейс на QML. Всё остальное, то есть вход в аккаунт, загрузка версий, установка модлоадеров и Java, смена сборок и запуск игры, написано на C++.
Здесь описано, как устроен код. Как собрать проект и выпустить релиз, рассказано в build-and-release.md, как устроены и запускаются автотесты — в testing.md.
Общая схема
QML (Main.qml и диалоги)
│ свойства, вызовы, сигналы
▼
LauncherBackend ──────────────── Loc (Localization)
│ владеет
▼
сервисы: каталоги, установщики, авторизация, BuildSwitcher, GameLauncher
│
▼
сеть, файлы, дочерние процессы
- QML. Main.qml — единственное окно приложения. Остальные окна —
Dialogвнутри него. Main создаёт одинLauncherBackendи передаёт его диалогам черезrequired property var backend. К сервисам QML не обращается. - LauncherBackend хранит профили, сборки и настройки, владеет двенадцатью сервисами и следит, чтобы их операции не пересекались. Каталоги он отдаёт в QML уже сведёнными с тем, что лежит на диске, поэтому окна сами ничего не считают.
- Сервисы. Каждый занят одним делом и про интерфейс не знает.
- Внешний мир. Серверы Mojang, Ely.by, Microsoft/Xbox, Adoptium, Fabric/Quilt/Forge/NeoForge и
свой сервер сезонных сборок. Файлы:
.minecraftи папка лаунчера. Процессы: java с игрой, установщики Forge/NeoForge,tar.
Отдельно стоит Localization, синглтон Loc. Через него идут все тексты
интерфейса: Loc.t.домен.вид.имя в QML и Loc::text("домен.вид.имя") в C++. Он ни от чего не
зависит, и обращаться к нему можно из любого слоя.
Почти всё работает в GUI-потоке. Параллельность даёт асинхронная сеть, а не потоки. Исключение —
файловые операции над .minecraft (это могут быть гигабайты модов и миров). Они вынесены в
отдельный поток в BuildArchiveWorker.
Основные понятия
Профиль — игрок и способ входа: офлайн, Ely.by или Microsoft.
Сборка — версия игры, модлоадер (или без него), адрес сервера и собственное содержимое
.minecraft: моды, конфиги, миры. Активная сборка одна, её файлы разложены в .minecraft, у
остальных файлы лежат в архивах в папке лаунчера. Папки versions, libraries, assets,
runtime общие для всех сборок. См. BuildSwitcher.
Сезонная сборка — готовая сборка, которую публикует команда на своём сервере. Ставится одной кнопкой вместе с версией, модлоадером и Java, обновляется по номеру ревизии. Формат каталога описан в SeasonalBuildService.
Папка лаунчера — BiLauncher рядом с .minecraft. Что в ней лежит, расписано в
launcherpaths.h.
QML
| Файл | Что это |
|---|---|
| Main | главное окно: экран запуска, профили, настройки, плашка сообщений, панели прогресса |
| BuildsDialog | пользовательские сборки: список и карточка |
| VersionPickerDialog | выбор версии Minecraft, удаление скачанных |
| JavaPickerDialog | выбор и загрузка Java |
| SeasonalBuildsDialog | каталог сезонных сборок |
| MicrosoftLoginDialog | вход Microsoft во встроенном браузере; только с WebEngine |
| LoaderRow | строка модлоадера в карточке сборки |
| ProgressPanel | плашка прогресса |
| DarkCombo | выпадающий список в стиле окна |
| LabelledField | подпись и поле ввода |
C++
Вход и фасад
| main.cpp | запуск приложения |
| LauncherBackend | всё, что видит QML |
| Localization | тексты интерфейса, i18n/translations.json |
Вход в аккаунт и запуск
| AuthService | Ely.by, офлайн, authlib-injector; структура AuthResult |
| MsaAuthService | Microsoft: OAuth2 → Xbox Live → XSTS → Minecraft Services |
| GameLauncher | командная строка, нативные библиотеки, процесс игры |
Версии игры
| VersionManifestService | каталог версий Mojang |
| VersionInstaller | установка версии: jar, библиотеки, ресурсы |
| minecraftversion.h | чтение описаний версий, цепочка inheritsFrom, правила Mojang |
Модлоадеры
| modloader.h | перечисление модлоадеров и ключи |
| ModLoaderVersionService | версии Forge, Fabric, NeoForge, Quilt |
| ModLoaderInstaller | установка: готовый профиль или installer.jar |
| zlibreference.h | обход zlib-ng для установщиков Forge/NeoForge на Linux |
Java
| javaruntime.h | типы, папка <root>/java, какая Java нужна какой версии игры |
| JavaRuntimeService | каталог Mojang и Temurin |
| JavaInstaller | установка: архив Temurin или дерево файлов Mojang |
| javalocator.h | поиск java в системе |
Сборки
| BuildSwitcher | смена активной сборки, раскатка пака, продолжение после падения |
| BuildArchiveWorker | файловые операции в отдельном потоке |
| SeasonalBuildService | каталог сезонных сборок и его формат |
| SeasonalPackDownloader | загрузка архива сезонной сборки |
| launcherpaths.h | все пути к данным лаунчера |
Прочее в репозитории
| Путь | Что это |
|---|---|
i18n/translations.json |
все тексты интерфейса |
tools/check_translations.py |
проверка каталога переводов |
tests/ |
автотесты, см. testing.md |
icons/ |
иконки и скрипт, который их генерирует |
images/ |
картинки интерфейса |
zlib/ |
исходники zlib 1.3.1 (чужой код) |
packaging/ |
установщик Windows, лицензии сторонних компонентов |
ci/ |
скрипты подготовки раннеров |
.gitea/workflows/release.yml |
сборка релизов |
.gitea/workflows/tests.yml |
автотесты на тех же раннерах |
Screenshots/ |
картинки для README |
При создании этого документа использовался ИИ.