Files
BiLauncher/doc/index.md
T
galeon 1d781b5324
tests / package-smoke-linux (push) Skipped
tests / package-smoke-windows (push) Skipped
tests / package-smoke-macos (push) Skipped
tests / macos (push) Successful in 1m20s
tests / linux (push) Successful in 2m14s
tests / windows (push) Failing after 23m21s
fix #23 by adding validating on first startup and close #30 by adding
version number

Signed-off-by: galeon <dertiellis@gmail.com>
2026-10-23 09:55:15 +03:00

9.2 KiB
Raw Blame History

BiLauncher: устройство проекта

Лаунчер Minecraft на Qt 6. Интерфейс на QML. Всё остальное, то есть вход в аккаунт, загрузка версий, установка модлоадеров и Java, смена сборок и запуск игры, написано на C++.

Здесь описано, как устроен код. Как собрать проект и выпустить релиз, рассказано в build-and-release.md, как устроены и запускаются автотесты — в testing.md.

Общая схема

QML (Main.qml и диалоги)
        │  свойства, вызовы, сигналы
        ▼
LauncherBackend ──────────────── Loc (Localization)
        │  владеет
        ▼
сервисы: каталоги, установщики, авторизация, BuildSwitcher, GameLauncher
        │
        ▼
сеть, файлы, дочерние процессы
  1. QML. Main.qml — единственное окно приложения. Остальные окна — Dialog внутри него. Main создаёт один LauncherBackend и передаёт его диалогам через required property var backend. К сервисам QML не обращается.
  2. LauncherBackend хранит профили, сборки и настройки, владеет двенадцатью сервисами и следит, чтобы их операции не пересекались. Каталоги он отдаёт в QML уже сведёнными с тем, что лежит на диске, поэтому окна сами ничего не считают.
  3. Сервисы. Каждый занят одним делом и про интерфейс не знает.
  4. Внешний мир. Серверы 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 файловые операции в отдельном потоке
gamedirimport.h сборка по содержимому папки игры при первом запуске
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

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