fix: enable demo launch only on supported instances

e.g. >= 1.3.1 instances

Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
flow 2022-09-15 19:23:58 -03:00
parent 1b2a7de4e2
commit 81e326571b
No known key found for this signature in database
GPG Key ID: 8D0F221F0A59F469
4 changed files with 31 additions and 1 deletions

View File

@ -245,6 +245,14 @@ QString MinecraftInstance::getLocalLibraryPath() const
return libraries_dir.absolutePath(); return libraries_dir.absolutePath();
} }
bool MinecraftInstance::supportsDemo() const
{
Version instance_ver { getPackProfile()->getComponentVersion("net.minecraft") };
// Demo mode was introduced in 1.3.1: https://minecraft.fandom.com/wiki/Demo_mode#History
// FIXME: Due to Version constraints atm, this can't handle well non-release versions
return instance_ver >= Version("1.3.1");
}
QString MinecraftInstance::jarModsDir() const QString MinecraftInstance::jarModsDir() const
{ {
QDir jarmods_dir(FS::PathCombine(instanceRoot(), "jarmods/")); QDir jarmods_dir(FS::PathCombine(instanceRoot(), "jarmods/"));

View File

@ -69,6 +69,8 @@ public:
// where the instance-local libraries should be // where the instance-local libraries should be
QString getLocalLibraryPath() const; QString getLocalLibraryPath() const;
/** Returns whether the instance, with its version, has support for demo mode. */
[[nodiscard]] bool supportsDemo() const;
////// Profile management ////// ////// Profile management //////
std::shared_ptr<PackProfile> getPackProfile() const; std::shared_ptr<PackProfile> getPackProfile() const;

View File

@ -166,7 +166,13 @@ void InstanceWindow::updateLaunchButtons()
else else
{ {
m_launchOfflineButton->setEnabled(true); m_launchOfflineButton->setEnabled(true);
m_launchDemoButton->setEnabled(true);
// Disable demo-mode if not available.
auto instance = dynamic_cast<MinecraftInstance*>(m_instance.get());
if (instance) {
m_launchDemoButton->setEnabled(instance->supportsDemo());
}
m_killButton->setText(tr("Launch")); m_killButton->setText(tr("Launch"));
m_killButton->setObjectName("launchButton"); m_killButton->setObjectName("launchButton");
m_killButton->setToolTip(tr("Launch the instance")); m_killButton->setToolTip(tr("Launch the instance"));

View File

@ -1253,6 +1253,13 @@ void MainWindow::updateToolsMenu()
normalLaunchOffline->setDisabled(true); normalLaunchOffline->setDisabled(true);
normalLaunchDemo->setDisabled(true); normalLaunchDemo->setDisabled(true);
} }
// Disable demo-mode if not available.
auto instance = dynamic_cast<MinecraftInstance*>(m_selectedInstance.get());
if (instance) {
normalLaunchDemo->setEnabled(instance->supportsDemo());
}
QString profilersTitle = tr("Profilers"); QString profilersTitle = tr("Profilers");
launchMenu->addSeparator()->setText(profilersTitle); launchMenu->addSeparator()->setText(profilersTitle);
launchOfflineMenu->addSeparator()->setText(profilersTitle); launchOfflineMenu->addSeparator()->setText(profilersTitle);
@ -2164,6 +2171,13 @@ void MainWindow::instanceChanged(const QModelIndex &current, const QModelIndex &
ui->actionLaunchInstance->setEnabled(m_selectedInstance->canLaunch()); ui->actionLaunchInstance->setEnabled(m_selectedInstance->canLaunch());
ui->actionLaunchInstanceOffline->setEnabled(m_selectedInstance->canLaunch()); ui->actionLaunchInstanceOffline->setEnabled(m_selectedInstance->canLaunch());
ui->actionLaunchInstanceDemo->setEnabled(m_selectedInstance->canLaunch()); ui->actionLaunchInstanceDemo->setEnabled(m_selectedInstance->canLaunch());
// Disable demo-mode if not available.
auto instance = dynamic_cast<MinecraftInstance*>(m_selectedInstance.get());
if (instance) {
ui->actionLaunchInstanceDemo->setEnabled(instance->supportsDemo());
}
ui->actionKillInstance->setEnabled(m_selectedInstance->isRunning()); ui->actionKillInstance->setEnabled(m_selectedInstance->isRunning());
ui->actionExportInstance->setEnabled(m_selectedInstance->canExport()); ui->actionExportInstance->setEnabled(m_selectedInstance->canExport());
ui->renameButton->setText(m_selectedInstance->name()); ui->renameButton->setText(m_selectedInstance->name());