From 4bf6e59f3b1ff22e09c9d085d34db6d70ed1d2cd Mon Sep 17 00:00:00 2001 From: clague <93119153+clague@users.noreply.github.com> Date: Sat, 14 Jun 2025 23:10:49 +0800 Subject: [PATCH 1/3] feat: add ability to change assets download server Signed-off-by: clague <93119153+clague@users.noreply.github.com> --- buildconfig/BuildConfig.h | 2 +- launcher/Application.cpp | 9 ++++++ launcher/minecraft/AssetsUtils.cpp | 7 +++- launcher/minecraft/update/AssetUpdateTask.cpp | 10 +++++- launcher/ui/pages/global/APIPage.cpp | 16 ++++++++++ launcher/ui/pages/global/APIPage.ui | 32 +++++++++++++++++++ 6 files changed, 73 insertions(+), 3 deletions(-) diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index 10c38e3d6..045d987d4 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -166,7 +166,7 @@ class Config { QString DISCORD_URL; QString SUBREDDIT_URL; - QString RESOURCE_BASE = "https://resources.download.minecraft.net/"; + QString DEFAULT_RESOURCE_BASE = "https://resources.download.minecraft.net/"; QString LIBRARY_BASE = "https://libraries.minecraft.net/"; QString IMGUR_BASE_URL = "https://api.imgur.com/3/"; QString FMLLIBS_BASE_URL; diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 99b72870b..a4c96d645 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -864,6 +864,15 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) // get rid of invalid meta urls if (!metaUrl.isValid() || (metaUrl.scheme() != "http" && metaUrl.scheme() != "https")) m_settings->reset("MetaURLOverride"); + + // Resource URL + m_settings->registerSetting("ResourceURLOverride", ""); + + QUrl resourceUrl(m_settings->get("ResourceURLOverride").toString()); + + // get rid of invalid resource urls + if (!resourceUrl.isValid() || (resourceUrl.scheme() != "http" && resourceUrl.scheme() != "https")) + m_settings->reset("ResourceURLOverride"); } m_settings->registerSetting("CloseAfterLaunch", false); diff --git a/launcher/minecraft/AssetsUtils.cpp b/launcher/minecraft/AssetsUtils.cpp index 083924dc6..d723efc7a 100644 --- a/launcher/minecraft/AssetsUtils.cpp +++ b/launcher/minecraft/AssetsUtils.cpp @@ -298,7 +298,12 @@ QString AssetObject::getLocalPath() QUrl AssetObject::getUrl() { - return BuildConfig.RESOURCE_BASE + getRelPath(); + auto s = APPLICATION->settings(); + auto resourceURL = s->get("ResourceURLOverride").toString(); + if (resourceURL.isEmpty()) { + return BuildConfig.DEFAULT_RESOURCE_BASE + getRelPath(); + } + return resourceURL + getRelPath(); } QString AssetObject::getRelPath() diff --git a/launcher/minecraft/update/AssetUpdateTask.cpp b/launcher/minecraft/update/AssetUpdateTask.cpp index acdddc833..54cb46e53 100644 --- a/launcher/minecraft/update/AssetUpdateTask.cpp +++ b/launcher/minecraft/update/AssetUpdateTask.cpp @@ -71,7 +71,15 @@ void AssetUpdateTask::assetIndexFinished() auto job = index.getDownloadJob(); if (job) { - setStatus(tr("Getting the assets files from Mojang...")); + QString resourceURLRaw; + auto statusText = tr("Getting the assets files from Mojang..."); + resourceURLRaw = APPLICATION->settings()->get("ResourceURLOverride").toString(); + // FIXME: Need translation + if (!resourceURLRaw.isEmpty()) { + QUrl resourceURL = QUrl(resourceURLRaw); + statusText.replace("Mojang", resourceURL.host()); + } + setStatus(statusText); downloadJob = job; connect(downloadJob.get(), &NetJob::succeeded, this, &AssetUpdateTask::emitSucceeded); connect(downloadJob.get(), &NetJob::failed, this, &AssetUpdateTask::assetsFailed); diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp index a030bf316..83f30f639 100644 --- a/launcher/ui/pages/global/APIPage.cpp +++ b/launcher/ui/pages/global/APIPage.cpp @@ -76,6 +76,7 @@ APIPage::APIPage(QWidget* parent) : QWidget(parent), ui(new Ui::APIPage) updateBaseURLPlaceholder(ui->pasteTypeComboBox->currentIndex()); // NOTE: this allows http://, but we replace that with https later anyway ui->metaURL->setValidator(new QRegularExpressionValidator(s_validUrlRegExp, ui->metaURL)); + ui->resourceURL->setValidator(new QRegularExpressionValidator(s_validUrlRegExp, ui->resourceURL)); ui->baseURLEntry->setValidator(new QRegularExpressionValidator(s_validUrlRegExp, ui->baseURLEntry)); ui->msaClientID->setValidator(new QRegularExpressionValidator(s_validMSAClientID, ui->msaClientID)); ui->flameKey->setValidator(new QRegularExpressionValidator(s_validFlameKey, ui->flameKey)); @@ -137,6 +138,8 @@ void APIPage::loadSettings() ui->msaClientID->setText(msaClientID); QString metaURL = s->get("MetaURLOverride").toString(); ui->metaURL->setText(metaURL); + QString resourceURL = s->get("ResourceURLOverride").toString(); + ui->resourceURL->setText(resourceURL); QString flameKey = s->get("FlameKeyOverride").toString(); ui->flameKey->setText(flameKey); QString modrinthToken = s->get("ModrinthToken").toString(); @@ -156,18 +159,31 @@ void APIPage::applySettings() QString msaClientID = ui->msaClientID->text(); s->set("MSAClientIDOverride", msaClientID); QUrl metaURL(ui->metaURL->text()); + QUrl resourceURL(ui->resourceURL->text()); // Add required trailing slash if (!metaURL.isEmpty() && !metaURL.path().endsWith('/')) { QString path = metaURL.path(); path.append('/'); metaURL.setPath(path); } + + if (!resourceURL.isEmpty() && !resourceURL.path().endsWith('/')) { + QString path = resourceURL.path(); + path.append('/'); + resourceURL.setPath(path); + } // Don't allow HTTP, since meta is basically RCE with all the jar files. if (!metaURL.isEmpty() && metaURL.scheme() == "http") { metaURL.setScheme("https"); } + // Also don't allow HTTP + if (!resourceURL.isEmpty() && resourceURL.scheme() == "http") { + resourceURL.setScheme("https"); + } + s->set("MetaURLOverride", metaURL.toString()); + s->set("ResourceURLOverride", resourceURL.toString()); QString flameKey = ui->flameKey->text(); s->set("FlameKeyOverride", flameKey); QString modrinthToken = ui->modrinthToken->text(); diff --git a/launcher/ui/pages/global/APIPage.ui b/launcher/ui/pages/global/APIPage.ui index c6a4593fc..cc36ff7b2 100644 --- a/launcher/ui/pages/global/APIPage.ui +++ b/launcher/ui/pages/global/APIPage.ui @@ -129,6 +129,38 @@ + + + + Assets Server + + + + + + You can set this to another server if you have problem in downloading assets. + + + Qt::RichText + + + true + + + true + + + + + + + Use Default + + + + + + From 09ec3eb621e11ab0d6668fbecc33a463c001ea37 Mon Sep 17 00:00:00 2001 From: clague <93119153+clague@users.noreply.github.com> Date: Mon, 16 Jun 2025 21:56:23 +0800 Subject: [PATCH 2/3] resolve problems Signed-off-by: clague <93119153+clague@users.noreply.github.com> --- launcher/Application.cpp | 6 +++--- launcher/minecraft/AssetsUtils.cpp | 6 +----- launcher/minecraft/update/AssetUpdateTask.cpp | 14 ++++++-------- launcher/ui/pages/global/APIPage.cpp | 4 ++-- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index a4c96d645..d7182c48d 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -866,13 +866,13 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_settings->reset("MetaURLOverride"); // Resource URL - m_settings->registerSetting("ResourceURLOverride", ""); + m_settings->registerSetting("ResourceURL", BuildConfig.DEFAULT_RESOURCE_BASE); - QUrl resourceUrl(m_settings->get("ResourceURLOverride").toString()); + QUrl resourceUrl(m_settings->get("ResourceURL").toString()); // get rid of invalid resource urls if (!resourceUrl.isValid() || (resourceUrl.scheme() != "http" && resourceUrl.scheme() != "https")) - m_settings->reset("ResourceURLOverride"); + m_settings->reset("ResourceURL"); } m_settings->registerSetting("CloseAfterLaunch", false); diff --git a/launcher/minecraft/AssetsUtils.cpp b/launcher/minecraft/AssetsUtils.cpp index d723efc7a..410d1e689 100644 --- a/launcher/minecraft/AssetsUtils.cpp +++ b/launcher/minecraft/AssetsUtils.cpp @@ -298,11 +298,7 @@ QString AssetObject::getLocalPath() QUrl AssetObject::getUrl() { - auto s = APPLICATION->settings(); - auto resourceURL = s->get("ResourceURLOverride").toString(); - if (resourceURL.isEmpty()) { - return BuildConfig.DEFAULT_RESOURCE_BASE + getRelPath(); - } + auto resourceURL = APPLICATION->settings()->get("ResourceURL").toString(); return resourceURL + getRelPath(); } diff --git a/launcher/minecraft/update/AssetUpdateTask.cpp b/launcher/minecraft/update/AssetUpdateTask.cpp index 54cb46e53..f4a4022e9 100644 --- a/launcher/minecraft/update/AssetUpdateTask.cpp +++ b/launcher/minecraft/update/AssetUpdateTask.cpp @@ -1,5 +1,6 @@ #include "AssetUpdateTask.h" +#include "BuildConfig.h" #include "launch/LaunchStep.h" #include "minecraft/AssetsUtils.h" #include "minecraft/MinecraftInstance.h" @@ -71,15 +72,12 @@ void AssetUpdateTask::assetIndexFinished() auto job = index.getDownloadJob(); if (job) { - QString resourceURLRaw; - auto statusText = tr("Getting the assets files from Mojang..."); - resourceURLRaw = APPLICATION->settings()->get("ResourceURLOverride").toString(); - // FIXME: Need translation - if (!resourceURLRaw.isEmpty()) { - QUrl resourceURL = QUrl(resourceURLRaw); - statusText.replace("Mojang", resourceURL.host()); + QString resourceURL = APPLICATION->settings()->get("ResourceURL").toString(); + QString source = tr("Mojang"); + if (resourceURL != BuildConfig.DEFAULT_RESOURCE_BASE) { + source = QUrl(resourceURL).host(); } - setStatus(statusText); + setStatus(tr("Getting the assets files from %1...").arg(source)); downloadJob = job; connect(downloadJob.get(), &NetJob::succeeded, this, &AssetUpdateTask::emitSucceeded); connect(downloadJob.get(), &NetJob::failed, this, &AssetUpdateTask::assetsFailed); diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp index 83f30f639..3fedbff72 100644 --- a/launcher/ui/pages/global/APIPage.cpp +++ b/launcher/ui/pages/global/APIPage.cpp @@ -138,7 +138,7 @@ void APIPage::loadSettings() ui->msaClientID->setText(msaClientID); QString metaURL = s->get("MetaURLOverride").toString(); ui->metaURL->setText(metaURL); - QString resourceURL = s->get("ResourceURLOverride").toString(); + QString resourceURL = s->get("ResourceURL").toString(); ui->resourceURL->setText(resourceURL); QString flameKey = s->get("FlameKeyOverride").toString(); ui->flameKey->setText(flameKey); @@ -183,7 +183,7 @@ void APIPage::applySettings() } s->set("MetaURLOverride", metaURL.toString()); - s->set("ResourceURLOverride", resourceURL.toString()); + s->set("ResourceURL", resourceURL.toString()); QString flameKey = ui->flameKey->text(); s->set("FlameKeyOverride", flameKey); QString modrinthToken = ui->modrinthToken->text(); From 78dc42f4dd3ba76dcf2e3cdbd55f8cbb7e7811c6 Mon Sep 17 00:00:00 2001 From: clague <93119153+clague@users.noreply.github.com> Date: Wed, 16 Jul 2025 14:56:44 +0800 Subject: [PATCH 3/3] fix grammar Co-authored-by: Seth Flynn Signed-off-by: clague <93119153+clague@users.noreply.github.com> --- launcher/ui/pages/global/APIPage.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/global/APIPage.ui b/launcher/ui/pages/global/APIPage.ui index cc36ff7b2..b918ae29e 100644 --- a/launcher/ui/pages/global/APIPage.ui +++ b/launcher/ui/pages/global/APIPage.ui @@ -138,7 +138,7 @@ - You can set this to another server if you have problem in downloading assets. + You can set this to another server if you have problems with downloading assets. Qt::RichText