From 616840fda98e6d7d750e18b5eeba2f63e98ff3d8 Mon Sep 17 00:00:00 2001 From: galeon Date: Fri, 28 Aug 2026 01:29:39 +0300 Subject: [PATCH] modded start fix --- gamelauncher.cpp | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/gamelauncher.cpp b/gamelauncher.cpp index 13e2615..be66d50 100644 --- a/gamelauncher.cpp +++ b/gamelauncher.cpp @@ -94,6 +94,23 @@ QStringList GameLauncher::missingFiles(const LaunchOptions &options, return missing; } +namespace { + +// -DignoreList у Forge 1.17+ — список префиксов имён файлов, которые +// BootstrapLauncher не берёт в слой модулей. Сравнение идёт по началу имени. +bool ignoreListCovers(const QString &ignoreListArgument, const QString &fileName) +{ + const QString value = ignoreListArgument.mid(QStringLiteral("-DignoreList=").size()); + const QStringList prefixes = value.split(u',', Qt::SkipEmptyParts); + for (const QString &prefix : prefixes) { + if (!prefix.isEmpty() && fileName.startsWith(prefix)) + return true; + } + return false; +} + +} // namespace + QStringList GameLauncher::buildArguments(const LaunchOptions &options, const MinecraftVersion &version, const QString &nativesDir) @@ -153,10 +170,22 @@ QStringList GameLauncher::buildArguments(const LaunchOptions &options, arguments << QStringLiteral("-Xmx%1M").arg(options.maxMemoryMb); arguments += options.extraJvmArgs; + // Forge 1.17+ собирает слой модулей из classpath, пропуская всё, чьё имя + // начинается с записи в -DignoreList. Ванильный клиентский jar записан там + // как ${version_name}.jar — с расчётом на лаунчер Mojang, который кладёт в + // classpath jar самого профиля. Своего jar у профиля Forge нет, мы кладём + // родительский, и без его имени в списке он становится вторым модулем с + // классами Minecraft: «Modules minecraft and _1._20._1 export package ...». + const QString clientJarName = QFileInfo(version.clientJarPath).fileName(); + for (const QString &argument : version.jvmArgs) { - const QString resolved = substitute(argument, variables); - if (!resolved.contains(QStringLiteral("${"))) - arguments << resolved; + QString resolved = substitute(argument, variables); + if (resolved.contains(QStringLiteral("${"))) + continue; + if (!clientJarName.isEmpty() && resolved.startsWith(QLatin1String("-DignoreList=")) + && !ignoreListCovers(resolved, clientJarName)) + resolved += u',' + clientJarName; + arguments << resolved; } if (!version.loggingArgument.isEmpty() && QFile::exists(version.loggingConfigPath)) {