From 069dacd4646a2dffbba485963cbca8abb55a7aab Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 5 Dec 2025 10:47:11 +0000 Subject: [PATCH] Expand variables in JVM args Signed-off-by: TheKodeToad --- launcher/minecraft/MinecraftInstance.cpp | 105 +++++++++++++---------- launcher/minecraft/MinecraftInstance.h | 2 + 2 files changed, 62 insertions(+), 45 deletions(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index efac92094..7110451f8 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -483,6 +483,29 @@ QStringList MinecraftInstance::getNativeJars() return nativeJars; } +static QString replaceTokensIn(const QString &text, const QMap &with) +{ + // TODO: does this still work?? + QString result; + static const QRegularExpression s_token_regexp("\\$\\{(.+)\\}", QRegularExpression::InvertedGreedinessOption); + QStringList list; + QRegularExpressionMatchIterator i = s_token_regexp.globalMatch(text); + int lastCapturedEnd = 0; + while (i.hasNext()) { + QRegularExpressionMatch match = i.next(); + result.append(text.mid(lastCapturedEnd, match.capturedStart())); + QString key = match.captured(1); + auto iter = with.find(key); + if (iter != with.end()) { + result.append(*iter); + } + lastCapturedEnd = match.capturedEnd(); + } + result.append(text.mid(lastCapturedEnd)); + return result; +} + + QStringList MinecraftInstance::extraArguments() { auto list = BaseInstance::extraArguments(); @@ -495,7 +518,11 @@ QStringList MinecraftInstance::extraArguments() } auto addn = m_components->getProfile()->getAddnJvmArguments(); if (!addn.isEmpty()) { - list.append(addn); + QMap tokenMapping = makeProfileVarMapping(m_components->getProfile()); + + for (const QString &item : addn) { + list.append(replaceTokensIn(item, tokenMapping)); + } } auto agents = m_components->getProfile()->getAgents(); for (auto agent : agents) { @@ -705,28 +732,6 @@ QProcessEnvironment MinecraftInstance::createLaunchEnvironment() return env; } -static QString replaceTokensIn(QString text, QMap with) -{ - // TODO: does this still work?? - QString result; - static const QRegularExpression s_token_regexp("\\$\\{(.+)\\}", QRegularExpression::InvertedGreedinessOption); - QStringList list; - QRegularExpressionMatchIterator i = s_token_regexp.globalMatch(text); - int lastCapturedEnd = 0; - while (i.hasNext()) { - QRegularExpressionMatch match = i.next(); - result.append(text.mid(lastCapturedEnd, match.capturedStart())); - QString key = match.captured(1); - auto iter = with.find(key); - if (iter != with.end()) { - result.append(*iter); - } - lastCapturedEnd = match.capturedEnd(); - } - result.append(text.mid(lastCapturedEnd)); - return result; -} - QStringList MinecraftInstance::processMinecraftArgs(AuthSessionPtr session, MinecraftTarget::Ptr targetToJoin) const { auto profile = m_components->getProfile(); @@ -748,38 +753,27 @@ QStringList MinecraftInstance::processMinecraftArgs(AuthSessionPtr session, Mine } } - QMap token_mapping; + + QMap tokenMapping = makeProfileVarMapping(profile); + // yggdrasil! if (session) { // token_mapping["auth_username"] = session->username; - token_mapping["auth_session"] = session->session; - token_mapping["auth_access_token"] = session->access_token; - token_mapping["auth_player_name"] = session->player_name; - token_mapping["auth_uuid"] = session->uuid; - token_mapping["user_properties"] = session->serializeUserProperties(); - token_mapping["user_type"] = session->user_type; + tokenMapping["auth_session"] = session->session; + tokenMapping["auth_access_token"] = session->access_token; + tokenMapping["auth_player_name"] = session->player_name; + tokenMapping["auth_uuid"] = session->uuid; + tokenMapping["user_properties"] = session->serializeUserProperties(); + tokenMapping["user_type"] = session->user_type; + if (session->demo) { args_pattern += " --demo"; } } - token_mapping["profile_name"] = name(); - token_mapping["version_name"] = profile->getMinecraftVersion(); - token_mapping["version_type"] = profile->getMinecraftVersionType(); - - QString absRootDir = QDir(gameRoot()).absolutePath(); - token_mapping["game_directory"] = absRootDir; - QString absAssetsDir = QDir("assets/").absolutePath(); - auto assets = profile->getMinecraftAssets(); - token_mapping["game_assets"] = AssetsUtils::getAssetsDir(assets->id, resourcesDir()).absolutePath(); - - // 1.7.3+ assets tokens - token_mapping["assets_root"] = absAssetsDir; - token_mapping["assets_index_name"] = assets->id; - QStringList parts = args_pattern.split(' ', Qt::SkipEmptyParts); for (int i = 0; i < parts.length(); i++) { - parts[i] = replaceTokensIn(parts[i], token_mapping); + parts[i] = replaceTokensIn(parts[i], tokenMapping); } return parts; } @@ -1024,6 +1018,27 @@ QMap MinecraftInstance::createCensorFilterFromSession(AuthSess return filter; } +QMap MinecraftInstance::makeProfileVarMapping(std::shared_ptr profile) const +{ + QMap result; + + result["profile_name"] = name(); + result["version_name"] = profile->getMinecraftVersion(); + result["version_type"] = profile->getMinecraftVersionType(); + + QString absRootDir = QDir(gameRoot()).absolutePath(); + result["game_directory"] = absRootDir; + QString absAssetsDir = QDir("assets/").absolutePath(); + auto assets = profile->getMinecraftAssets(); + result["game_assets"] = AssetsUtils::getAssetsDir(assets->id, resourcesDir()).absolutePath(); + + // 1.7.3+ assets tokens + result["assets_root"] = absAssetsDir; + result["assets_index_name"] = assets->id; + + return result; +} + QStringList MinecraftInstance::getLogFileSearchPaths() { return { FS::PathCombine(gameRoot(), "crash-reports"), FS::PathCombine(gameRoot(), "logs"), gameRoot() }; diff --git a/launcher/minecraft/MinecraftInstance.h b/launcher/minecraft/MinecraftInstance.h index a5fa2537b..ecddef69c 100644 --- a/launcher/minecraft/MinecraftInstance.h +++ b/launcher/minecraft/MinecraftInstance.h @@ -50,6 +50,7 @@ class ShaderPackFolderModel; class TexturePackFolderModel; class WorldList; class LaunchStep; +class LaunchProfile; class PackProfile; class MinecraftInstance : public BaseInstance { @@ -158,6 +159,7 @@ class MinecraftInstance : public BaseInstance { protected: QMap createCensorFilterFromSession(AuthSessionPtr session); + QMap makeProfileVarMapping(std::shared_ptr profile) const; protected: // data std::shared_ptr m_components;