add launcher folder and some checks to it

This commit is contained in:
2026-08-23 01:20:18 +03:00
parent 2c4b594c90
commit af4230500e
13 changed files with 328 additions and 169 deletions
+31 -21
View File
@@ -47,8 +47,8 @@ QString mavenToPath(const QString &name)
if (parts.size() > 3)
file += u'-' + parts[3];
return QString(parts[0]).replace(u'.', u'/') + u'/' + parts[1] + u'/' + parts[2]
+ u'/' + file + u'.' + extension;
return QString(parts[0]).replace(u'.', u'/') + u'/' + parts[1] + u'/' + parts[2] + u'/' + file
+ u'.' + extension;
}
// Ключ для дедупликации: у наследника и родителя одна и та же библиотека часто
@@ -163,9 +163,12 @@ void parseLibraries(const QJsonObject &root,
// Основной артефакт. В новом формате (1.19+) натив-библиотеки — это
// отдельные записи с классификатором natives-*, у них тоже есть artifact.
if (downloads.contains(QStringLiteral("artifact")) || !downloads.contains(QStringLiteral("classifiers"))) {
MinecraftLibrary library = libraryFromDownload(
name, downloads.value(QStringLiteral("artifact")).toObject(), relativePath);
if (downloads.contains(QStringLiteral("artifact"))
|| !downloads.contains(QStringLiteral("classifiers"))) {
MinecraftLibrary library
= libraryFromDownload(name,
downloads.value(QStringLiteral("artifact")).toObject(),
relativePath);
// У Fabric у части библиотек нет блока downloads вообще — только
// name и адрес Maven-репозитория, путь собираем из координат.
@@ -193,13 +196,12 @@ void parseLibraries(const QJsonObject &root,
continue;
classifier.replace(QStringLiteral("${arch}"),
VersionLoader::osArch() == QStringLiteral("x86") ? QStringLiteral("32")
: QStringLiteral("64"));
: QStringLiteral("64"));
const QJsonObject classifiers = downloads.value(QStringLiteral("classifiers")).toObject();
MinecraftLibrary library = libraryFromDownload(
name + u':' + classifier,
classifiers.value(classifier).toObject(),
mavenToPath(name + u':' + classifier));
MinecraftLibrary library = libraryFromDownload(name + u':' + classifier,
classifiers.value(classifier).toObject(),
mavenToPath(name + u':' + classifier));
if (library.path.isEmpty())
continue;
@@ -219,7 +221,7 @@ void pickNativesForCurrentArch(QList<MinecraftLibrary> &libraries)
: VersionLoader::osName();
const QString base = QStringLiteral("natives-") + osPart;
QHash<QString, QString> chosen; // group:artifact -> классификатор
QHash<QString, QString> chosen; // group:artifact -> классификатор
for (const MinecraftLibrary &library : libraries) {
if (!library.native)
continue;
@@ -263,7 +265,7 @@ QString VersionLoader::osArch()
const QString arch = QSysInfo::currentCpuArchitecture();
if (arch == QLatin1String("i386") || arch == QLatin1String("i686"))
return QStringLiteral("x86");
return arch; // x86_64 / arm64 — совпадают с тем, что пишет Mojang
return arch; // x86_64 / arm64 — совпадают с тем, что пишет Mojang
}
QString VersionLoader::nativeClassifier()
@@ -326,12 +328,14 @@ MinecraftVersion VersionLoader::load(const QString &gameDir,
while (!currentId.isEmpty()) {
if (chainIds.contains(currentId)) {
if (error)
*error = QObject::tr("Циклическая зависимость inheritsFrom в версии «%1»").arg(currentId);
*error = QObject::tr("Циклическая зависимость inheritsFrom в версии «%1»")
.arg(currentId);
return version;
}
if (chain.size() >= kMaxInheritanceDepth) {
if (error)
*error = QObject::tr("Слишком длинная цепочка inheritsFrom у версии «%1»").arg(versionId);
*error = QObject::tr("Слишком длинная цепочка inheritsFrom у версии «%1»")
.arg(versionId);
return version;
}
@@ -392,7 +396,8 @@ MinecraftVersion VersionLoader::load(const QString &gameDir,
.value(QStringLiteral("id"))
.toString();
if (!fileId.isEmpty())
version.loggingConfigPath = gameDir + QStringLiteral("/assets/log_configs/") + fileId;
version.loggingConfigPath = gameDir + QStringLiteral("/assets/log_configs/")
+ fileId;
}
// minecraftArguments (до 1.13) заменяет список целиком, arguments.game — дополняет.
@@ -405,9 +410,12 @@ MinecraftVersion VersionLoader::load(const QString &gameDir,
const QJsonObject arguments = object.value(QStringLiteral("arguments")).toObject();
appendArguments(arguments.value(QStringLiteral("jvm")).toArray(), version.jvmArgs, features);
appendArguments(arguments.value(QStringLiteral("game")).toArray(), version.gameArgs, features);
appendArguments(arguments.value(QStringLiteral("game")).toArray(),
version.gameArgs,
features);
const QByteArray raw = QJsonDocument(arguments.value(QStringLiteral("game")).toArray()).toJson();
const QByteArray raw = QJsonDocument(arguments.value(QStringLiteral("game")).toArray())
.toJson();
if (raw.contains("quickPlayMultiplayer"))
version.supportsQuickPlay = true;
if (raw.contains("resolution_width"))
@@ -437,10 +445,12 @@ MinecraftVersion VersionLoader::load(const QString &gameDir,
pickNativesForCurrentArch(version.libraries);
// До 1.13 jvm-аргументов в json нет — собираем их сами.
const bool hasClasspathArg = std::any_of(
version.jvmArgs.cbegin(), version.jvmArgs.cend(), [](const QString &argument) {
return argument == QLatin1String("-cp") || argument == QLatin1String("-classpath");
});
const bool hasClasspathArg = std::any_of(version.jvmArgs.cbegin(),
version.jvmArgs.cend(),
[](const QString &argument) {
return argument == QLatin1String("-cp")
|| argument == QLatin1String("-classpath");
});
if (!hasClasspathArg) {
version.jvmArgs << QStringLiteral("-Djava.library.path=${natives_directory}")
<< QStringLiteral("-Dminecraft.launcher.brand=${launcher_name}")