64 lines
2.8 KiB
C++
64 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; // относительный путь → файл
|
|||
|
|
};
|