#pragma once // Миниатюрный Mojang для FakeInternet: манифест версий, json версий, client.jar, // библиотеки (в т.ч. натив под текущую ОС), индекс ассетов, сами ассеты и // конфиг логирования. Содержимое крошечное, но устроено как настоящее — // VersionInstaller и GameLauncher работают с ним без поблажек. #include "fakeinternet.h" #include #include #include #include #include class FakeMojang { public: struct VersionSpec { QString id; QString type = QStringLiteral("release"); QString inheritsFrom; // непусто — «дочерняя» версия без своих файлов bool legacyAssets = false; // индекс с virtual: true (как у 1.6 и старше) int javaMajor = 17; QString releaseTime = QStringLiteral("2023-06-12T13:25:51+00:00"); bool listed = true; // попадает ли в манифест }; explicit FakeMojang(FakeInternet &net); // Публикует версию: json + все файлы, на которые он ссылается. void publish(const VersionSpec &spec); // Переопубликовать манифест (после publish всех версий вызывается автоматически). void routeManifest(); // Подменить ответ на конкретный файл (по относительному пути внутри .minecraft, // например "libraries/com/mojang/brigadier/1.1.8/brigadier-1.1.8.jar"). void overrideFile(const QString &relativePath, const FakeResponse &response); // Что должно лечь на диск после установки: относительный путь → содержимое. QHash expectedFiles(const QString &id) const; // URL json версии и URL конкретного файла. QString versionJsonUrl(const QString &id) const; QString fileUrl(const QString &relativePath) const; QByteArray versionJson(const QString &id) const; static QString manifestUrl(); private: struct File { QString url; QByteArray data; }; QString addObject(const QString &relativePath, const QByteArray &data); FakeInternet &m_net; QList m_specs; QHash m_versionJson; // id → json QHash> m_expected; // id → (путь → данные) QHash m_files; // относительный путь → файл };