Как работает лаунчер Minecraft
Данная статья написана в ознакомительных целях и рассчитана на читателей уже знакомых в первую очередь с Minecraft, HTTP протоколом, имеющих опыт прикладного программирования на языках Java, C++ или др.
Прежде чем начать воспользуемся хорошей практикой и обратимся к Google с запросом "Minecraft Launcher вики" далее пройдя по ссылке на официальную Minecraft вики мы найдем следующую важную для понимания информацию.
Лаунчер является интерфейсом загрузки и входа в клиент Minecraft. Он отвечает за загрузку пакетов Java, включая minecraft.jar, который содержит код игры, авторизует игрока и запускает клиент.
Основное функциональное назначение:
- Загрузка файлов игры
- Авторизация игрока
- Запуск клиента
Рассмотрим процесс детальнее на примере.
Файлы игры
Скачаем официальный лаунчер, авторизуемся, загрузим версию игры 1.12.2.
Далее в зависимости от системы перейдем к расположению загруженных файлов.
- Windows
%APPDATA%\.minecraft
- macOS
~/Library/Application Support/minecraft
- Linux
~/.minecraft
Вид каталога с игрой после загрузки (структура).
В рамках данной статьи я оставлю минимальный набор файлов, необходимый для самостоятельного запуска игры.
Сформируем общее понимание базовых составляющих игры.
- Файл
versions/1.12.2/1.12.2.jar
(в более ранних версиях minecraft.jar) содержит в себе весь код игры и является ядром. - Папка
libraries/
содержит в себе все сторонние пакеты или библиотеки Java такие как графическая библиотека LWJGL которые используются в исходном коде игры изversions/1.12.2/1.12.2.jar
они также требуют поставки в комплекте с игрой. - Некоторые сопутствующие библиотеки написаны специально под конкретную операционную систему их называют нативными (нативные библиотеки имеют разные расширения в зависимости от ОС, примеры расширений: macOS –
.dylib
; Linux –.so
; Windows –.dll
), официальный лаунчер хранит их вbin/natives
на ОС Windows. - Папка
assets/
содержит звуки, текстуры, шрифты, языковые файлы и другие ресурсы игры. - Файл
versions/1.12.2/1.12.2.json
является файлом версии, это означает что он хранит в себе всю информацию о конкретной версии игры, в нем можно найти список всех необходимых библиотек, клиента, сервера игры, URL адресов для скачивания, Hash-кодов для сверки соответствия файлов и параметры запуска (об этом далее).
Авторизация
Процесс авторизации в лаунчере:
- Пользователь вводит учетные данные: имя пользователя, пароль.
- Лаунчер преобразует данные в JSON и отправляет POST запрос на сервер аутентификации.
- Сервер аутентификации находит пользователя в базе данных и генерирует уникальный UUID и accessToken, затем возвращая их вместе с именем пользователя обратно лаунчеру.
- Лаунчер записывает имя пользователя, UUID и accessToken, в дальнейшем используя эти параметры для запуска игры.
Дополнительная информация:
- Схема аутентификации Yggdrasil.
- Описание протокола: последовательность авторизации клиента.
- Гайд по созданию своего сервера аутентификации от @TaoGunner.
- Репозиторий нашего сервера аутентификации.
Запуск клиента
Дальнейшие действия выполняются лаунчером при входе в игру. Их можно сымитировать в ручную через терминал (или консоль в Windows). Для ручного запуска нам потребуется загруженный набор файлов игры из versions/1.12.2/1.12.2.json
и полученные от сервера аутентификации наше имя пользователя, UUID и accessToken. Для запуска игры мы просим Java запустить versions/1.12.2/1.12.2.jar
со списком параметров:
- Путь к папке с нативными пакетами, которые используются в
versions/1.12.2/1.12.2.jar
- Путь к папке с Java пакетами, которые используются в
versions/1.12.2/1.12.2.jar
- Главный класс
net.minecraft.client.main.Main
(берется изversions/1.12.2/1.12.2.json
) - Параметры Java машины (опционально, такие как количество выделяемой оперативной памяти и т.д.)
- Игровые параметры (берется из
versions/1.12.2/1.12.2.json
): - Имя игрока
--username <username>
- Версия игры
--version 1.12.2
- Путь к папке с игрой
--gameDir '/Users/scavver/Library/Application Support/minecraft'
- Путь к папке с ассетами
--assetsDir '/Users/scavver/Library/Application Support/minecraft/assets'
- Индекс ассетов
--assetIndex 1.12
- UUID игрока
--uuid <UUID>
- Токен игрока
--accessToken <accessToken>
- Тип пользователя
--userType mojang
- Тип версии
--versionType release
Демонстрация итоговой строки запуска для macOS без перечисления всего списка библиотек и дополнительных параметров Java машине (в терминале подобная конструкция должна быть объеденена в одну строку, вместо символов переноса строки должны быть символы пробела):
"/Applications/IntelliJ IDEA CE.app/Contents/jbr/Contents/Home/bin/java" -Djava.library.path="/Users/scavver/Library/Application Support/minecraft/bin/natives" -cp "/Users/scavver/Library/Application Support/Minecraft.biz/libraries/1.jar: /Users/scavver/Library/Application Support/Minecraft.biz/libraries/2.jar: /Users/scavver/Library/Application Support/Minecraft.biz/libraries/3.jar: /Users/scavver/Library/Application Support/Minecraft.biz/libraries/N.jar: /Users/scavver/Library/Application Support/Minecraft.biz/versions/1.12.2/1.12.2.jar" net.minecraft.client.main.Main --username scavver --version 1.12.2 --gameDir '/Users/scavver/Library/Application Support/minecraft' --assetsDir '/Users/scavver/Library/Application Support/minecraft/assets' --assetIndex 1.12 --uuid <uuid> --accessToken <accessToken> --userType mojang --versionType release
Обратите внимание:
- Для параметра -cp (classpath – местоположение пользовательских классов или пакетов) необходимо перечислить список полных путей ко всем пакетам (библиотекам) из
libraries/
. - Разделитель двоеточие ( : ) используется на macOS и Linux, в Windows необходимо использовать точку с запятой ( ; ).
- Разделитель пути косая черта ( / ) используется на macOS и Linux, а в DOS и Windows обратная косая черта ( \ ).
- Пути могут содержать пробелы поэтому их нужно заключать в кавычки.
Для закрепления материала рекомендую самостоятельно запустить игровой клиент с помощью .bat
файла на Windows или составив строку запуска для терминала macOS или Linux. Подсказка: воспользуйтесь официальным лаунчером для загрузки чистого клиента и авторизации (получения UUID и accessToken от сервера аутентификации Mojang). Теперь у вас есть достаточно информации для самостоятельной работы и поисков, тема также останется открытой на форуме.