65 lines
2.8 KiB
C++
65 lines
2.8 KiB
C++
#pragma once
|
||
|
||
// Миниатюрный Mojang для FakeInternet: манифест версий, json версий, client.jar,
|
||
// библиотеки (в т.ч. натив под текущую ОС), индекс ассетов, сами ассеты и
|
||
// конфиг логирования. Содержимое крошечное, но устроено как настоящее —
|
||
// VersionInstaller и GameLauncher работают с ним без поблажек.
|
||
|
||
#include "fakeinternet.h"
|
||
|
||
#include <QByteArray>
|
||
#include <QHash>
|
||
#include <QJsonObject>
|
||
#include <QString>
|
||
#include <QStringList>
|
||
|
||
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<QString, QByteArray> 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<VersionSpec> m_specs;
|
||
QHash<QString, QByteArray> m_versionJson; // id → json
|
||
QHash<QString, QHash<QString, QByteArray>> m_expected; // id → (путь → данные)
|
||
QHash<QString, File> m_files; // относительный путь → файл
|
||
};
|