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