add launcher folder and some checks to it
This commit is contained in:
+31
-21
@@ -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}")
|
||||
|
||||
Reference in New Issue
Block a user