Dev
June 12, 2020

Как работает лаунчер Minecraft

Данная статья написана в ознакомительных целях и рассчитана на читателей уже знакомых в первую очередь с Minecraft, HTTP протоколом, имеющих опыт прикладного программирования на языках Java, C++ или др.

Прежде чем начать воспользуемся хорошей практикой и обратимся к Google с запросом "Minecraft Launcher вики" далее пройдя по ссылке на официальную Minecraft вики мы найдем следующую важную для понимания информацию.

Лаунчер является интерфейсом загрузки и входа в клиент Minecraft. Он отвечает за загрузку пакетов Java, включая minecraft.jar, который содержит код игры, авторизует игрока и запускает клиент.

Основное функциональное назначение:

  1. Загрузка файлов игры
  2. Авторизация игрока
  3. Запуск клиента

Рассмотрим процесс детальнее на примере.

Файлы игры

Скачаем официальный лаунчер, авторизуемся, загрузим версию игры 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-кодов для сверки соответствия файлов и параметры запуска (об этом далее).

Авторизация

Процесс авторизации в лаунчере:

  1. Пользователь вводит учетные данные: имя пользователя, пароль.
  2. Лаунчер преобразует данные в JSON и отправляет POST запрос на сервер аутентификации.
  3. Сервер аутентификации находит пользователя в базе данных и генерирует уникальный UUID и accessToken, затем возвращая их вместе с именем пользователя обратно лаунчеру.
  4. Лаунчер записывает имя пользователя, UUID и accessToken, в дальнейшем используя эти параметры для запуска игры.

Дополнительная информация:

Запуск клиента

Дальнейшие действия выполняются лаунчером при входе в игру. Их можно сымитировать в ручную через терминал (или консоль в Windows). Для ручного запуска нам потребуется загруженный набор файлов игры из versions/1.12.2/1.12.2.json и полученные от сервера аутентификации наше имя пользователя, UUID и accessToken. Для запуска игры мы просим Java запустить versions/1.12.2/1.12.2.jar со списком параметров:

  1. Путь к папке с нативными пакетами, которые используются в versions/1.12.2/1.12.2.jar
  2. Путь к папке с Java пакетами, которые используются в versions/1.12.2/1.12.2.jar
  3. Главный класс net.minecraft.client.main.Main (берется из versions/1.12.2/1.12.2.json)
  4. Параметры Java машины (опционально, такие как количество выделяемой оперативной памяти и т.д.)
  5. Игровые параметры (берется из 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). Теперь у вас есть достаточно информации для самостоятельной работы и поисков, тема также останется открытой на форуме.