diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp
index 635cecfac..90c066fe3 100644
--- a/launcher/minecraft/MinecraftInstance.cpp
+++ b/launcher/minecraft/MinecraftInstance.cpp
@@ -250,6 +250,10 @@ void MinecraftInstance::loadSpecificSettings()
m_settings->registerSetting("ExportOptionalFiles", true);
m_settings->registerSetting("ExportRecommendedRAM");
+ // Join server on launch, this does not have a global override
+ m_settings->registerSetting("OverrideModDownloadLoaders", false);
+ m_settings->registerSetting("ModDownloadLoaders", QStringList());
+
qDebug() << "Instance-type specific settings were loaded!";
setSpecificSettingsLoaded(true);
diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.cpp b/launcher/ui/widgets/MinecraftSettingsWidget.cpp
index c3d342d42..637e34db7 100644
--- a/launcher/ui/widgets/MinecraftSettingsWidget.cpp
+++ b/launcher/ui/widgets/MinecraftSettingsWidget.cpp
@@ -39,6 +39,7 @@
#include "Application.h"
#include "BuildConfig.h"
+#include "minecraft/PackProfile.h"
#include "minecraft/WorldList.h"
#include "minecraft/auth/AccountList.h"
#include "settings/Setting.h"
@@ -55,6 +56,7 @@ MinecraftSettingsWidget::MinecraftSettingsWidget(MinecraftInstancePtr instance,
m_ui->openGlobalSettingsButton->setVisible(false);
m_ui->instanceAccountGroupBox->hide();
m_ui->serverJoinGroupBox->hide();
+ m_ui->loaderGroup->hide();
} else {
m_javaSettings = new JavaSettingsWidget(m_instance, this);
m_ui->javaScrollArea->setWidget(m_javaSettings);
@@ -93,6 +95,17 @@ MinecraftSettingsWidget::MinecraftSettingsWidget(MinecraftInstancePtr instance,
connect(m_ui->openGlobalSettingsButton, &QCommandLinkButton::clicked, this, &MinecraftSettingsWidget::openGlobalSettings);
connect(m_ui->serverJoinAddressButton, &QAbstractButton::toggled, m_ui->serverJoinAddress, &QWidget::setEnabled);
connect(m_ui->worldJoinButton, &QAbstractButton::toggled, m_ui->worldsCb, &QWidget::setEnabled);
+
+ connect(m_ui->loaderGroup, &QGroupBox::toggled, this, [this](bool value) {
+ m_instance->settings()->set("OverrideModDownloadLoaders", value);
+ if (!value)
+ m_instance->settings()->reset("ModDownloadLoaders");
+ });
+ connect(m_ui->neoForge, &QCheckBox::stateChanged, this, &MinecraftSettingsWidget::selectedLoadersChanged);
+ connect(m_ui->forge, &QCheckBox::stateChanged, this, &MinecraftSettingsWidget::selectedLoadersChanged);
+ connect(m_ui->fabric, &QCheckBox::stateChanged, this, &MinecraftSettingsWidget::selectedLoadersChanged);
+ connect(m_ui->quilt, &QCheckBox::stateChanged, this, &MinecraftSettingsWidget::selectedLoadersChanged);
+ connect(m_ui->liteLoader, &QCheckBox::stateChanged, this, &MinecraftSettingsWidget::selectedLoadersChanged);
}
m_ui->maximizedWarning->hide();
@@ -220,6 +233,35 @@ void MinecraftSettingsWidget::loadSettings()
m_ui->instanceAccountGroupBox->setChecked(settings->get("UseAccountForInstance").toBool());
updateAccountsMenu(*settings);
+
+ m_ui->loaderGroup->blockSignals(true);
+ m_ui->neoForge->blockSignals(true);
+ m_ui->forge->blockSignals(true);
+ m_ui->fabric->blockSignals(true);
+ m_ui->quilt->blockSignals(true);
+ m_ui->liteLoader->blockSignals(true);
+ auto instLoaders = m_instance->getPackProfile()->getSupportedModLoaders().value();
+ m_ui->loaderGroup->setChecked(settings->get("OverrideModDownloadLoaders").toBool());
+ auto loaders = settings->get("ModDownloadLoaders").toStringList();
+ if (loaders.isEmpty()) {
+ m_ui->neoForge->setChecked(instLoaders & ModPlatform::NeoForge);
+ m_ui->forge->setChecked(instLoaders & ModPlatform::Forge);
+ m_ui->fabric->setChecked(instLoaders & ModPlatform::Fabric);
+ m_ui->quilt->setChecked(instLoaders & ModPlatform::Quilt);
+ m_ui->liteLoader->setChecked(instLoaders & ModPlatform::LiteLoader);
+ } else {
+ m_ui->neoForge->setChecked(loaders.contains(getModLoaderAsString(ModPlatform::NeoForge)));
+ m_ui->forge->setChecked(loaders.contains(getModLoaderAsString(ModPlatform::Forge)));
+ m_ui->fabric->setChecked(loaders.contains(getModLoaderAsString(ModPlatform::Fabric)));
+ m_ui->quilt->setChecked(loaders.contains(getModLoaderAsString(ModPlatform::Quilt)));
+ m_ui->liteLoader->setChecked(loaders.contains(getModLoaderAsString(ModPlatform::LiteLoader)));
+ }
+ m_ui->loaderGroup->blockSignals(false);
+ m_ui->neoForge->blockSignals(false);
+ m_ui->forge->blockSignals(false);
+ m_ui->fabric->blockSignals(false);
+ m_ui->quilt->blockSignals(false);
+ m_ui->liteLoader->blockSignals(false);
}
m_ui->legacySettingsGroupBox->setChecked(settings->get("OverrideLegacySettings").toBool());
@@ -238,7 +280,6 @@ void MinecraftSettingsWidget::saveSettings()
{
SettingsObject::Lock lock(settings);
-
// Console
bool console = m_instance == nullptr || m_ui->consoleSettingsBox->isChecked();
@@ -267,7 +308,7 @@ void MinecraftSettingsWidget::saveSettings()
settings->set("LaunchMaximized", m_ui->maximizedCheckBox->isChecked());
settings->set("MinecraftWinWidth", m_ui->windowWidthSpinBox->value());
settings->set("MinecraftWinHeight", m_ui->windowHeightSpinBox->value());
- settings->set("CloseAfterLaunch", m_ui->closeAfterLaunchCheck->isChecked());
+ settings->set("CloseAfterLaunch", m_ui->closeAfterLaunchCheck->isChecked());
settings->set("QuitAfterGameStop", m_ui->quitAfterGameStopCheck->isChecked());
} else {
settings->reset("LaunchMaximized");
@@ -444,3 +485,19 @@ bool MinecraftSettingsWidget::isQuickPlaySupported()
{
return m_instance->traits().contains("feature:is_quick_play_singleplayer");
}
+
+void MinecraftSettingsWidget::selectedLoadersChanged()
+{
+ QStringList loaders;
+ if (m_ui->neoForge->isChecked())
+ loaders << getModLoaderAsString(ModPlatform::NeoForge);
+ if (m_ui->forge->isChecked())
+ loaders << getModLoaderAsString(ModPlatform::Forge);
+ if (m_ui->fabric->isChecked())
+ loaders << getModLoaderAsString(ModPlatform::Fabric);
+ if (m_ui->quilt->isChecked())
+ loaders << getModLoaderAsString(ModPlatform::Quilt);
+ if (m_ui->liteLoader->isChecked())
+ loaders << getModLoaderAsString(ModPlatform::LiteLoader);
+ m_instance->settings()->set("ModDownloadLoaders", loaders);
+}
\ No newline at end of file
diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.h b/launcher/ui/widgets/MinecraftSettingsWidget.h
index 86effb337..6be73375e 100644
--- a/launcher/ui/widgets/MinecraftSettingsWidget.h
+++ b/launcher/ui/widgets/MinecraftSettingsWidget.h
@@ -56,6 +56,8 @@ class MinecraftSettingsWidget : public QWidget {
void openGlobalSettings();
void updateAccountsMenu(const SettingsObject& settings);
bool isQuickPlaySupported();
+ private slots:
+ void selectedLoadersChanged();
MinecraftInstancePtr m_instance;
Ui::MinecraftSettingsWidget* m_ui;
diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.ui b/launcher/ui/widgets/MinecraftSettingsWidget.ui
index ed12604fd..15406873a 100644
--- a/launcher/ui/widgets/MinecraftSettingsWidget.ui
+++ b/launcher/ui/widgets/MinecraftSettingsWidget.ui
@@ -58,9 +58,9 @@
0
- -207
- 603
- 694
+ -537
+ 623
+ 1007
@@ -394,11 +394,67 @@
Qt::Horizontal
+
+
+ 0
+ 0
+
+
+ -
+
+
+ Override Mod Download &Loaders
+
+
+ true
+
+
+ false
+
+
+
-
+
+
+ NeoForge
+
+
+
+ -
+
+
+ Forge
+
+
+
+ -
+
+
+ Fabric
+
+
+
+ -
+
+
+ Quilt
+
+
+
+ -
+
+
+ LiteLoader
+
+
+
+
+
+
-
@@ -433,8 +489,8 @@
0
0
- 624
- 487
+ 98
+ 28
@@ -457,8 +513,8 @@
0
0
- 624
- 487
+ 299
+ 499
diff --git a/launcher/ui/widgets/ModFilterWidget.cpp b/launcher/ui/widgets/ModFilterWidget.cpp
index da41b990a..699f5f7d6 100644
--- a/launcher/ui/widgets/ModFilterWidget.cpp
+++ b/launcher/ui/widgets/ModFilterWidget.cpp
@@ -218,7 +218,14 @@ void ModFilterWidget::prepareBasicFilter()
if (m_instance) {
m_filter->hideInstalled = false;
m_filter->side = ""; // or "both"
- auto loaders = m_instance->getPackProfile()->getSupportedModLoaders().value();
+ ModPlatform::ModLoaderTypes loaders;
+ if (m_instance->settings()->get("OverrideModDownloadLoaders").toBool()) {
+ for (auto loader : m_instance->settings()->get("ModDownloadLoaders").toStringList()) {
+ loaders |= ModPlatform::getModLoaderFromString(loader);
+ }
+ } else {
+ loaders = m_instance->getPackProfile()->getSupportedModLoaders().value();
+ }
ui->neoForge->setChecked(loaders & ModPlatform::NeoForge);
ui->forge->setChecked(loaders & ModPlatform::Forge);
ui->fabric->setChecked(loaders & ModPlatform::Fabric);