Files
MrixsCraft/docs/launcher/Specification.md

11 KiB
Raw Permalink Blame History

Спецификация архитектуры 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)

Для корректной работы лаунчера на сервере должны быть реализованы следующие эндпоинты:

  1. Yggdrasil API: /authserver/authenticate, /authserver/refresh, /authserver/validate.
  2. Обновление лаунчера: GET /api/launcher/latest -> Возвращает версию и прямую ссылку на бинарники (Win, Mac, Lin).
  3. Список серверов: GET /api/servers.json -> Отдает массив доступных модпаков.
  4. Манифест сервера: GET /api/instances/hitech/manifest.json -> Отдает полный граф файлов с хэшами SHA-1, путями и параметрами запуска.
  5. Файловый хостинг (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)