modded start fix
This commit is contained in:
+32
-3
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user