11 KiB
11 KiB
Спецификация архитектуры Minecraft лаунчера
1. Общие сведения
- Язык программирования: Go (Golang)
- GUI-библиотека: Fyne
- Целевые ОС: Windows, macOS, Linux (кроссплатформенная компиляция)
- Тип сервера: Приватный мультисерверный проект (с поддержкой разных модпаков и версий игры)
2. Ключевые модули лаунчера (Core Modules)
2.1. Модуль авторизации (Auth Manager)
- Протокол: Yggdrasil API (кастомный сервер).
- Инъекция: Использование
authlib-injector.jarдля перенаправления запросов клиента с серверов Mojang на приватный Yggdrasil-сервер. - Сохранение сессии: Локальное хранение
accessTokenиclientTokenв зашифрованном или скрытом JSON-файле (например,session.json). - Жизненный цикл: При запуске лаунчер выполняет
/validateили/refresh. При успехе пропускает экран логина, при неудаче запрашивает пароль.
2.2. Модуль синхронизации файлов (Sync & Download Manager)
- Манифест: Скачивание
manifest.jsonс описанием структуры файлов (ассеты, библиотеки, моды, конфиги). - Хэширование: Использование алгоритма SHA-1 для сверки локальных файлов с манифестом.
- Многопоточность: Асинхронная загрузка недостающих/поврежденных файлов (горутины + воркер-пулы).
- Разрешение конфликтов: Если в папке
mods/найден файл, которого нет в манифесте, он не удаляется безвозвратно, а перемещается в папкуmods_backup/для предотвращения крашей игры (Soft Deletion/Self-healing).
2.3. Модуль управления Java (JRE Manager)
- Изоляция: Лаунчер загружает и использует собственные портативные версии Java (8, 17, 21), не завися от установленной в ОС.
- Логика: Манифест сервера указывает требуемую версию Java (например,
java_version: 21). Лаунчер проверяет наличие папкиJava/21/bin/javaвнутри своей рабочей директории (см. раздел 4). Если ее нет — скачивает архив, распаковывает и выдает права на исполнение (для UNIX-систем).
2.4. Модуль запуска (Launch Engine)
- Агностичность: Лаунчер не привязан к конкретному Mod Loader'у (Vanilla, Fabric, Forge).
- Генерация аргументов: Манифест предоставляет шаблоны
mainClassиgameArgs(массив строк). - Интерполяция: Замена псевдопеременных в строке запуска перед стартом:
${player_name}-> Никнейм игрока${auth_uuid}-> UUID сессии${auth_access_token}-> Токен Yggdrasil${classpath}-> Склейка путей ко всем.jarбиблиотекам
- Обязательное внедрение аргумента:
-javaagent:<путь>/authlib-injector.jar=<URL_сервера>.
2.5. Модуль автообновления (Self-Updater)
- Библиотека:
github.com/cloudflare/go-selfupdate. - Механика: Сравнение текущей версии с версией на сервере API. Скачивание нового бинарника, переименование текущего исполняемого файла в
.old(обход блокировки Windows) и перезапуск программы.
3. Пользовательский интерфейс (UI - Fyne)
Основан на компоновке BorderLayout со следующими зонами:
| Зона (Layout) | Элементы виджетов (Fyne Widgets) | Описание логики |
|---|---|---|
| Left (Лево) | widget.List / container.VBox |
Вертикальный список серверов (модпаков). Содержит иконки и названия. При выборе меняет контент центральной зоны. |
| Center (Центр) | widget.RichText, canvas.Image |
Фоновое изображение выбранного сервера. Поверх него — Markdown-карточка с новостями/патчноутами. |
| Bottom (Низ) | BorderLayout (вложенный) |
Панель управления (Навигация и статус). |
| Bottom-Left | canvas.Image, widget.Label |
Аватарка (лицо из скина 8x8) и никнейм. Кнопка "Выйти". |
| Bottom-Center | widget.ProgressBar |
Полоса загрузки (показывает прогресс скачивания файлов). Скрыта, если нет активных загрузок. |
| Bottom-Right | widget.Button |
Кнопка «Настройки» (шестеренка) и большая акцентная кнопка «PLAY». |
3.1. Экран настроек (Модальное окно)
- ОЗУ: Слайдер (
widget.Slider) для выбора выделяемой оперативной памяти (от 1 ГБ до максимума физической ОЗУ пользователя). Конвертируется в флаги-Xmsи-Xmx. - Доп. аргументы: Текстовое поле (
widget.Entry) для пользовательских флагов JVM (например, настройки Garbage Collector).
4. Структура файловой системы (Клиентская часть)
Кастомная корневая директория, зависящая от ОС:
- Windows:
%AppData%\Roaming\MrixsCraft\ - macOS:
~/Library/Application Support/MrixsCraft/ - Linux:
~/.MrixsCraft/
Внутренняя иерархия папок:
MrixsCraft/
├── launcher.exe # Исполняемый файл лаунчера
├── launcher.json # Настройки лаунчера (ОЗУ, выбранный сервер)
├── session.json # Токены авторизации Yggdrasil
├── authlib-injector.jar # Перехватчик авторизации
├── Java/ # Портативные версии Java
│ ├── 8/
│ │ └── bin/java
│ ├── 17/
│ │ └── bin/java
│ └── 21/
│ └── bin/java
├── assets/ # Общие ресурсы игры (звуки, текстуры), размещаются здесь для совместимости с игрой
├── libraries/ # Общие библиотеки (LWJGL, утилиты), размещаются здесь для совместимости с игрой
└── instances/ # Изолированные клиенты (модпаки)
├── HiTech_1_21/
│ ├── mods/ # Моды (проверяются SHA-1)
│ ├── mods_backup/ # Сюда скидываются неизвестные моды
│ ├── config/ # Конфигурации
│ └── resourcepacks/
└── Vanilla_1_20/
5. Требования к серверной части (API & CDN)
Для корректной работы лаунчера на сервере должны быть реализованы следующие эндпоинты:
- Yggdrasil API:
/authserver/authenticate,/authserver/refresh,/authserver/validate. - Обновление лаунчера: GET
/api/launcher/latest-> Возвращает версию и прямую ссылку на бинарники (Win, Mac, Lin). - Список серверов: GET
/api/servers.json-> Отдает массив доступных модпаков. - Манифест сервера: GET
/api/instances/hitech/manifest.json-> Отдает полный граф файлов с хэшами SHA-1, путями и параметрами запуска. - Файловый хостинг (CDN): Раздача статики (модов, ассетов, библиотек).
6. Предлагаемая структура проекта (Go Packages)
Для чистоты кода рекомендуется использовать стандартный паттерн структуры Go-приложений:
/cmd/launcher/
└── main.go # Точка входа, инициализация Fyne приложения
/internal/
├── auth/ # Логика Yggdrasil, токены, профили
├── config/ # Чтение/запись launcher.json и системных путей
├── fetcher/ # HTTP-клиент, скачивание файлов, проверка SHA-1
├── java/ # Определение ОС, скачивание и распаковка JRE
├── launch/ # Парсинг manifest.json, интерполяция строк, exec.Command
├── selfupdate/ # Интеграция библиотеки автообновления лаунчера
└── ui/ # Код Fyne интерфейса
├── components/ # Отдельные виджеты (аватарка, прогресс-бар)
├── screens/ # Экраны (Логин, Главное меню, Настройки)
└── theme/ # Кастомная тема Fyne (цвета, шрифты)
/pkg/
└── utils/ # Вспомогательные функции (вычисление хэша, парсинг zip)