modded start fix

This commit is contained in:
2026-08-28 01:29:39 +03:00
parent bbc8633257
commit 616840fda9
+31 -2
View File
@@ -94,6 +94,23 @@ QStringList GameLauncher::missingFiles(const LaunchOptions &options,
return missing; 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, QStringList GameLauncher::buildArguments(const LaunchOptions &options,
const MinecraftVersion &version, const MinecraftVersion &version,
const QString &nativesDir) const QString &nativesDir)
@@ -153,9 +170,21 @@ QStringList GameLauncher::buildArguments(const LaunchOptions &options,
arguments << QStringLiteral("-Xmx%1M").arg(options.maxMemoryMb); arguments << QStringLiteral("-Xmx%1M").arg(options.maxMemoryMb);
arguments += options.extraJvmArgs; 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) { for (const QString &argument : version.jvmArgs) {
const QString resolved = substitute(argument, variables); QString resolved = substitute(argument, variables);
if (!resolved.contains(QStringLiteral("${"))) if (resolved.contains(QStringLiteral("${")))
continue;
if (!clientJarName.isEmpty() && resolved.startsWith(QLatin1String("-DignoreList="))
&& !ignoreListCovers(resolved, clientJarName))
resolved += u',' + clientJarName;
arguments << resolved; arguments << resolved;
} }