2026-08-22 18:19:13 +03:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <QJsonArray>
|
|
|
|
|
#include <QList>
|
|
|
|
|
#include <QSet>
|
|
|
|
|
#include <QString>
|
|
|
|
|
#include <QStringList>
|
|
|
|
|
|
|
|
|
|
// Одна библиотека из client.json уже с разрешёнными правилами.
|
|
|
|
|
struct MinecraftLibrary
|
|
|
|
|
{
|
2026-08-23 01:20:18 +03:00
|
|
|
QString name; // Maven-координаты: org.lwjgl:lwjgl:3.3.1:natives-windows
|
|
|
|
|
QString path; // Путь относительно .minecraft/libraries
|
|
|
|
|
QString url; // Откуда качать, если файла нет (может быть пустым)
|
2026-08-22 18:19:13 +03:00
|
|
|
QString sha1;
|
|
|
|
|
qint64 size = 0;
|
2026-08-23 01:20:18 +03:00
|
|
|
bool native = false; // Распаковывается в natives, а не кладётся в classpath
|
|
|
|
|
QStringList extractExclude; // Префиксы, которые не распаковываем
|
2026-08-22 18:19:13 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// client.json, «схлопнутый» по всей цепочке inheritsFrom.
|
|
|
|
|
struct MinecraftVersion
|
|
|
|
|
{
|
2026-08-23 01:20:18 +03:00
|
|
|
QString id; // Имя папки в versions, оно же --version
|
2026-08-22 18:19:13 +03:00
|
|
|
QString mainClass;
|
2026-08-23 01:20:18 +03:00
|
|
|
QString type; // release / snapshot / modified — идёт в --versionType
|
|
|
|
|
QString assetIndexId; // --assetIndex
|
|
|
|
|
QString assetsKind; // Поле "assets": legacy, pre-1.6 либо тот же id
|
|
|
|
|
QString clientJarPath; // Абсолютный путь к <id>.jar (может лежать у родителя)
|
2026-08-22 18:19:13 +03:00
|
|
|
int javaMajor = 8;
|
|
|
|
|
|
2026-08-23 01:20:18 +03:00
|
|
|
QStringList jvmArgs; // Ещё с неподставленными ${...}
|
2026-08-22 18:19:13 +03:00
|
|
|
QStringList gameArgs;
|
|
|
|
|
QList<MinecraftLibrary> libraries;
|
|
|
|
|
|
2026-08-23 01:20:18 +03:00
|
|
|
QString loggingArgument; // -Dlog4j.configurationFile=${path}
|
|
|
|
|
QString loggingConfigPath; // Абсолютный путь к xml, пустой если конфига нет
|
2026-08-22 18:19:13 +03:00
|
|
|
|
2026-08-23 01:20:18 +03:00
|
|
|
bool supportsQuickPlay = false; // 1.20+ понимает --quickPlayMultiplayer
|
2026-08-22 18:19:13 +03:00
|
|
|
bool hasCustomResolutionArgs = false;
|
|
|
|
|
|
|
|
|
|
bool isValid() const { return !id.isEmpty() && !mainClass.isEmpty(); }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
namespace VersionLoader {
|
|
|
|
|
|
|
|
|
|
// Версии, реально установленные в <gameDir>/versions (есть папка и <id>.json).
|
|
|
|
|
QStringList installedVersions(const QString &gameDir);
|
|
|
|
|
|
|
|
|
|
// Читает и разворачивает версию. При ошибке возвращает невалидный объект и пишет error.
|
|
|
|
|
MinecraftVersion load(const QString &gameDir,
|
|
|
|
|
const QString &versionId,
|
|
|
|
|
const QSet<QString> &features,
|
|
|
|
|
QString *error);
|
|
|
|
|
|
|
|
|
|
// Стандартный алгоритм Mojang: правила применяются по порядку, побеждает последнее совпавшее.
|
|
|
|
|
bool rulesAllow(const QJsonArray &rules, const QSet<QString> &features = {});
|
|
|
|
|
|
|
|
|
|
// natives-windows / natives-macos-arm64 / natives-linux ... для текущей машины.
|
|
|
|
|
QString nativeClassifier();
|
|
|
|
|
|
|
|
|
|
QString osName();
|
|
|
|
|
QString osArch();
|
|
|
|
|
|
|
|
|
|
} // namespace VersionLoader
|