# minecraftversion.h — MinecraftVersion и VersionLoader ## Обзор Каждая версия Minecraft описывается файлом `versions//.json` — в нём главный класс, аргументы запуска, список библиотек, индекс ресурсов и требуемая версия Java. Файлы образуют цепочку: профиль модлоадера наследуется от версии игры через поле `inheritsFrom`, а та, в свою очередь, может наследоваться дальше. Заголовок `minecraftversion.h` даёт две вещи: структуры, описывающие версию в разобранном виде, и пространство имён `VersionLoader` — чтение, разворачивание цепочки наследования и работа с установленными версиями на диске. Заголовок подключают [GameLauncher](GameLauncher.md) (собирает из версии командную строку), [VersionInstaller](VersionInstaller.md) (по списку библиотек понимает, что качать) и [LauncherBackend](LauncherBackend.md) (проверяет комплектность и удаляет версии). ## Типы | Имя | Вид | Описание | |-----|-----|----------| | `MinecraftLibrary` | `struct` | Одна библиотека из `client.json` с уже разрешёнными правилами | | `MinecraftVersion` | `struct` | `client.json`, «схлопнутый» по всей цепочке `inheritsFrom` | ### MinecraftLibrary | Поле | Тип | Описание | |------|-----|----------| | `name` | `QString` | Maven-координаты, например `org.lwjgl:lwjgl:3.3.1:natives-windows` | | `path` | `QString` | Путь относительно `.minecraft/libraries` | | `url` | `QString` | Откуда качать, если файла нет; может быть пустым — тогда файл должен уже лежать на месте | | `sha1` | `QString` | Контрольная сумма для проверки скачанного | | `size` | `qint64` | Размер в байтах; `0` — неизвестен | | `native` | `bool` | Библиотека распаковывается в `natives`, а не кладётся в classpath | | `extractExclude` | `QStringList` | Префиксы путей внутри архива, которые не распаковываются | ### MinecraftVersion | Поле | Тип | Описание | |------|-----|----------| | `id` | `QString` | Имя папки в `versions`, оно же значение аргумента `--version` | | `mainClass` | `QString` | Главный класс, который запускает java | | `type` | `QString` | `release`, `snapshot` или `modified`; идёт в `--versionType` | | `assetIndexId` | `QString` | Идентификатор индекса ресурсов для `--assetIndex` | | `assetsKind` | `QString` | Поле `assets` версии: `legacy`, `pre-1.6` либо тот же идентификатор | | `clientJarPath` | `QString` | Абсолютный путь к `.jar`; может лежать у родительской версии | | `javaMajor` | `int` | Требуемая мажорная версия Java; по умолчанию `8` | | `jvmArgs` | `QStringList` | Аргументы JVM ещё с неподставленными подстановками вида `${...}` | | `gameArgs` | `QStringList` | Аргументы игры, тоже с неподставленными подстановками | | `libraries` | `QList` | Библиотеки версии с уже применёнными правилами | | `loggingArgument` | `QString` | Аргумент вида `-Dlog4j.configurationFile=${path}` | | `loggingConfigPath` | `QString` | Абсолютный путь к xml-конфигурации журнала; пуст, если конфигурации нет | | `supportsQuickPlay` | `bool` | Версия 1.20 и новее понимает `--quickPlayMultiplayer` — так лаунчер подключается к серверу сразу при запуске | | `hasCustomResolutionArgs` | `bool` | Версия принимает аргументы размера окна | Метод `isValid()` возвращает `true`, когда заполнены и `id`, и `mainClass`: именно этим проверяется успешность чтения версии. ## Функции Пространство имён `VersionLoader`. #### QStringList installedVersions(const QString &gameDir) Версии, реально установленные в `/versions`: есть и папка, и файл `.json`. Одной только папки недостаточно — она остаётся после неудачной установки. #### QStringList dependentsOf(const QString &gameDir, const QString &versionId) Установленные профили, у которых `inheritsFrom` равен `versionId`. Без базовой версии они не запустятся, поэтому список показывается пользователю перед удалением версии. #### qint64 installedSize(const QString &gameDir, const QString &versionId) Размер `/versions/` в байтах; `0`, если папки нет. Используется в предупреждении об удалении — версия весит десятки мегабайт, и стоит показать, сколько освободится. #### bool remove(const QString &gameDir, const QString &versionId, QString \*error) Сносит `/versions/`. Отсутствие папки считается успехом. При неудаче возвращает `false` и заполняет `error`. Библиотеки и ресурсы в `libraries/` и `assets/` не трогаются: они общие для всех версий. #### MinecraftVersion load(const QString &gameDir, const QString &versionId, const QSet<QString> &features, QString \*error) Читает версию и разворачивает всю цепочку `inheritsFrom` в один объект. Параметр `features` — набор включённых возможностей, влияющих на применение правил (например, запрошен ли пользовательский размер окна). При ошибке возвращает объект, у которого `isValid()` даёт `false`, и заполняет `error`. #### bool rulesAllow(const QJsonArray &rules, const QSet<QString> &features = {}) Стандартный алгоритм Mojang для блоков `rules`: правила применяются по порядку, побеждает последнее совпавшее. Используется и для библиотек, и для аргументов запуска. #### QString nativeClassifier() Классификатор нативных библиотек для текущей машины: `natives-windows`, `natives-macos-arm64`, `natives-linux` и подобные. По нему из списка библиотек отбираются те, что нужно распаковать. #### QString osName() Имя операционной системы в терминах Mojang — оно подставляется в правила и аргументы. #### QString osArch() Архитектура в терминах Mojang. ## Зависимости Подключает `QJsonArray`, `QList`, `QSet`, `QString` и `QStringList` — только Qt Core. От классов проекта не зависит. ## Пример использования ```cpp QString error; const MinecraftVersion version = VersionLoader::load(gameDir, versionId, features, &error); if (!version.isValid()) { emit launchError(error); return; } QStringList classpath; for (const MinecraftLibrary &library : version.libraries) { if (!library.native) classpath << gameDir + "/libraries/" + library.path; } classpath << version.clientJarPath; ``` --- При создании этого документа использовался ИИ.