# Спецификация архитектуры 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=`. ### 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/` Внутренняя иерархия папок: ```text 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-приложений: ```text /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) ```