From 1d8196e11a3ff901d5e65d9f6dc4d2ea98df3cc8 Mon Sep 17 00:00:00 2001 From: swirl Date: Mon, 10 Jan 2022 12:46:43 -0500 Subject: [PATCH] More rebranding Closes: #39 Mostly done with rebranding now. We just need to translate some services to PolyMC. --- cmake/UnitTest/test.rc | 2 +- launcher/Application.cpp | 2 +- launcher/java/JavaUtils.cpp | 10 +++---- launcher/launch/LaunchTask.cpp | 3 +- launcher/launch/steps/CheckJava.cpp | 4 +-- launcher/minecraft/Library.h | 15 +++++----- launcher/minecraft/MinecraftInstance.cpp | 2 +- launcher/minecraft/VersionFile.h | 27 +++++++++--------- launcher/minecraft/auth/AccountList.h | 3 +- launcher/minecraft/auth/MinecraftAccount.h | 3 +- .../launch/MinecraftServerTarget.cpp | 2 +- .../notifications/NotificationChecker.cpp | 2 +- launcher/settings/Setting.h | 3 +- launcher/ui/dialogs/AboutDialog.ui | 2 +- launcher/ui/dialogs/UpdateDialog.cpp | 8 +++--- launcher/ui/dialogs/UpdateDialog.ui | 2 +- launcher/ui/pages/global/AccountListPage.cpp | 4 +-- .../ui/pages/instance/LegacyUpgradePage.ui | 2 +- launcher/ui/pages/instance/VersionPage.cpp | 3 +- launcher/ui/widgets/PageContainer.cpp | 2 +- launcher/updater/DownloadTask.h | 3 +- launcher/updater/GoUpdate.cpp | 2 +- ...t_DownloadTask-test_writeInstallScript.xml | Bin 311 -> 308 bytes libraries/katabasis/README.md | 4 +-- 24 files changed, 57 insertions(+), 53 deletions(-) diff --git a/cmake/UnitTest/test.rc b/cmake/UnitTest/test.rc index 9fe4147e..6c0f0641 100644 --- a/cmake/UnitTest/test.rc +++ b/cmake/UnitTest/test.rc @@ -14,7 +14,7 @@ BEGIN BEGIN BLOCK "000004b0" BEGIN - VALUE "CompanyName", "MultiMC Contributors" + VALUE "CompanyName", "MultiMC & PolyMC Contributors" VALUE "FileDescription", "Testcase" VALUE "FileVersion", "1.0.0.0" VALUE "ProductName", "Launcher Testcase" diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 9bd4ebae..a3e2c44f 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -435,7 +435,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) #endif /* - * Establish the mechanism for communication with an already running MultiMC that uses the same data path. + * Establish the mechanism for communication with an already running PolyMC that uses the same data path. * If there is one, tell it what the user actually wanted to do and exit. * We want to initialize this before logging to avoid messing with the log of a potential already running copy. */ diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index 8249fc29..b5b1fd08 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -77,14 +77,14 @@ QProcessEnvironment CleanEnviroment() qDebug() << "Env: ignoring" << key << value; continue; } - // filter MultiMC-related things + // filter PolyMC-related things if(key.startsWith("QT_")) { qDebug() << "Env: ignoring" << key << value; continue; } #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - // Do not pass LD_* variables to java. They were intended for MultiMC + // Do not pass LD_* variables to java. They were intended for PolyMC if(key.startsWith("LD_")) { qDebug() << "Env: ignoring" << key << value; @@ -290,7 +290,7 @@ QList JavaUtils::FindJavaPaths() KEY_WOW64_64KEY, "SOFTWARE\\Azul Systems\\Zulu", "InstallationPath"); QList ZULU32s = this->FindJavaFromRegistryKey( KEY_WOW64_32KEY, "SOFTWARE\\Azul Systems\\Zulu", "InstallationPath"); - + // BellSoft Liberica QList LIBERICA64s = this->FindJavaFromRegistryKey( KEY_WOW64_64KEY, "SOFTWARE\\BellSoft\\Liberica", "InstallationPath"); @@ -328,7 +328,7 @@ QList JavaUtils::FindJavaPaths() java_candidates.append(ADOPTIUMJDK32s); java_candidates.append(ZULU32s); java_candidates.append(LIBERICA32s); - + java_candidates.append(MakeJavaPtr(this->GetDefaultJava()->path)); QList candidates; @@ -402,7 +402,7 @@ QList JavaUtils::FindJavaPaths() scanJavaDir("/usr/lib/jvm"); scanJavaDir("/usr/lib64/jvm"); scanJavaDir("/usr/lib32/jvm"); - // javas stored in MultiMC's folder + // javas stored in PolyMC's folder scanJavaDir("java"); // manually installed JDKs in /opt scanJavaDir("/opt/jdk"); diff --git a/launcher/launch/LaunchTask.cpp b/launcher/launch/LaunchTask.cpp index e6f6bbac..231a6398 100644 --- a/launcher/launch/LaunchTask.cpp +++ b/launcher/launch/LaunchTask.cpp @@ -212,7 +212,7 @@ shared_qobject_ptr LaunchTask::getLogModel() m_logModel->setMaxLines(m_instance->getConsoleMaxLines()); m_logModel->setStopOnOverflow(m_instance->shouldStopOnConsoleOverflow()); // FIXME: should this really be here? - m_logModel->setOverflowMessage(tr("MultiMC stopped watching the game log because the log length surpassed %1 lines.\n" + m_logModel->setOverflowMessage(tr("PolyMC stopped watching the game log because the log length surpassed %1 lines.\n" "You may have to fix your mods because the game is still logging to files and" " likely wasting harddrive space at an alarming rate!").arg(m_logModel->getMaxLines())); } @@ -277,4 +277,3 @@ QString LaunchTask::substituteVariables(const QString &cmd) const } return out; } - diff --git a/launcher/launch/steps/CheckJava.cpp b/launcher/launch/steps/CheckJava.cpp index fb338231..d3f2148c 100644 --- a/launcher/launch/steps/CheckJava.cpp +++ b/launcher/launch/steps/CheckJava.cpp @@ -87,14 +87,14 @@ void CheckJava::checkJavaFinished(JavaCheckResult result) // Error message displayed if java can't start emit logLine(QString("Could not start java:"), MessageLevel::Error); emit logLines(result.errorLog.split('\n'), MessageLevel::Error); - emit logLine("\nCheck your MultiMC Java settings.", MessageLevel::Launcher); + emit logLine("\nCheck your PolyMC Java settings.", MessageLevel::Launcher); printSystemInfo(false, false); emitFailed(QString("Could not start java!")); return; } case JavaCheckResult::Validity::ReturnedInvalidData: { - emit logLine(QString("Java checker returned some invalid data MultiMC doesn't understand:"), MessageLevel::Error); + emit logLine(QString("Java checker returned some invalid data PolyMC doesn't understand:"), MessageLevel::Error); emit logLines(result.outLog.split('\n'), MessageLevel::Warning); emit logLine("\nMinecraft might not start properly.", MessageLevel::Launcher); printSystemInfo(false, false); diff --git a/launcher/minecraft/Library.h b/launcher/minecraft/Library.h index 41d41a8b..0740a7ca 100644 --- a/launcher/minecraft/Library.h +++ b/launcher/minecraft/Library.h @@ -156,7 +156,7 @@ public: /* methods */ QStringList & failedLocalFiles, const QString & overridePath) const; private: /* methods */ - /// the default storage prefix used by MultiMC + /// the default storage prefix used by PolyMC static QString defaultStoragePrefix(); /// Get the prefix - root of the storage to be used @@ -177,23 +177,23 @@ protected: /* data */ /// DEPRECATED URL prefix of the maven repo where the file can be downloaded QString m_repositoryURL; - /// DEPRECATED: MultiMC-specific absolute URL. takes precedence over the implicit maven repo URL, if defined + /// DEPRECATED: PolyMC-specific absolute URL. takes precedence over the implicit maven repo URL, if defined QString m_absoluteURL; - /// MultiMC extension - filename override + /// PolyMC extension - filename override QString m_filename; - /// DEPRECATED MultiMC extension - display name + /// DEPRECATED PolyMC extension - display name QString m_displayname; /** - * MultiMC-specific type hint - modifies how the library is treated + * PolyMC-specific type hint - modifies how the library is treated */ QString m_hint; /** - * storage - by default the local libraries folder in multimc, but could be elsewhere - * MultiMC specific, because of FTB. + * storage - by default the local libraries folder in polymc, but could be elsewhere + * PolyMC specific, because of FTB. */ QString m_storagePrefix; @@ -215,3 +215,4 @@ protected: /* data */ /// MOJANG: container with Mojang style download info MojangLibraryDownloadInfo::Ptr m_mojangDownloads; }; + diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 0b3c049b..7327f9d5 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -445,7 +445,7 @@ QStringList MinecraftInstance::processMinecraftArgs( } // blatant self-promotion. - token_mapping["profile_name"] = token_mapping["version_name"] = "MultiMC5"; + token_mapping["profile_name"] = token_mapping["version_name"] = "PolyMC"; token_mapping["version_type"] = profile->getMinecraftVersionType(); diff --git a/launcher/minecraft/VersionFile.h b/launcher/minecraft/VersionFile.h index b79fcd4f..239a4069 100644 --- a/launcher/minecraft/VersionFile.h +++ b/launcher/minecraft/VersionFile.h @@ -27,19 +27,19 @@ public: /* methods */ void applyTo(LaunchProfile* profile); public: /* data */ - /// MultiMC: order hint for this version file if no explicit order is set + /// PolyMC: order hint for this version file if no explicit order is set int order = 0; - /// MultiMC: human readable name of this package + /// PolyMC: human readable name of this package QString name; - /// MultiMC: package ID of this package + /// PolyMC: package ID of this package QString uid; - /// MultiMC: version of this package + /// PolyMC: version of this package QString version; - /// MultiMC: DEPRECATED dependency on a Minecraft version + /// PolyMC: DEPRECATED dependency on a Minecraft version QString dependsOnMinecraftVersion; /// Mojang: DEPRECATED used to version the Mojang version format @@ -51,7 +51,7 @@ public: /* data */ /// Mojang: class to launch Minecraft with QString mainClass; - /// MultiMC: class to launch legacy Minecraft with (embed in a custom window) + /// PolyMC: class to launch legacy Minecraft with (embed in a custom window) QString appletClass; /// Mojang: Minecraft launch arguments (may contain placeholders for variable substitution) @@ -69,35 +69,35 @@ public: /* data */ /// Mojang: DEPRECATED asset group to be used with Minecraft QString assets; - /// MultiMC: list of tweaker mod arguments for launchwrapper + /// PolyMC: list of tweaker mod arguments for launchwrapper QStringList addTweakers; /// Mojang: list of libraries to add to the version QList libraries; - /// MultiMC: list of maven files to put in the libraries folder, but not in classpath + /// PolyMC: list of maven files to put in the libraries folder, but not in classpath QList mavenFiles; /// The main jar (Minecraft version library, normally) LibraryPtr mainJar; - /// MultiMC: list of attached traits of this version file - used to enable features + /// PolyMC: list of attached traits of this version file - used to enable features QSet traits; - /// MultiMC: list of jar mods added to this version + /// PolyMC: list of jar mods added to this version QList jarMods; - /// MultiMC: list of mods added to this version + /// PolyMC: list of mods added to this version QList mods; /** - * MultiMC: set of packages this depends on + * PolyMC: set of packages this depends on * NOTE: this is shared with the meta format!!! */ Meta::RequireSet requires; /** - * MultiMC: set of packages this conflicts with + * PolyMC: set of packages this conflicts with * NOTE: this is shared with the meta format!!! */ Meta::RequireSet conflicts; @@ -112,3 +112,4 @@ public: // Mojang: extended asset index download information std::shared_ptr mojangAssetIndex; }; + diff --git a/launcher/minecraft/auth/AccountList.h b/launcher/minecraft/auth/AccountList.h index fa1e7431..025926ae 100644 --- a/launcher/minecraft/auth/AccountList.h +++ b/launcher/minecraft/auth/AccountList.h @@ -24,7 +24,7 @@ /*! * List of available Mojang accounts. - * This should be loaded in the background by MultiMC on startup. + * This should be loaded in the background by PolyMC on startup. */ class AccountList : public QAbstractListModel { @@ -158,3 +158,4 @@ protected: */ bool m_autosave = false; }; + diff --git a/launcher/minecraft/auth/MinecraftAccount.h b/launcher/minecraft/auth/MinecraftAccount.h index 4ac0a3e5..7ab3c746 100644 --- a/launcher/minecraft/auth/MinecraftAccount.h +++ b/launcher/minecraft/auth/MinecraftAccount.h @@ -41,7 +41,7 @@ Q_DECLARE_METATYPE(MinecraftAccountPtr) * A profile within someone's Mojang account. * * Currently, the profile system has not been implemented by Mojang yet, - * but we might as well add some things for it in MultiMC right now so + * but we might as well add some things for it in PolyMC right now so * we don't have to rip the code to pieces to add it later. */ struct AccountProfile @@ -198,3 +198,4 @@ slots: void authSucceeded(); void authFailed(QString reason); }; + diff --git a/launcher/minecraft/launch/MinecraftServerTarget.cpp b/launcher/minecraft/launch/MinecraftServerTarget.cpp index 0f98f356..78a33359 100644 --- a/launcher/minecraft/launch/MinecraftServerTarget.cpp +++ b/launcher/minecraft/launch/MinecraftServerTarget.cpp @@ -23,7 +23,7 @@ MinecraftServerTarget MinecraftServerTarget::parse(const QString &fullAddress) { // The logic below replicates the exact logic minecraft uses for parsing server addresses. // While the conversion is not lossless and eats errors, it ensures the same behavior - // within Minecraft and MultiMC when entering server addresses. + // within Minecraft and PolyMC when entering server addresses. if (fullAddress.startsWith("[")) { int bracket = fullAddress.indexOf("]"); diff --git a/launcher/notifications/NotificationChecker.cpp b/launcher/notifications/NotificationChecker.cpp index c08bcdcb..10b91691 100644 --- a/launcher/notifications/NotificationChecker.cpp +++ b/launcher/notifications/NotificationChecker.cpp @@ -44,7 +44,7 @@ void NotificationChecker::checkForNotifications() if (!m_notificationsUrl.isValid()) { qCritical() << "Failed to check for notifications. No notifications URL set." - << "If you'd like to use MultiMC's notification system, please pass the " + << "If you'd like to use PolyMC's notification system, please pass the " "URL to CMake at compile time."; return; } diff --git a/launcher/settings/Setting.h b/launcher/settings/Setting.h index 9beeb35e..9a5b8210 100644 --- a/launcher/settings/Setting.h +++ b/launcher/settings/Setting.h @@ -33,7 +33,7 @@ public: * Construct a Setting * * Synonyms are all the possible names used in the settings object, in order of preference. - * First synonym is the ID, which identifies the setting in MultiMC. + * First synonym is the ID, which identifies the setting in PolyMC. * * defVal is the default value that will be returned when the settings object * doesn't have any value for this setting. @@ -115,3 +115,4 @@ protected: QStringList m_synonyms; QVariant m_defVal; }; + diff --git a/launcher/ui/dialogs/AboutDialog.ui b/launcher/ui/dialogs/AboutDialog.ui index 4db533ff..822c6f58 100644 --- a/launcher/ui/dialogs/AboutDialog.ui +++ b/launcher/ui/dialogs/AboutDialog.ui @@ -80,7 +80,7 @@ - MultiMC 5 + PolyMC Qt::AlignCenter diff --git a/launcher/ui/dialogs/UpdateDialog.cpp b/launcher/ui/dialogs/UpdateDialog.cpp index c0f6074c..ec77d146 100644 --- a/launcher/ui/dialogs/UpdateDialog.cpp +++ b/launcher/ui/dialogs/UpdateDialog.cpp @@ -38,12 +38,12 @@ void UpdateDialog::loadChangelog() QString url; if(channel == "stable") { - url = QString("https://raw.githubusercontent.com/MultiMC/Launcher/%1/changelog.md").arg(channel); + url = QString("https://raw.githubusercontent.com/PolyMC/PolyMC/%1/changelog.md").arg(channel); m_changelogType = CHANGELOG_MARKDOWN; } else { - url = QString("https://api.github.com/repos/MultiMC/Launcher/compare/%1...%2").arg(BuildConfig.GIT_COMMIT, channel); + url = QString("https://api.github.com/repos/PolyMC/PolyMC/compare/%1...%2").arg(BuildConfig.GIT_COMMIT, channel); m_changelogType = CHANGELOG_COMMITS; } dljob->addNetAction(Net::Download::makeByteArray(QUrl(url), &changelogData)); @@ -58,7 +58,7 @@ QString reprocessMarkdown(QByteArray markdown) QString output = hoedown.process(markdown); // HACK: easier than customizing hoedown - output.replace(QRegExp("GH-([0-9]+)"), "GH-\\1"); + output.replace(QRegExp("GH-([0-9]+)"), "GH-\\1"); qDebug() << output; return output; } @@ -100,7 +100,7 @@ QString reprocessCommits(QByteArray json) result += ""; if(issuenr.length()) { - result += QString("GH-%2").arg(issuenr, issuenr); + result += QString("GH-%2").arg(issuenr, issuenr); } else if(prefix.length()) { diff --git a/launcher/ui/dialogs/UpdateDialog.ui b/launcher/ui/dialogs/UpdateDialog.ui index b0b3dd83..bd94a554 100644 --- a/launcher/ui/dialogs/UpdateDialog.ui +++ b/launcher/ui/dialogs/UpdateDialog.ui @@ -11,7 +11,7 @@ - MultiMC Update + PolyMC Update diff --git a/launcher/ui/pages/global/AccountListPage.cpp b/launcher/ui/pages/global/AccountListPage.cpp index 87fcac86..b8da6c75 100644 --- a/launcher/ui/pages/global/AccountListPage.cpp +++ b/launcher/ui/pages/global/AccountListPage.cpp @@ -132,8 +132,8 @@ void AccountListPage::on_actionAddMicrosoft_triggered() this, tr("Microsoft Accounts not available"), tr( - "Microsoft accounts are only usable on macOS 10.13 or newer, with fully updated MultiMC.\n\n" - "Please update both your operating system and MultiMC." + "Microsoft accounts are only usable on macOS 10.13 or newer, with fully updated PolyMC.\n\n" + "Please update both your operating system and PolyMC." ), QMessageBox::Warning )->exec(); diff --git a/launcher/ui/pages/instance/LegacyUpgradePage.ui b/launcher/ui/pages/instance/LegacyUpgradePage.ui index 085919e3..4e803358 100644 --- a/launcher/ui/pages/instance/LegacyUpgradePage.ui +++ b/launcher/ui/pages/instance/LegacyUpgradePage.ui @@ -26,7 +26,7 @@ - <html><body><h1>Upgrade is required</h1><p>MultiMC now supports old Minecraft versions and all the required features in the new (OneSix) instance format. As a consequence, the old (Legacy) format has been entirely disabled and old instances need to be upgraded.</p><p>The upgrade will create a new instance with the same contents as the current one, in the new format. The original instance will remain untouched, in case anything goes wrong in the process.</p><p>Please report any issues on our <a href="https://github.com/MultiMC/Launcher/issues">github issues page</a>.</p><p>There is also a <a href="https://discord.gg/GtPmv93">discord channel for testing here</a>.</p></body></html> + <html><body><h1>Upgrade is required</h1><p>PolyMC now supports old Minecraft versions and all the required features in the new (OneSix) instance format. As a consequence, the old (Legacy) format has been entirely disabled and old instances need to be upgraded.</p><p>The upgrade will create a new instance with the same contents as the current one, in the new format. The original instance will remain untouched, in case anything goes wrong in the process.</p><p>Please report any issues on our <a href="https://github.com/PolyMC/PolyMC/issues">github issues page</a>.</p><p>There is also a <a href="https://discord.gg/GtPmv93">discord channel for testing here</a>.</p></body></html> true diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index 6e57909b..0fa5f68d 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -395,7 +395,7 @@ void VersionPage::on_actionDownload_All_triggered() { CustomMessageBox::selectable( this, tr("Error"), - tr("MultiMC cannot download Minecraft or update instances unless you have at least " + tr("PolyMC cannot download Minecraft or update instances unless you have at least " "one account added.\nPlease add your Mojang or Minecraft account."), QMessageBox::Warning)->show(); return; @@ -635,4 +635,3 @@ void VersionPage::onFilterTextChanged(const QString &newContents) } #include "VersionPage.moc" - diff --git a/launcher/ui/widgets/PageContainer.cpp b/launcher/ui/widgets/PageContainer.cpp index 74a6dff3..6de49467 100644 --- a/launcher/ui/widgets/PageContainer.cpp +++ b/launcher/ui/widgets/PageContainer.cpp @@ -207,7 +207,7 @@ void PageContainer::help() QString pageId = m_currentPage->helpPage(); if (pageId.isEmpty()) return; - DesktopServices::openUrl(QUrl("https://github.com/MultiMC/Launcher/wiki/" + pageId)); + DesktopServices::openUrl(QUrl("https://github.com/PolyMC/PolyMC/wiki/" + pageId)); } } diff --git a/launcher/updater/DownloadTask.h b/launcher/updater/DownloadTask.h index eac26238..f47a3048 100644 --- a/launcher/updater/DownloadTask.h +++ b/launcher/updater/DownloadTask.h @@ -54,7 +54,7 @@ protected: /*! * Downloads the version info files from the repository. * The files for both the current build, and the build that we're updating to need to be downloaded. - * If the current version's info file can't be found, MultiMC will not delete files that + * If the current version's info file can't be found, PolyMC will not delete files that * were removed between versions. It will still replace files that have changed, however. * Note that although the repository URL for the current version is not given to the update task, * the task will attempt to look it up in the UpdateChecker's channel list. @@ -97,3 +97,4 @@ private: }; } + diff --git a/launcher/updater/GoUpdate.cpp b/launcher/updater/GoUpdate.cpp index 76f68b55..91f30b5d 100644 --- a/launcher/updater/GoUpdate.cpp +++ b/launcher/updater/GoUpdate.cpp @@ -104,7 +104,7 @@ bool processFileLists } } - // Next, check each file in MultiMC's folder and see if we need to update them. + // Next, check each file in PolyMC's folder and see if we need to update them. for (VersionFileEntry entry : newVersion) { // TODO: Let's not MD5sum a ton of files on the GUI thread. We should probably find a diff --git a/launcher/updater/testdata/tst_DownloadTask-test_writeInstallScript.xml b/launcher/updater/testdata/tst_DownloadTask-test_writeInstallScript.xml index 09c162cadc38116f8e6cc645c1d90640eeccb7e9..38ecc809c7eda43590cd03fc284108998b004840 100644 GIT binary patch delta 46 zcmdnaw1sKHB$a^toJwD3z0`_S8~x(^(xT*4J1zwU1)G%A;u5<6{e1l#{mO|u>i~K_ B5Fr2n delta 49 zcmdnOw4G_fBz51?oRUmmXT8*lR2%)`{L-T2R68yO1qGXw)Z!95U;R@39Q_jg%!%9T E0Iib|9smFU diff --git a/libraries/katabasis/README.md b/libraries/katabasis/README.md index a4dc0994..08f3c9d1 100644 --- a/libraries/katabasis/README.md +++ b/libraries/katabasis/README.md @@ -1,4 +1,4 @@ -# Katabasis - MS-flavoerd OAuth for Qt, derived from the O2 library +# Katabasis - MS-flavored OAuth for Qt, derived from the O2 library This library's sole purpose is to make interacting with MSA and various MSA and XBox authenticated services less painful. @@ -10,7 +10,7 @@ Notes to contributors: * Please follow the coding style of the existing source, where reasonable * Code contributions are released under Simplified BSD License, as specified in LICENSE. Do not contribute if this license does not suit your code - * If you are interested in working on this, come to the MultiMC Discord server and talk first + * If you are interested in working on this, come to the PolyMC Discord server and talk first ## Installation