Почти всё, что будет описано выше, является вольным пересказом следующей статьи, а также некоторой информацией взятой из личного опыта.

Все доступные версии самой игры перечислены в файле 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.