diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index dfca52d87..260cf75a9 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -317,4 +317,21 @@ Version::Ptr VersionList::getLatestForParent(const QString& uid, const QString& return latestCompat; } +static const Meta::Version::Ptr& getLatestVersion(const Meta::Version::Ptr& a, const Meta::Version::Ptr& b) +{ + if (!a) + return b; + if (!b) + return a; + return (a->rawTime() > b->rawTime() ? a : b); +} + +Version::Ptr VersionList::getLatest() +{ + Version::Ptr latestCompat = nullptr; + for (auto ver : m_versions) { + latestCompat = getLatestVersion(latestCompat, ver); + } + return latestCompat; +} } // namespace Meta diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index 18681b8ed..1a635e601 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -45,6 +45,7 @@ class VersionList : public BaseVersionList, public BaseEntity { BaseVersion::Ptr getRecommended() const override; Version::Ptr getRecommendedForParent(const QString& uid, const QString& version); Version::Ptr getLatestForParent(const QString& uid, const QString& version); + Version::Ptr getLatest(); QVariant data(const QModelIndex& index, int role) const override; RoleList providesRoles() const override; diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 7749d0f6b..28f5ed9b0 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -181,6 +181,7 @@ void MinecraftInstance::loadSpecificSettings() auto locationOverride = m_settings->registerSetting("OverrideJavaLocation", false); auto argsOverride = m_settings->registerSetting("OverrideJavaArgs", false); m_settings->registerSetting("AutomaticJava", false); + m_settings->registerSetting("UseLatestMinecraftVersion", false); if (auto global_settings = globalSettings()) { m_settings->registerOverride(global_settings->getSetting("JavaPath"), locationOverride); diff --git a/launcher/minecraft/MinecraftLoadAndCheck.cpp b/launcher/minecraft/MinecraftLoadAndCheck.cpp index c0a82e61e..4e7046bb7 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.cpp +++ b/launcher/minecraft/MinecraftLoadAndCheck.cpp @@ -1,4 +1,5 @@ #include "MinecraftLoadAndCheck.h" +#include "Application.h" #include "MinecraftInstance.h" #include "PackProfile.h" @@ -8,6 +9,14 @@ void MinecraftLoadAndCheck::executeTask() { // add offline metadata load task auto components = m_inst->getPackProfile(); + if (m_inst->settings()->get("UseLatestMinecraftVersion").toBool()) { + if (APPLICATION->settings()->get("AutomaticJavaSwitch").toBool() && m_inst->settings()->get("AutomaticJava").toBool() && + m_inst->settings()->get("OverrideJavaLocation").toBool()) { + m_inst->settings()->set("OverrideJavaLocation", false); + m_inst->settings()->set("JavaPath", ""); + } + components->updateLatestMinecraft(); + } if (auto result = components->reload(m_netmode); !result) { emitFailed(result.error); return; diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 8475a1f32..e1e096176 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -1061,3 +1061,20 @@ QList PackProfile::getModLoadersList() } return result; } + +void PackProfile::updateLatestMinecraft() +{ + const QString uid = "net.minecraft"; + auto patch = getComponent(uid); + patch->waitLoadMeta(); // make sure we have latest versions + auto list = patch->getVersionList(); + if (!list) { + return; + } + + auto latest = list->getLatest(); + + qDebug() << "Change" << uid << "to" << latest.get(); + setComponentVersion(uid, latest->descriptor(), true); + resolve(Net::Mode::Online); +} \ No newline at end of file diff --git a/launcher/minecraft/PackProfile.h b/launcher/minecraft/PackProfile.h index d812dfa48..1e7c35ba5 100644 --- a/launcher/minecraft/PackProfile.h +++ b/launcher/minecraft/PackProfile.h @@ -164,6 +164,8 @@ class PackProfile : public QAbstractListModel { /// apply the component patches. Catches all the errors and returns true/false for success/failure void invalidateLaunchProfile(); + void updateLatestMinecraft(); + private: void scheduleSave(); bool saveIsScheduled() const; diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.cpp b/launcher/ui/widgets/MinecraftSettingsWidget.cpp index f46786518..7c3ac4aa1 100644 --- a/launcher/ui/widgets/MinecraftSettingsWidget.cpp +++ b/launcher/ui/widgets/MinecraftSettingsWidget.cpp @@ -60,6 +60,7 @@ MinecraftSettingsWidget::MinecraftSettingsWidget(MinecraftInstancePtr instance, m_ui->serverJoinGroupBox->hide(); m_ui->globalDataPacksGroupBox->hide(); m_ui->loaderGroup->hide(); + m_ui->latestMCVersionCheckBox->hide(); } else { m_javaSettings = new JavaSettingsWidget(m_instance, this); m_ui->javaScrollArea->setWidget(m_javaSettings); @@ -281,6 +282,8 @@ void MinecraftSettingsWidget::loadSettings() m_ui->fabric->blockSignals(false); m_ui->quilt->blockSignals(false); m_ui->liteLoader->blockSignals(false); + + m_ui->latestMCVersionCheckBox->setChecked(settings->get("UseLatestMinecraftVersion").toBool()); } m_ui->legacySettingsGroupBox->setChecked(settings->get("OverrideLegacySettings").toBool()); @@ -457,6 +460,8 @@ void MinecraftSettingsWidget::saveSettings() } else { settings->reset("InstanceAccountId"); } + + settings->set("UseLatestMinecraftVersion", m_ui->latestMCVersionCheckBox->isChecked()); } bool overrideLegacySettings = m_instance == nullptr || m_ui->legacySettingsGroupBox->isChecked(); diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.ui b/launcher/ui/widgets/MinecraftSettingsWidget.ui index 4a35addc0..ab8cbfac2 100644 --- a/launcher/ui/widgets/MinecraftSettingsWidget.ui +++ b/launcher/ui/widgets/MinecraftSettingsWidget.ui @@ -519,6 +519,13 @@ It is most likely you will need to change the path - please refer to the mod's w + + + + Always use the latest minecraft version + + +