Почти всё, что будет описано выше, является вольным пересказом следующей статьи, а также некоторой информацией взятой из личного опыта.
Все доступные версии самой игры перечислены в файле launchermeta.mojang.com/mc/game/version_manifest.json
Местоположение информационного файла JSON для конкретной версии включено в манифест версии, который указан выше. Файл JSON (для конкретной версии) включает требования для запуска клиента (флаги), ссылки для загрузки клиента, сервера, список библиотек и нативных файлов (libraries и natives) с ссылками для загрузки, а также ссылку на ассеты используемых для данной версии и прочую информацию.
Далее в тексте для примера мы будем разбирать работу оригинального лаунчера Minecraft и JSON файл для версии 1.16.5
Скачивание клиента (jar)
Самое простое из всего списка, это найти файл client.jar
Располагается он следующей последовательности downloads -> client
{
"downloads": {
"client": {
"sha1": "37fd3c903861eeff3bc24b71eed48f828b5269c8",
"size": 17547153,
"url": "https://launcher.mojang.com/v1/objects/37fd3c903861eeff3bc24b71eed48f828b5269c8/client.jar"
}
}
}
Соответственно https://launcher.mojang.com/v1/objects/37fd3c903861eeff3bc24b71eed48f828b5269c8/client.jar
и есть тот самый файл, который нам нужен.
Скачивание ассетов
Тут всё тоже довольно просто. Находите в файле следующий код:
{
"assetIndex": {
"id": "1.16",
"sha1": "3a5d110a6ab102c7083bae4296d2de4b8fcf92eb",
"size": 295421,
"totalSize": 330604420,
"url": "https://launchermeta.mojang.com/v1/packages/3a5d110a6ab102c7083bae4296d2de4b8fcf92eb/1.16.json"
},
"assets": "1.16"
}
Данный блок содержит информацию о ассетах используемых для данной версии.
После перехода по url
мы видим файл со списком всех ассетов для данной версии.
Все ресурсы хранятся на сервере resources.download.minecraft.net
Каждый ассет в файле имеет имя (имя поля объекта ресурса), хэш SHA1 и размер файла. Например:
{
"icons/icon_16x16.png": {
"hash": "bdf48ef6b5d0d23bbb02e17d04865216179f510a",
"size": 3665
}
}
В настоящее время лаунчер загружает все ресурсы в папку assets/objects
из
https://resources.download.minecraft.net/<первые 2 символа хэша>/<весь хеш>
и хранит их в .minecraft/assets/objects/<первые 2 символа хэша>/<весь хеш>
Для legacy версий (версии 1.7.2 включительно и ниже) ассеты динамически (при старте клиента) распаковываются лаунчером в папку .minecraft/resources/
в старом формате по названию файла (например: music/calm1.ogg
).
Скачивание библиотек и нативных файлов
А вот тут всё куда интереснее.
Библиотеки, которые загружаются лаунчером, расположены по адресу libraries.minecraft.net
В JSON файле версии содержится список библиотек и нативных файлов, требуемых для данной версии игры.
Для примера возмём следующий блок:
{
"downloads": {
"artifact": {
"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar",
"sha1": "d3ad4df38e400b8afba1de63f84338809399df5b",
"size": 108907,
"url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar"
},
"classifiers": {
"natives-linux": {
"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-linux.jar",
"sha1": "0957733f26a6661d4883da0335f7ef46d3bbbd7d",
"size": 159198,
"url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-linux.jar"
},
"natives-macos": {
"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-macos.jar",
"sha1": "98f745038d17ac3192fcd01dc44126b03ec1570d",
"size": 67311,
"url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-macos.jar"
},
"natives-windows": {
"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-windows.jar",
"sha1": "dc6826d636bf796b33a49038c354210e661bfc17",
"size": 266648,
"url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-windows.jar"
}
}
},
"name": "org.lwjgl:lwjgl-glfw:3.2.2",
"natives": {
"linux": "natives-linux",
"windows": "natives-windows"
},
"rules": [
{
"action": "allow"
},
{
"action": "disallow",
"os": {
"name": "osx"
}
}
]
}
Он содержит следующую информацию:
downloads
- Блок с файлами для скачки, содержит следующие данные:
artifact
- блок с информацией о файле библиотекиclassifiers
- блок с информацией о нативных файлах. Содержит следующее:natives-{x}
- объект с информацией о файле содержащим нативные файлы, гдеx
- наименование ОС из блокаnatives
name
- название библиотекиnatives
- блок, в котором указываются имена нативных файлов в разделе classifiers
, которые нужно скачать. Строка в natives
может содержать шаблон ${arch}
, который следует заменить на 32
или 64
в зависимости от битности используемой системыrules
- список правил, которые используются для определения, на какие платформы загружать файлextract
- список файлов/папок, которые не будут выгружены из файла (для natives
), пример ниже:
"extract": {
"exclude": [
"META-INF/"
]
}
Все поля кроме name
являются необязательными, и что-то из этого может отсутствовать.
Пример блока информации о библиотеке / нативном файле содержит следующее:
path
- путь, куда будет сохранён файл, например:org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar
sha1
- хеш SHA1 файлаsize
- размер файлаurl
- ссылка для скачивания файла, например:https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar
Файлы “нативок” хоть и в формате jar, но не содержат скомпилированный java код, а являются, по сути, архивами с нативными файлами внутри (dll, so, dylib, jnilib).
Ключ rules
используется для определения, на какие платформы загружать файл. Когда действие разрешено, файл будет загружен на платформу, указанную в os. Если действие запрещено, файл не будет загружен на платформу, указанную в os. Если ключа ОС нет, правило используется по умолчанию для неуказанных платформ.
Все файлы библиотек загружаются в папку .minecraft/libraries
, в том числе и содержащие нативные файлы. В свою очередь, файлы, содержащие нативные файлы выгружаются лаунчером при запуске клиента в папку .minecraft/bin/{temp_dir}
, где {temp_dir}
- временная папка создаваемая лаунчером и удаляемая после закрытия клиента.
Пример параметра запуска из лога официального лаунчера:
Java argument:-Djava.library.path=C:\Users\mrcat\AppData\Roaming\.minecraft\bin\414e-b72e-34de-d57c
Сборка клиентов под разные лаунчеры
Ниже будет описан процесс сборки клиентов для различных лаунчеров
Sashok724 v3 / KeeperJerry Launcher / GravitLauncher
Ассеты кидаются в папку ассетов, в папку клиента кидаются:
- файл
minecraft.jar
( переименованныйclient.jar
) - папка
libraries
со всеми библиотеками кроме тех, что содержат нативные файлы - папка
natives
со всеми нативными файлами
В GravitLauncher начиная с версии 5.1.0 требуется замена библиотеки authlib. Подробнее в wiki лаунчера.
Также для GravitLauncher начиная с 5.0.10 и выше можно использовать модуль UnsafeCommandPack
Для загрузки ассетов используется команда newdownloadasset [version] [dir]
Для загрузки клиента используется команда newdownloadclient [version] [dir]
При этом следует удалить повторяющиеся библиотеки разных версий (лично мной этот метод не рекомендуется из-за не очевидного поведения загрузчика)
Aurora Launcher
На данный момент структура ассетов и клиентов аналогична структурам лаунчеров указанных выше.
Для скачивания ассетов и клиентов можно использовать встроенные команды downloadassets
и downloadclient
.