diff options
-rw-r--r-- | launcher/Application.cpp | 25 | ||||
-rw-r--r-- | launcher/Application.h | 1 | ||||
-rw-r--r-- | launcher/CMakeLists.txt | 10 | ||||
-rw-r--r-- | launcher/LaunchController.cpp | 11 | ||||
-rw-r--r-- | launcher/LaunchController.h | 5 | ||||
-rw-r--r-- | launcher/minecraft/MinecraftInstance.cpp | 8 | ||||
-rw-r--r-- | launcher/minecraft/MinecraftInstance.h | 2 | ||||
-rw-r--r-- | launcher/ui/InstanceWindow.cpp | 24 | ||||
-rw-r--r-- | launcher/ui/InstanceWindow.h | 2 | ||||
-rw-r--r-- | launcher/ui/MainWindow.cpp | 48 | ||||
-rw-r--r-- | launcher/ui/MainWindow.h | 2 | ||||
-rw-r--r-- | launcher/ui/WinDarkmode.cpp | 32 | ||||
-rw-r--r-- | launcher/ui/WinDarkmode.h | 60 | ||||
-rw-r--r-- | launcher/ui/pages/instance/ServersPage.cpp | 2 | ||||
-rw-r--r-- | libraries/launcher/org/polymc/applet/LegacyFrame.java | 5 | ||||
-rw-r--r-- | libraries/launcher/org/polymc/impl/OneSixLauncher.java | 9 |
16 files changed, 230 insertions, 16 deletions
diff --git a/launcher/Application.cpp b/launcher/Application.cpp index aa937964..0d1db11c 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -60,6 +60,10 @@ #include "ui/themes/BrightTheme.h" #include "ui/themes/CustomTheme.h" +#ifdef Q_OS_WIN +#include "ui/WinDarkmode.h" +#endif + #include "ui/setupwizard/SetupWizard.h" #include "ui/setupwizard/LanguageWizardPage.h" #include "ui/setupwizard/JavaWizardPage.h" @@ -1037,7 +1041,7 @@ void Application::performMainStartupAction() qDebug() << " Launching with account" << m_profileToUse; } - launch(inst, true, nullptr, serverToJoin, accountToUse); + launch(inst, true, false, nullptr, serverToJoin, accountToUse); return; } } @@ -1141,6 +1145,7 @@ void Application::messageReceived(const QByteArray& message) launch( instance, true, + false, nullptr, serverObject, accountObject @@ -1195,6 +1200,15 @@ void Application::setApplicationTheme(const QString& name, bool initial) { auto & theme = (*themeIter).second; theme->apply(initial); +#ifdef Q_OS_WIN + if (m_mainWindow) { + if (QString::compare(theme->id(), "dark") == 0) { + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); + } else { + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), false); + } + } +#endif } else { @@ -1232,6 +1246,7 @@ bool Application::openJsonEditor(const QString &filename) bool Application::launch( InstancePtr instance, bool online, + bool demo, BaseProfilerFactory *profiler, MinecraftServerTargetPtr serverToJoin, MinecraftAccountPtr accountToUse @@ -1255,6 +1270,7 @@ bool Application::launch( controller.reset(new LaunchController()); controller->setInstance(instance); controller->setOnline(online); + controller->setDemo(demo); controller->setProfiler(profiler); controller->setServerToJoin(serverToJoin); controller->setAccountToUse(accountToUse); @@ -1425,6 +1441,13 @@ MainWindow* Application::showMainWindow(bool minimized) m_mainWindow = new MainWindow(); m_mainWindow->restoreState(QByteArray::fromBase64(APPLICATION->settings()->get("MainWindowState").toByteArray())); m_mainWindow->restoreGeometry(QByteArray::fromBase64(APPLICATION->settings()->get("MainWindowGeometry").toByteArray())); +#ifdef Q_OS_WIN + if (QString::compare(settings()->get("ApplicationTheme").toString(), "dark") == 0) { + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); + } else { + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), false); + } +#endif if(minimized) { m_mainWindow->showMinimized(); diff --git a/launcher/Application.h b/launcher/Application.h index 41fd4c47..34ad8c15 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -213,6 +213,7 @@ public slots: bool launch( InstancePtr instance, bool online = true, + bool demo = false, BaseProfilerFactory *profiler = nullptr, MinecraftServerTargetPtr serverToJoin = nullptr, MinecraftAccountPtr accountToUse = nullptr diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 6e93b530..e44b98eb 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -868,6 +868,16 @@ SET(LAUNCHER_SOURCES ui/instanceview/VisualGroup.h ) +if(WIN32) + set(LAUNCHER_SOURCES + ${LAUNCHER_SOURCES} + + # GUI - dark titlebar for Windows 10/11 + ui/WinDarkmode.h + ui/WinDarkmode.cpp + ) +endif() + qt_wrap_ui(LAUNCHER_UI ui/setupwizard/PasteWizardPage.ui ui/pages/global/AccountListPage.ui diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index 11f9b2bb..830fcf82 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -167,6 +167,7 @@ void LaunchController::login() { tries++; m_session = std::make_shared<AuthSession>(); m_session->wants_online = m_online; + m_session->demo = m_demo; m_accountToUse->fillSession(m_session); // Launch immediately in true offline mode @@ -184,12 +185,18 @@ void LaunchController::login() { if(!m_session->wants_online) { // we ask the user for a player name bool ok = false; + + QString message = tr("Choose your offline mode player name."); + if(m_session->demo) { + message = tr("Choose your demo mode player name."); + } + QString lastOfflinePlayerName = APPLICATION->settings()->get("LastOfflinePlayerName").toString(); QString usedname = lastOfflinePlayerName.isEmpty() ? m_session->player_name : lastOfflinePlayerName; QString name = QInputDialog::getText( m_parentWidget, tr("Player name"), - tr("Choose your offline mode player name."), + message, QLineEdit::Normal, usedname, &ok @@ -369,7 +376,7 @@ void LaunchController::launchInstance() } m_launcher->prependStep(new TextPrint(m_launcher.get(), resolved_servers, MessageLevel::Launcher)); } else { - online_mode = "offline"; + online_mode = m_demo ? "demo" : "offline"; } m_launcher->prependStep(new TextPrint(m_launcher.get(), "Launched instance in " + online_mode + " mode\n", MessageLevel::Launcher)); diff --git a/launcher/LaunchController.h b/launcher/LaunchController.h index 2171ad5e..af6c98d1 100644 --- a/launcher/LaunchController.h +++ b/launcher/LaunchController.h @@ -63,6 +63,10 @@ public: m_online = online; } + void setDemo(bool demo) { + m_demo = demo; + } + void setProfiler(BaseProfilerFactory *profiler) { m_profiler = profiler; } @@ -101,6 +105,7 @@ private slots: private: BaseProfilerFactory *m_profiler = nullptr; bool m_online = true; + bool m_demo = false; InstancePtr m_instance; QWidget * m_parentWidget = nullptr; InstanceWindow *m_console = nullptr; diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 9478b1b8..ab904fa2 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -245,6 +245,14 @@ QString MinecraftInstance::getLocalLibraryPath() const 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 { QDir jarmods_dir(FS::PathCombine(instanceRoot(), "jarmods/")); diff --git a/launcher/minecraft/MinecraftInstance.h b/launcher/minecraft/MinecraftInstance.h index d62ac655..fe39674a 100644 --- a/launcher/minecraft/MinecraftInstance.h +++ b/launcher/minecraft/MinecraftInstance.h @@ -69,6 +69,8 @@ public: // where the instance-local libraries should be QString getLocalLibraryPath() const; + /** Returns whether the instance, with its version, has support for demo mode. */ + [[nodiscard]] bool supportsDemo() const; ////// Profile management ////// std::shared_ptr<PackProfile> getPackProfile() const; diff --git a/launcher/ui/InstanceWindow.cpp b/launcher/ui/InstanceWindow.cpp index 0ad8c594..09ce0d67 100644 --- a/launcher/ui/InstanceWindow.cpp +++ b/launcher/ui/InstanceWindow.cpp @@ -95,8 +95,14 @@ InstanceWindow::InstanceWindow(InstancePtr instance, QWidget *parent) m_launchOfflineButton = new QPushButton(); horizontalLayout->addWidget(m_launchOfflineButton); m_launchOfflineButton->setText(tr("Launch Offline")); + + m_launchDemoButton = new QPushButton(); + horizontalLayout->addWidget(m_launchDemoButton); + m_launchDemoButton->setText(tr("Launch Demo")); + updateLaunchButtons(); connect(m_launchOfflineButton, SIGNAL(clicked(bool)), SLOT(on_btnLaunchMinecraftOffline_clicked())); + connect(m_launchDemoButton, SIGNAL(clicked(bool)), SLOT(on_btnLaunchMinecraftDemo_clicked())); m_closeButton = new QPushButton(); m_closeButton->setText(tr("Close")); @@ -143,6 +149,7 @@ void InstanceWindow::updateLaunchButtons() if(m_instance->isRunning()) { m_launchOfflineButton->setEnabled(false); + m_launchDemoButton->setEnabled(false); m_killButton->setText(tr("Kill")); m_killButton->setObjectName("killButton"); m_killButton->setToolTip(tr("Kill the running instance")); @@ -150,6 +157,7 @@ void InstanceWindow::updateLaunchButtons() else if(!m_instance->canLaunch()) { m_launchOfflineButton->setEnabled(false); + m_launchDemoButton->setEnabled(false); m_killButton->setText(tr("Launch")); m_killButton->setObjectName("launchButton"); m_killButton->setToolTip(tr("Launch the instance")); @@ -158,6 +166,13 @@ void InstanceWindow::updateLaunchButtons() else { m_launchOfflineButton->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->setObjectName("launchButton"); m_killButton->setToolTip(tr("Launch the instance")); @@ -169,7 +184,12 @@ void InstanceWindow::updateLaunchButtons() void InstanceWindow::on_btnLaunchMinecraftOffline_clicked() { - APPLICATION->launch(m_instance, false, nullptr); + APPLICATION->launch(m_instance, false, false, nullptr); +} + +void InstanceWindow::on_btnLaunchMinecraftDemo_clicked() +{ + APPLICATION->launch(m_instance, false, true, nullptr); } void InstanceWindow::instanceLaunchTaskChanged(shared_qobject_ptr<LaunchTask> proc) @@ -223,7 +243,7 @@ void InstanceWindow::on_btnKillMinecraft_clicked() } else { - APPLICATION->launch(m_instance, true, nullptr); + APPLICATION->launch(m_instance, true, false, nullptr); } } diff --git a/launcher/ui/InstanceWindow.h b/launcher/ui/InstanceWindow.h index aec07868..554c4c74 100644 --- a/launcher/ui/InstanceWindow.h +++ b/launcher/ui/InstanceWindow.h @@ -74,6 +74,7 @@ slots: void on_closeButton_clicked(); void on_btnKillMinecraft_clicked(); void on_btnLaunchMinecraftOffline_clicked(); + void on_btnLaunchMinecraftDemo_clicked(); void instanceLaunchTaskChanged(shared_qobject_ptr<LaunchTask> proc); void runningStateChanged(bool running); @@ -93,4 +94,5 @@ private: QPushButton *m_closeButton = nullptr; QPushButton *m_killButton = nullptr; QPushButton *m_launchOfflineButton = nullptr; + QPushButton *m_launchDemoButton = nullptr; }; diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 299401f5..58b1ae80 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -240,6 +240,7 @@ public: TranslatedAction actionCAT; TranslatedAction actionCopyInstance; TranslatedAction actionLaunchInstanceOffline; + TranslatedAction actionLaunchInstanceDemo; TranslatedAction actionScreenshots; TranslatedAction actionExportInstance; QVector<TranslatedAction *> all_actions; @@ -499,6 +500,7 @@ public: fileMenu->addAction(actionAddInstance); fileMenu->addAction(actionLaunchInstance); fileMenu->addAction(actionLaunchInstanceOffline); + fileMenu->addAction(actionLaunchInstanceDemo); fileMenu->addAction(actionKillInstance); fileMenu->addAction(actionCloseWindow); fileMenu->addSeparator(); @@ -669,6 +671,12 @@ public: actionLaunchInstanceOffline.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Launch the selected instance in offline mode.")); all_actions.append(&actionLaunchInstanceOffline); + actionLaunchInstanceDemo = TranslatedAction(MainWindow); + actionLaunchInstanceDemo->setObjectName(QStringLiteral("actionLaunchInstanceDemo")); + actionLaunchInstanceDemo.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Launch &Demo")); + actionLaunchInstanceDemo.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Launch the selected instance in demo mode.")); + all_actions.append(&actionLaunchInstanceDemo); + actionKillInstance = TranslatedAction(MainWindow); actionKillInstance->setObjectName(QStringLiteral("actionKillInstance")); actionKillInstance->setDisabled(true); @@ -1195,6 +1203,7 @@ void MainWindow::updateToolsMenu() ui->actionLaunchInstance->setDisabled(!m_selectedInstance || currentInstanceRunning); ui->actionLaunchInstanceOffline->setDisabled(!m_selectedInstance || currentInstanceRunning); + ui->actionLaunchInstanceDemo->setDisabled(!m_selectedInstance || currentInstanceRunning); QMenu *launchMenu = ui->actionLaunchInstance->menu(); QMenu *launchOfflineMenu = ui->actionLaunchInstanceOffline->menu(); @@ -1220,23 +1229,37 @@ void MainWindow::updateToolsMenu() normalLaunch->setShortcut(QKeySequence::Open); QAction *normalLaunchOffline = launchOfflineMenu->addAction(tr("Launch Offline")); normalLaunchOffline->setShortcut(QKeySequence(tr("Ctrl+Shift+O"))); + QAction *normalLaunchDemo = launchOfflineMenu->addAction(tr("Launch Demo")); + normalLaunchDemo->setShortcut(QKeySequence(tr("Ctrl+Alt+O"))); if (m_selectedInstance) { normalLaunch->setEnabled(m_selectedInstance->canLaunch()); normalLaunchOffline->setEnabled(m_selectedInstance->canLaunch()); + normalLaunchDemo->setEnabled(m_selectedInstance->canLaunch()); connect(normalLaunch, &QAction::triggered, [this]() { - APPLICATION->launch(m_selectedInstance, true); + APPLICATION->launch(m_selectedInstance, true, false); }); connect(normalLaunchOffline, &QAction::triggered, [this]() { - APPLICATION->launch(m_selectedInstance, false); + APPLICATION->launch(m_selectedInstance, false, false); + }); + connect(normalLaunchDemo, &QAction::triggered, [this]() { + APPLICATION->launch(m_selectedInstance, false, true); }); } else { normalLaunch->setDisabled(true); normalLaunchOffline->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"); launchMenu->addSeparator()->setText(profilersTitle); launchOfflineMenu->addSeparator()->setText(profilersTitle); @@ -1260,11 +1283,11 @@ void MainWindow::updateToolsMenu() connect(profilerAction, &QAction::triggered, [this, profiler]() { - APPLICATION->launch(m_selectedInstance, true, profiler.get()); + APPLICATION->launch(m_selectedInstance, true, false, profiler.get()); }); connect(profilerOfflineAction, &QAction::triggered, [this, profiler]() { - APPLICATION->launch(m_selectedInstance, false, profiler.get()); + APPLICATION->launch(m_selectedInstance, false, false, profiler.get()); }); } else @@ -2096,6 +2119,14 @@ void MainWindow::on_actionLaunchInstanceOffline_triggered() } } +void MainWindow::on_actionLaunchInstanceDemo_triggered() +{ + if (m_selectedInstance) + { + APPLICATION->launch(m_selectedInstance, false, true); + } +} + void MainWindow::on_actionKillInstance_triggered() { if(m_selectedInstance && m_selectedInstance->isRunning()) @@ -2139,6 +2170,14 @@ void MainWindow::instanceChanged(const QModelIndex ¤t, const QModelIndex & ui->setInstanceActionsEnabled(true); ui->actionLaunchInstance->setEnabled(m_selectedInstance->canLaunch()); ui->actionLaunchInstanceOffline->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->actionExportInstance->setEnabled(m_selectedInstance->canExport()); ui->renameButton->setText(m_selectedInstance->name()); @@ -2158,6 +2197,7 @@ void MainWindow::instanceChanged(const QModelIndex ¤t, const QModelIndex & ui->setInstanceActionsEnabled(false); ui->actionLaunchInstance->setEnabled(false); ui->actionLaunchInstanceOffline->setEnabled(false); + ui->actionLaunchInstanceDemo->setEnabled(false); ui->actionKillInstance->setEnabled(false); APPLICATION->settings()->set("SelectedInstance", QString()); selectionBad(); diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h index dde3d02c..8b41bf94 100644 --- a/launcher/ui/MainWindow.h +++ b/launcher/ui/MainWindow.h @@ -140,6 +140,8 @@ private slots: void on_actionLaunchInstanceOffline_triggered(); + void on_actionLaunchInstanceDemo_triggered(); + void on_actionKillInstance_triggered(); void on_actionDeleteInstance_triggered(); diff --git a/launcher/ui/WinDarkmode.cpp b/launcher/ui/WinDarkmode.cpp new file mode 100644 index 00000000..eac68e4f --- /dev/null +++ b/launcher/ui/WinDarkmode.cpp @@ -0,0 +1,32 @@ +#include <QWidget> + +#include "WinDarkmode.h" + +namespace WinDarkmode { + +/* See https://github.com/statiolake/neovim-qt/commit/da8eaba7f0e38b6b51f3bacd02a8cc2d1f7a34d8 */ +void setDarkWinTitlebar(WId winid, bool darkmode) +{ + HWND hwnd = reinterpret_cast<HWND>(winid); + BOOL dark = (BOOL) darkmode; + + HMODULE hUxtheme = LoadLibraryExW(L"uxtheme.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); + HMODULE hUser32 = GetModuleHandleW(L"user32.dll"); + fnAllowDarkModeForWindow AllowDarkModeForWindow + = reinterpret_cast<fnAllowDarkModeForWindow>(GetProcAddress(hUxtheme, MAKEINTRESOURCEA(133))); + fnSetPreferredAppMode SetPreferredAppMode + = reinterpret_cast<fnSetPreferredAppMode>(GetProcAddress(hUxtheme, MAKEINTRESOURCEA(135))); + fnSetWindowCompositionAttribute SetWindowCompositionAttribute + = reinterpret_cast<fnSetWindowCompositionAttribute>(GetProcAddress(hUser32, "SetWindowCompositionAttribute")); + + SetPreferredAppMode(AllowDark); + AllowDarkModeForWindow(hwnd, dark); + WINDOWCOMPOSITIONATTRIBDATA data = { + WCA_USEDARKMODECOLORS, + &dark, + sizeof(dark) + }; + SetWindowCompositionAttribute(hwnd, &data); +} + +} diff --git a/launcher/ui/WinDarkmode.h b/launcher/ui/WinDarkmode.h new file mode 100644 index 00000000..5b567c6b --- /dev/null +++ b/launcher/ui/WinDarkmode.h @@ -0,0 +1,60 @@ +#pragma once + +#include <windows.h> +#include <dwmapi.h> + + +namespace WinDarkmode { + +void setDarkWinTitlebar(WId winid, bool darkmode); + +enum PreferredAppMode { + Default, + AllowDark, + ForceDark, + ForceLight, + Max +}; + +enum WINDOWCOMPOSITIONATTRIB { + WCA_UNDEFINED = 0, + WCA_NCRENDERING_ENABLED = 1, + WCA_NCRENDERING_POLICY = 2, + WCA_TRANSITIONS_FORCEDISABLED = 3, + WCA_ALLOW_NCPAINT = 4, + WCA_CAPTION_BUTTON_BOUNDS = 5, + WCA_NONCLIENT_RTL_LAYOUT = 6, + WCA_FORCE_ICONIC_REPRESENTATION = 7, + WCA_EXTENDED_FRAME_BOUNDS = 8, + WCA_HAS_ICONIC_BITMAP = 9, + WCA_THEME_ATTRIBUTES = 10, + WCA_NCRENDERING_EXILED = 11, + WCA_NCADORNMENTINFO = 12, + WCA_EXCLUDED_FROM_LIVEPREVIEW = 13, + WCA_VIDEO_OVERLAY_ACTIVE = 14, + WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15, + WCA_DISALLOW_PEEK = 16, + WCA_CLOAK = 17, + WCA_CLOAKED = 18, + WCA_ACCENT_POLICY = 19, + WCA_FREEZE_REPRESENTATION = 20, + WCA_EVER_UNCLOAKED = 21, + WCA_VISUAL_OWNER = 22, + WCA_HOLOGRAPHIC = 23, + WCA_EXCLUDED_FROM_DDA = 24, + WCA_PASSIVEUPDATEMODE = 25, + WCA_USEDARKMODECOLORS = 26, + WCA_LAST = 27 +}; + +struct WINDOWCOMPOSITIONATTRIBDATA { + WINDOWCOMPOSITIONATTRIB Attrib; + PVOID pvData; + SIZE_T cbData; +}; + +using fnAllowDarkModeForWindow = BOOL (WINAPI *)(HWND hWnd, BOOL allow); +using fnSetPreferredAppMode = PreferredAppMode (WINAPI *)(PreferredAppMode appMode); +using fnSetWindowCompositionAttribute = BOOL (WINAPI *)(HWND hwnd, WINDOWCOMPOSITIONATTRIBDATA *); + +} diff --git a/launcher/ui/pages/instance/ServersPage.cpp b/launcher/ui/pages/instance/ServersPage.cpp index e5cce96c..5e8bd7cc 100644 --- a/launcher/ui/pages/instance/ServersPage.cpp +++ b/launcher/ui/pages/instance/ServersPage.cpp @@ -811,7 +811,7 @@ void ServersPage::on_actionMove_Down_triggered() void ServersPage::on_actionJoin_triggered() { const auto &address = m_model->at(currentServer)->m_address; - APPLICATION->launch(m_inst, true, nullptr, std::make_shared<MinecraftServerTarget>(MinecraftServerTarget::parse(address))); + APPLICATION->launch(m_inst, true, false, nullptr, std::make_shared<MinecraftServerTarget>(MinecraftServerTarget::parse(address))); } #include "ServersPage.moc" diff --git a/libraries/launcher/org/polymc/applet/LegacyFrame.java b/libraries/launcher/org/polymc/applet/LegacyFrame.java index 2cdd17d7..7ae56e60 100644 --- a/libraries/launcher/org/polymc/applet/LegacyFrame.java +++ b/libraries/launcher/org/polymc/applet/LegacyFrame.java @@ -63,7 +63,8 @@ public final class LegacyFrame extends Frame { int winSizeH, boolean maximize, String serverAddress, - String serverPort + String serverPort, + boolean isDemo ) { // Implements support for launching in to multiplayer on classic servers using a mpticket // file generated by an external program and stored in the instance's root folder. @@ -106,7 +107,7 @@ public final class LegacyFrame extends Frame { appletWrap.setParameter("sessionid", session); appletWrap.setParameter("stand-alone", "true"); // Show the quit button. appletWrap.setParameter("haspaid", "true"); // Some old versions need this for world saves to work. - appletWrap.setParameter("demo", "false"); + appletWrap.setParameter("demo", isDemo ? "true" : "false"); appletWrap.setParameter("fullscreen", "false"); add(appletWrap); diff --git a/libraries/launcher/org/polymc/impl/OneSixLauncher.java b/libraries/launcher/org/polymc/impl/OneSixLauncher.java index 362ff8d6..d43101eb 100644 --- a/libraries/launcher/org/polymc/impl/OneSixLauncher.java +++ b/libraries/launcher/org/polymc/impl/OneSixLauncher.java @@ -24,8 +24,8 @@ import java.applet.Applet; import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.Collections; import java.util.List; +import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; @@ -58,10 +58,10 @@ public final class OneSixLauncher implements Launcher { public OneSixLauncher(Parameters params) { classLoader = ClassLoader.getSystemClassLoader(); - mcParams = params.allSafe("param", Collections.<String>emptyList()); + mcParams = params.allSafe("param", new ArrayList<String>()); mainClass = params.firstSafe("mainClass", "net.minecraft.client.Minecraft"); appletClass = params.firstSafe("appletClass", "net.minecraft.client.MinecraftApplet"); - traits = params.allSafe("traits", Collections.<String>emptyList()); + traits = params.allSafe("traits", new ArrayList<String>()); userName = params.first("userName"); sessionId = params.first("sessionId"); @@ -137,7 +137,8 @@ public final class OneSixLauncher implements Launcher { winSizeH, maximize, serverAddress, - serverPort + serverPort, + mcParams.contains("--demo") ); return; |