From f95856d06285a65caf0da7377f42f45c33d9603f Mon Sep 17 00:00:00 2001 From: timoreo Date: Thu, 30 Jun 2022 18:07:08 +0200 Subject: [PATCH 001/616] Add the base of java downloading Signed-off-by: timoreo --- launcher/CMakeLists.txt | 2 + launcher/JavaDownloader.cpp | 165 ++++++++++++++++++++++++++++++++++++ launcher/JavaDownloader.h | 8 ++ 3 files changed, 175 insertions(+) create mode 100644 launcher/JavaDownloader.cpp create mode 100644 launcher/JavaDownloader.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 79ac49c76..4e5508579 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -881,6 +881,8 @@ SET(LAUNCHER_SOURCES ui/instanceview/InstanceDelegate.h ui/instanceview/VisualGroup.cpp ui/instanceview/VisualGroup.h + JavaDownloader.cpp + JavaDownloader.h ) if(WIN32) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp new file mode 100644 index 000000000..43da2df01 --- /dev/null +++ b/launcher/JavaDownloader.cpp @@ -0,0 +1,165 @@ +#include "JavaDownloader.h" +#include "net/NetJob.h" +#include "Application.h" +#include "FileSystem.h" +#include "quazip.h" +#include "MMCZip.h" +#include "net/ChecksumValidator.h" + +//Quick & dirty struct to store files +struct File{ + QString path; + QString url; + QByteArray hash; +}; + +void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) { + //Query the adoptium API to get a good version + auto netJob = new NetJob(QString("JRE::QueryVersions"), APPLICATION->network()); + auto response = new QByteArray(); + netJob->addNetAction(Net::Download::makeByteArray(QUrl("https://launchermeta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); + QObject::connect(netJob, &NetJob::finished,[netJob, response]{ + netJob->deleteLater(); + delete response; + }); + QObject::connect(netJob, &NetJob::succeeded,[response, &OS, isLegacy] { + QJsonParseError parse_error{}; + QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response at " << parse_error.offset + << " reason: " << parse_error.errorString(); + qWarning() << *response; + return; + } + auto versionArray = doc.object()[OS].toObject()[isLegacy ? "jre-legacy" : "java-runtime-gamma"].toArray(); + if(!versionArray.empty()){ + auto url = versionArray[0].toObject()["manifest"].toObject()["url"].toString(); + auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); + auto files = new QByteArray(); + + download->addNetAction(Net::Download::makeByteArray(QUrl(url), files)); + + QObject::connect(download, &NetJob::finished,[download, files]{ + download->deleteLater(); + delete files; + }); + QObject::connect(download, &NetJob::succeeded,[files, isLegacy] { + QJsonParseError parse_error{}; + QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response at " << parse_error.offset + << " reason: " << parse_error.errorString(); + qWarning() << *files; + return; + } + + //valid json doc, begin making jre spot + auto output = FS::PathCombine(QCoreApplication::applicationDirPath(), QString("java/") + (isLegacy ? "java-legacy" : "java-current")); + FS::ensureFolderPathExists(output); + std::vector toDownload; + auto list = doc.object()["files"].toObject(); + for(auto element : list){ + auto obj = element.toObject(); + for(const auto& paths : obj.keys()){ + auto file = FS::PathCombine(output,paths); + + auto type = obj[paths].toObject()["type"].toString(); + if(type == "directory"){ + FS::ensureFolderPathExists(file); + }else if(type == "link"){ + //this is linux only ! + auto target = FS::PathCombine(file,"../"+obj[paths].toObject()["target"].toString()); + QFile(target).link(file); + }else if(type == "file"){ + //TODO download compressed version if it exists ? + auto raw = obj[paths].toObject()["downloads"].toObject()["raw"].toObject(); + auto f = File{file,raw["url"].toString(), QByteArray::fromHex(raw["sha1"].toString().toLatin1())}; + toDownload.push_back(f); + } + } + } + auto elementDownload = new NetJob("JRE::FileDownload", APPLICATION->network()); + for(const auto& file : toDownload){ + auto dl = Net::Download::makeFile(file.url,file.path); + dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, file.hash)); + elementDownload->addNetAction(dl); + } + QObject::connect(elementDownload, &NetJob::finished,[elementDownload]{ + elementDownload->deleteLater(); + }); + elementDownload->start(); + }); + download->start(); + }else{ + //mojang does not have a JRE for us, let's get azul zulu + QString javaVersion = isLegacy ? QString("8.0") : QString("17.0"); + QString azulOS; + QString arch; + QString bitness; + + if(OS == "mac-os-arm64"){ + //macos arm64 + azulOS = "macos"; + arch = "arm"; + bitness = "64"; + }else if(OS == "linux-aarch64"){ + //linux aarch64 + azulOS = "linux"; + arch = "arm"; + bitness = "64"; + } + auto metaResponse = new QByteArray(); + auto downloadJob = new NetJob(QString("JRE::QueryAzulMeta"), APPLICATION->network()); + downloadJob->addNetAction(Net::Download::makeByteArray(QString( + "https://api.azul.com/zulu/download/community/v1.0/bundles/?" + "java_version=%1" + "&os=%2" + "&arch=%3" + "&hw_bitness=%4" + "&ext=zip" //as a zip for all os, even linux + "&bundle_type=jre" //jre only + "&latest=true" //only get the one latest entry + ).arg(javaVersion,azulOS,arch,bitness), metaResponse)); + QObject::connect(downloadJob, &NetJob::finished,[downloadJob, metaResponse]{ + downloadJob->deleteLater(); + delete metaResponse; + }); + + QObject::connect(downloadJob, &NetJob::succeeded,[metaResponse, isLegacy] { + QJsonParseError parse_error{}; + QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response at " << parse_error.offset + << " reason: " << parse_error.errorString(); + qWarning() << *metaResponse; + return; + } + auto array = doc.array(); + if(!array.empty()){ + //JRE found ! download the zip + auto downloadURL = QUrl(array[0].toObject()["url"].toString()); + auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); + const QString path = downloadURL.host() + '/' + downloadURL.path(); + auto entry = APPLICATION->metacache()->resolveEntry("general", path); + entry->setStale(true); + download->addNetAction(Net::Download::makeCached(downloadURL,entry)); + auto zippath = entry->getFullPath(); + QObject::connect(download, &NetJob::finished,[download]{ + download->deleteLater(); + + }); + QObject::connect(download, &NetJob::succeeded,[isLegacy, zippath]{ + auto output = FS::PathCombine(FS::PathCombine(QCoreApplication::applicationDirPath(), "java"),isLegacy ? "java-legacy" : "java-current"); + //This should do all of the extracting and creating folders + MMCZip::extractDir(zippath, output); + }); + }else{ + qWarning() << "No suitable JRE found !!"; + } + }); + } + }); + + netJob->start(); + +} \ No newline at end of file diff --git a/launcher/JavaDownloader.h b/launcher/JavaDownloader.h new file mode 100644 index 000000000..cc073b54c --- /dev/null +++ b/launcher/JavaDownloader.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +namespace JavaDownloader { + /*Downloads the java to the runtimes folder*/ + void downloadJava(bool isLegacy, const QString& OS); +} From 3433c102b70c1c74c882dd2fa19242725676ffe5 Mon Sep 17 00:00:00 2001 From: timoreo Date: Thu, 30 Jun 2022 18:13:52 +0200 Subject: [PATCH 002/616] Remove old comment and change to piston-meta Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index 43da2df01..f1a24a68c 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -14,10 +14,9 @@ struct File{ }; void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) { - //Query the adoptium API to get a good version auto netJob = new NetJob(QString("JRE::QueryVersions"), APPLICATION->network()); auto response = new QByteArray(); - netJob->addNetAction(Net::Download::makeByteArray(QUrl("https://launchermeta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); + netJob->addNetAction(Net::Download::makeByteArray(QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); QObject::connect(netJob, &NetJob::finished,[netJob, response]{ netJob->deleteLater(); delete response; From 9a4a92de4f90334a9dcf1b7b7712f628b232d480 Mon Sep 17 00:00:00 2001 From: timoreo Date: Fri, 1 Jul 2022 08:52:56 +0200 Subject: [PATCH 003/616] Clang format Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 124 +++++++++++++++++------------------- launcher/JavaDownloader.h | 6 +- 2 files changed, 63 insertions(+), 67 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index f1a24a68c..5c3d04a6d 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -1,158 +1,155 @@ #include "JavaDownloader.h" -#include "net/NetJob.h" #include "Application.h" #include "FileSystem.h" -#include "quazip.h" #include "MMCZip.h" #include "net/ChecksumValidator.h" +#include "net/NetJob.h" +#include "quazip.h" -//Quick & dirty struct to store files -struct File{ +// Quick & dirty struct to store files +struct File { QString path; QString url; QByteArray hash; }; -void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) { +void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) +{ auto netJob = new NetJob(QString("JRE::QueryVersions"), APPLICATION->network()); auto response = new QByteArray(); - netJob->addNetAction(Net::Download::makeByteArray(QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); - QObject::connect(netJob, &NetJob::finished,[netJob, response]{ + netJob->addNetAction(Net::Download::makeByteArray( + QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); + QObject::connect(netJob, &NetJob::finished, [netJob, response] { netJob->deleteLater(); delete response; }); - QObject::connect(netJob, &NetJob::succeeded,[response, &OS, isLegacy] { + QObject::connect(netJob, &NetJob::succeeded, [response, &OS, isLegacy] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response at " << parse_error.offset - << " reason: " << parse_error.errorString(); + qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); qWarning() << *response; return; } auto versionArray = doc.object()[OS].toObject()[isLegacy ? "jre-legacy" : "java-runtime-gamma"].toArray(); - if(!versionArray.empty()){ + if (!versionArray.empty()) { auto url = versionArray[0].toObject()["manifest"].toObject()["url"].toString(); auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); auto files = new QByteArray(); download->addNetAction(Net::Download::makeByteArray(QUrl(url), files)); - QObject::connect(download, &NetJob::finished,[download, files]{ + QObject::connect(download, &NetJob::finished, [download, files] { download->deleteLater(); delete files; }); - QObject::connect(download, &NetJob::succeeded,[files, isLegacy] { + QObject::connect(download, &NetJob::succeeded, [files, isLegacy] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response at " << parse_error.offset - << " reason: " << parse_error.errorString(); + qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); qWarning() << *files; return; } - //valid json doc, begin making jre spot - auto output = FS::PathCombine(QCoreApplication::applicationDirPath(), QString("java/") + (isLegacy ? "java-legacy" : "java-current")); + // valid json doc, begin making jre spot + auto output = + FS::PathCombine(QCoreApplication::applicationDirPath(), QString("java/") + (isLegacy ? "java-legacy" : "java-current")); FS::ensureFolderPathExists(output); std::vector toDownload; auto list = doc.object()["files"].toObject(); - for(auto element : list){ + for (auto element : list) { auto obj = element.toObject(); - for(const auto& paths : obj.keys()){ - auto file = FS::PathCombine(output,paths); + for (const auto& paths : obj.keys()) { + auto file = FS::PathCombine(output, paths); auto type = obj[paths].toObject()["type"].toString(); - if(type == "directory"){ + if (type == "directory") { FS::ensureFolderPathExists(file); - }else if(type == "link"){ - //this is linux only ! - auto target = FS::PathCombine(file,"../"+obj[paths].toObject()["target"].toString()); + } else if (type == "link") { + // this is linux only ! + auto target = FS::PathCombine(file, "../" + obj[paths].toObject()["target"].toString()); QFile(target).link(file); - }else if(type == "file"){ - //TODO download compressed version if it exists ? + } else if (type == "file") { + // TODO download compressed version if it exists ? auto raw = obj[paths].toObject()["downloads"].toObject()["raw"].toObject(); - auto f = File{file,raw["url"].toString(), QByteArray::fromHex(raw["sha1"].toString().toLatin1())}; + auto f = File{ file, raw["url"].toString(), QByteArray::fromHex(raw["sha1"].toString().toLatin1()) }; toDownload.push_back(f); } } } auto elementDownload = new NetJob("JRE::FileDownload", APPLICATION->network()); - for(const auto& file : toDownload){ - auto dl = Net::Download::makeFile(file.url,file.path); + for (const auto& file : toDownload) { + auto dl = Net::Download::makeFile(file.url, file.path); dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, file.hash)); elementDownload->addNetAction(dl); } - QObject::connect(elementDownload, &NetJob::finished,[elementDownload]{ - elementDownload->deleteLater(); - }); + QObject::connect(elementDownload, &NetJob::finished, [elementDownload] { elementDownload->deleteLater(); }); elementDownload->start(); }); download->start(); - }else{ - //mojang does not have a JRE for us, let's get azul zulu + } else { + // mojang does not have a JRE for us, let's get azul zulu QString javaVersion = isLegacy ? QString("8.0") : QString("17.0"); QString azulOS; QString arch; QString bitness; - if(OS == "mac-os-arm64"){ - //macos arm64 + if (OS == "mac-os-arm64") { + // macos arm64 azulOS = "macos"; arch = "arm"; bitness = "64"; - }else if(OS == "linux-aarch64"){ - //linux aarch64 + } else if (OS == "linux-aarch64") { + // linux aarch64 azulOS = "linux"; arch = "arm"; bitness = "64"; } auto metaResponse = new QByteArray(); auto downloadJob = new NetJob(QString("JRE::QueryAzulMeta"), APPLICATION->network()); - downloadJob->addNetAction(Net::Download::makeByteArray(QString( - "https://api.azul.com/zulu/download/community/v1.0/bundles/?" - "java_version=%1" - "&os=%2" - "&arch=%3" - "&hw_bitness=%4" - "&ext=zip" //as a zip for all os, even linux - "&bundle_type=jre" //jre only - "&latest=true" //only get the one latest entry - ).arg(javaVersion,azulOS,arch,bitness), metaResponse)); - QObject::connect(downloadJob, &NetJob::finished,[downloadJob, metaResponse]{ + downloadJob->addNetAction(Net::Download::makeByteArray(QString("https://api.azul.com/zulu/download/community/v1.0/bundles/?" + "java_version=%1" + "&os=%2" + "&arch=%3" + "&hw_bitness=%4" + "&ext=zip" // as a zip for all os, even linux + "&bundle_type=jre" // jre only + "&latest=true" // only get the one latest entry + ) + .arg(javaVersion, azulOS, arch, bitness), + metaResponse)); + QObject::connect(downloadJob, &NetJob::finished, [downloadJob, metaResponse] { downloadJob->deleteLater(); delete metaResponse; }); - QObject::connect(downloadJob, &NetJob::succeeded,[metaResponse, isLegacy] { + QObject::connect(downloadJob, &NetJob::succeeded, [metaResponse, isLegacy] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error); if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response at " << parse_error.offset - << " reason: " << parse_error.errorString(); + qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); qWarning() << *metaResponse; return; } auto array = doc.array(); - if(!array.empty()){ - //JRE found ! download the zip + if (!array.empty()) { + // JRE found ! download the zip auto downloadURL = QUrl(array[0].toObject()["url"].toString()); auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); const QString path = downloadURL.host() + '/' + downloadURL.path(); auto entry = APPLICATION->metacache()->resolveEntry("general", path); entry->setStale(true); - download->addNetAction(Net::Download::makeCached(downloadURL,entry)); + download->addNetAction(Net::Download::makeCached(downloadURL, entry)); auto zippath = entry->getFullPath(); - QObject::connect(download, &NetJob::finished,[download]{ - download->deleteLater(); - - }); - QObject::connect(download, &NetJob::succeeded,[isLegacy, zippath]{ - auto output = FS::PathCombine(FS::PathCombine(QCoreApplication::applicationDirPath(), "java"),isLegacy ? "java-legacy" : "java-current"); - //This should do all of the extracting and creating folders + QObject::connect(download, &NetJob::finished, [download] { download->deleteLater(); }); + QObject::connect(download, &NetJob::succeeded, [isLegacy, zippath] { + auto output = FS::PathCombine(FS::PathCombine(QCoreApplication::applicationDirPath(), "java"), + isLegacy ? "java-legacy" : "java-current"); + // This should do all of the extracting and creating folders MMCZip::extractDir(zippath, output); }); - }else{ + } else { qWarning() << "No suitable JRE found !!"; } }); @@ -160,5 +157,4 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) { }); netJob->start(); - } \ No newline at end of file diff --git a/launcher/JavaDownloader.h b/launcher/JavaDownloader.h index cc073b54c..3dd57eebe 100644 --- a/launcher/JavaDownloader.h +++ b/launcher/JavaDownloader.h @@ -3,6 +3,6 @@ #include namespace JavaDownloader { - /*Downloads the java to the runtimes folder*/ - void downloadJava(bool isLegacy, const QString& OS); -} +/*Downloads the java to the runtimes folder*/ +void downloadJava(bool isLegacy, const QString& OS); +} // namespace JavaDownloader From a97387b692456cae3b13b48ea9e5901712334f4c Mon Sep 17 00:00:00 2001 From: timoreo Date: Fri, 1 Jul 2022 09:37:23 +0200 Subject: [PATCH 004/616] Cherry-pick SysInfo from #680 Signed-off-by: timoreo --- launcher/CMakeLists.txt | 2 + launcher/SysInfo.cpp | 155 ++++++++++++++++++++++++++++++++++++++++ launcher/SysInfo.h | 13 ++++ 3 files changed, 170 insertions(+) create mode 100644 launcher/SysInfo.cpp create mode 100644 launcher/SysInfo.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 4e5508579..c4d9cb74f 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -580,6 +580,8 @@ SET(LAUNCHER_SOURCES UpdateController.h ApplicationMessage.h ApplicationMessage.cpp + SysInfo.h + SysInfo.cpp # GUI - general utilities DesktopServices.h diff --git a/launcher/SysInfo.cpp b/launcher/SysInfo.cpp new file mode 100644 index 000000000..4abf39301 --- /dev/null +++ b/launcher/SysInfo.cpp @@ -0,0 +1,155 @@ +#include +#include +#include "settings/SettingsObject.h" +#ifdef Q_OS_MACOS +#include +#endif +#include +#include +#include +#include "MessageLevel.h" +#include +#include +#include +#include "java/JavaUtils.h" +#include "FileSystem.h" +#include "Commandline.h" +#include "Application.h" + +#ifdef Q_OS_MACOS +bool rosettaDetect() { + int ret = 0; + size_t size = sizeof(ret); + if (sysctlbyname("sysctl.proc_translated", &ret, &size, NULL, 0) == -1) + { + return false; + } + if(ret == 0) + { + return false; + } + if(ret == 1) + { + return true; + } + return false; +} +#endif + +namespace SysInfo { +QString currentSystem() { +#if defined(Q_OS_LINUX) + return "linux"; +#elif defined(Q_OS_MACOS) + return "osx"; +#elif defined(Q_OS_WINDOWS) + return "windows"; +#elif defined(Q_OS_FREEBSD) + return "freebsd"; +#elif defined(Q_OS_OPENBSD) + return "openbsd"; +#else + return "unknown"; +#endif +} + +QString useQTForArch(){ + auto qtArch = QSysInfo::currentCpuArchitecture(); +#if defined(Q_OS_MACOS) && !defined(Q_PROCESSOR_ARM) + if(rosettaDetect()) + { + return "arm64"; + } + else + { + return "x86_64"; + } +#endif + return qtArch; +} + +QString runCheckerForArch(const SettingsObjectPtr& settingsObj){ + QString checkerJar = FS::PathCombine(APPLICATION->getJarsPath(), "JavaCheck.jar"); + + QStringList args; + + QProcessPtr process = new QProcess(); + args.append({"-jar", checkerJar}); + process->setArguments(args); + process->setProgram(settingsObj->get("JavaPath").toString()); + process->setProcessChannelMode(QProcess::SeparateChannels); + process->setProcessEnvironment(CleanEnviroment()); + qDebug() << "Running java checker: " + settingsObj->get("JavaPath").toString() + args.join(" ");; + + process->start(); + if(!process->waitForFinished(15000)){ + // we've been waiting for 15 seconds! wtf! OR... it already finished. But HOW WOULD THAT HAPPEN? + process->kill(); // die. BUUURNNNN + // fallback to using polymc arch + return useQTForArch(); + } else { + // yay we can use the java arch + QString stdout_javaChecker; + QString stderr_javaChecker; + + // process stdout + QByteArray data = process->readAllStandardOutput(); + QString added = QString::fromLocal8Bit(data); + added.remove('\r'); + stdout_javaChecker += added; + + // process stderr + data = process->readAllStandardError(); + added = QString::fromLocal8Bit(data); + added.remove('\r'); + stderr_javaChecker += added; + + QMap results; + QStringList lines = stdout_javaChecker.split("\n", QString::SkipEmptyParts); + for(QString line : lines) + { + line = line.trimmed(); + // NOTE: workaround for GH-4125, where garbage is getting printed into stdout on bedrock linux + if (line.contains("/bedrock/strata")) { + continue; + } + + auto parts = line.split('=', QString::SkipEmptyParts); + if(parts.size() != 2 || parts[0].isEmpty() || parts[1].isEmpty()) + { + continue; + } + else + { + results.insert(parts[0], parts[1]); + } + } + + if(!results.contains("os.arch") || !results.contains("java.version") || !results.contains("java.vendor")) + { + // wtf man why + // fallback to using polymc arch + return useQTForArch(); + } + + return results["os.arch"]; + } +} + +QString currentArch(const SettingsObjectPtr& settingsObj) { + auto realJavaArchitecture = settingsObj->get("JavaRealArchitecture").toString(); + if(realJavaArchitecture == ""){ + //BRO WHY NOW I HAVE TO USE A JAVA CHECKER >:( + qDebug() << "SysInfo: BRO I HAVE TO USE A JAVA CHECKER WHY IS JAVA ARCH BORKED"; + settingsObj->set("JavaRealArchitecture", runCheckerForArch(settingsObj)); + realJavaArchitecture = settingsObj->get("JavaRealArchitecture").toString(); + } + //qDebug() << "SysInfo: realJavaArch = " << realJavaArchitecture; + if(realJavaArchitecture == "aarch64"){ + return "arm64"; + } else { + return realJavaArchitecture; + } +} +} + diff --git a/launcher/SysInfo.h b/launcher/SysInfo.h new file mode 100644 index 000000000..a4e41e674 --- /dev/null +++ b/launcher/SysInfo.h @@ -0,0 +1,13 @@ +#include +#include "settings/SettingsObject.h" +#ifdef Q_OS_MACOS +#include +#endif + +namespace SysInfo { +QString currentSystem(); +QString currentArch(const SettingsObjectPtr& settingsObj); +QString runCheckerForArch(const SettingsObjectPtr& settingsObj); +QString useQTForArch(); +} + From 98a82cd4847160f41e728403efee51ebc4d2b60a Mon Sep 17 00:00:00 2001 From: timoreo Date: Fri, 1 Jul 2022 14:03:45 +0200 Subject: [PATCH 005/616] Fix MMCZip bugs Signed-off-by: timoreo --- launcher/MMCZip.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index 9f4e968f7..3b5c44425 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -300,6 +300,11 @@ std::optional MMCZip::extractSubDir(QuaZip *zip, const QString & su name.remove(0, subdir.size()); auto original_name = name; + // Fix subdirs/files ending with a / getting transformed into absolute paths + if(name.startsWith('/')){ + name = name.mid(1); + } + // Fix weird "folders with a single file get squashed" thing QString path; if(name.contains('/') && !name.endsWith('/')){ @@ -319,6 +324,11 @@ std::optional MMCZip::extractSubDir(QuaZip *zip, const QString & su absFilePath = directory.absoluteFilePath(path + name); } + //Block potential file traversal issues + if(!absFilePath.startsWith(directory.absolutePath())){ + qWarning() << "Potential file traversal issue, for path " << absFilePath << " with base name as " << directory.absolutePath(); + continue; + } if (!JlCompress::extractFile(zip, "", absFilePath)) { qWarning() << "Failed to extract file" << original_name << "to" << absFilePath; From 89ce80b27960e66efccfaee20b3baf1596a8ba53 Mon Sep 17 00:00:00 2001 From: timoreo Date: Fri, 1 Jul 2022 14:05:14 +0200 Subject: [PATCH 006/616] Fix Java downloader bugs + Add a test button in JavaPage Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 63 ++++++++++++++++----------- launcher/ui/pages/global/JavaPage.cpp | 41 +++++++++++++++++ launcher/ui/pages/global/JavaPage.h | 1 + launcher/ui/pages/global/JavaPage.ui | 11 ++++- 4 files changed, 88 insertions(+), 28 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index 5c3d04a6d..3af69f025 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -1,6 +1,7 @@ #include "JavaDownloader.h" #include "Application.h" #include "FileSystem.h" +#include "Json.h" #include "MMCZip.h" #include "net/ChecksumValidator.h" #include "net/NetJob.h" @@ -11,6 +12,7 @@ struct File { QString path; QString url; QByteArray hash; + bool isExec; }; void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) @@ -23,7 +25,7 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) netJob->deleteLater(); delete response; }); - QObject::connect(netJob, &NetJob::succeeded, [response, &OS, isLegacy] { + QObject::connect(netJob, &NetJob::succeeded, [response, OS, isLegacy] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -31,7 +33,7 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) qWarning() << *response; return; } - auto versionArray = doc.object()[OS].toObject()[isLegacy ? "jre-legacy" : "java-runtime-gamma"].toArray(); + auto versionArray = Json::ensureArray(Json::ensureObject(doc.object(), OS), isLegacy ? "jre-legacy" : "java-runtime-gamma"); if (!versionArray.empty()) { auto url = versionArray[0].toObject()["manifest"].toObject()["url"].toString(); auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); @@ -53,35 +55,37 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) } // valid json doc, begin making jre spot - auto output = - FS::PathCombine(QCoreApplication::applicationDirPath(), QString("java/") + (isLegacy ? "java-legacy" : "java-current")); + auto output = FS::PathCombine(QString("java"), (isLegacy ? "java-legacy" : "java-current")); FS::ensureFolderPathExists(output); std::vector toDownload; auto list = doc.object()["files"].toObject(); - for (auto element : list) { - auto obj = element.toObject(); - for (const auto& paths : obj.keys()) { - auto file = FS::PathCombine(output, paths); + for (const auto& paths : list.keys()) { + auto file = FS::PathCombine(output, paths); - auto type = obj[paths].toObject()["type"].toString(); - if (type == "directory") { - FS::ensureFolderPathExists(file); - } else if (type == "link") { - // this is linux only ! - auto target = FS::PathCombine(file, "../" + obj[paths].toObject()["target"].toString()); - QFile(target).link(file); - } else if (type == "file") { - // TODO download compressed version if it exists ? - auto raw = obj[paths].toObject()["downloads"].toObject()["raw"].toObject(); - auto f = File{ file, raw["url"].toString(), QByteArray::fromHex(raw["sha1"].toString().toLatin1()) }; - toDownload.push_back(f); - } + auto type = list[paths].toObject()["type"].toString(); + if (type == "directory") { + FS::ensureFolderPathExists(file); + } else if (type == "link") { + // this is linux only ! + auto target = FS::PathCombine(file, "../" + list[paths].toObject()["target"].toString()); + QFile(target).link(file); + } else if (type == "file") { + // TODO download compressed version if it exists ? + auto raw = list[paths].toObject()["downloads"].toObject()["raw"].toObject(); + auto isExec = list[paths].toObject()["executable"].toBool(); + auto f = File{ file, raw["url"].toString(), QByteArray::fromHex(raw["sha1"].toString().toLatin1()), isExec }; + toDownload.push_back(f); } } auto elementDownload = new NetJob("JRE::FileDownload", APPLICATION->network()); for (const auto& file : toDownload) { auto dl = Net::Download::makeFile(file.url, file.path); dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, file.hash)); + if (file.isExec) { + QObject::connect(dl.get(), &Net::Download::succeeded, [file] { + QFile(file.path).setPermissions(QFile(file.path).permissions() | QFileDevice::Permissions(0x1111)); + }); + } elementDownload->addNetAction(dl); } QObject::connect(elementDownload, &NetJob::finished, [elementDownload] { elementDownload->deleteLater(); }); @@ -90,7 +94,7 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) download->start(); } else { // mojang does not have a JRE for us, let's get azul zulu - QString javaVersion = isLegacy ? QString("8.0") : QString("17.0"); + QString javaVersion = isLegacy ? QString("8.0") : QString("18.0"); QString azulOS; QString arch; QString bitness; @@ -100,11 +104,16 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) azulOS = "macos"; arch = "arm"; bitness = "64"; - } else if (OS == "linux-aarch64") { - // linux aarch64 + } else if (OS == "linux-arm64") { + // linux arm64 azulOS = "linux"; arch = "arm"; bitness = "64"; + } else if (OS == "linux-arm") { + // linux arm (32) + azulOS = "linux"; + arch = "arm"; + bitness = "32"; } auto metaResponse = new QByteArray(); auto downloadJob = new NetJob(QString("JRE::QueryAzulMeta"), APPLICATION->network()); @@ -143,16 +152,18 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) download->addNetAction(Net::Download::makeCached(downloadURL, entry)); auto zippath = entry->getFullPath(); QObject::connect(download, &NetJob::finished, [download] { download->deleteLater(); }); - QObject::connect(download, &NetJob::succeeded, [isLegacy, zippath] { + QObject::connect(download, &NetJob::succeeded, [isLegacy, zippath, downloadURL] { auto output = FS::PathCombine(FS::PathCombine(QCoreApplication::applicationDirPath(), "java"), isLegacy ? "java-legacy" : "java-current"); // This should do all of the extracting and creating folders - MMCZip::extractDir(zippath, output); + MMCZip::extractDir(zippath, downloadURL.fileName().chopped(4), output); }); + download->start(); } else { qWarning() << "No suitable JRE found !!"; } }); + downloadJob->start(); } }); diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 2cee15bf1..a57a8ee06 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -52,6 +52,9 @@ #include #include "Application.h" #include +#include "SysInfo.h" +#include "JavaDownloader.h" + JavaPage::JavaPage(QWidget *parent) : QWidget(parent), ui(new Ui::JavaPage) { @@ -177,6 +180,44 @@ void JavaPage::on_javaTestBtn_clicked() checker->run(); } +void JavaPage::on_javaDownloadBtn_clicked(){ + QString sys = SysInfo::currentSystem(); + if(sys == "osx"){ + sys = "mac-os"; + } + QString arch = SysInfo::useQTForArch(); + QString version; + if(sys == "windows"){ + if(arch == "x86_64"){ + version = "windows-x64"; + }else if(arch == "i386"){ + version = "windows-x86"; + }else{ + //Unknown, maybe arm, appending arch for downloader + version = "windows-"+arch; + } + }else if(sys == "mac-os"){ + if(arch == "arm64"){ + version = "mac-os-arm64"; + }else{ + version = "mac-os"; + } + }else if(sys == "linux"){ + if(arch == "x86_64"){ + version = "linux"; + }else { + // will work for i386, and arm(64) + version = "linux-" + arch; + } + }else{ + // ? ? ? ? ? unknown os, at least it won't have a java version on mojang or azul, display warning + QMessageBox::warning(this, tr("Unknown OS"), tr("The OS you are running is not supported by Mojang or Azul. Please install Java manually.")); + return; + } + //TODO display a selection for java 8 or 18 + JavaDownloader::downloadJava(false, version); +} + void JavaPage::checkerFinished() { checker.reset(); diff --git a/launcher/ui/pages/global/JavaPage.h b/launcher/ui/pages/global/JavaPage.h index 64d4098e5..aa06dc0be 100644 --- a/launcher/ui/pages/global/JavaPage.h +++ b/launcher/ui/pages/global/JavaPage.h @@ -85,6 +85,7 @@ slots: void on_javaDetectBtn_clicked(); void on_javaTestBtn_clicked(); void on_javaBrowseBtn_clicked(); + void on_javaDownloadBtn_clicked(); void checkerFinished(); private: diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index 6ccffed4d..c109efbfc 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -6,8 +6,8 @@ 0 0 - 545 - 580 + 559 + 659 @@ -279,6 +279,13 @@ + + + + Download Java + + + From 54ad91c3b79dbd3379e6f0e1c7bc76f149fc6794 Mon Sep 17 00:00:00 2001 From: timoreo Date: Fri, 1 Jul 2022 14:18:34 +0200 Subject: [PATCH 007/616] Anti-scrumped Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index 3af69f025..09aeed5de 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -168,4 +168,4 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) }); netJob->start(); -} \ No newline at end of file +} From 53ddba80778e7c232cd778c1eabc0bc36c3f6414 Mon Sep 17 00:00:00 2001 From: timoreo Date: Sun, 10 Jul 2022 19:56:52 +0200 Subject: [PATCH 008/616] Made JavaDownloader a task and added some quick UI Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 51 +++++++++++++++++---------- launcher/JavaDownloader.h | 17 ++++++--- launcher/ui/pages/global/JavaPage.cpp | 28 +++++++++++---- 3 files changed, 67 insertions(+), 29 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index 09aeed5de..d72f66f36 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -15,17 +15,21 @@ struct File { bool isExec; }; -void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) +void JavaDownloader::executeTask() { + auto OS = m_OS; + auto isLegacy = m_isLegacy; auto netJob = new NetJob(QString("JRE::QueryVersions"), APPLICATION->network()); auto response = new QByteArray(); + setStatus(tr("Querying mojang meta")); netJob->addNetAction(Net::Download::makeByteArray( QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); QObject::connect(netJob, &NetJob::finished, [netJob, response] { netJob->deleteLater(); delete response; }); - QObject::connect(netJob, &NetJob::succeeded, [response, OS, isLegacy] { + QObject::connect(netJob, &NetJob::progress, this, &JavaDownloader::progress); + QObject::connect(netJob, &NetJob::succeeded, [response, OS, isLegacy, this] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -35,6 +39,7 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) } auto versionArray = Json::ensureArray(Json::ensureObject(doc.object(), OS), isLegacy ? "jre-legacy" : "java-runtime-gamma"); if (!versionArray.empty()) { + setStatus(tr("Downloading java from Mojang")); auto url = versionArray[0].toObject()["manifest"].toObject()["url"].toString(); auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); auto files = new QByteArray(); @@ -45,7 +50,8 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) download->deleteLater(); delete files; }); - QObject::connect(download, &NetJob::succeeded, [files, isLegacy] { + QObject::connect(download, &NetJob::progress, this, &JavaDownloader::progress); + QObject::connect(download, &NetJob::succeeded, [files, isLegacy, this] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -89,12 +95,14 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) elementDownload->addNetAction(dl); } QObject::connect(elementDownload, &NetJob::finished, [elementDownload] { elementDownload->deleteLater(); }); + QObject::connect(elementDownload, &NetJob::succeeded, [this]{emitSucceeded();}); elementDownload->start(); }); download->start(); } else { // mojang does not have a JRE for us, let's get azul zulu - QString javaVersion = isLegacy ? QString("8.0") : QString("18.0"); + setStatus(tr("Querying Azul meta")); + QString javaVersion = isLegacy ? QString("8.0") : QString("17.0"); QString azulOS; QString arch; QString bitness; @@ -117,23 +125,24 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) } auto metaResponse = new QByteArray(); auto downloadJob = new NetJob(QString("JRE::QueryAzulMeta"), APPLICATION->network()); - downloadJob->addNetAction(Net::Download::makeByteArray(QString("https://api.azul.com/zulu/download/community/v1.0/bundles/?" - "java_version=%1" - "&os=%2" - "&arch=%3" - "&hw_bitness=%4" - "&ext=zip" // as a zip for all os, even linux - "&bundle_type=jre" // jre only - "&latest=true" // only get the one latest entry - ) - .arg(javaVersion, azulOS, arch, bitness), - metaResponse)); + downloadJob->addNetAction( + Net::Download::makeByteArray(QString("https://api.azul.com/zulu/download/community/v1.0/bundles/?" + "java_version=%1" + "&os=%2" + "&arch=%3" + "&hw_bitness=%4" + "&ext=zip" // as a zip for all os, even linux NOTE !! Linux ARM is .deb only !! + "&bundle_type=jre" // jre only + "&latest=true" // only get the one latest entry + ) + .arg(javaVersion, azulOS, arch, bitness), + metaResponse)); QObject::connect(downloadJob, &NetJob::finished, [downloadJob, metaResponse] { downloadJob->deleteLater(); delete metaResponse; }); - - QObject::connect(downloadJob, &NetJob::succeeded, [metaResponse, isLegacy] { + QObject::connect(downloadJob, &NetJob::progress, this, &JavaDownloader::progress); + QObject::connect(downloadJob, &NetJob::succeeded, [metaResponse, isLegacy, this] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -144,6 +153,7 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) auto array = doc.array(); if (!array.empty()) { // JRE found ! download the zip + setStatus(tr("Downloading java from Azul")); auto downloadURL = QUrl(array[0].toObject()["url"].toString()); auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); const QString path = downloadURL.host() + '/' + downloadURL.path(); @@ -152,15 +162,18 @@ void JavaDownloader::downloadJava(bool isLegacy, const QString& OS) download->addNetAction(Net::Download::makeCached(downloadURL, entry)); auto zippath = entry->getFullPath(); QObject::connect(download, &NetJob::finished, [download] { download->deleteLater(); }); - QObject::connect(download, &NetJob::succeeded, [isLegacy, zippath, downloadURL] { + QObject::connect(download, &NetJob::progress, this, &JavaDownloader::progress); + QObject::connect(download, &NetJob::succeeded, [isLegacy, zippath, downloadURL, this] { + setStatus(tr("Extracting java")); auto output = FS::PathCombine(FS::PathCombine(QCoreApplication::applicationDirPath(), "java"), isLegacy ? "java-legacy" : "java-current"); // This should do all of the extracting and creating folders MMCZip::extractDir(zippath, downloadURL.fileName().chopped(4), output); + emitSucceeded(); }); download->start(); } else { - qWarning() << "No suitable JRE found !!"; + emitFailed(tr("No suitable JRE found")); } }); downloadJob->start(); diff --git a/launcher/JavaDownloader.h b/launcher/JavaDownloader.h index 3dd57eebe..3b7a7c425 100644 --- a/launcher/JavaDownloader.h +++ b/launcher/JavaDownloader.h @@ -1,8 +1,17 @@ #pragma once #include +#include "tasks/Task.h" -namespace JavaDownloader { -/*Downloads the java to the runtimes folder*/ -void downloadJava(bool isLegacy, const QString& OS); -} // namespace JavaDownloader +class JavaDownloader : public Task { + Q_OBJECT + public: + /*Downloads the java to the runtimes folder*/ + explicit JavaDownloader(bool isLegacy, const QString& OS) : m_isLegacy(isLegacy), m_OS(OS) {} + + void executeTask() override; + + private: + bool m_isLegacy; + const QString& m_OS; +}; diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index a57a8ee06..2cc627b7d 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -48,13 +48,14 @@ #include "java/JavaUtils.h" #include "java/JavaInstallList.h" -#include "settings/SettingsObject.h" #include -#include "Application.h" #include -#include "SysInfo.h" +#include "Application.h" #include "JavaDownloader.h" - +#include "SysInfo.h" +#include "settings/SettingsObject.h" +#include "ui/dialogs/ProgressDialog.h" +#include JavaPage::JavaPage(QWidget *parent) : QWidget(parent), ui(new Ui::JavaPage) { @@ -214,8 +215,23 @@ void JavaPage::on_javaDownloadBtn_clicked(){ QMessageBox::warning(this, tr("Unknown OS"), tr("The OS you are running is not supported by Mojang or Azul. Please install Java manually.")); return; } - //TODO display a selection for java 8 or 18 - JavaDownloader::downloadJava(false, version); + //Selection using QMessageBox for java 8 or 17 + QMessageBox box(QMessageBox::Icon::Question, tr("Java version"), tr("Do you want to download Java version 8 or 17?\n Java 8 is recommended for minecraft versions below 1.17\n Java 17 is recommended for minecraft versions above or equal to 1.17"), + QMessageBox::NoButton, this); + box.addButton("Java 17", QMessageBox::YesRole); + auto no = box.addButton("Java 8", QMessageBox::NoRole); + auto cancel = box.addButton(tr("Download both"), QMessageBox::AcceptRole); + box.exec(); + bool isLegacy = box.clickedButton() == no; + + auto down = new JavaDownloader(isLegacy, version); + ProgressDialog dialog(this); + dialog.execWithTask(down); + if(box.clickedButton() == cancel) { + auto dwn = new JavaDownloader(false, version); + ProgressDialog dg(this); + dg.execWithTask(dwn); + } } void JavaPage::checkerFinished() From f946964490c181700cbc0b1b479fd6089f4ba02e Mon Sep 17 00:00:00 2001 From: timoreo Date: Sun, 10 Jul 2022 20:21:52 +0200 Subject: [PATCH 009/616] Regrab a few changes on SysInfo Signed-off-by: timoreo --- launcher/CMakeLists.txt | 2 ++ launcher/SysInfo.cpp | 32 ++++++++++++++++------- launcher/SysInfo.h | 9 +++---- launcher/minecraft/LaunchContext.cpp | 39 ++++++++++++++++++++++++++++ launcher/minecraft/LaunchContext.h | 34 ++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 14 deletions(-) create mode 100644 launcher/minecraft/LaunchContext.cpp create mode 100644 launcher/minecraft/LaunchContext.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index c4d9cb74f..c467957a8 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -271,6 +271,8 @@ set(MINECRAFT_SOURCES minecraft/GradleSpecifier.h minecraft/MinecraftInstance.cpp minecraft/MinecraftInstance.h + minecraft/LaunchContext.cpp + minecraft/LaunchContext.h minecraft/LaunchProfile.cpp minecraft/LaunchProfile.h minecraft/Component.cpp diff --git a/launcher/SysInfo.cpp b/launcher/SysInfo.cpp index 4abf39301..010eb84c8 100644 --- a/launcher/SysInfo.cpp +++ b/launcher/SysInfo.cpp @@ -1,6 +1,6 @@ #include #include -#include "settings/SettingsObject.h" +#include "minecraft/LaunchContext.h" #ifdef Q_OS_MACOS #include #endif @@ -68,18 +68,24 @@ QString useQTForArch(){ return qtArch; } -QString runCheckerForArch(const SettingsObjectPtr& settingsObj){ - QString checkerJar = FS::PathCombine(APPLICATION->getJarsPath(), "JavaCheck.jar"); +QString runCheckerForArch(LaunchContext launchContext){ + QString checkerJar = JavaUtils::getJavaCheckPath(); + + if (checkerJar.isEmpty()) + { + qDebug() << "Java checker library could not be found. Please check your installation."; + return useQTForArch(); + } QStringList args; QProcessPtr process = new QProcess(); args.append({"-jar", checkerJar}); process->setArguments(args); - process->setProgram(settingsObj->get("JavaPath").toString()); + process->setProgram(launchContext.getJavaPath().toString()); process->setProcessChannelMode(QProcess::SeparateChannels); process->setProcessEnvironment(CleanEnviroment()); - qDebug() << "Running java checker: " + settingsObj->get("JavaPath").toString() + args.join(" ");; + qDebug() << "Running java checker: " + launchContext.getJavaPath().toString() + args.join(" ");; process->start(); if(!process->waitForFinished(15000)){ @@ -105,7 +111,11 @@ QString runCheckerForArch(const SettingsObjectPtr& settingsObj){ stderr_javaChecker += added; QMap results; +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + QStringList lines = stdout_javaChecker.split("\n", Qt::SkipEmptyParts); +#else QStringList lines = stdout_javaChecker.split("\n", QString::SkipEmptyParts); +#endif for(QString line : lines) { line = line.trimmed(); @@ -114,7 +124,11 @@ QString runCheckerForArch(const SettingsObjectPtr& settingsObj){ continue; } +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + auto parts = line.split('=', Qt::SkipEmptyParts); +#else auto parts = line.split('=', QString::SkipEmptyParts); +#endif if(parts.size() != 2 || parts[0].isEmpty() || parts[1].isEmpty()) { continue; @@ -136,13 +150,13 @@ QString runCheckerForArch(const SettingsObjectPtr& settingsObj){ } } -QString currentArch(const SettingsObjectPtr& settingsObj) { - auto realJavaArchitecture = settingsObj->get("JavaRealArchitecture").toString(); +QString currentArch(LaunchContext launchContext) { + auto realJavaArchitecture = launchContext.getRealJavaArch().toString(); if(realJavaArchitecture == ""){ //BRO WHY NOW I HAVE TO USE A JAVA CHECKER >:( qDebug() << "SysInfo: BRO I HAVE TO USE A JAVA CHECKER WHY IS JAVA ARCH BORKED"; - settingsObj->set("JavaRealArchitecture", runCheckerForArch(settingsObj)); - realJavaArchitecture = settingsObj->get("JavaRealArchitecture").toString(); + launchContext.setRealJavaArch(runCheckerForArch(launchContext)); + realJavaArchitecture = launchContext.getRealJavaArch().toString(); } //qDebug() << "SysInfo: realJavaArch = " << realJavaArchitecture; if(realJavaArchitecture == "aarch64"){ diff --git a/launcher/SysInfo.h b/launcher/SysInfo.h index a4e41e674..280757674 100644 --- a/launcher/SysInfo.h +++ b/launcher/SysInfo.h @@ -1,13 +1,12 @@ #include -#include "settings/SettingsObject.h" +#include "minecraft/LaunchContext.h" #ifdef Q_OS_MACOS #include #endif namespace SysInfo { QString currentSystem(); -QString currentArch(const SettingsObjectPtr& settingsObj); -QString runCheckerForArch(const SettingsObjectPtr& settingsObj); +QString currentArch(LaunchContext launchContext); +QString runCheckerForArch(LaunchContext launchContext); QString useQTForArch(); -} - +} \ No newline at end of file diff --git a/launcher/minecraft/LaunchContext.cpp b/launcher/minecraft/LaunchContext.cpp new file mode 100644 index 000000000..b445d9ae1 --- /dev/null +++ b/launcher/minecraft/LaunchContext.cpp @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 Toshit Chawda + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "LaunchContext.h" + +LaunchContext::LaunchContext(SettingsObjectPtr instanceSettings){ + m_instanceSettings = instanceSettings; +} + +void LaunchContext::setRealJavaArch(QVariant realJavaArch) +{ + m_instanceSettings->set("JavaRealArchitecture", realJavaArch); +} + +QVariant LaunchContext::getRealJavaArch() +{ + return m_instanceSettings->get("JavaRealArchitecture"); +} + +QVariant LaunchContext::getJavaPath() +{ + return m_instanceSettings->get("JavaPath"); +} \ No newline at end of file diff --git a/launcher/minecraft/LaunchContext.h b/launcher/minecraft/LaunchContext.h new file mode 100644 index 000000000..0d322a2ea --- /dev/null +++ b/launcher/minecraft/LaunchContext.h @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 Toshit Chawda + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include +#include "settings/SettingsObject.h" + +#pragma once + +class LaunchContext +{ + public: + LaunchContext(SettingsObjectPtr instanceSettings); + void setRealJavaArch(QVariant realJavaArch); + QVariant getRealJavaArch(); + QVariant getJavaPath(); + private: + SettingsObjectPtr m_instanceSettings; +}; \ No newline at end of file From 68446c2a5442d568a75229d63d6addc502237b4a Mon Sep 17 00:00:00 2001 From: timoreo Date: Sun, 10 Jul 2022 20:34:29 +0200 Subject: [PATCH 010/616] Obligatory formatting fix commit Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 2 +- launcher/SysInfo.h | 2 +- launcher/minecraft/LaunchContext.cpp | 2 +- launcher/minecraft/LaunchContext.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index d72f66f36..2cca83a9b 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -95,7 +95,7 @@ void JavaDownloader::executeTask() elementDownload->addNetAction(dl); } QObject::connect(elementDownload, &NetJob::finished, [elementDownload] { elementDownload->deleteLater(); }); - QObject::connect(elementDownload, &NetJob::succeeded, [this]{emitSucceeded();}); + QObject::connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); elementDownload->start(); }); download->start(); diff --git a/launcher/SysInfo.h b/launcher/SysInfo.h index 280757674..9107cacb8 100644 --- a/launcher/SysInfo.h +++ b/launcher/SysInfo.h @@ -9,4 +9,4 @@ QString currentSystem(); QString currentArch(LaunchContext launchContext); QString runCheckerForArch(LaunchContext launchContext); QString useQTForArch(); -} \ No newline at end of file +} diff --git a/launcher/minecraft/LaunchContext.cpp b/launcher/minecraft/LaunchContext.cpp index b445d9ae1..ea6a549f0 100644 --- a/launcher/minecraft/LaunchContext.cpp +++ b/launcher/minecraft/LaunchContext.cpp @@ -36,4 +36,4 @@ QVariant LaunchContext::getRealJavaArch() QVariant LaunchContext::getJavaPath() { return m_instanceSettings->get("JavaPath"); -} \ No newline at end of file +} diff --git a/launcher/minecraft/LaunchContext.h b/launcher/minecraft/LaunchContext.h index 0d322a2ea..2c6e1307f 100644 --- a/launcher/minecraft/LaunchContext.h +++ b/launcher/minecraft/LaunchContext.h @@ -31,4 +31,4 @@ class LaunchContext QVariant getJavaPath(); private: SettingsObjectPtr m_instanceSettings; -}; \ No newline at end of file +}; From 24dc154856cc45b78404b47fa085f8ea0a1adeb0 Mon Sep 17 00:00:00 2001 From: timoreo Date: Mon, 11 Jul 2022 15:11:08 +0200 Subject: [PATCH 011/616] Add download button to more pages + UI fixes Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 79 +++++++++++++++++++ launcher/JavaDownloader.h | 1 + launcher/ui/pages/global/JavaPage.cpp | 57 +------------ .../pages/instance/InstanceSettingsPage.cpp | 6 ++ .../ui/pages/instance/InstanceSettingsPage.h | 1 + .../ui/pages/instance/InstanceSettingsPage.ui | 7 ++ launcher/ui/widgets/JavaSettingsWidget.cpp | 11 +++ launcher/ui/widgets/JavaSettingsWidget.h | 3 + 8 files changed, 111 insertions(+), 54 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index 2cca83a9b..cb8fd1116 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -1,11 +1,15 @@ #include "JavaDownloader.h" +#include +#include #include "Application.h" #include "FileSystem.h" #include "Json.h" #include "MMCZip.h" +#include "SysInfo.h" #include "net/ChecksumValidator.h" #include "net/NetJob.h" #include "quazip.h" +#include "ui/dialogs/ProgressDialog.h" // Quick & dirty struct to store files struct File { @@ -95,6 +99,7 @@ void JavaDownloader::executeTask() elementDownload->addNetAction(dl); } QObject::connect(elementDownload, &NetJob::finished, [elementDownload] { elementDownload->deleteLater(); }); + QObject::connect(elementDownload, &NetJob::progress, this, &JavaDownloader::progress); QObject::connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); elementDownload->start(); }); @@ -182,3 +187,77 @@ void JavaDownloader::executeTask() netJob->start(); } +void JavaDownloader::showPrompts(QWidget* parent) +{ + QString sys = SysInfo::currentSystem(); + if (sys == "osx") { + sys = "mac-os"; + } + QString arch = SysInfo::useQTForArch(); + QString version; + if (sys == "windows") { + if (arch == "x86_64") { + version = "windows-x64"; + } else if (arch == "i386") { + version = "windows-x86"; + } else { + // Unknown, maybe arm, appending arch for downloader + version = "windows-" + arch; + } + } else if (sys == "mac-os") { + if (arch == "arm64") { + version = "mac-os-arm64"; + } else { + version = "mac-os"; + } + } else if (sys == "linux") { + if (arch == "x86_64") { + version = "linux"; + } else { + // will work for i386, and arm(64) + version = "linux-" + arch; + } + } else { + // ? ? ? ? ? unknown os, at least it won't have a java version on mojang or azul, display warning + QMessageBox::warning(parent, tr("Unknown OS"), + tr("The OS you are running is not supported by Mojang or Azul. Please install Java manually.")); + return; + } + // Selection using QMessageBox for java 8 or 17 + QMessageBox box(QMessageBox::Icon::Question, tr("Java version"), + tr("Do you want to download Java version 8 or 17?\n Java 8 is recommended for minecraft versions below 1.17\n Java 17 " + "is recommended for minecraft versions above or equal to 1.17"), + QMessageBox::NoButton, parent); + auto yes = box.addButton("Java 17", QMessageBox::AcceptRole); + auto no = box.addButton("Java 8", QMessageBox::AcceptRole); + auto both = box.addButton(tr("Download both"), QMessageBox::AcceptRole); + auto cancel = box.addButton(QMessageBox::Cancel); + + if (QFileInfo::exists(FS::PathCombine(QString("java"), "java-legacy"))) { + no->setEnabled(false); + } + if (QFileInfo::exists(FS::PathCombine(QString("java"), "java-current"))) { + yes->setEnabled(false); + } + if (!yes->isEnabled() || !no->isEnabled()) { + both->setEnabled(false); + } + if (!yes->isEnabled() && !no->isEnabled()) { + QMessageBox::warning(parent, tr("Already installed !"), tr("Both versions of java are already installed !")); + return; + } + box.exec(); + if (box.clickedButton() == nullptr || box.clickedButton() == cancel) { + return; + } + bool isLegacy = box.clickedButton() == no; + + auto down = new JavaDownloader(isLegacy, version); + ProgressDialog dialog(parent); + dialog.execWithTask(down); + if (box.clickedButton() == both) { + auto dwn = new JavaDownloader(false, version); + ProgressDialog dg(parent); + dg.execWithTask(dwn); + } +} diff --git a/launcher/JavaDownloader.h b/launcher/JavaDownloader.h index 3b7a7c425..274a95e49 100644 --- a/launcher/JavaDownloader.h +++ b/launcher/JavaDownloader.h @@ -10,6 +10,7 @@ class JavaDownloader : public Task { explicit JavaDownloader(bool isLegacy, const QString& OS) : m_isLegacy(isLegacy), m_OS(OS) {} void executeTask() override; + static void showPrompts(QWidget* parent = nullptr); private: bool m_isLegacy; diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 2cc627b7d..d7f48f552 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -52,10 +52,7 @@ #include #include "Application.h" #include "JavaDownloader.h" -#include "SysInfo.h" #include "settings/SettingsObject.h" -#include "ui/dialogs/ProgressDialog.h" -#include JavaPage::JavaPage(QWidget *parent) : QWidget(parent), ui(new Ui::JavaPage) { @@ -181,57 +178,9 @@ void JavaPage::on_javaTestBtn_clicked() checker->run(); } -void JavaPage::on_javaDownloadBtn_clicked(){ - QString sys = SysInfo::currentSystem(); - if(sys == "osx"){ - sys = "mac-os"; - } - QString arch = SysInfo::useQTForArch(); - QString version; - if(sys == "windows"){ - if(arch == "x86_64"){ - version = "windows-x64"; - }else if(arch == "i386"){ - version = "windows-x86"; - }else{ - //Unknown, maybe arm, appending arch for downloader - version = "windows-"+arch; - } - }else if(sys == "mac-os"){ - if(arch == "arm64"){ - version = "mac-os-arm64"; - }else{ - version = "mac-os"; - } - }else if(sys == "linux"){ - if(arch == "x86_64"){ - version = "linux"; - }else { - // will work for i386, and arm(64) - version = "linux-" + arch; - } - }else{ - // ? ? ? ? ? unknown os, at least it won't have a java version on mojang or azul, display warning - QMessageBox::warning(this, tr("Unknown OS"), tr("The OS you are running is not supported by Mojang or Azul. Please install Java manually.")); - return; - } - //Selection using QMessageBox for java 8 or 17 - QMessageBox box(QMessageBox::Icon::Question, tr("Java version"), tr("Do you want to download Java version 8 or 17?\n Java 8 is recommended for minecraft versions below 1.17\n Java 17 is recommended for minecraft versions above or equal to 1.17"), - QMessageBox::NoButton, this); - box.addButton("Java 17", QMessageBox::YesRole); - auto no = box.addButton("Java 8", QMessageBox::NoRole); - auto cancel = box.addButton(tr("Download both"), QMessageBox::AcceptRole); - box.exec(); - bool isLegacy = box.clickedButton() == no; - - auto down = new JavaDownloader(isLegacy, version); - ProgressDialog dialog(this); - dialog.execWithTask(down); - if(box.clickedButton() == cancel) { - auto dwn = new JavaDownloader(false, version); - ProgressDialog dg(this); - dg.execWithTask(dwn); - } +void JavaPage::on_javaDownloadBtn_clicked() +{ + JavaDownloader::showPrompts(this); } void JavaPage::checkerFinished() diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index 5da7f19f5..62e780ce8 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -49,6 +49,7 @@ #include "JavaCommon.h" #include "Application.h" +#include "JavaDownloader.h" #include "java/JavaInstallList.h" #include "java/JavaUtils.h" #include "FileSystem.h" @@ -374,6 +375,11 @@ void InstanceSettingsPage::loadSettings() ui->serverJoinAddress->setText(m_settings->get("JoinServerOnLaunchAddress").toString()); } +void InstanceSettingsPage::on_javaDownloadBtn_clicked() +{ + JavaDownloader::showPrompts(this); +} + void InstanceSettingsPage::on_javaDetectBtn_clicked() { if (JavaUtils::getJavaCheckPath().isEmpty()) { diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.h b/launcher/ui/pages/instance/InstanceSettingsPage.h index 97d1296fe..ffb226781 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.h +++ b/launcher/ui/pages/instance/InstanceSettingsPage.h @@ -81,6 +81,7 @@ private slots: void on_javaDetectBtn_clicked(); void on_javaTestBtn_clicked(); void on_javaBrowseBtn_clicked(); + void on_javaDownloadBtn_clicked(); void applySettings(); void loadSettings(); diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.ui b/launcher/ui/pages/instance/InstanceSettingsPage.ui index 8b3c33702..4ce59a0ae 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.ui +++ b/launcher/ui/pages/instance/InstanceSettingsPage.ui @@ -95,6 +95,13 @@ + + + + Download Java... + + + diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 314a126e4..e62cdd1f0 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -14,6 +14,7 @@ #include "JavaCommon.h" #include "java/JavaInstall.h" #include "java/JavaUtils.h" +#include "JavaDownloader.h" #include "FileSystem.h" #include "ui/dialogs/CustomMessageBox.h" @@ -38,6 +39,8 @@ JavaSettingsWidget::JavaSettingsWidget(QWidget* parent) : QWidget(parent) connect(m_javaBrowseBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaBrowseBtn_clicked); connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaSettingsWidget::javaPathEdited); connect(m_javaStatusBtn, &QToolButton::clicked, this, &JavaSettingsWidget::on_javaStatusBtn_clicked); + connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaDownloadBtn_clicked); + } void JavaSettingsWidget::setupUi() @@ -115,6 +118,10 @@ void JavaSettingsWidget::setupUi() m_verticalLayout->addWidget(m_memoryGroupBox); + m_javaDownloadBtn = new QPushButton("Download Java",this); + + m_verticalLayout->addWidget(m_javaDownloadBtn); + retranslate(); } @@ -276,7 +283,11 @@ void JavaSettingsWidget::on_javaBrowseBtn_clicked() m_javaPathTextBox->setText(cooked_path); checkJavaPath(cooked_path); } +void JavaSettingsWidget::on_javaDownloadBtn_clicked() +{ + JavaDownloader::showPrompts(this); +} void JavaSettingsWidget::on_javaStatusBtn_clicked() { QString text; diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index 0d280daf3..fe6ee2f58 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -63,6 +63,7 @@ protected slots: void javaVersionSelected(BaseVersionPtr version); void on_javaBrowseBtn_clicked(); void on_javaStatusBtn_clicked(); + void on_javaDownloadBtn_clicked(); void checkFinished(JavaCheckResult result); protected: /* methods */ @@ -88,6 +89,8 @@ private: /* data */ QSpinBox *m_minMemSpinBox = nullptr; QLabel *m_labelPermGen = nullptr; QSpinBox *m_permGenSpinBox = nullptr; + + QPushButton *m_javaDownloadBtn = nullptr; QIcon goodIcon; QIcon yellowIcon; QIcon badIcon; From a902f29ccff347f1c51ab95330748cb6e71d1539 Mon Sep 17 00:00:00 2001 From: timoreo Date: Mon, 12 Sep 2022 08:19:42 +0200 Subject: [PATCH 012/616] Changed to a temporary file Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 21 ++++++++++++++------- launcher/ui/widgets/JavaSettingsWidget.cpp | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index cb8fd1116..e56a87d0c 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -1,6 +1,7 @@ #include "JavaDownloader.h" #include #include +#include #include "Application.h" #include "FileSystem.h" #include "Json.h" @@ -127,6 +128,11 @@ void JavaDownloader::executeTask() azulOS = "linux"; arch = "arm"; bitness = "32"; + } else if (OS == "linux"){ + // linux x86 64 (used for debugging, should never reach here) + azulOS = "linux"; + arch = "x86"; + bitness = "64"; } auto metaResponse = new QByteArray(); auto downloadJob = new NetJob(QString("JRE::QueryAzulMeta"), APPLICATION->network()); @@ -161,19 +167,20 @@ void JavaDownloader::executeTask() setStatus(tr("Downloading java from Azul")); auto downloadURL = QUrl(array[0].toObject()["url"].toString()); auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); - const QString path = downloadURL.host() + '/' + downloadURL.path(); - auto entry = APPLICATION->metacache()->resolveEntry("general", path); - entry->setStale(true); - download->addNetAction(Net::Download::makeCached(downloadURL, entry)); - auto zippath = entry->getFullPath(); + auto temp = std::make_unique(FS::PathCombine(APPLICATION->root(), "temp", "XXXXXX.zip")); + FS::ensureFolderPathExists(FS::PathCombine(APPLICATION->root(),"temp")); + // Have to open at least once to generate path + temp->open(); + temp->close(); + download->addNetAction(Net::Download::makeFile(downloadURL, temp->fileName())); QObject::connect(download, &NetJob::finished, [download] { download->deleteLater(); }); QObject::connect(download, &NetJob::progress, this, &JavaDownloader::progress); - QObject::connect(download, &NetJob::succeeded, [isLegacy, zippath, downloadURL, this] { + QObject::connect(download, &NetJob::succeeded, [isLegacy, file = std::move(temp), downloadURL, this] { setStatus(tr("Extracting java")); auto output = FS::PathCombine(FS::PathCombine(QCoreApplication::applicationDirPath(), "java"), isLegacy ? "java-legacy" : "java-current"); // This should do all of the extracting and creating folders - MMCZip::extractDir(zippath, downloadURL.fileName().chopped(4), output); + MMCZip::extractDir(file->fileName(), downloadURL.fileName().chopped(4), output); emitSucceeded(); }); download->start(); diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index e62cdd1f0..6494b79fd 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -118,7 +118,7 @@ void JavaSettingsWidget::setupUi() m_verticalLayout->addWidget(m_memoryGroupBox); - m_javaDownloadBtn = new QPushButton("Download Java",this); + m_javaDownloadBtn = new QPushButton(tr("Download Java"), this); m_verticalLayout->addWidget(m_javaDownloadBtn); From dc84a6199932fed417796ec1183598669b4dde2f Mon Sep 17 00:00:00 2001 From: timoreo Date: Mon, 12 Sep 2022 14:17:41 +0200 Subject: [PATCH 013/616] Added failed and aborted handlers Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 61 +++++++++++++++++++++++++++++++------ launcher/JavaDownloader.h | 3 ++ 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index e56a87d0c..b0cde7d98 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -24,17 +24,29 @@ void JavaDownloader::executeTask() { auto OS = m_OS; auto isLegacy = m_isLegacy; + auto netJob = new NetJob(QString("JRE::QueryVersions"), APPLICATION->network()); auto response = new QByteArray(); setStatus(tr("Querying mojang meta")); netJob->addNetAction(Net::Download::makeByteArray( QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); - QObject::connect(netJob, &NetJob::finished, [netJob, response] { + + QObject::connect(this, &Task::aborted, [isLegacy]{ + QDir(FS::PathCombine("java",(isLegacy ? "java-legacy" : "java-current"))).removeRecursively(); + }); + + QObject::connect(netJob, &NetJob::finished, [netJob, response, this] { + //delete so that it's not called on a deleted job + QObject::disconnect(this, &Task::aborted, netJob, &NetJob::abort); netJob->deleteLater(); delete response; }); QObject::connect(netJob, &NetJob::progress, this, &JavaDownloader::progress); - QObject::connect(netJob, &NetJob::succeeded, [response, OS, isLegacy, this] { + QObject::connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed); + + QObject::connect(this, &Task::aborted, netJob, &NetJob::abort); + + QObject::connect(netJob, &NetJob::succeeded, [response, OS, isLegacy, this, netJob] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -51,12 +63,16 @@ void JavaDownloader::executeTask() download->addNetAction(Net::Download::makeByteArray(QUrl(url), files)); - QObject::connect(download, &NetJob::finished, [download, files] { + QObject::connect(download, &NetJob::finished, [download, files, this] { + QObject::disconnect(this, &Task::aborted, download, &NetJob::abort); download->deleteLater(); delete files; }); QObject::connect(download, &NetJob::progress, this, &JavaDownloader::progress); - QObject::connect(download, &NetJob::succeeded, [files, isLegacy, this] { + QObject::connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed); + QObject::connect(this, &Task::aborted, download, &NetJob::abort); + + QObject::connect(download, &NetJob::succeeded, [download, files, isLegacy, this] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -99,8 +115,15 @@ void JavaDownloader::executeTask() } elementDownload->addNetAction(dl); } - QObject::connect(elementDownload, &NetJob::finished, [elementDownload] { elementDownload->deleteLater(); }); + QObject::connect(elementDownload, &NetJob::finished, [elementDownload, this] { + QObject::disconnect(this, &Task::aborted, elementDownload, &NetJob::abort); + elementDownload->deleteLater(); + }); QObject::connect(elementDownload, &NetJob::progress, this, &JavaDownloader::progress); + QObject::connect(elementDownload, &NetJob::failed, this, &JavaDownloader::emitFailed); + + + QObject::connect(this, &Task::aborted, elementDownload, &NetJob::abort); QObject::connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); elementDownload->start(); }); @@ -148,12 +171,15 @@ void JavaDownloader::executeTask() ) .arg(javaVersion, azulOS, arch, bitness), metaResponse)); - QObject::connect(downloadJob, &NetJob::finished, [downloadJob, metaResponse] { + QObject::connect(downloadJob, &NetJob::finished, [downloadJob, metaResponse, this] { + QObject::disconnect(this, &Task::aborted, downloadJob, &NetJob::abort); downloadJob->deleteLater(); delete metaResponse; }); + QObject::connect(this, &Task::aborted, downloadJob, &NetJob::abort); + QObject::connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed); QObject::connect(downloadJob, &NetJob::progress, this, &JavaDownloader::progress); - QObject::connect(downloadJob, &NetJob::succeeded, [metaResponse, isLegacy, this] { + QObject::connect(downloadJob, &NetJob::succeeded, [metaResponse, isLegacy, this, downloadJob] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -173,8 +199,13 @@ void JavaDownloader::executeTask() temp->open(); temp->close(); download->addNetAction(Net::Download::makeFile(downloadURL, temp->fileName())); - QObject::connect(download, &NetJob::finished, [download] { download->deleteLater(); }); + QObject::connect(download, &NetJob::finished, [download, this] { + QObject::disconnect(this, &Task::aborted, download, &NetJob::abort); + download->deleteLater(); + }); QObject::connect(download, &NetJob::progress, this, &JavaDownloader::progress); + QObject::connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed); + QObject::connect(this, &Task::aborted, download, &NetJob::abort); QObject::connect(download, &NetJob::succeeded, [isLegacy, file = std::move(temp), downloadURL, this] { setStatus(tr("Extracting java")); auto output = FS::PathCombine(FS::PathCombine(QCoreApplication::applicationDirPath(), "java"), @@ -194,6 +225,14 @@ void JavaDownloader::executeTask() netJob->start(); } +void JavaDownloader::abortNetJob(NetJob* elementDownload) +{ + if(elementDownload->isRunning()){ + elementDownload->abort(); + }else{ + emit elementDownload->aborted(); + } +} void JavaDownloader::showPrompts(QWidget* parent) { QString sys = SysInfo::currentSystem(); @@ -261,10 +300,12 @@ void JavaDownloader::showPrompts(QWidget* parent) auto down = new JavaDownloader(isLegacy, version); ProgressDialog dialog(parent); - dialog.execWithTask(down); - if (box.clickedButton() == both) { + dialog.setSkipButton(true, tr("Abort")); + + if (dialog.execWithTask(down) && box.clickedButton() == both) { auto dwn = new JavaDownloader(false, version); ProgressDialog dg(parent); + dg.setSkipButton(true, tr("Abort")); dg.execWithTask(dwn); } } diff --git a/launcher/JavaDownloader.h b/launcher/JavaDownloader.h index 274a95e49..00ccdf2bc 100644 --- a/launcher/JavaDownloader.h +++ b/launcher/JavaDownloader.h @@ -1,6 +1,7 @@ #pragma once #include +#include "net/NetJob.h" #include "tasks/Task.h" class JavaDownloader : public Task { @@ -10,9 +11,11 @@ class JavaDownloader : public Task { explicit JavaDownloader(bool isLegacy, const QString& OS) : m_isLegacy(isLegacy), m_OS(OS) {} void executeTask() override; + [[nodiscard]] bool canAbort() const override { return true; } static void showPrompts(QWidget* parent = nullptr); private: bool m_isLegacy; const QString& m_OS; + static void abortNetJob(NetJob* elementDownload); }; From 89f1b60538068ac033f7ca1899b4d310eb43f8c2 Mon Sep 17 00:00:00 2001 From: timoreo Date: Mon, 12 Sep 2022 15:00:31 +0200 Subject: [PATCH 014/616] Delete out non-needed functions from SysInfo Delete LaunchContext Signed-off-by: timoreo --- launcher/CMakeLists.txt | 4 +- launcher/SysInfo.cpp | 103 --------------------------- launcher/SysInfo.h | 6 -- launcher/minecraft/LaunchContext.cpp | 39 ---------- launcher/minecraft/LaunchContext.h | 34 --------- 5 files changed, 1 insertion(+), 185 deletions(-) delete mode 100644 launcher/minecraft/LaunchContext.cpp delete mode 100644 launcher/minecraft/LaunchContext.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index c467957a8..4bb686106 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -271,9 +271,7 @@ set(MINECRAFT_SOURCES minecraft/GradleSpecifier.h minecraft/MinecraftInstance.cpp minecraft/MinecraftInstance.h - minecraft/LaunchContext.cpp - minecraft/LaunchContext.h - minecraft/LaunchProfile.cpp + minecraft/LaunchProfile.cpp minecraft/LaunchProfile.h minecraft/Component.cpp minecraft/Component.h diff --git a/launcher/SysInfo.cpp b/launcher/SysInfo.cpp index 010eb84c8..f3ff200fc 100644 --- a/launcher/SysInfo.cpp +++ b/launcher/SysInfo.cpp @@ -1,18 +1,13 @@ #include #include -#include "minecraft/LaunchContext.h" #ifdef Q_OS_MACOS #include #endif -#include #include -#include -#include "MessageLevel.h" #include #include #include #include "java/JavaUtils.h" -#include "FileSystem.h" #include "Commandline.h" #include "Application.h" @@ -67,103 +62,5 @@ QString useQTForArch(){ #endif return qtArch; } - -QString runCheckerForArch(LaunchContext launchContext){ - QString checkerJar = JavaUtils::getJavaCheckPath(); - - if (checkerJar.isEmpty()) - { - qDebug() << "Java checker library could not be found. Please check your installation."; - return useQTForArch(); - } - - QStringList args; - - QProcessPtr process = new QProcess(); - args.append({"-jar", checkerJar}); - process->setArguments(args); - process->setProgram(launchContext.getJavaPath().toString()); - process->setProcessChannelMode(QProcess::SeparateChannels); - process->setProcessEnvironment(CleanEnviroment()); - qDebug() << "Running java checker: " + launchContext.getJavaPath().toString() + args.join(" ");; - - process->start(); - if(!process->waitForFinished(15000)){ - // we've been waiting for 15 seconds! wtf! OR... it already finished. But HOW WOULD THAT HAPPEN? - process->kill(); // die. BUUURNNNN - // fallback to using polymc arch - return useQTForArch(); - } else { - // yay we can use the java arch - QString stdout_javaChecker; - QString stderr_javaChecker; - - // process stdout - QByteArray data = process->readAllStandardOutput(); - QString added = QString::fromLocal8Bit(data); - added.remove('\r'); - stdout_javaChecker += added; - - // process stderr - data = process->readAllStandardError(); - added = QString::fromLocal8Bit(data); - added.remove('\r'); - stderr_javaChecker += added; - - QMap results; -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - QStringList lines = stdout_javaChecker.split("\n", Qt::SkipEmptyParts); -#else - QStringList lines = stdout_javaChecker.split("\n", QString::SkipEmptyParts); -#endif - for(QString line : lines) - { - line = line.trimmed(); - // NOTE: workaround for GH-4125, where garbage is getting printed into stdout on bedrock linux - if (line.contains("/bedrock/strata")) { - continue; - } - -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - auto parts = line.split('=', Qt::SkipEmptyParts); -#else - auto parts = line.split('=', QString::SkipEmptyParts); -#endif - if(parts.size() != 2 || parts[0].isEmpty() || parts[1].isEmpty()) - { - continue; - } - else - { - results.insert(parts[0], parts[1]); - } - } - - if(!results.contains("os.arch") || !results.contains("java.version") || !results.contains("java.vendor")) - { - // wtf man why - // fallback to using polymc arch - return useQTForArch(); - } - - return results["os.arch"]; - } -} - -QString currentArch(LaunchContext launchContext) { - auto realJavaArchitecture = launchContext.getRealJavaArch().toString(); - if(realJavaArchitecture == ""){ - //BRO WHY NOW I HAVE TO USE A JAVA CHECKER >:( - qDebug() << "SysInfo: BRO I HAVE TO USE A JAVA CHECKER WHY IS JAVA ARCH BORKED"; - launchContext.setRealJavaArch(runCheckerForArch(launchContext)); - realJavaArchitecture = launchContext.getRealJavaArch().toString(); - } - //qDebug() << "SysInfo: realJavaArch = " << realJavaArchitecture; - if(realJavaArchitecture == "aarch64"){ - return "arm64"; - } else { - return realJavaArchitecture; - } -} } diff --git a/launcher/SysInfo.h b/launcher/SysInfo.h index 9107cacb8..3cb1c8de6 100644 --- a/launcher/SysInfo.h +++ b/launcher/SysInfo.h @@ -1,12 +1,6 @@ #include -#include "minecraft/LaunchContext.h" -#ifdef Q_OS_MACOS -#include -#endif namespace SysInfo { QString currentSystem(); -QString currentArch(LaunchContext launchContext); -QString runCheckerForArch(LaunchContext launchContext); QString useQTForArch(); } diff --git a/launcher/minecraft/LaunchContext.cpp b/launcher/minecraft/LaunchContext.cpp deleted file mode 100644 index ea6a549f0..000000000 --- a/launcher/minecraft/LaunchContext.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * PolyMC - Minecraft Launcher - * Copyright (C) 2022 Toshit Chawda - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "LaunchContext.h" - -LaunchContext::LaunchContext(SettingsObjectPtr instanceSettings){ - m_instanceSettings = instanceSettings; -} - -void LaunchContext::setRealJavaArch(QVariant realJavaArch) -{ - m_instanceSettings->set("JavaRealArchitecture", realJavaArch); -} - -QVariant LaunchContext::getRealJavaArch() -{ - return m_instanceSettings->get("JavaRealArchitecture"); -} - -QVariant LaunchContext::getJavaPath() -{ - return m_instanceSettings->get("JavaPath"); -} diff --git a/launcher/minecraft/LaunchContext.h b/launcher/minecraft/LaunchContext.h deleted file mode 100644 index 2c6e1307f..000000000 --- a/launcher/minecraft/LaunchContext.h +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * PolyMC - Minecraft Launcher - * Copyright (C) 2022 Toshit Chawda - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include "settings/SettingsObject.h" - -#pragma once - -class LaunchContext -{ - public: - LaunchContext(SettingsObjectPtr instanceSettings); - void setRealJavaArch(QVariant realJavaArch); - QVariant getRealJavaArch(); - QVariant getJavaPath(); - private: - SettingsObjectPtr m_instanceSettings; -}; From 86e3518430917483f35777a25a76159274e72d38 Mon Sep 17 00:00:00 2001 From: timoreo Date: Mon, 12 Sep 2022 16:34:37 +0200 Subject: [PATCH 015/616] Apply most of the suggestions from @flowln Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 366 ++++++++++++++++++------------------ launcher/JavaDownloader.h | 10 +- 2 files changed, 197 insertions(+), 179 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index b0cde7d98..425a7d470 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -9,7 +9,6 @@ #include "SysInfo.h" #include "net/ChecksumValidator.h" #include "net/NetJob.h" -#include "quazip.h" #include "ui/dialogs/ProgressDialog.h" // Quick & dirty struct to store files @@ -25,28 +24,31 @@ void JavaDownloader::executeTask() auto OS = m_OS; auto isLegacy = m_isLegacy; + downloadMojangJavaList(OS, isLegacy); +} +void JavaDownloader::downloadMojangJavaList(const QString& OS, bool isLegacy) +{ auto netJob = new NetJob(QString("JRE::QueryVersions"), APPLICATION->network()); auto response = new QByteArray(); setStatus(tr("Querying mojang meta")); netJob->addNetAction(Net::Download::makeByteArray( QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); - QObject::connect(this, &Task::aborted, [isLegacy]{ - QDir(FS::PathCombine("java",(isLegacy ? "java-legacy" : "java-current"))).removeRecursively(); - }); + connect(this, &Task::aborted, + [isLegacy] { QDir(FS::PathCombine("java", (isLegacy ? "java-legacy" : "java-current"))).removeRecursively(); }); - QObject::connect(netJob, &NetJob::finished, [netJob, response, this] { - //delete so that it's not called on a deleted job - QObject::disconnect(this, &Task::aborted, netJob, &NetJob::abort); + connect(netJob, &NetJob::finished, [netJob, response, this] { + // delete so that it's not called on a deleted job + disconnect(this, &Task::aborted, netJob, &NetJob::abort); netJob->deleteLater(); delete response; }); - QObject::connect(netJob, &NetJob::progress, this, &JavaDownloader::progress); - QObject::connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed); + connect(netJob, &NetJob::progress, this, &JavaDownloader::progress); + connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed); - QObject::connect(this, &Task::aborted, netJob, &NetJob::abort); + connect(this, &Task::aborted, netJob, &NetJob::abort); - QObject::connect(netJob, &NetJob::succeeded, [response, OS, isLegacy, this, netJob] { + connect(netJob, &NetJob::succeeded, [response, OS, isLegacy, this, netJob] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -56,182 +58,190 @@ void JavaDownloader::executeTask() } auto versionArray = Json::ensureArray(Json::ensureObject(doc.object(), OS), isLegacy ? "jre-legacy" : "java-runtime-gamma"); if (!versionArray.empty()) { - setStatus(tr("Downloading java from Mojang")); - auto url = versionArray[0].toObject()["manifest"].toObject()["url"].toString(); - auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); - auto files = new QByteArray(); + parseMojangManifest(isLegacy, versionArray); - download->addNetAction(Net::Download::makeByteArray(QUrl(url), files)); - - QObject::connect(download, &NetJob::finished, [download, files, this] { - QObject::disconnect(this, &Task::aborted, download, &NetJob::abort); - download->deleteLater(); - delete files; - }); - QObject::connect(download, &NetJob::progress, this, &JavaDownloader::progress); - QObject::connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed); - QObject::connect(this, &Task::aborted, download, &NetJob::abort); - - QObject::connect(download, &NetJob::succeeded, [download, files, isLegacy, this] { - QJsonParseError parse_error{}; - QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); - if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); - qWarning() << *files; - return; - } - - // valid json doc, begin making jre spot - auto output = FS::PathCombine(QString("java"), (isLegacy ? "java-legacy" : "java-current")); - FS::ensureFolderPathExists(output); - std::vector toDownload; - auto list = doc.object()["files"].toObject(); - for (const auto& paths : list.keys()) { - auto file = FS::PathCombine(output, paths); - - auto type = list[paths].toObject()["type"].toString(); - if (type == "directory") { - FS::ensureFolderPathExists(file); - } else if (type == "link") { - // this is linux only ! - auto target = FS::PathCombine(file, "../" + list[paths].toObject()["target"].toString()); - QFile(target).link(file); - } else if (type == "file") { - // TODO download compressed version if it exists ? - auto raw = list[paths].toObject()["downloads"].toObject()["raw"].toObject(); - auto isExec = list[paths].toObject()["executable"].toBool(); - auto f = File{ file, raw["url"].toString(), QByteArray::fromHex(raw["sha1"].toString().toLatin1()), isExec }; - toDownload.push_back(f); - } - } - auto elementDownload = new NetJob("JRE::FileDownload", APPLICATION->network()); - for (const auto& file : toDownload) { - auto dl = Net::Download::makeFile(file.url, file.path); - dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, file.hash)); - if (file.isExec) { - QObject::connect(dl.get(), &Net::Download::succeeded, [file] { - QFile(file.path).setPermissions(QFile(file.path).permissions() | QFileDevice::Permissions(0x1111)); - }); - } - elementDownload->addNetAction(dl); - } - QObject::connect(elementDownload, &NetJob::finished, [elementDownload, this] { - QObject::disconnect(this, &Task::aborted, elementDownload, &NetJob::abort); - elementDownload->deleteLater(); - }); - QObject::connect(elementDownload, &NetJob::progress, this, &JavaDownloader::progress); - QObject::connect(elementDownload, &NetJob::failed, this, &JavaDownloader::emitFailed); - - - QObject::connect(this, &Task::aborted, elementDownload, &NetJob::abort); - QObject::connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); - elementDownload->start(); - }); - download->start(); } else { // mojang does not have a JRE for us, let's get azul zulu - setStatus(tr("Querying Azul meta")); - QString javaVersion = isLegacy ? QString("8.0") : QString("17.0"); - QString azulOS; - QString arch; - QString bitness; - - if (OS == "mac-os-arm64") { - // macos arm64 - azulOS = "macos"; - arch = "arm"; - bitness = "64"; - } else if (OS == "linux-arm64") { - // linux arm64 - azulOS = "linux"; - arch = "arm"; - bitness = "64"; - } else if (OS == "linux-arm") { - // linux arm (32) - azulOS = "linux"; - arch = "arm"; - bitness = "32"; - } else if (OS == "linux"){ - // linux x86 64 (used for debugging, should never reach here) - azulOS = "linux"; - arch = "x86"; - bitness = "64"; - } - auto metaResponse = new QByteArray(); - auto downloadJob = new NetJob(QString("JRE::QueryAzulMeta"), APPLICATION->network()); - downloadJob->addNetAction( - Net::Download::makeByteArray(QString("https://api.azul.com/zulu/download/community/v1.0/bundles/?" - "java_version=%1" - "&os=%2" - "&arch=%3" - "&hw_bitness=%4" - "&ext=zip" // as a zip for all os, even linux NOTE !! Linux ARM is .deb only !! - "&bundle_type=jre" // jre only - "&latest=true" // only get the one latest entry - ) - .arg(javaVersion, azulOS, arch, bitness), - metaResponse)); - QObject::connect(downloadJob, &NetJob::finished, [downloadJob, metaResponse, this] { - QObject::disconnect(this, &Task::aborted, downloadJob, &NetJob::abort); - downloadJob->deleteLater(); - delete metaResponse; - }); - QObject::connect(this, &Task::aborted, downloadJob, &NetJob::abort); - QObject::connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed); - QObject::connect(downloadJob, &NetJob::progress, this, &JavaDownloader::progress); - QObject::connect(downloadJob, &NetJob::succeeded, [metaResponse, isLegacy, this, downloadJob] { - QJsonParseError parse_error{}; - QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error); - if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); - qWarning() << *metaResponse; - return; - } - auto array = doc.array(); - if (!array.empty()) { - // JRE found ! download the zip - setStatus(tr("Downloading java from Azul")); - auto downloadURL = QUrl(array[0].toObject()["url"].toString()); - auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); - auto temp = std::make_unique(FS::PathCombine(APPLICATION->root(), "temp", "XXXXXX.zip")); - FS::ensureFolderPathExists(FS::PathCombine(APPLICATION->root(),"temp")); - // Have to open at least once to generate path - temp->open(); - temp->close(); - download->addNetAction(Net::Download::makeFile(downloadURL, temp->fileName())); - QObject::connect(download, &NetJob::finished, [download, this] { - QObject::disconnect(this, &Task::aborted, download, &NetJob::abort); - download->deleteLater(); - }); - QObject::connect(download, &NetJob::progress, this, &JavaDownloader::progress); - QObject::connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed); - QObject::connect(this, &Task::aborted, download, &NetJob::abort); - QObject::connect(download, &NetJob::succeeded, [isLegacy, file = std::move(temp), downloadURL, this] { - setStatus(tr("Extracting java")); - auto output = FS::PathCombine(FS::PathCombine(QCoreApplication::applicationDirPath(), "java"), - isLegacy ? "java-legacy" : "java-current"); - // This should do all of the extracting and creating folders - MMCZip::extractDir(file->fileName(), downloadURL.fileName().chopped(4), output); - emitSucceeded(); - }); - download->start(); - } else { - emitFailed(tr("No suitable JRE found")); - } - }); - downloadJob->start(); + downloadAzulMeta(OS, isLegacy, netJob); } }); netJob->start(); } -void JavaDownloader::abortNetJob(NetJob* elementDownload) +void JavaDownloader::parseMojangManifest(bool isLegacy, const QJsonArray& versionArray) { - if(elementDownload->isRunning()){ - elementDownload->abort(); - }else{ - emit elementDownload->aborted(); + setStatus(tr("Downloading java from Mojang")); + auto url = versionArray[0].toObject()["manifest"].toObject()["url"].toString(); + auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); + auto files = new QByteArray(); + + download->addNetAction(Net::Download::makeByteArray(QUrl(url), files)); + + connect(download, &NetJob::finished, [download, files, this] { + disconnect(this, &Task::aborted, download, &NetJob::abort); + download->deleteLater(); + delete files; + }); + connect(download, &NetJob::progress, this, &JavaDownloader::progress); + connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed); + connect(this, &Task::aborted, download, &NetJob::abort); + + connect(download, &NetJob::succeeded, [files, isLegacy, this] { + QJsonParseError parse_error{}; + QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); + qWarning() << *files; + return; + } + downloadMojangJava(isLegacy, doc); + }); + download->start(); +} +void JavaDownloader::downloadMojangJava(bool isLegacy, const QJsonDocument& doc) +{ // valid json doc, begin making jre spot + auto output = FS::PathCombine(QString("java"), (isLegacy ? "java-legacy" : "java-current")); + FS::ensureFolderPathExists(output); + std::vector toDownload; + auto list = doc.object()["files"].toObject(); + for (const auto& paths : list.keys()) { + auto file = FS::PathCombine(output, paths); + + auto type = list[paths].toObject()["type"].toString(); + if (type == "directory") { + FS::ensureFolderPathExists(file); + } else if (type == "link") { + // this is linux only ! + auto target = FS::PathCombine(file, "../" + list[paths].toObject()["target"].toString()); + QFile(target).link(file); + } else if (type == "file") { + // TODO download compressed version if it exists ? + auto raw = list[paths].toObject()["downloads"].toObject()["raw"].toObject(); + auto isExec = list[paths].toObject()["executable"].toBool(); + auto f = File{ file, raw["url"].toString(), QByteArray::fromHex(raw["sha1"].toString().toLatin1()), isExec }; + toDownload.push_back(f); + } } + auto elementDownload = new NetJob("JRE::FileDownload", APPLICATION->network()); + for (const auto& file : toDownload) { + auto dl = Net::Download::makeFile(file.url, file.path); + dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, file.hash)); + if (file.isExec) { + connect(dl.get(), &Net::Download::succeeded, + [file] { QFile(file.path).setPermissions(QFile(file.path).permissions() | QFileDevice::Permissions(0x1111)); }); + } + elementDownload->addNetAction(dl); + } + connect(elementDownload, &NetJob::finished, [elementDownload, this] { + disconnect(this, &Task::aborted, elementDownload, &NetJob::abort); + elementDownload->deleteLater(); + }); + connect(elementDownload, &NetJob::progress, this, &JavaDownloader::progress); + connect(elementDownload, &NetJob::failed, this, &JavaDownloader::emitFailed); + + connect(this, &Task::aborted, elementDownload, &NetJob::abort); + connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); + elementDownload->start(); +} +void JavaDownloader::downloadAzulMeta(const QString& OS, bool isLegacy, const NetJob* netJob) +{ + setStatus(tr("Querying Azul meta")); + QString javaVersion = isLegacy ? QString("8.0") : QString("17.0"); + + QString azulOS; + QString arch; + QString bitness; + + mojangOStoAzul(OS, azulOS, arch, bitness); + auto metaResponse = new QByteArray(); + auto downloadJob = new NetJob(QString("JRE::QueryAzulMeta"), APPLICATION->network()); + downloadJob->addNetAction( + Net::Download::makeByteArray(QString("https://api.azul.com/zulu/download/community/v1.0/bundles/?" + "java_version=%1" + "&os=%2" + "&arch=%3" + "&hw_bitness=%4" + "&ext=zip" // as a zip for all os, even linux NOTE !! Linux ARM is .deb only !! + "&bundle_type=jre" // jre only + "&latest=true" // only get the one latest entry + ) + .arg(javaVersion, azulOS, arch, bitness), + metaResponse)); + connect(downloadJob, &NetJob::finished, [downloadJob, metaResponse, this] { + disconnect(this, &Task::aborted, downloadJob, &NetJob::abort); + downloadJob->deleteLater(); + delete metaResponse; + }); + connect(this, &Task::aborted, downloadJob, &NetJob::abort); + connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed); + connect(downloadJob, &NetJob::progress, this, &JavaDownloader::progress); + connect(downloadJob, &NetJob::succeeded, [metaResponse, isLegacy, this] { + QJsonParseError parse_error{}; + QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); + qWarning() << *metaResponse; + return; + } + auto array = doc.array(); + if (!array.empty()) { + downloadAzulJava(isLegacy, array); + } else { + emitFailed(tr("No suitable JRE found")); + } + }); + downloadJob->start(); +} +void JavaDownloader::mojangOStoAzul(const QString& OS, QString& azulOS, QString& arch, QString& bitness) +{ + if (OS == "mac-os-arm64") { + // macos arm64 + azulOS = "macos"; + arch = "arm"; + bitness = "64"; + } else if (OS == "linux-arm64") { + // linux arm64 + azulOS = "linux"; + arch = "arm"; + bitness = "64"; + } else if (OS == "linux-arm") { + // linux arm (32) + azulOS = "linux"; + arch = "arm"; + bitness = "32"; + } else if (OS == "linux") { + // linux x86 64 (used for debugging, should never reach here) + azulOS = "linux"; + arch = "x86"; + bitness = "64"; + } +} +void JavaDownloader::downloadAzulJava(bool isLegacy, const QJsonArray& array) +{ // JRE found ! download the zip + setStatus(tr("Downloading java from Azul")); + auto downloadURL = QUrl(array[0].toObject()["url"].toString()); + auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); + auto temp = std::make_unique(FS::PathCombine(APPLICATION->root(), "temp", "XXXXXX.zip")); + FS::ensureFolderPathExists(FS::PathCombine(APPLICATION->root(), "temp")); + // Have to open at least once to generate path + temp->open(); + temp->close(); + download->addNetAction(Net::Download::makeFile(downloadURL, temp->fileName())); + connect(download, &NetJob::finished, [download, this] { + disconnect(this, &Task::aborted, download, &NetJob::abort); + download->deleteLater(); + }); + connect(download, &NetJob::progress, this, &JavaDownloader::progress); + connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed); + connect(this, &Task::aborted, download, &NetJob::abort); + connect(download, &NetJob::succeeded, [isLegacy, file = std::move(temp), downloadURL, this] { + setStatus(tr("Extracting java")); + auto output = FS::PathCombine(QCoreApplication::applicationDirPath(), "java", isLegacy ? "java-legacy" : "java-current"); + // This should do all of the extracting and creating folders + MMCZip::extractDir(file->fileName(), downloadURL.fileName().chopped(4), output); + emitSucceeded(); + }); + download->start(); } void JavaDownloader::showPrompts(QWidget* parent) { @@ -289,7 +299,7 @@ void JavaDownloader::showPrompts(QWidget* parent) both->setEnabled(false); } if (!yes->isEnabled() && !no->isEnabled()) { - QMessageBox::warning(parent, tr("Already installed !"), tr("Both versions of java are already installed !")); + QMessageBox::warning(parent, tr("Already installed!"), tr("Both versions of java are already installed!")); return; } box.exec(); diff --git a/launcher/JavaDownloader.h b/launcher/JavaDownloader.h index 00ccdf2bc..6ed67263a 100644 --- a/launcher/JavaDownloader.h +++ b/launcher/JavaDownloader.h @@ -17,5 +17,13 @@ class JavaDownloader : public Task { private: bool m_isLegacy; const QString& m_OS; - static void abortNetJob(NetJob* elementDownload); + + void downloadMojangJavaList(const QString& OS, bool isLegacy); + void parseMojangManifest(bool isLegacy, const QJsonArray& versionArray); + void downloadMojangJava(bool isLegacy, const QJsonDocument& doc); + + static void mojangOStoAzul(const QString& OS, QString& azulOS, QString& arch, QString& bitness) ; + void downloadAzulMeta(const QString& OS, bool isLegacy, const NetJob* netJob); + void downloadAzulJava(bool isLegacy, const QJsonArray& array); + }; From a65f20a78920efdb974b78f0c72df95d401ad337 Mon Sep 17 00:00:00 2001 From: timoreo Date: Mon, 12 Sep 2022 17:21:55 +0200 Subject: [PATCH 016/616] Fix a tiny formatting issue Co-authored-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Signed-off-by: timoreo --- launcher/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 4bb686106..c4d9cb74f 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -271,7 +271,7 @@ set(MINECRAFT_SOURCES minecraft/GradleSpecifier.h minecraft/MinecraftInstance.cpp minecraft/MinecraftInstance.h - minecraft/LaunchProfile.cpp + minecraft/LaunchProfile.cpp minecraft/LaunchProfile.h minecraft/Component.cpp minecraft/Component.h From dcbd6cc1afe3495908511fb9179dd27fe8a70c98 Mon Sep 17 00:00:00 2001 From: timoreo Date: Mon, 12 Sep 2022 19:31:07 +0200 Subject: [PATCH 017/616] More Json:: everywhere ! Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index 425a7d470..d0b8c5240 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -71,7 +71,7 @@ void JavaDownloader::downloadMojangJavaList(const QString& OS, bool isLegacy) void JavaDownloader::parseMojangManifest(bool isLegacy, const QJsonArray& versionArray) { setStatus(tr("Downloading java from Mojang")); - auto url = versionArray[0].toObject()["manifest"].toObject()["url"].toString(); + auto url = Json::ensureString(Json::ensureObject(Json::ensureObject(versionArray[0]), "manifest"), "url"); auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); auto files = new QByteArray(); @@ -103,22 +103,22 @@ void JavaDownloader::downloadMojangJava(bool isLegacy, const QJsonDocument& doc) auto output = FS::PathCombine(QString("java"), (isLegacy ? "java-legacy" : "java-current")); FS::ensureFolderPathExists(output); std::vector toDownload; - auto list = doc.object()["files"].toObject(); + auto list = Json::ensureObject(Json::ensureObject(doc.object()), "files"); for (const auto& paths : list.keys()) { auto file = FS::PathCombine(output, paths); - auto type = list[paths].toObject()["type"].toString(); + auto type = Json::requireString(Json::requireObject(list, paths), "type"); if (type == "directory") { FS::ensureFolderPathExists(file); } else if (type == "link") { // this is linux only ! - auto target = FS::PathCombine(file, "../" + list[paths].toObject()["target"].toString()); + auto target = FS::PathCombine(file, "../" + Json::requireString(Json::requireObject(list, paths), "target")); QFile(target).link(file); } else if (type == "file") { // TODO download compressed version if it exists ? - auto raw = list[paths].toObject()["downloads"].toObject()["raw"].toObject(); - auto isExec = list[paths].toObject()["executable"].toBool(); - auto f = File{ file, raw["url"].toString(), QByteArray::fromHex(raw["sha1"].toString().toLatin1()), isExec }; + auto raw = Json::requireObject(Json::requireObject(Json::requireObject(list, paths), "downloads"), "raw"); + auto isExec = Json::ensureBoolean(Json::requireObject(list, paths), "executable", false); + auto f = File{ file, Json::requireString(raw, "url"), QByteArray::fromHex(Json::ensureString(raw, "sha1").toLatin1()), isExec }; toDownload.push_back(f); } } @@ -183,7 +183,7 @@ void JavaDownloader::downloadAzulMeta(const QString& OS, bool isLegacy, const Ne qWarning() << *metaResponse; return; } - auto array = doc.array(); + auto array = Json::ensureArray(doc.array()); if (!array.empty()) { downloadAzulJava(isLegacy, array); } else { From 6a5db12c6a3350b74eb9cd75a526881bc5b68572 Mon Sep 17 00:00:00 2001 From: timoreo Date: Mon, 24 Oct 2022 14:55:51 +0200 Subject: [PATCH 018/616] Apply some more suggestions from @flowln Co-authored-by: flow Signed-off-by: timoreo --- launcher/JavaDownloader.cpp | 82 +++++++++++-------- .../ui/pages/instance/InstanceSettingsPage.ui | 38 ++++----- 2 files changed, 68 insertions(+), 52 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index d0b8c5240..165573599 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -2,8 +2,10 @@ #include #include #include +#include #include "Application.h" #include "FileSystem.h" +#include "InstanceList.h" #include "Json.h" #include "MMCZip.h" #include "SysInfo.h" @@ -34,8 +36,10 @@ void JavaDownloader::downloadMojangJavaList(const QString& OS, bool isLegacy) netJob->addNetAction(Net::Download::makeByteArray( QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); - connect(this, &Task::aborted, - [isLegacy] { QDir(FS::PathCombine("java", (isLegacy ? "java-legacy" : "java-current"))).removeRecursively(); }); + connect(this, &Task::aborted, [isLegacy] { + QDir(FS::PathCombine(QCoreApplication::applicationDirPath(), "java", (isLegacy ? "java-legacy" : "java-current"))) + .removeRecursively(); + }); connect(netJob, &NetJob::finished, [netJob, response, this] { // delete so that it's not called on a deleted job @@ -70,7 +74,7 @@ void JavaDownloader::downloadMojangJavaList(const QString& OS, bool isLegacy) } void JavaDownloader::parseMojangManifest(bool isLegacy, const QJsonArray& versionArray) { - setStatus(tr("Downloading java from Mojang")); + setStatus(tr("Downloading Java from Mojang")); auto url = Json::ensureString(Json::ensureObject(Json::ensureObject(versionArray[0]), "manifest"), "url"); auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); auto files = new QByteArray(); @@ -100,32 +104,41 @@ void JavaDownloader::parseMojangManifest(bool isLegacy, const QJsonArray& versio } void JavaDownloader::downloadMojangJava(bool isLegacy, const QJsonDocument& doc) { // valid json doc, begin making jre spot - auto output = FS::PathCombine(QString("java"), (isLegacy ? "java-legacy" : "java-current")); + auto output = FS::PathCombine(QCoreApplication::applicationDirPath(), QString("java"), (isLegacy ? "java-legacy" : "java-current")); FS::ensureFolderPathExists(output); std::vector toDownload; auto list = Json::ensureObject(Json::ensureObject(doc.object()), "files"); for (const auto& paths : list.keys()) { auto file = FS::PathCombine(output, paths); - auto type = Json::requireString(Json::requireObject(list, paths), "type"); + const QJsonObject& meta = Json::ensureObject(list, paths); + auto type = Json::ensureString(meta, "type"); if (type == "directory") { FS::ensureFolderPathExists(file); } else if (type == "link") { // this is linux only ! - auto target = FS::PathCombine(file, "../" + Json::requireString(Json::requireObject(list, paths), "target")); - QFile(target).link(file); + auto path = Json::ensureString(meta, "target"); + if (!path.isEmpty()) { + auto target = FS::PathCombine(file, "../" + path); + QFile(target).link(file); + } } else if (type == "file") { // TODO download compressed version if it exists ? - auto raw = Json::requireObject(Json::requireObject(Json::requireObject(list, paths), "downloads"), "raw"); - auto isExec = Json::ensureBoolean(Json::requireObject(list, paths), "executable", false); - auto f = File{ file, Json::requireString(raw, "url"), QByteArray::fromHex(Json::ensureString(raw, "sha1").toLatin1()), isExec }; - toDownload.push_back(f); + auto raw = Json::ensureObject(Json::ensureObject(meta, "downloads"), "raw"); + auto isExec = Json::ensureBoolean(meta, "executable", false); + auto url = Json::ensureString(raw, "url"); + if (!url.isEmpty() && QUrl(url).isValid()) { + auto f = File{ file, url, QByteArray::fromHex(Json::ensureString(raw, "sha1").toLatin1()), isExec }; + toDownload.push_back(f); + } } } auto elementDownload = new NetJob("JRE::FileDownload", APPLICATION->network()); for (const auto& file : toDownload) { auto dl = Net::Download::makeFile(file.url, file.path); - dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, file.hash)); + if (!file.hash.isEmpty()) { + dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, file.hash)); + } if (file.isExec) { connect(dl.get(), &Net::Download::succeeded, [file] { QFile(file.path).setPermissions(QFile(file.path).permissions() | QFileDevice::Permissions(0x1111)); }); @@ -161,7 +174,7 @@ void JavaDownloader::downloadAzulMeta(const QString& OS, bool isLegacy, const Ne "&os=%2" "&arch=%3" "&hw_bitness=%4" - "&ext=zip" // as a zip for all os, even linux NOTE !! Linux ARM is .deb only !! + "&ext=zip" // as a zip for all os, even linux NOTE !! Linux ARM is .deb or .tar.gz only !! "&bundle_type=jre" // jre only "&latest=true" // only get the one latest entry ) @@ -218,27 +231,30 @@ void JavaDownloader::mojangOStoAzul(const QString& OS, QString& azulOS, QString& } void JavaDownloader::downloadAzulJava(bool isLegacy, const QJsonArray& array) { // JRE found ! download the zip - setStatus(tr("Downloading java from Azul")); + setStatus(tr("Downloading Java from Azul")); auto downloadURL = QUrl(array[0].toObject()["url"].toString()); auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); - auto temp = std::make_unique(FS::PathCombine(APPLICATION->root(), "temp", "XXXXXX.zip")); - FS::ensureFolderPathExists(FS::PathCombine(APPLICATION->root(), "temp")); - // Have to open at least once to generate path - temp->open(); - temp->close(); - download->addNetAction(Net::Download::makeFile(downloadURL, temp->fileName())); + auto path = APPLICATION->instances()->getStagedInstancePath(); + auto temp = FS::PathCombine(path, "azulJRE.zip"); + + download->addNetAction(Net::Download::makeFile(downloadURL, temp)); connect(download, &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download, &NetJob::abort); download->deleteLater(); }); + connect(download, &NetJob::aborted, [path] { APPLICATION->instances()->destroyStagingPath(path); }); connect(download, &NetJob::progress, this, &JavaDownloader::progress); - connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed); + connect(download, &NetJob::failed, this, [this, path](QString reason) { + APPLICATION->instances()->destroyStagingPath(path); + emitFailed(std::move(reason)); + }); connect(this, &Task::aborted, download, &NetJob::abort); - connect(download, &NetJob::succeeded, [isLegacy, file = std::move(temp), downloadURL, this] { + connect(download, &NetJob::succeeded, [isLegacy, temp, downloadURL, path, this] { setStatus(tr("Extracting java")); auto output = FS::PathCombine(QCoreApplication::applicationDirPath(), "java", isLegacy ? "java-legacy" : "java-current"); // This should do all of the extracting and creating folders - MMCZip::extractDir(file->fileName(), downloadURL.fileName().chopped(4), output); + MMCZip::extractDir(temp, downloadURL.fileName().chopped(4), output); + APPLICATION->instances()->destroyStagingPath(path); emitSucceeded(); }); download->start(); @@ -280,26 +296,27 @@ void JavaDownloader::showPrompts(QWidget* parent) return; } // Selection using QMessageBox for java 8 or 17 - QMessageBox box(QMessageBox::Icon::Question, tr("Java version"), - tr("Do you want to download Java version 8 or 17?\n Java 8 is recommended for minecraft versions below 1.17\n Java 17 " - "is recommended for minecraft versions above or equal to 1.17"), - QMessageBox::NoButton, parent); + QMessageBox box( + QMessageBox::Icon::Question, tr("Java version"), + tr("Do you want to download Java version 8 or 17?\n Java 8 is recommended for older Minecraft versions, below 1.17\n Java 17 " + "is recommended for newer Minecraft versions, starting from 1.17"), + QMessageBox::NoButton, parent); auto yes = box.addButton("Java 17", QMessageBox::AcceptRole); auto no = box.addButton("Java 8", QMessageBox::AcceptRole); auto both = box.addButton(tr("Download both"), QMessageBox::AcceptRole); auto cancel = box.addButton(QMessageBox::Cancel); - if (QFileInfo::exists(FS::PathCombine(QString("java"), "java-legacy"))) { + if (QFileInfo::exists(FS::PathCombine(QCoreApplication::applicationDirPath(), QString("java"), "java-legacy"))) { no->setEnabled(false); } - if (QFileInfo::exists(FS::PathCombine(QString("java"), "java-current"))) { + if (QFileInfo::exists(FS::PathCombine(QCoreApplication::applicationDirPath(), QString("java"), "java-current"))) { yes->setEnabled(false); } if (!yes->isEnabled() || !no->isEnabled()) { both->setEnabled(false); } if (!yes->isEnabled() && !no->isEnabled()) { - QMessageBox::warning(parent, tr("Already installed!"), tr("Both versions of java are already installed!")); + QMessageBox::information(parent, tr("Already installed!"), tr("Both versions of Java are already installed!")); return; } box.exec(); @@ -311,8 +328,9 @@ void JavaDownloader::showPrompts(QWidget* parent) auto down = new JavaDownloader(isLegacy, version); ProgressDialog dialog(parent); dialog.setSkipButton(true, tr("Abort")); - - if (dialog.execWithTask(down) && box.clickedButton() == both) { + bool finished_successfully = dialog.execWithTask(down); + // Run another download task for the other option as well! + if (finished_successfully && box.clickedButton() == both) { auto dwn = new JavaDownloader(false, version); ProgressDialog dg(parent); dg.setSkipButton(true, tr("Abort")); diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.ui b/launcher/ui/pages/instance/InstanceSettingsPage.ui index 4ce59a0ae..a28332d5a 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.ui +++ b/launcher/ui/pages/instance/InstanceSettingsPage.ui @@ -61,9 +61,6 @@ false - - - @@ -71,20 +68,6 @@ - - - - Browse... - - - - - - - Test - - - @@ -95,7 +78,24 @@ - + + + + + + + Browse... + + + + + + + Test + + + + Download Java... @@ -635,8 +635,6 @@ javaSettingsGroupBox javaPathTextBox javaDetectBtn - javaBrowseBtn - javaTestBtn memoryGroupBox minMemSpinBox maxMemSpinBox From ce6a36c8b57fb9eb0a22c4f70b74e8fa200a88ad Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 28 Jul 2023 14:31:53 +0100 Subject: [PATCH 019/616] Deduplicate fix Signed-off-by: TheKodeToad --- launcher/MMCZip.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index 49fd0e707..1a336375b 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -315,11 +315,6 @@ std::optional MMCZip::extractSubDir(QuaZip *zip, const QString & su if (relative_file_name.startsWith('/')) relative_file_name = relative_file_name.mid(1); - // Fix subdirs/files ending with a / getting transformed into absolute paths - if(name.startsWith('/')){ - name = name.mid(1); - } - // Fix weird "folders with a single file get squashed" thing QString sub_path; if (relative_file_name.contains('/') && !relative_file_name.endsWith('/')) { From 5538c1d0afba06d1a639dca45e88b0e94a3742f0 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 28 Jul 2023 15:11:24 +0100 Subject: [PATCH 020/616] Fix compilation (actually this time!), incorporating new changes Signed-off-by: TheKodeToad --- launcher/JavaDownloader.cpp | 55 +++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp index 165573599..f5960bbe9 100644 --- a/launcher/JavaDownloader.cpp +++ b/launcher/JavaDownloader.cpp @@ -30,8 +30,8 @@ void JavaDownloader::executeTask() } void JavaDownloader::downloadMojangJavaList(const QString& OS, bool isLegacy) { - auto netJob = new NetJob(QString("JRE::QueryVersions"), APPLICATION->network()); - auto response = new QByteArray(); + auto netJob = makeShared(QString("JRE::QueryVersions"), APPLICATION->network()); + auto response = std::make_shared(); setStatus(tr("Querying mojang meta")); netJob->addNetAction(Net::Download::makeByteArray( QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); @@ -41,18 +41,17 @@ void JavaDownloader::downloadMojangJavaList(const QString& OS, bool isLegacy) .removeRecursively(); }); - connect(netJob, &NetJob::finished, [netJob, response, this] { + connect(netJob.get(), &NetJob::finished, [netJob, response, this] { // delete so that it's not called on a deleted job - disconnect(this, &Task::aborted, netJob, &NetJob::abort); - netJob->deleteLater(); - delete response; + // FIXME: is this needed? qt should handle this + disconnect(this, &Task::aborted, netJob.get(), &NetJob::abort); }); - connect(netJob, &NetJob::progress, this, &JavaDownloader::progress); - connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed); + connect(netJob.get(), &NetJob::progress, this, &JavaDownloader::progress); + connect(netJob.get(), &NetJob::failed, this, &JavaDownloader::emitFailed); - connect(this, &Task::aborted, netJob, &NetJob::abort); + connect(this, &Task::aborted, netJob.get(), &NetJob::abort); - connect(netJob, &NetJob::succeeded, [response, OS, isLegacy, this, netJob] { + connect(netJob.get(), &NetJob::succeeded, [response, OS, isLegacy, this, netJob] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -66,7 +65,7 @@ void JavaDownloader::downloadMojangJavaList(const QString& OS, bool isLegacy) } else { // mojang does not have a JRE for us, let's get azul zulu - downloadAzulMeta(OS, isLegacy, netJob); + downloadAzulMeta(OS, isLegacy, netJob.get()); } }); @@ -76,21 +75,19 @@ void JavaDownloader::parseMojangManifest(bool isLegacy, const QJsonArray& versio { setStatus(tr("Downloading Java from Mojang")); auto url = Json::ensureString(Json::ensureObject(Json::ensureObject(versionArray[0]), "manifest"), "url"); - auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); - auto files = new QByteArray(); + auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); + auto files = std::make_shared(); download->addNetAction(Net::Download::makeByteArray(QUrl(url), files)); - connect(download, &NetJob::finished, [download, files, this] { - disconnect(this, &Task::aborted, download, &NetJob::abort); - download->deleteLater(); - delete files; + connect(download.get(), &NetJob::finished, [download, files, this] { + disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); - connect(download, &NetJob::progress, this, &JavaDownloader::progress); - connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed); - connect(this, &Task::aborted, download, &NetJob::abort); + connect(download.get(), &NetJob::progress, this, &JavaDownloader::progress); + connect(download.get(), &NetJob::failed, this, &JavaDownloader::emitFailed); + connect(this, &Task::aborted, download.get(), &NetJob::abort); - connect(download, &NetJob::succeeded, [files, isLegacy, this] { + connect(download.get(), &NetJob::succeeded, [files, isLegacy, this] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -166,8 +163,8 @@ void JavaDownloader::downloadAzulMeta(const QString& OS, bool isLegacy, const Ne QString bitness; mojangOStoAzul(OS, azulOS, arch, bitness); - auto metaResponse = new QByteArray(); - auto downloadJob = new NetJob(QString("JRE::QueryAzulMeta"), APPLICATION->network()); + auto metaResponse = std::make_shared(); + auto downloadJob = makeShared(QString("JRE::QueryAzulMeta"), APPLICATION->network()); downloadJob->addNetAction( Net::Download::makeByteArray(QString("https://api.azul.com/zulu/download/community/v1.0/bundles/?" "java_version=%1" @@ -180,15 +177,13 @@ void JavaDownloader::downloadAzulMeta(const QString& OS, bool isLegacy, const Ne ) .arg(javaVersion, azulOS, arch, bitness), metaResponse)); - connect(downloadJob, &NetJob::finished, [downloadJob, metaResponse, this] { - disconnect(this, &Task::aborted, downloadJob, &NetJob::abort); - downloadJob->deleteLater(); - delete metaResponse; + connect(downloadJob.get(), &NetJob::finished, [downloadJob, metaResponse, this] { + disconnect(this, &Task::aborted, downloadJob.get(), &NetJob::abort); }); - connect(this, &Task::aborted, downloadJob, &NetJob::abort); + connect(this, &Task::aborted, downloadJob.get(), &NetJob::abort); connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed); - connect(downloadJob, &NetJob::progress, this, &JavaDownloader::progress); - connect(downloadJob, &NetJob::succeeded, [metaResponse, isLegacy, this] { + connect(downloadJob.get(), &NetJob::progress, this, &JavaDownloader::progress); + connect(downloadJob.get(), &NetJob::succeeded, [metaResponse, isLegacy, this] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error); if (parse_error.error != QJsonParseError::NoError) { From f3baa420b2154c37a8f418a090c4392d526482c2 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 16 Aug 2023 13:43:07 +0100 Subject: [PATCH 021/616] Fix broken tab order Signed-off-by: TheKodeToad --- launcher/ui/pages/global/JavaPage.ui | 8 +++++++- launcher/ui/pages/instance/InstanceSettingsPage.ui | 12 ++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index 44289eb86..0bf27fef1 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -320,8 +320,14 @@ minMemSpinBox maxMemSpinBox permGenSpinBox - javaBrowseBtn javaPathTextBox + javaBrowseBtn + javaDownloadBtn + javaDetectBtn + javaTestBtn + skipCompatibilityCheckbox + skipJavaWizardCheckbox + jvmArgsTextBox tabWidget diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.ui b/launcher/ui/pages/instance/InstanceSettingsPage.ui index f9e679b2e..08a74671c 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.ui +++ b/launcher/ui/pages/instance/InstanceSettingsPage.ui @@ -714,6 +714,12 @@ openGlobalJavaSettingsButton settingsTabs javaSettingsGroupBox + javaPathTextBox + javaBrowseBtn + javaDownloadBtn + javaDetectBtn + javaTestBtn + skipCompatibilityCheckbox memoryGroupBox minMemSpinBox maxMemSpinBox @@ -733,12 +739,6 @@ useNativeOpenALCheck showGameTime recordGameTime - skipCompatibilityCheckbox - javaPathTextBox - javaBrowseBtn - javaDownloadBtn - javaDetectBtn - javaTestBtn miscellaneousSettingsBox closeAfterLaunchCheck quitAfterGameStopCheck From 93876e27f80a63b36c2cce73b014bf031054bb99 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 31 Aug 2023 17:32:55 +0100 Subject: [PATCH 022/616] Generalise resource metadata Signed-off-by: TheKodeToad --- launcher/CMakeLists.txt | 5 +- launcher/QObjectPtr.h | 6 +- launcher/minecraft/MinecraftInstance.cpp | 13 ++-- launcher/minecraft/mod/MetadataHandler.h | 51 ++++++++----- launcher/minecraft/mod/Mod.cpp | 73 +----------------- launcher/minecraft/mod/Mod.h | 15 +--- launcher/minecraft/mod/ModDetails.h | 48 +----------- launcher/minecraft/mod/ModFolderModel.cpp | 46 ++---------- launcher/minecraft/mod/ModFolderModel.h | 14 +--- launcher/minecraft/mod/Resource.cpp | 45 ++++++++++- launcher/minecraft/mod/Resource.h | 28 ++++++- .../minecraft/mod/ResourceFolderModel.cpp | 14 ++-- launcher/minecraft/mod/ResourceFolderModel.h | 11 ++- .../minecraft/mod/ResourcePackFolderModel.cpp | 10 +-- .../minecraft/mod/ResourcePackFolderModel.h | 6 +- .../minecraft/mod/ShaderPackFolderModel.h | 4 +- .../minecraft/mod/TexturePackFolderModel.cpp | 10 +-- .../minecraft/mod/TexturePackFolderModel.h | 5 +- .../minecraft/mod/tasks/BasicFolderLoadTask.h | 74 ------------------- .../minecraft/mod/tasks/LocalModParseTask.h | 5 -- ...oadTask.cpp => ResourceFolderLoadTask.cpp} | 71 +++++++++--------- ...derLoadTask.h => ResourceFolderLoadTask.h} | 12 ++- launcher/modplatform/EnsureMetadataTask.cpp | 2 +- .../modplatform/flame/FlameCheckUpdate.cpp | 4 +- .../modrinth/ModrinthCheckUpdate.cpp | 2 +- .../modrinth/ModrinthPackExportTask.cpp | 2 +- launcher/modplatform/packwiz/Packwiz.h | 1 + launcher/ui/dialogs/ModUpdateDialog.cpp | 2 +- 28 files changed, 209 insertions(+), 370 deletions(-) delete mode 100644 launcher/minecraft/mod/tasks/BasicFolderLoadTask.h rename launcher/minecraft/mod/tasks/{ModFolderLoadTask.cpp => ResourceFolderLoadTask.cpp} (55%) rename launcher/minecraft/mod/tasks/{ModFolderLoadTask.h => ResourceFolderLoadTask.h} (84%) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 18e0acab1..cd4c64dec 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -350,9 +350,8 @@ set(MINECRAFT_SOURCES minecraft/mod/TexturePackFolderModel.h minecraft/mod/TexturePackFolderModel.cpp minecraft/mod/ShaderPackFolderModel.h - minecraft/mod/tasks/BasicFolderLoadTask.h - minecraft/mod/tasks/ModFolderLoadTask.h - minecraft/mod/tasks/ModFolderLoadTask.cpp + minecraft/mod/tasks/ResourceFolderLoadTask.h + minecraft/mod/tasks/ResourceFolderLoadTask.cpp minecraft/mod/tasks/LocalModParseTask.h minecraft/mod/tasks/LocalModParseTask.cpp minecraft/mod/tasks/LocalModUpdateTask.h diff --git a/launcher/QObjectPtr.h b/launcher/QObjectPtr.h index a1c64b433..5f7b64df0 100644 --- a/launcher/QObjectPtr.h +++ b/launcher/QObjectPtr.h @@ -33,11 +33,7 @@ class shared_qobject_ptr : public QSharedPointer { {} void reset() { QSharedPointer::reset(); } - void reset(T*&& other) - { - shared_qobject_ptr t(other); - this->swap(t); - } + void reset(T* other) { QSharedPointer::reset(other); } void reset(const shared_qobject_ptr& other) { shared_qobject_ptr t(other); diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 0e64c46d4..a75d017b7 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -1091,7 +1091,7 @@ std::shared_ptr MinecraftInstance::loaderModList() { if (!m_loader_mod_list) { bool is_indexed = !APPLICATION->settings()->get("ModMetadataDisabled").toBool(); - m_loader_mod_list.reset(new ModFolderModel(modsRoot(), this, is_indexed)); + m_loader_mod_list.reset(new ModFolderModel(modsRoot(), this, is_indexed, true)); } return m_loader_mod_list; } @@ -1100,7 +1100,7 @@ std::shared_ptr MinecraftInstance::coreModList() { if (!m_core_mod_list) { bool is_indexed = !APPLICATION->settings()->get("ModMetadataDisabled").toBool(); - m_core_mod_list.reset(new ModFolderModel(coreModsDir(), this, is_indexed)); + m_core_mod_list.reset(new ModFolderModel(coreModsDir(), this, is_indexed, true)); } return m_core_mod_list; } @@ -1117,7 +1117,8 @@ std::shared_ptr MinecraftInstance::nilModList() std::shared_ptr MinecraftInstance::resourcePackList() { if (!m_resource_pack_list) { - m_resource_pack_list.reset(new ResourcePackFolderModel(resourcePacksDir(), this)); + bool is_indexed = !APPLICATION->settings()->get("ModMetadataDisabled").toBool(); + m_resource_pack_list.reset(new ResourcePackFolderModel(resourcePacksDir(), this, is_indexed, true)); } return m_resource_pack_list; } @@ -1125,7 +1126,8 @@ std::shared_ptr MinecraftInstance::resourcePackList() std::shared_ptr MinecraftInstance::texturePackList() { if (!m_texture_pack_list) { - m_texture_pack_list.reset(new TexturePackFolderModel(texturePacksDir(), this)); + bool is_indexed = !APPLICATION->settings()->get("ModMetadataDisabled").toBool(); + m_texture_pack_list.reset(new TexturePackFolderModel(texturePacksDir(), this, is_indexed, true)); } return m_texture_pack_list; } @@ -1133,7 +1135,8 @@ std::shared_ptr MinecraftInstance::texturePackList() std::shared_ptr MinecraftInstance::shaderPackList() { if (!m_shader_pack_list) { - m_shader_pack_list.reset(new ShaderPackFolderModel(shaderPacksDir(), this)); + bool is_indexed = !APPLICATION->settings()->get("ModMetadataDisabled").toBool(); + m_shader_pack_list.reset(new ShaderPackFolderModel(shaderPacksDir(), this, is_indexed, true)); } return m_shader_pack_list; } diff --git a/launcher/minecraft/mod/MetadataHandler.h b/launcher/minecraft/mod/MetadataHandler.h index 88e9ff2b6..747375d3f 100644 --- a/launcher/minecraft/mod/MetadataHandler.h +++ b/launcher/minecraft/mod/MetadataHandler.h @@ -25,30 +25,41 @@ // launcher/minecraft/mod/Mod.h class Mod; -/* Abstraction file for easily changing the way metadata is stored / handled - * Needs to be a class because of -Wunused-function and no C++17 [[maybe_unused]] - * */ -class Metadata { - public: - using ModStruct = Packwiz::V1::Mod; +namespace Metadata { +using ModStruct = Packwiz::V1::Mod; - static auto create(QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> ModStruct - { - return Packwiz::V1::createModFormat(index_dir, mod_pack, mod_version); - } +inline auto create(QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> ModStruct +{ + return Packwiz::V1::createModFormat(index_dir, mod_pack, mod_version); +} - static auto create(QDir& index_dir, Mod& internal_mod, QString mod_slug) -> ModStruct - { - return Packwiz::V1::createModFormat(index_dir, internal_mod, mod_slug); - } +inline auto create(QDir& index_dir, Mod& internal_mod, QString mod_slug) -> ModStruct +{ + return Packwiz::V1::createModFormat(index_dir, internal_mod, std::move(mod_slug)); +} - static void update(QDir& index_dir, ModStruct& mod) { Packwiz::V1::updateModIndex(index_dir, mod); } +inline void update(QDir& index_dir, ModStruct& mod) +{ + Packwiz::V1::updateModIndex(index_dir, mod); +} - static void remove(QDir& index_dir, QString mod_slug) { Packwiz::V1::deleteModIndex(index_dir, mod_slug); } +inline void remove(QDir& index_dir, QString mod_slug) +{ + Packwiz::V1::deleteModIndex(index_dir, mod_slug); +} - static void remove(QDir& index_dir, QVariant& mod_id) { Packwiz::V1::deleteModIndex(index_dir, mod_id); } +inline void remove(QDir& index_dir, QVariant& mod_id) +{ + Packwiz::V1::deleteModIndex(index_dir, mod_id); +} - static auto get(QDir& index_dir, QString mod_slug) -> ModStruct { return Packwiz::V1::getIndexForMod(index_dir, mod_slug); } +inline auto get(QDir& index_dir, QString mod_slug) -> ModStruct +{ + return Packwiz::V1::getIndexForMod(index_dir, std::move(mod_slug)); +} - static auto get(QDir& index_dir, QVariant& mod_id) -> ModStruct { return Packwiz::V1::getIndexForMod(index_dir, mod_id); } -}; +inline auto get(QDir& index_dir, QVariant& mod_id) -> ModStruct +{ + return Packwiz::V1::getIndexForMod(index_dir, mod_id); +} +}; // namespace Metadata diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp index ae3dea8d8..53f7d72de 100644 --- a/launcher/minecraft/mod/Mod.cpp +++ b/launcher/minecraft/mod/Mod.cpp @@ -43,35 +43,16 @@ #include "MTPixmapCache.h" #include "MetadataHandler.h" +#include "Resource.h" #include "Version.h" #include "minecraft/mod/ModDetails.h" #include "minecraft/mod/tasks/LocalModParseTask.h" -static ModPlatform::ProviderCapabilities ProviderCaps; - Mod::Mod(const QFileInfo& file) : Resource(file), m_local_details() { m_enabled = (file.suffix() != "disabled"); } -Mod::Mod(const QDir& mods_dir, const Metadata::ModStruct& metadata) : Mod(mods_dir.absoluteFilePath(metadata.filename)) -{ - m_name = metadata.name; - m_local_details.metadata = std::make_shared(std::move(metadata)); -} - -void Mod::setStatus(ModStatus status) -{ - m_local_details.status = status; -} -void Mod::setMetadata(std::shared_ptr&& metadata) -{ - if (status() == ModStatus::NoMetadata) - setStatus(ModStatus::Installed); - - m_local_details.metadata = metadata; -} - void Mod::setDetails(const ModDetails& details) { m_local_details = details; @@ -103,8 +84,7 @@ std::pair Mod::compare(const Resource& other, SortType type) const break; } case SortType::PROVIDER: { - auto compare_result = - QString::compare(provider().value_or("Unknown"), cast_other->provider().value_or("Unknown"), Qt::CaseInsensitive); + auto compare_result = QString::compare(provider(), cast_other->provider(), Qt::CaseInsensitive); if (compare_result != 0) return { compare_result, type == SortType::PROVIDER }; break; @@ -127,22 +107,6 @@ bool Mod::applyFilter(QRegularExpression filter) const return Resource::applyFilter(filter); } -auto Mod::destroy(QDir& index_dir, bool preserve_metadata, bool attempt_trash) -> bool -{ - if (!preserve_metadata) { - qDebug() << QString("Destroying metadata for '%1' on purpose").arg(name()); - - if (metadata()) { - Metadata::remove(index_dir, metadata()->slug); - } else { - auto n = name(); - Metadata::remove(index_dir, n); - } - } - - return Resource::destroy(attempt_trash); -} - auto Mod::details() const -> const ModDetails& { return m_local_details; @@ -154,10 +118,7 @@ auto Mod::name() const -> QString if (!d_name.isEmpty()) return d_name; - if (metadata()) - return metadata()->name; - - return m_name; + return Resource::name(); } auto Mod::version() const -> QString @@ -187,45 +148,17 @@ auto Mod::authors() const -> QStringList return details().authors; } -auto Mod::status() const -> ModStatus -{ - return details().status; -} - -auto Mod::metadata() -> std::shared_ptr -{ - return m_local_details.metadata; -} - -auto Mod::metadata() const -> const std::shared_ptr -{ - return m_local_details.metadata; -} - void Mod::finishResolvingWithDetails(ModDetails&& details) { m_is_resolving = false; m_is_resolved = true; - std::shared_ptr metadata = details.metadata; - if (details.status == ModStatus::Unknown) - details.status = m_local_details.status; - m_local_details = std::move(details); - if (metadata) - setMetadata(std::move(metadata)); if (!iconPath().isEmpty()) { m_pack_image_cache_key.was_read_attempt = false; } } -auto Mod::provider() const -> std::optional -{ - if (metadata()) - return ProviderCaps.readableName(metadata()->provider); - return {}; -} - auto Mod::licenses() const -> const QList& { return details().licenses; diff --git a/launcher/minecraft/mod/Mod.h b/launcher/minecraft/mod/Mod.h index 6dafecfc5..5f82572a2 100644 --- a/launcher/minecraft/mod/Mod.h +++ b/launcher/minecraft/mod/Mod.h @@ -56,7 +56,6 @@ class Mod : public Resource { Mod() = default; Mod(const QFileInfo& file); - Mod(const QDir& mods_dir, const Metadata::ModStruct& metadata); Mod(QString file_path) : Mod(QFileInfo(file_path)) {} auto details() const -> const ModDetails&; @@ -65,11 +64,10 @@ class Mod : public Resource { auto homeurl() const -> QString; auto description() const -> QString; auto authors() const -> QStringList; - auto status() const -> ModStatus; - auto provider() const -> std::optional; auto licenses() const -> const QList&; auto issueTracker() const -> QString; auto metaurl() const -> QString; + void setDetails(const ModDetails& details); /** Get the intneral path to the mod's icon file*/ QString iconPath() const { return m_local_details.icon_file; } @@ -78,22 +76,11 @@ class Mod : public Resource { /** Thread-safe. */ void setIcon(QImage new_image) const; - auto metadata() -> std::shared_ptr; - auto metadata() const -> const std::shared_ptr; - - void setStatus(ModStatus status); - void setMetadata(std::shared_ptr&& metadata); - void setMetadata(const Metadata::ModStruct& metadata) { setMetadata(std::make_shared(metadata)); } - void setDetails(const ModDetails& details); - bool valid() const override; [[nodiscard]] auto compare(Resource const& other, SortType type) const -> std::pair override; [[nodiscard]] bool applyFilter(QRegularExpression filter) const override; - // Delete all the files of this mod - auto destroy(QDir& index_dir, bool preserve_metadata = false, bool attempt_trash = true) -> bool; - void finishResolvingWithDetails(ModDetails&& details); protected: diff --git a/launcher/minecraft/mod/ModDetails.h b/launcher/minecraft/mod/ModDetails.h index a00d5a24b..9195c0368 100644 --- a/launcher/minecraft/mod/ModDetails.h +++ b/launcher/minecraft/mod/ModDetails.h @@ -43,13 +43,6 @@ #include "minecraft/mod/MetadataHandler.h" -enum class ModStatus { - Installed, // Both JAR and Metadata are present - NotInstalled, // Only the Metadata is present - NoMetadata, // Only the JAR is present - Unknown, // Default status -}; - struct ModLicense { QString name = {}; QString id = {}; @@ -149,12 +142,6 @@ struct ModDetails { /* Path of mod logo */ QString icon_file = {}; - /* Installation status of the mod */ - ModStatus status = ModStatus::Unknown; - - /* Metadata information, if any */ - std::shared_ptr metadata = nullptr; - ModDetails() = default; /** Metadata should be handled manually to properly set the mod status. */ @@ -169,40 +156,9 @@ struct ModDetails { , issue_tracker(other.issue_tracker) , licenses(other.licenses) , icon_file(other.icon_file) - , status(other.status) {} - ModDetails& operator=(const ModDetails& other) - { - this->mod_id = other.mod_id; - this->name = other.name; - this->version = other.version; - this->mcversion = other.mcversion; - this->homeurl = other.homeurl; - this->description = other.description; - this->authors = other.authors; - this->issue_tracker = other.issue_tracker; - this->licenses = other.licenses; - this->icon_file = other.icon_file; - this->status = other.status; + ModDetails& operator=(const ModDetails& other) = default; - return *this; - } - - ModDetails& operator=(const ModDetails&& other) - { - this->mod_id = other.mod_id; - this->name = other.name; - this->version = other.version; - this->mcversion = other.mcversion; - this->homeurl = other.homeurl; - this->description = other.description; - this->authors = other.authors; - this->issue_tracker = other.issue_tracker; - this->licenses = other.licenses; - this->icon_file = other.icon_file; - this->status = other.status; - - return *this; - } + ModDetails& operator=(ModDetails&& other) = default; }; diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp index eed35615c..2f0e9b3e4 100644 --- a/launcher/minecraft/mod/ModFolderModel.cpp +++ b/launcher/minecraft/mod/ModFolderModel.cpp @@ -52,15 +52,16 @@ #include "Application.h" #include "Json.h" +#include "Resource.h" #include "minecraft/mod/tasks/LocalModParseTask.h" #include "minecraft/mod/tasks/LocalModUpdateTask.h" -#include "minecraft/mod/tasks/ModFolderLoadTask.h" +#include "minecraft/mod/tasks/ResourceFolderLoadTask.h" #include "modplatform/ModIndex.h" #include "modplatform/flame/FlameAPI.h" #include "modplatform/flame/FlameModIndex.h" -ModFolderModel::ModFolderModel(const QString& dir, BaseInstance* instance, bool is_indexed, bool create_dir) - : ResourceFolderModel(QDir(dir), instance, nullptr, create_dir), m_is_indexed(is_indexed) +ModFolderModel::ModFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent) + : ResourceFolderModel(QDir(dir), instance, is_indexed, create_dir, parent) { m_column_names = QStringList({ "Enable", "Image", "Name", "Version", "Last Modified", "Provider" }); m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Version"), tr("Last Modified"), tr("Provider") }); @@ -96,15 +97,8 @@ QVariant ModFolderModel::data(const QModelIndex& index, int role) const } case DateColumn: return m_resources[row]->dateTimeChanged(); - case ProviderColumn: { - auto provider = at(row)->provider(); - if (!provider.has_value()) { - //: Unknown mod provider (i.e. not Modrinth, CurseForge, etc...) - return tr("Unknown"); - } - - return provider.value(); - } + case ProviderColumn: + return at(row)->provider(); default: return QVariant(); } @@ -185,14 +179,6 @@ int ModFolderModel::columnCount(const QModelIndex& parent) const return parent.isValid() ? 0 : NUM_COLUMNS; } -Task* ModFolderModel::createUpdateTask() -{ - auto index_dir = indexDir(); - auto task = new ModFolderLoadTask(dir(), index_dir, m_is_indexed, m_first_folder_load); - m_first_folder_load = false; - return task; -} - Task* ModFolderModel::createParseTask(Resource& resource) { return new LocalModParseTask(m_next_resolution_ticket, resource.type(), resource.fileinfo()); @@ -273,26 +259,6 @@ auto ModFolderModel::allMods() -> QList return mods; } -void ModFolderModel::onUpdateSucceeded() -{ - auto update_results = static_cast(m_current_update_task.get())->result(); - - auto& new_mods = update_results->mods; - -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - auto current_list = m_resources_index.keys(); - QSet current_set(current_list.begin(), current_list.end()); - - auto new_list = new_mods.keys(); - QSet new_set(new_list.begin(), new_list.end()); -#else - QSet current_set(m_resources_index.keys().toSet()); - QSet new_set(new_mods.keys().toSet()); -#endif - - applyUpdates(current_set, new_set, new_mods); -} - void ModFolderModel::onParseSucceeded(int ticket, QString mod_id) { auto iter = m_active_parse_tasks.constFind(ticket); diff --git a/launcher/minecraft/mod/ModFolderModel.h b/launcher/minecraft/mod/ModFolderModel.h index f1890e87e..9326158d4 100644 --- a/launcher/minecraft/mod/ModFolderModel.h +++ b/launcher/minecraft/mod/ModFolderModel.h @@ -47,10 +47,9 @@ #include "ResourceFolderModel.h" #include "minecraft/mod/tasks/LocalModParseTask.h" -#include "minecraft/mod/tasks/ModFolderLoadTask.h" +#include "minecraft/mod/tasks/ResourceFolderLoadTask.h" #include "modplatform/ModIndex.h" -class LegacyInstance; class BaseInstance; class QFileSystemWatcher; @@ -63,7 +62,7 @@ class ModFolderModel : public ResourceFolderModel { public: enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, VersionColumn, DateColumn, ProviderColumn, NUM_COLUMNS }; enum ModStatusAction { Disable, Enable, Toggle }; - ModFolderModel(const QString& dir, BaseInstance* instance, bool is_indexed = false, bool create_dir = true); + ModFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent = nullptr); virtual QString id() const override { return "mods"; } @@ -72,7 +71,7 @@ class ModFolderModel : public ResourceFolderModel { QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; int columnCount(const QModelIndex& parent) const override; - [[nodiscard]] Task* createUpdateTask() override; + [[nodiscard]] Resource* createResource(const QFileInfo& file) override { return new Mod(file); } [[nodiscard]] Task* createParseTask(Resource&) override; bool installMod(QString file_path) { return ResourceFolderModel::installResource(file_path); } @@ -87,18 +86,11 @@ class ModFolderModel : public ResourceFolderModel { bool startWatching() override; bool stopWatching() override; - QDir indexDir() { return { QString("%1/.index").arg(dir().absolutePath()) }; } - auto selectedMods(QModelIndexList& indexes) -> QList; auto allMods() -> QList; RESOURCE_HELPERS(Mod) private slots: - void onUpdateSucceeded() override; void onParseSucceeded(int ticket, QString resource_id) override; - - protected: - bool m_is_indexed; - bool m_first_folder_load = true; }; diff --git a/launcher/minecraft/mod/Resource.cpp b/launcher/minecraft/mod/Resource.cpp index da806f0f4..0dd7f8992 100644 --- a/launcher/minecraft/mod/Resource.cpp +++ b/launcher/minecraft/mod/Resource.cpp @@ -5,6 +5,8 @@ #include "FileSystem.h" +static ModPlatform::ProviderCapabilities ProviderCaps; + Resource::Resource(QObject* parent) : QObject(parent) {} Resource::Resource(QFileInfo file_info) : QObject() @@ -54,6 +56,14 @@ void Resource::parseFile() m_changed_date_time = m_file_info.lastModified(); } +auto Resource::name() const -> QString +{ + if (metadata()) + return metadata()->name; + + return m_name; +} + static void removeThePrefix(QString& string) { QRegularExpression regex(QStringLiteral("^(?:the|teh) +"), QRegularExpression::CaseInsensitiveOption); @@ -61,6 +71,22 @@ static void removeThePrefix(QString& string) string = string.trimmed(); } +auto Resource::provider() const -> QString +{ + if (metadata()) + return ProviderCaps.readableName(metadata()->provider); + + return tr("Unknown"); +} + +void Resource::setMetadata(std::shared_ptr&& metadata) +{ + if (status() == ResourceStatus::NO_METADATA) + setStatus(ResourceStatus::INSTALLED); + + m_metadata = metadata; +} + std::pair Resource::compare(const Resource& other, SortType type) const { switch (type) { @@ -152,6 +178,23 @@ bool Resource::destroy(bool attemptTrash) return (attemptTrash && FS::trash(m_file_info.filePath())) || FS::deletePath(m_file_info.filePath()); } + +auto Resource::destroy(QDir& index_dir, bool preserve_metadata, bool attempt_trash) -> bool +{ + if (!preserve_metadata) { + qDebug() << QString("Destroying metadata for '%1' on purpose").arg(name()); + + if (metadata()) { + Metadata::remove(index_dir, metadata()->slug); + } else { + auto n = name(); + Metadata::remove(index_dir, n); + } + } + + return destroy(attempt_trash); +} + bool Resource::isSymLinkUnder(const QString& instPath) const { if (isSymLink()) @@ -168,4 +211,4 @@ bool Resource::isSymLinkUnder(const QString& instPath) const bool Resource::isMoreThanOneHardLink() const { return FS::hardLinkCount(m_file_info.absoluteFilePath()) > 1; -} +} \ No newline at end of file diff --git a/launcher/minecraft/mod/Resource.h b/launcher/minecraft/mod/Resource.h index c1ed49461..5012c23a4 100644 --- a/launcher/minecraft/mod/Resource.h +++ b/launcher/minecraft/mod/Resource.h @@ -5,6 +5,8 @@ #include #include +#include "MetadataHandler.h" +#include "ModDetails.h" #include "QObjectPtr.h" enum class ResourceType { @@ -15,6 +17,13 @@ enum class ResourceType { LITEMOD, //!< The resource is a litemod }; +enum class ResourceStatus { + INSTALLED, // Both JAR and Metadata are present + NOT_INSTALLED, // Only the Metadata is present + NO_METADATA, // Only the JAR is present + UNKNOWN, // Default status +}; + enum class SortType { NAME, DATE, VERSION, ENABLED, PACK_FORMAT, PROVIDER }; enum class EnableAction { ENABLE, DISABLE, TOGGLE }; @@ -46,9 +55,18 @@ class Resource : public QObject { [[nodiscard]] auto type() const -> ResourceType { return m_type; } [[nodiscard]] bool enabled() const { return m_enabled; } - [[nodiscard]] virtual auto name() const -> QString { return m_name; } + [[nodiscard]] virtual auto name() const -> QString; [[nodiscard]] virtual bool valid() const { return m_type != ResourceType::UNKNOWN; } + [[nodiscard]] auto status() const -> ResourceStatus { return m_status; }; + [[nodiscard]] auto metadata() -> std::shared_ptr { return m_metadata; } + [[nodiscard]] auto metadata() const -> std::shared_ptr { return m_metadata; } + [[nodiscard]] auto provider() const -> QString; + + void setStatus(ResourceStatus status) { m_status = status; } + void setMetadata(std::shared_ptr&& metadata); + void setMetadata(const Metadata::ModStruct& metadata) { setMetadata(std::make_shared(metadata)); } + /** Compares two Resources, for sorting purposes, considering a ascending order, returning: * > 0: 'this' comes after 'other' * = 0: 'this' is equal to 'other' @@ -81,7 +99,8 @@ class Resource : public QObject { } // Delete all files of this resource. - bool destroy(bool attemptTrash = true); + auto destroy(bool attemptTrash = true) -> bool; + auto destroy(QDir& index_dir, bool preserve_metadata = false, bool attempt_trash = true) -> bool; [[nodiscard]] auto isSymLink() const -> bool { return m_file_info.isSymLink(); } @@ -110,6 +129,11 @@ class Resource : public QObject { /* The type of file we're dealing with. */ ResourceType m_type = ResourceType::UNKNOWN; + /* Installation status of the resource. */ + ResourceStatus m_status = ResourceStatus::UNKNOWN; + + std::shared_ptr m_metadata = nullptr; + /* Whether the resource is enabled (e.g. shows up in the game) or not. */ bool m_enabled = true; diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index d3237b34b..a39e9adee 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -15,14 +15,14 @@ #include "FileSystem.h" #include "QVariantUtils.h" -#include "minecraft/mod/tasks/BasicFolderLoadTask.h" +#include "minecraft/mod/tasks/ResourceFolderLoadTask.h" #include "settings/Setting.h" #include "tasks/Task.h" #include "ui/dialogs/CustomMessageBox.h" -ResourceFolderModel::ResourceFolderModel(QDir dir, BaseInstance* instance, QObject* parent, bool create_dir) - : QAbstractListModel(parent), m_dir(dir), m_instance(instance), m_watcher(this) +ResourceFolderModel::ResourceFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent) + : QAbstractListModel(parent), m_dir(dir), m_instance(instance), m_watcher(this), m_is_indexed(is_indexed) { if (create_dir) { FS::ensureFolderPathExists(m_dir.absolutePath()); @@ -290,7 +290,7 @@ void ResourceFolderModel::resolveResource(Resource* res) void ResourceFolderModel::onUpdateSucceeded() { - auto update_results = static_cast(m_current_update_task.get())->result(); + auto update_results = static_cast(m_current_update_task.get())->result(); auto& new_resources = update_results->resources; @@ -320,7 +320,11 @@ void ResourceFolderModel::onParseSucceeded(int ticket, QString resource_id) Task* ResourceFolderModel::createUpdateTask() { - return new BasicFolderLoadTask(m_dir); + auto index_dir = indexDir(); + auto task = new ResourceFolderLoadTask(dir(), index_dir, m_is_indexed, m_first_folder_load, + [this](const QFileInfo& file) { return createResource(file); }); + m_first_folder_load = false; + return task; } bool ResourceFolderModel::hasPendingParseTasks() const diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index 80c31e456..3a4287b30 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -29,7 +29,7 @@ class QSortFilterProxyModel; class ResourceFolderModel : public QAbstractListModel { Q_OBJECT public: - ResourceFolderModel(QDir, BaseInstance* instance, QObject* parent = nullptr, bool create_dir = true); + ResourceFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent = nullptr); ~ResourceFolderModel() override; virtual QString id() const { return "resource"; } @@ -52,6 +52,8 @@ class ResourceFolderModel : public QAbstractListModel { virtual bool startWatching() { return startWatching({ m_dir.absolutePath() }); } virtual bool stopWatching() { return stopWatching({ m_dir.absolutePath() }); } + QDir indexDir() { return { QString("%1/.index").arg(dir().absolutePath()) }; } + /** Given a path in the system, install that resource, moving it to its place in the * instance file hierarchy. * @@ -152,7 +154,9 @@ class ResourceFolderModel : public QAbstractListModel { * This Task is normally executed when opening a page, so it shouldn't contain much heavy work. * If such work is needed, try using it in the Task create by createParseTask() instead! */ - [[nodiscard]] virtual Task* createUpdateTask(); + [[nodiscard]] Task* createUpdateTask(); + + [[nodiscard]] virtual Resource* createResource(const QFileInfo& info) { return new Resource(info); } /** This creates a new parse task to be executed by onUpdateSucceeded(). * @@ -210,6 +214,9 @@ class ResourceFolderModel : public QAbstractListModel { QFileSystemWatcher m_watcher; bool m_is_watching = false; + bool m_is_indexed; + bool m_first_folder_load = true; + Task::Ptr m_current_update_task = nullptr; bool m_scheduled_update = false; diff --git a/launcher/minecraft/mod/ResourcePackFolderModel.cpp b/launcher/minecraft/mod/ResourcePackFolderModel.cpp index f27431576..2e72e02f2 100644 --- a/launcher/minecraft/mod/ResourcePackFolderModel.cpp +++ b/launcher/minecraft/mod/ResourcePackFolderModel.cpp @@ -44,10 +44,11 @@ #include "Application.h" #include "Version.h" -#include "minecraft/mod/tasks/BasicFolderLoadTask.h" #include "minecraft/mod/tasks/LocalResourcePackParseTask.h" +#include "minecraft/mod/tasks/ResourceFolderLoadTask.h" -ResourcePackFolderModel::ResourcePackFolderModel(const QString& dir, BaseInstance* instance) : ResourceFolderModel(QDir(dir), instance) +ResourcePackFolderModel::ResourcePackFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent) + : ResourceFolderModel(dir, instance, is_indexed, create_dir, parent) { m_column_names = QStringList({ "Enable", "Image", "Name", "Pack Format", "Last Modified" }); m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Pack Format"), tr("Last Modified") }); @@ -173,11 +174,6 @@ int ResourcePackFolderModel::columnCount(const QModelIndex& parent) const return parent.isValid() ? 0 : NUM_COLUMNS; } -Task* ResourcePackFolderModel::createUpdateTask() -{ - return new BasicFolderLoadTask(m_dir, [](QFileInfo const& entry) { return makeShared(entry); }); -} - Task* ResourcePackFolderModel::createParseTask(Resource& resource) { return new LocalResourcePackParseTask(m_next_resolution_ticket, static_cast(resource)); diff --git a/launcher/minecraft/mod/ResourcePackFolderModel.h b/launcher/minecraft/mod/ResourcePackFolderModel.h index 29c2c5995..fd56c8c73 100644 --- a/launcher/minecraft/mod/ResourcePackFolderModel.h +++ b/launcher/minecraft/mod/ResourcePackFolderModel.h @@ -9,16 +9,16 @@ class ResourcePackFolderModel : public ResourceFolderModel { public: enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, PackFormatColumn, DateColumn, NUM_COLUMNS }; - explicit ResourcePackFolderModel(const QString& dir, BaseInstance* instance); + explicit ResourcePackFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent = nullptr); - virtual QString id() const override { return "resourcepacks"; } + QString id() const override { return "resourcepacks"; } [[nodiscard]] QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; [[nodiscard]] QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; [[nodiscard]] int columnCount(const QModelIndex& parent) const override; - [[nodiscard]] Task* createUpdateTask() override; + [[nodiscard]] Resource* createResource(const QFileInfo& file) override { return new ResourcePack(file); } [[nodiscard]] Task* createParseTask(Resource&) override; RESOURCE_HELPERS(ResourcePack) diff --git a/launcher/minecraft/mod/ShaderPackFolderModel.h b/launcher/minecraft/mod/ShaderPackFolderModel.h index 44ed37a47..02faee49c 100644 --- a/launcher/minecraft/mod/ShaderPackFolderModel.h +++ b/launcher/minecraft/mod/ShaderPackFolderModel.h @@ -6,7 +6,9 @@ class ShaderPackFolderModel : public ResourceFolderModel { Q_OBJECT public: - explicit ShaderPackFolderModel(const QString& dir, BaseInstance* instance) : ResourceFolderModel(QDir(dir), instance) {} + explicit ShaderPackFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent = nullptr) + : ResourceFolderModel(dir, instance, is_indexed, create_dir, parent) + {} virtual QString id() const override { return "shaderpacks"; } }; diff --git a/launcher/minecraft/mod/TexturePackFolderModel.cpp b/launcher/minecraft/mod/TexturePackFolderModel.cpp index 5c5f2b7c1..23a392421 100644 --- a/launcher/minecraft/mod/TexturePackFolderModel.cpp +++ b/launcher/minecraft/mod/TexturePackFolderModel.cpp @@ -39,10 +39,11 @@ #include "TexturePackFolderModel.h" -#include "minecraft/mod/tasks/BasicFolderLoadTask.h" #include "minecraft/mod/tasks/LocalTexturePackParseTask.h" +#include "minecraft/mod/tasks/ResourceFolderLoadTask.h" -TexturePackFolderModel::TexturePackFolderModel(const QString& dir, BaseInstance* instance) : ResourceFolderModel(QDir(dir), instance) +TexturePackFolderModel::TexturePackFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent) + : ResourceFolderModel(QDir(dir), instance, is_indexed, create_dir, parent) { m_column_names = QStringList({ "Enable", "Image", "Name", "Last Modified" }); m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Last Modified") }); @@ -52,11 +53,6 @@ TexturePackFolderModel::TexturePackFolderModel(const QString& dir, BaseInstance* m_columnsHideable = { false, true, false, true }; } -Task* TexturePackFolderModel::createUpdateTask() -{ - return new BasicFolderLoadTask(m_dir, [](QFileInfo const& entry) { return makeShared(entry); }); -} - Task* TexturePackFolderModel::createParseTask(Resource& resource) { return new LocalTexturePackParseTask(m_next_resolution_ticket, static_cast(resource)); diff --git a/launcher/minecraft/mod/TexturePackFolderModel.h b/launcher/minecraft/mod/TexturePackFolderModel.h index b975d8641..44b19b57a 100644 --- a/launcher/minecraft/mod/TexturePackFolderModel.h +++ b/launcher/minecraft/mod/TexturePackFolderModel.h @@ -46,7 +46,7 @@ class TexturePackFolderModel : public ResourceFolderModel { public: enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, DateColumn, NUM_COLUMNS }; - explicit TexturePackFolderModel(const QString& dir, std::shared_ptr instance); + explicit TexturePackFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent = nullptr); virtual QString id() const override { return "texturepacks"; } @@ -55,8 +55,7 @@ class TexturePackFolderModel : public ResourceFolderModel { [[nodiscard]] QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; [[nodiscard]] int columnCount(const QModelIndex& parent) const override; - explicit TexturePackFolderModel(const QString& dir, BaseInstance* instance); - [[nodiscard]] Task* createUpdateTask() override; + [[nodiscard]] Resource* createResource(const QFileInfo& file) override { return new TexturePack(file); } [[nodiscard]] Task* createParseTask(Resource&) override; RESOURCE_HELPERS(TexturePack) diff --git a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h deleted file mode 100644 index 23a2b649a..000000000 --- a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h +++ /dev/null @@ -1,74 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include - -#include "minecraft/mod/Resource.h" - -#include "tasks/Task.h" - -/** Very simple task that just loads a folder's contents directly. - */ -class BasicFolderLoadTask : public Task { - Q_OBJECT - public: - struct Result { - QMap resources; - }; - using ResultPtr = std::shared_ptr; - - [[nodiscard]] ResultPtr result() const { return m_result; } - - public: - BasicFolderLoadTask(QDir dir) : Task(nullptr, false), m_dir(dir), m_result(new Result), m_thread_to_spawn_into(thread()) - { - m_create_func = [](QFileInfo const& entry) -> Resource::Ptr { return makeShared(entry); }; - } - BasicFolderLoadTask(QDir dir, std::function create_function) - : Task(nullptr, false) - , m_dir(dir) - , m_result(new Result) - , m_create_func(std::move(create_function)) - , m_thread_to_spawn_into(thread()) - {} - - [[nodiscard]] bool canAbort() const override { return true; } - bool abort() override - { - m_aborted.store(true); - return true; - } - - void executeTask() override - { - if (thread() != m_thread_to_spawn_into) - connect(this, &Task::finished, this->thread(), &QThread::quit); - - m_dir.refresh(); - for (auto entry : m_dir.entryInfoList()) { - auto resource = m_create_func(entry); - resource->moveToThread(m_thread_to_spawn_into); - m_result->resources.insert(resource->internal_id(), resource); - } - - if (m_aborted) - emit finished(); - else - emitSucceeded(); - } - - private: - QDir m_dir; - ResultPtr m_result; - - std::atomic m_aborted = false; - - std::function m_create_func; - - /** This is the thread in which we should put new mod objects */ - QThread* m_thread_to_spawn_into; -}; diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.h b/launcher/minecraft/mod/tasks/LocalModParseTask.h index a03217093..ff1ff822e 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.h +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.h @@ -47,11 +47,6 @@ class LocalModParseTask : public Task { [[nodiscard]] int token() const { return m_token; } - private: - void processAsZip(); - void processAsFolder(); - void processAsLitemod(); - private: int m_token; ResourceType m_type; diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp b/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.cpp similarity index 55% rename from launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp rename to launcher/minecraft/mod/tasks/ResourceFolderLoadTask.cpp index 9f79ba098..1004bcff0 100644 --- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp +++ b/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.cpp @@ -34,23 +34,20 @@ * limitations under the License. */ -#include "ModFolderLoadTask.h" +#include "ResourceFolderLoadTask.h" #include "minecraft/mod/MetadataHandler.h" #include -ModFolderLoadTask::ModFolderLoadTask(QDir mods_dir, QDir index_dir, bool is_indexed, bool clean_orphan) - : Task(nullptr, false) - , m_mods_dir(mods_dir) - , m_index_dir(index_dir) - , m_is_indexed(is_indexed) - , m_clean_orphan(clean_orphan) - , m_result(new Result()) - , m_thread_to_spawn_into(thread()) +ResourceFolderLoadTask::ResourceFolderLoadTask(const QDir& resource_dir, + const QDir& index_dir, + bool is_indexed, + bool clean_orphan, + std::function create_function) {} -void ModFolderLoadTask::executeTask() +void ResourceFolderLoadTask::executeTask() { if (thread() != m_thread_to_spawn_into) connect(this, &Task::finished, this->thread(), &QThread::quit); @@ -63,32 +60,32 @@ void ModFolderLoadTask::executeTask() // Read JAR files that don't have metadata m_mods_dir.refresh(); for (auto entry : m_mods_dir.entryInfoList()) { - Mod* mod(new Mod(entry)); + Resource* resource = m_create_func(entry); - if (mod->enabled()) { - if (m_result->mods.contains(mod->internal_id())) { - m_result->mods[mod->internal_id()]->setStatus(ModStatus::Installed); + if (resource->enabled()) { + if (m_result->resources.contains(resource->internal_id())) { + m_result->resources[resource->internal_id()]->setStatus(ResourceStatus::INSTALLED); // Delete the object we just created, since a valid one is already in the mods list. - delete mod; + delete resource; } else { - m_result->mods[mod->internal_id()].reset(std::move(mod)); - m_result->mods[mod->internal_id()]->setStatus(ModStatus::NoMetadata); + m_result->resources[resource->internal_id()].reset(resource); + m_result->resources[resource->internal_id()]->setStatus(ResourceStatus::NO_METADATA); } } else { - QString chopped_id = mod->internal_id().chopped(9); - if (m_result->mods.contains(chopped_id)) { - m_result->mods[mod->internal_id()].reset(std::move(mod)); + QString chopped_id = resource->internal_id().chopped(9); + if (m_result->resources.contains(chopped_id)) { + m_result->resources[resource->internal_id()].reset(resource); - auto metadata = m_result->mods[chopped_id]->metadata(); + auto metadata = m_result->resources[chopped_id]->metadata(); if (metadata) { - mod->setMetadata(*metadata); + resource->setMetadata(*metadata); - m_result->mods[mod->internal_id()]->setStatus(ModStatus::Installed); - m_result->mods.remove(chopped_id); + m_result->resources[resource->internal_id()]->setStatus(ResourceStatus::INSTALLED); + m_result->resources.remove(chopped_id); } } else { - m_result->mods[mod->internal_id()].reset(std::move(mod)); - m_result->mods[mod->internal_id()]->setStatus(ModStatus::NoMetadata); + m_result->resources[resource->internal_id()].reset(resource); + m_result->resources[resource->internal_id()]->setStatus(ResourceStatus::NO_METADATA); } } } @@ -96,17 +93,17 @@ void ModFolderLoadTask::executeTask() // Remove orphan metadata to prevent issues // See https://github.com/PolyMC/PolyMC/issues/996 if (m_clean_orphan) { - QMutableMapIterator iter(m_result->mods); + QMutableMapIterator iter(m_result->resources); while (iter.hasNext()) { - auto mod = iter.next().value(); - if (mod->status() == ModStatus::NotInstalled) { - mod->destroy(m_index_dir, false, false); + auto resource = iter.next().value(); + if (resource->status() == ResourceStatus::NOT_INSTALLED) { + resource->destroy(m_index_dir, false, false); iter.remove(); } } } - for (auto mod : m_result->mods) + for (auto mod : m_result->resources) mod->moveToThread(m_thread_to_spawn_into); if (m_aborted) @@ -115,18 +112,18 @@ void ModFolderLoadTask::executeTask() emitSucceeded(); } -void ModFolderLoadTask::getFromMetadata() +void ResourceFolderLoadTask::getFromMetadata() { m_index_dir.refresh(); for (auto entry : m_index_dir.entryList(QDir::Files)) { auto metadata = Metadata::get(m_index_dir, entry); - if (!metadata.isValid()) { + if (!metadata.isValid()) return; - } - auto* mod = new Mod(m_mods_dir, metadata); - mod->setStatus(ModStatus::NotInstalled); - m_result->mods[mod->internal_id()].reset(std::move(mod)); + auto* resource = m_create_func(QFileInfo(m_mods_dir.filePath(metadata.filename))); + resource->setMetadata(metadata); + resource->setStatus(ResourceStatus::NOT_INSTALLED); + m_result->resources[resource->internal_id()].reset(resource); } } diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.h b/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.h similarity index 84% rename from launcher/minecraft/mod/tasks/ModFolderLoadTask.h rename to launcher/minecraft/mod/tasks/ResourceFolderLoadTask.h index 4200ef6d9..616597ca4 100644 --- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.h +++ b/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.h @@ -44,17 +44,21 @@ #include "minecraft/mod/Mod.h" #include "tasks/Task.h" -class ModFolderLoadTask : public Task { +class ResourceFolderLoadTask : public Task { Q_OBJECT public: struct Result { - QMap mods; + QMap resources; }; using ResultPtr = std::shared_ptr; ResultPtr result() const { return m_result; } public: - ModFolderLoadTask(QDir mods_dir, QDir index_dir, bool is_indexed, bool clean_orphan = false); + ResourceFolderLoadTask(const QDir& resource_dir, + const QDir& index_dir, + bool is_indexed, + bool clean_orphan, + std::function create_function); [[nodiscard]] bool canAbort() const override { return true; } bool abort() override @@ -76,6 +80,8 @@ class ModFolderLoadTask : public Task { std::atomic m_aborted = false; + std::function m_create_func; + /** This is the thread in which we should put new mod objects */ QThread* m_thread_to_spawn_into; }; diff --git a/launcher/modplatform/EnsureMetadataTask.cpp b/launcher/modplatform/EnsureMetadataTask.cpp index c3eadd06d..05caa33c9 100644 --- a/launcher/modplatform/EnsureMetadataTask.cpp +++ b/launcher/modplatform/EnsureMetadataTask.cpp @@ -94,7 +94,7 @@ void EnsureMetadataTask::executeTask() } // They already have the right metadata :o - if (mod->status() != ModStatus::NoMetadata && mod->metadata() && mod->metadata()->provider == m_provider) { + if (mod->status() != ResourceStatus::NO_METADATA && mod->metadata() && mod->metadata()->provider == m_provider) { qDebug() << "Mod" << mod->name() << "already has metadata!"; emitReady(mod); continue; diff --git a/launcher/modplatform/flame/FlameCheckUpdate.cpp b/launcher/modplatform/flame/FlameCheckUpdate.cpp index 476a4667a..6653e477e 100644 --- a/launcher/modplatform/flame/FlameCheckUpdate.cpp +++ b/launcher/modplatform/flame/FlameCheckUpdate.cpp @@ -154,7 +154,7 @@ void FlameCheckUpdate::executeTask() continue; } - if (!latest_ver.hash.isEmpty() && (mod->metadata()->hash != latest_ver.hash || mod->status() == ModStatus::NotInstalled)) { + if (!latest_ver.hash.isEmpty() && (mod->metadata()->hash != latest_ver.hash || mod->status() == ResourceStatus::NOT_INSTALLED)) { // Fake pack with the necessary info to pass to the download task :) auto pack = std::make_shared(); pack->name = mod->name(); @@ -167,7 +167,7 @@ void FlameCheckUpdate::executeTask() pack->provider = ModPlatform::ResourceProvider::FLAME; auto old_version = mod->version(); - if (old_version.isEmpty() && mod->status() != ModStatus::NotInstalled) { + if (old_version.isEmpty() && mod->status() != ResourceStatus::NOT_INSTALLED) { auto current_ver = getFileInfo(latest_ver.addonId.toInt(), mod->metadata()->file_id.toInt()); old_version = current_ver.version; } diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp index c65f4fa80..574e99ac7 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp @@ -144,7 +144,7 @@ void ModrinthCheckUpdate::executeTask() auto mod = *mod_iter; auto key = project_ver.hash; - if ((key != hash && project_ver.is_preferred) || (mod->status() == ModStatus::NotInstalled)) { + if ((key != hash && project_ver.is_preferred) || (mod->status() == ResourceStatus::NOT_INSTALLED)) { if (mod->version() == project_ver.version_number) continue; diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp b/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp index a9ddb0c91..72b52836f 100644 --- a/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp @@ -121,7 +121,7 @@ void ModrinthPackExportTask::collectHashes() modIter != allMods.end()) { const Mod* mod = *modIter; if (mod->metadata() != nullptr) { - QUrl& url = mod->metadata()->url; + const QUrl& url = mod->metadata()->url; // ensure the url is permitted on modrinth.com if (!url.isEmpty() && BuildConfig.MODRINTH_MRPACK_HOSTS.contains(url.host())) { qDebug() << "Resolving" << relative << "from index"; diff --git a/launcher/modplatform/packwiz/Packwiz.h b/launcher/modplatform/packwiz/Packwiz.h index 7edc18cde..c49165557 100644 --- a/launcher/modplatform/packwiz/Packwiz.h +++ b/launcher/modplatform/packwiz/Packwiz.h @@ -35,6 +35,7 @@ auto getRealIndexName(QDir& index_dir, QString normalized_index_name, bool shoul class V1 { public: + // can also represent other resources beside loader mods - but this is what packwiz calls it struct Mod { QString slug{}; QString name{}; diff --git a/launcher/ui/dialogs/ModUpdateDialog.cpp b/launcher/ui/dialogs/ModUpdateDialog.cpp index 1f0fa7cd2..f1216572f 100644 --- a/launcher/ui/dialogs/ModUpdateDialog.cpp +++ b/launcher/ui/dialogs/ModUpdateDialog.cpp @@ -228,7 +228,7 @@ auto ModUpdateDialog::ensureMetadata() -> bool }; for (auto candidate : m_candidates) { - if (candidate->status() != ModStatus::NoMetadata) { + if (candidate->status() != ResourceStatus::NO_METADATA) { onMetadataEnsured(candidate); continue; } From ee487669960ba8ee7c1997621b9fd7e778d3f65a Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 1 Sep 2023 00:27:05 +0100 Subject: [PATCH 023/616] More generalistaion for ResourceFolderModels Signed-off-by: TheKodeToad --- launcher/ResourceDownloadTask.cpp | 8 +- launcher/minecraft/mod/MetadataHandler.h | 14 +-- launcher/minecraft/mod/Mod.cpp | 1 - launcher/minecraft/mod/ModFolderModel.cpp | 95 ------------------- launcher/minecraft/mod/ModFolderModel.h | 10 -- launcher/minecraft/mod/Resource.cpp | 9 +- launcher/minecraft/mod/Resource.h | 3 +- .../minecraft/mod/ResourceFolderModel.cpp | 58 ++++++++++- launcher/minecraft/mod/ResourceFolderModel.h | 8 +- launcher/modplatform/packwiz/Packwiz.cpp | 16 ++-- launcher/modplatform/packwiz/Packwiz.h | 16 ++-- launcher/ui/MainWindow.cpp | 2 +- launcher/ui/pages/instance/ModFolderPage.cpp | 2 +- 13 files changed, 90 insertions(+), 152 deletions(-) diff --git a/launcher/ResourceDownloadTask.cpp b/launcher/ResourceDownloadTask.cpp index a02151ca1..dffbaf478 100644 --- a/launcher/ResourceDownloadTask.cpp +++ b/launcher/ResourceDownloadTask.cpp @@ -67,12 +67,8 @@ void ResourceDownloadTask::downloadSucceeded() m_filesNetJob.reset(); auto name = std::get<0>(to_delete); auto filename = std::get<1>(to_delete); - if (!name.isEmpty() && filename != m_pack_version.fileName) { - if (auto model = dynamic_cast(m_pack_model.get()); model) - model->uninstallMod(filename, true); - else - m_pack_model->uninstallResource(filename); - } + if (!name.isEmpty() && filename != m_pack_version.fileName) + m_pack_model->uninstallResource(filename, true); } void ResourceDownloadTask::downloadFailed(QString reason) diff --git a/launcher/minecraft/mod/MetadataHandler.h b/launcher/minecraft/mod/MetadataHandler.h index 747375d3f..3794db484 100644 --- a/launcher/minecraft/mod/MetadataHandler.h +++ b/launcher/minecraft/mod/MetadataHandler.h @@ -28,37 +28,37 @@ class Mod; namespace Metadata { using ModStruct = Packwiz::V1::Mod; -inline auto create(QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> ModStruct +inline auto create(const QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> ModStruct { return Packwiz::V1::createModFormat(index_dir, mod_pack, mod_version); } -inline auto create(QDir& index_dir, Mod& internal_mod, QString mod_slug) -> ModStruct +inline auto create(const QDir& index_dir, Mod& internal_mod, QString mod_slug) -> ModStruct { return Packwiz::V1::createModFormat(index_dir, internal_mod, std::move(mod_slug)); } -inline void update(QDir& index_dir, ModStruct& mod) +inline void update(const QDir& index_dir, ModStruct& mod) { Packwiz::V1::updateModIndex(index_dir, mod); } -inline void remove(QDir& index_dir, QString mod_slug) +inline void remove(const QDir& index_dir, QString mod_slug) { Packwiz::V1::deleteModIndex(index_dir, mod_slug); } -inline void remove(QDir& index_dir, QVariant& mod_id) +inline void remove(const QDir& index_dir, QVariant& mod_id) { Packwiz::V1::deleteModIndex(index_dir, mod_id); } -inline auto get(QDir& index_dir, QString mod_slug) -> ModStruct +inline auto get(const QDir& index_dir, QString mod_slug) -> ModStruct { return Packwiz::V1::getIndexForMod(index_dir, std::move(mod_slug)); } -inline auto get(QDir& index_dir, QVariant& mod_id) -> ModStruct +inline auto get(const QDir& index_dir, QVariant& mod_id) -> ModStruct { return Packwiz::V1::getIndexForMod(index_dir, mod_id); } diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp index 53f7d72de..27688b5f2 100644 --- a/launcher/minecraft/mod/Mod.cpp +++ b/launcher/minecraft/mod/Mod.cpp @@ -36,7 +36,6 @@ #include "Mod.h" -#include #include #include #include diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp index 2f0e9b3e4..733e1f655 100644 --- a/launcher/minecraft/mod/ModFolderModel.cpp +++ b/launcher/minecraft/mod/ModFolderModel.cpp @@ -51,13 +51,9 @@ #include "Application.h" -#include "Json.h" #include "Resource.h" #include "minecraft/mod/tasks/LocalModParseTask.h" #include "minecraft/mod/tasks/LocalModUpdateTask.h" -#include "minecraft/mod/tasks/ResourceFolderLoadTask.h" -#include "modplatform/ModIndex.h" -#include "modplatform/flame/FlameAPI.h" #include "modplatform/flame/FlameModIndex.h" ModFolderModel::ModFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent) @@ -184,58 +180,11 @@ Task* ModFolderModel::createParseTask(Resource& resource) return new LocalModParseTask(m_next_resolution_ticket, resource.type(), resource.fileinfo()); } -bool ModFolderModel::uninstallMod(const QString& filename, bool preserve_metadata) -{ - for (auto mod : allMods()) { - if (mod->fileinfo().fileName() == filename) { - auto index_dir = indexDir(); - mod->destroy(index_dir, preserve_metadata, false); - - update(); - - return true; - } - } - - return false; -} - -bool ModFolderModel::deleteMods(const QModelIndexList& indexes) -{ - if (indexes.isEmpty()) - return true; - - for (auto i : indexes) { - if (i.column() != 0) { - continue; - } - auto m = at(i.row()); - auto index_dir = indexDir(); - m->destroy(index_dir); - } - - update(); - - return true; -} - bool ModFolderModel::isValid() { return m_dir.exists() && m_dir.isReadable(); } -bool ModFolderModel::startWatching() -{ - // Remove orphaned metadata next time - m_first_folder_load = true; - return ResourceFolderModel::startWatching({ m_dir.absolutePath(), indexDir().absolutePath() }); -} - -bool ModFolderModel::stopWatching() -{ - return ResourceFolderModel::stopWatching({ m_dir.absolutePath(), indexDir().absolutePath() }); -} - auto ModFolderModel::selectedMods(QModelIndexList& indexes) -> QList { QList selected_resources; @@ -280,47 +229,3 @@ void ModFolderModel::onParseSucceeded(int ticket, QString mod_id) emit dataChanged(index(row), index(row, columnCount(QModelIndex()) - 1)); } - -static const FlameAPI flameAPI; -bool ModFolderModel::installMod(QString file_path, ModPlatform::IndexedVersion& vers) -{ - if (vers.addonId.isValid()) { - ModPlatform::IndexedPack pack{ - vers.addonId, - ModPlatform::ResourceProvider::FLAME, - }; - - QEventLoop loop; - - auto response = std::make_shared(); - auto job = flameAPI.getProject(vers.addonId.toString(), response); - - QObject::connect(job.get(), &Task::failed, [&loop] { loop.quit(); }); - QObject::connect(job.get(), &Task::aborted, &loop, &QEventLoop::quit); - QObject::connect(job.get(), &Task::succeeded, [response, this, &vers, &loop, &pack] { - QJsonParseError parse_error{}; - QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); - if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response for mod info at " << parse_error.offset - << " reason: " << parse_error.errorString(); - qDebug() << *response; - return; - } - try { - auto obj = Json::requireObject(Json::requireObject(doc), "data"); - FlameMod::loadIndexedPack(pack, obj); - } catch (const JSONValidationError& e) { - qDebug() << doc; - qWarning() << "Error while reading mod info: " << e.cause(); - } - LocalModUpdateTask update_metadata(indexDir(), pack, vers); - QObject::connect(&update_metadata, &Task::finished, &loop, &QEventLoop::quit); - update_metadata.start(); - }); - - job->start(); - - loop.exec(); - } - return ResourceFolderModel::installResource(file_path); -} diff --git a/launcher/minecraft/mod/ModFolderModel.h b/launcher/minecraft/mod/ModFolderModel.h index 9326158d4..c1db33c0c 100644 --- a/launcher/minecraft/mod/ModFolderModel.h +++ b/launcher/minecraft/mod/ModFolderModel.h @@ -74,18 +74,8 @@ class ModFolderModel : public ResourceFolderModel { [[nodiscard]] Resource* createResource(const QFileInfo& file) override { return new Mod(file); } [[nodiscard]] Task* createParseTask(Resource&) override; - bool installMod(QString file_path) { return ResourceFolderModel::installResource(file_path); } - bool installMod(QString file_path, ModPlatform::IndexedVersion& vers); - bool uninstallMod(const QString& filename, bool preserve_metadata = false); - - /// Deletes all the selected mods - bool deleteMods(const QModelIndexList& indexes); - bool isValid(); - bool startWatching() override; - bool stopWatching() override; - auto selectedMods(QModelIndexList& indexes) -> QList; auto allMods() -> QList; diff --git a/launcher/minecraft/mod/Resource.cpp b/launcher/minecraft/mod/Resource.cpp index 0dd7f8992..bfe2a8802 100644 --- a/launcher/minecraft/mod/Resource.cpp +++ b/launcher/minecraft/mod/Resource.cpp @@ -172,15 +172,10 @@ bool Resource::enable(EnableAction action) return true; } -bool Resource::destroy(bool attemptTrash) +auto Resource::destroy(const QDir& index_dir, bool preserve_metadata, bool attempt_trash) -> bool { m_type = ResourceType::UNKNOWN; - return (attemptTrash && FS::trash(m_file_info.filePath())) || FS::deletePath(m_file_info.filePath()); -} - -auto Resource::destroy(QDir& index_dir, bool preserve_metadata, bool attempt_trash) -> bool -{ if (!preserve_metadata) { qDebug() << QString("Destroying metadata for '%1' on purpose").arg(name()); @@ -192,7 +187,7 @@ auto Resource::destroy(QDir& index_dir, bool preserve_metadata, bool attempt_tra } } - return destroy(attempt_trash); + return (attempt_trash && FS::trash(m_file_info.filePath())) || FS::deletePath(m_file_info.filePath()); } bool Resource::isSymLinkUnder(const QString& instPath) const diff --git a/launcher/minecraft/mod/Resource.h b/launcher/minecraft/mod/Resource.h index 5012c23a4..77063cbf0 100644 --- a/launcher/minecraft/mod/Resource.h +++ b/launcher/minecraft/mod/Resource.h @@ -99,8 +99,7 @@ class Resource : public QObject { } // Delete all files of this resource. - auto destroy(bool attemptTrash = true) -> bool; - auto destroy(QDir& index_dir, bool preserve_metadata = false, bool attempt_trash = true) -> bool; + auto destroy(const QDir& index_dir, bool preserve_metadata = false, bool attempt_trash = true) -> bool; [[nodiscard]] auto isSymLink() const -> bool { return m_file_info.isSymLink(); } diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index a39e9adee..9ac387904 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "Application.h" #include "FileSystem.h" @@ -17,6 +18,10 @@ #include "QVariantUtils.h" #include "minecraft/mod/tasks/ResourceFolderLoadTask.h" +#include "Json.h" +#include "minecraft/mod/tasks/LocalModUpdateTask.h" +#include "modplatform/flame/FlameAPI.h" +#include "modplatform/flame/FlameModIndex.h" #include "settings/Setting.h" #include "tasks/Task.h" #include "ui/dialogs/CustomMessageBox.h" @@ -43,6 +48,9 @@ ResourceFolderModel::~ResourceFolderModel() bool ResourceFolderModel::startWatching(const QStringList paths) { + // Remove orphaned metadata next time + m_first_folder_load = true; + if (m_is_watching) return false; @@ -153,11 +161,55 @@ bool ResourceFolderModel::installResource(QString original_path) return false; } -bool ResourceFolderModel::uninstallResource(QString file_name) +bool ResourceFolderModel::installResource(QString path, ModPlatform::IndexedVersion& vers) +{ + if (vers.addonId.isValid()) { + ModPlatform::IndexedPack pack{ + vers.addonId, + ModPlatform::ResourceProvider::FLAME, + }; + + QEventLoop loop; + + auto response = std::make_shared(); + auto job = FlameAPI().getProject(vers.addonId.toString(), response); + + QObject::connect(job.get(), &Task::failed, [&loop] { loop.quit(); }); + QObject::connect(job.get(), &Task::aborted, &loop, &QEventLoop::quit); + QObject::connect(job.get(), &Task::succeeded, [response, this, &vers, &loop, &pack] { + QJsonParseError parse_error{}; + QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response for mod info at " << parse_error.offset + << " reason: " << parse_error.errorString(); + qDebug() << *response; + return; + } + try { + auto obj = Json::requireObject(Json::requireObject(doc), "data"); + FlameMod::loadIndexedPack(pack, obj); + } catch (const JSONValidationError& e) { + qDebug() << doc; + qWarning() << "Error while reading mod info: " << e.cause(); + } + LocalModUpdateTask update_metadata(indexDir(), pack, vers); + QObject::connect(&update_metadata, &Task::finished, &loop, &QEventLoop::quit); + update_metadata.start(); + }); + + job->start(); + + loop.exec(); + } + + return installResource(std::move(path)); +} + +bool ResourceFolderModel::uninstallResource(QString file_name, bool preserve_metadata) { for (auto& resource : m_resources) { if (resource->fileinfo().fileName() == file_name) { - auto res = resource->destroy(false); + auto res = resource->destroy(indexDir(), preserve_metadata, false); update(); @@ -179,7 +231,7 @@ bool ResourceFolderModel::deleteResources(const QModelIndexList& indexes) auto& resource = m_resources.at(i.row()); - resource->destroy(); + resource->destroy(indexDir()); } update(); diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index 3a4287b30..e8f8d2b9e 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -49,8 +49,8 @@ class ResourceFolderModel : public QAbstractListModel { bool stopWatching(const QStringList paths); /* Helper methods for subclasses, using a predetermined list of paths. */ - virtual bool startWatching() { return startWatching({ m_dir.absolutePath() }); } - virtual bool stopWatching() { return stopWatching({ m_dir.absolutePath() }); } + virtual bool startWatching() { return startWatching({ indexDir().absolutePath(), m_dir.absolutePath() }); } + virtual bool stopWatching() { return stopWatching({ indexDir().absolutePath(), m_dir.absolutePath() }); } QDir indexDir() { return { QString("%1/.index").arg(dir().absolutePath()) }; } @@ -61,11 +61,13 @@ class ResourceFolderModel : public QAbstractListModel { */ virtual bool installResource(QString path); + virtual bool installResource(QString path, ModPlatform::IndexedVersion& vers); + /** Uninstall (i.e. remove all data about it) a resource, given its file name. * * Returns whether the removal was successful. */ - virtual bool uninstallResource(QString file_name); + virtual bool uninstallResource(QString file_name, bool preserve_metadata = false); virtual bool deleteResources(const QModelIndexList&); /** Applies the given 'action' to the resources in 'indexes'. diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index 71f66bf3e..bfc1dea44 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -32,7 +32,7 @@ namespace Packwiz { -auto getRealIndexName(QDir& index_dir, QString normalized_fname, bool should_find_match) -> QString +auto getRealIndexName(const QDir& index_dir, QString normalized_fname, bool should_find_match) -> QString { QFile index_file(index_dir.absoluteFilePath(normalized_fname)); @@ -89,7 +89,7 @@ auto intEntry(toml::table table, QString entry_name) -> int return node.value_or(0); } -auto V1::createModFormat([[maybe_unused]] QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) +auto V1::createModFormat([[maybe_unused]] const QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> Mod { Mod mod; @@ -115,7 +115,7 @@ auto V1::createModFormat([[maybe_unused]] QDir& index_dir, ModPlatform::IndexedP return mod; } -auto V1::createModFormat(QDir& index_dir, [[maybe_unused]] ::Mod& internal_mod, QString slug) -> Mod +auto V1::createModFormat(const QDir& index_dir, [[maybe_unused]] ::Mod& internal_mod, QString slug) -> Mod { // Try getting metadata if it exists Mod mod{ getIndexForMod(index_dir, slug) }; @@ -127,7 +127,7 @@ auto V1::createModFormat(QDir& index_dir, [[maybe_unused]] ::Mod& internal_mod, return {}; } -void V1::updateModIndex(QDir& index_dir, Mod& mod) +void V1::updateModIndex(const QDir& index_dir, Mod& mod) { if (!mod.isValid()) { qCritical() << QString("Tried to update metadata of an invalid mod!"); @@ -192,7 +192,7 @@ void V1::updateModIndex(QDir& index_dir, Mod& mod) index_file.close(); } -void V1::deleteModIndex(QDir& index_dir, QString& mod_slug) +void V1::deleteModIndex(const QDir& index_dir, QString& mod_slug) { auto normalized_fname = indexFileName(mod_slug); auto real_fname = getRealIndexName(index_dir, normalized_fname); @@ -211,7 +211,7 @@ void V1::deleteModIndex(QDir& index_dir, QString& mod_slug) } } -void V1::deleteModIndex(QDir& index_dir, QVariant& mod_id) +void V1::deleteModIndex(const QDir& index_dir, QVariant& mod_id) { for (auto& file_name : index_dir.entryList(QDir::Filter::Files)) { auto mod = getIndexForMod(index_dir, file_name); @@ -223,7 +223,7 @@ void V1::deleteModIndex(QDir& index_dir, QVariant& mod_id) } } -auto V1::getIndexForMod(QDir& index_dir, QString slug) -> Mod +auto V1::getIndexForMod(const QDir& index_dir, QString slug) -> Mod { Mod mod; @@ -301,7 +301,7 @@ auto V1::getIndexForMod(QDir& index_dir, QString slug) -> Mod return mod; } -auto V1::getIndexForMod(QDir& index_dir, QVariant& mod_id) -> Mod +auto V1::getIndexForMod(const QDir& index_dir, QVariant& mod_id) -> Mod { for (auto& file_name : index_dir.entryList(QDir::Filter::Files)) { auto mod = getIndexForMod(index_dir, file_name); diff --git a/launcher/modplatform/packwiz/Packwiz.h b/launcher/modplatform/packwiz/Packwiz.h index c49165557..ffc1d40c8 100644 --- a/launcher/modplatform/packwiz/Packwiz.h +++ b/launcher/modplatform/packwiz/Packwiz.h @@ -31,7 +31,7 @@ class Mod; namespace Packwiz { -auto getRealIndexName(QDir& index_dir, QString normalized_index_name, bool should_match = false) -> QString; +auto getRealIndexName(const QDir& index_dir, QString normalized_index_name, bool should_match = false) -> QString; class V1 { public: @@ -67,33 +67,33 @@ class V1 { /* Generates the object representing the information in a mod.pw.toml file via * its common representation in the launcher, when downloading mods. * */ - static auto createModFormat(QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> Mod; + static auto createModFormat(const QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> Mod; /* Generates the object representing the information in a mod.pw.toml file via * its common representation in the launcher, plus a necessary slug. * */ - static auto createModFormat(QDir& index_dir, ::Mod& internal_mod, QString slug) -> Mod; + static auto createModFormat(const QDir& index_dir, ::Mod& internal_mod, QString slug) -> Mod; /* Updates the mod index for the provided mod. * This creates a new index if one does not exist already * TODO: Ask the user if they want to override, and delete the old mod's files, or keep the old one. * */ - static void updateModIndex(QDir& index_dir, Mod& mod); + static void updateModIndex(const QDir& index_dir, Mod& mod); /* Deletes the metadata for the mod with the given slug. If the metadata doesn't exist, it does nothing. */ - static void deleteModIndex(QDir& index_dir, QString& mod_slug); + static void deleteModIndex(const QDir& index_dir, QString& mod_slug); /* Deletes the metadata for the mod with the given id. If the metadata doesn't exist, it does nothing. */ - static void deleteModIndex(QDir& index_dir, QVariant& mod_id); + static void deleteModIndex(const QDir& index_dir, QVariant& mod_id); /* Gets the metadata for a mod with a particular file name. * If the mod doesn't have a metadata, it simply returns an empty Mod object. * */ - static auto getIndexForMod(QDir& index_dir, QString slug) -> Mod; + static auto getIndexForMod(const QDir& index_dir, QString slug) -> Mod; /* Gets the metadata for a mod with a particular id. * If the mod doesn't have a metadata, it simply returns an empty Mod object. * */ - static auto getIndexForMod(QDir& index_dir, QVariant& mod_id) -> Mod; + static auto getIndexForMod(const QDir& index_dir, QVariant& mod_id) -> Mod; }; } // namespace Packwiz diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 5e55a5abb..a7e3def38 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1048,7 +1048,7 @@ void MainWindow::processURLs(QList urls) qWarning() << "Importing of Data Packs not supported at this time. Ignoring" << localFileName; break; case PackedResourceType::Mod: - minecraftInst->loaderModList()->installMod(localFileName, version); + minecraftInst->loaderModList()->installResource(localFileName, version); break; case PackedResourceType::ShaderPack: minecraftInst->shaderPackList()->installResource(localFileName); diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 0f5e29cb6..6333dec1d 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -150,7 +150,7 @@ void ModFolderPage::removeItems(const QItemSelection& selection) if (response != QMessageBox::Yes) return; } - m_model->deleteMods(selection.indexes()); + m_model->deleteResources(selection.indexes()); } void ModFolderPage::installMods() From 6aecbfc38fe3ec2b6fc6d9f3e2a76fc03229729b Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 1 Sep 2023 12:50:20 +0100 Subject: [PATCH 024/616] Fix crashes Signed-off-by: TheKodeToad --- launcher/QObjectPtr.h | 6 +++++- .../minecraft/mod/tasks/ResourceFolderLoadTask.cpp | 14 +++++++++++--- .../minecraft/mod/tasks/ResourceFolderLoadTask.h | 5 ++--- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/launcher/QObjectPtr.h b/launcher/QObjectPtr.h index 5f7b64df0..88c17c0b2 100644 --- a/launcher/QObjectPtr.h +++ b/launcher/QObjectPtr.h @@ -33,7 +33,11 @@ class shared_qobject_ptr : public QSharedPointer { {} void reset() { QSharedPointer::reset(); } - void reset(T* other) { QSharedPointer::reset(other); } + void reset(T* other) + { + shared_qobject_ptr t(other); + this->swap(t); + } void reset(const shared_qobject_ptr& other) { shared_qobject_ptr t(other); diff --git a/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.cpp b/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.cpp index 1004bcff0..2a02eb177 100644 --- a/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.cpp +++ b/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.cpp @@ -45,6 +45,14 @@ ResourceFolderLoadTask::ResourceFolderLoadTask(const QDir& resource_dir, bool is_indexed, bool clean_orphan, std::function create_function) + : Task(nullptr, false) + , m_resource_dir(resource_dir) + , m_index_dir(index_dir) + , m_is_indexed(is_indexed) + , m_clean_orphan(clean_orphan) + , m_create_func(create_function) + , m_result(new Result()) + , m_thread_to_spawn_into(thread()) {} void ResourceFolderLoadTask::executeTask() @@ -58,8 +66,8 @@ void ResourceFolderLoadTask::executeTask() } // Read JAR files that don't have metadata - m_mods_dir.refresh(); - for (auto entry : m_mods_dir.entryInfoList()) { + m_resource_dir.refresh(); + for (auto entry : m_resource_dir.entryInfoList()) { Resource* resource = m_create_func(entry); if (resource->enabled()) { @@ -121,7 +129,7 @@ void ResourceFolderLoadTask::getFromMetadata() if (!metadata.isValid()) return; - auto* resource = m_create_func(QFileInfo(m_mods_dir.filePath(metadata.filename))); + auto* resource = m_create_func(QFileInfo(m_resource_dir.filePath(metadata.filename))); resource->setMetadata(metadata); resource->setStatus(ResourceStatus::NOT_INSTALLED); m_result->resources[resource->internal_id()].reset(resource); diff --git a/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.h b/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.h index 616597ca4..9950345ef 100644 --- a/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.h +++ b/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.h @@ -73,15 +73,14 @@ class ResourceFolderLoadTask : public Task { void getFromMetadata(); private: - QDir m_mods_dir, m_index_dir; + QDir m_resource_dir, m_index_dir; bool m_is_indexed; bool m_clean_orphan; + std::function m_create_func; ResultPtr m_result; std::atomic m_aborted = false; - std::function m_create_func; - /** This is the thread in which we should put new mod objects */ QThread* m_thread_to_spawn_into; }; From ad16d612087beab6f918c96168ad5628e77487f5 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 1 Sep 2023 17:42:05 +0100 Subject: [PATCH 025/616] Resource metadata writing Signed-off-by: TheKodeToad --- launcher/CMakeLists.txt | 4 +- launcher/ResourceDownloadTask.cpp | 6 +- launcher/ResourceDownloadTask.h | 4 +- launcher/minecraft/mod/ModFolderModel.cpp | 2 +- .../minecraft/mod/ResourceFolderModel.cpp | 4 +- ...teTask.cpp => LocalResourceUpdateTask.cpp} | 26 +-- ...UpdateTask.h => LocalResourceUpdateTask.h} | 12 +- launcher/modplatform/EnsureMetadataTask.cpp | 168 +++++++++--------- launcher/modplatform/EnsureMetadataTask.h | 23 +-- .../ui/pages/modplatform/ResourcePage.cpp | 4 +- .../ui/pages/modplatform/ShaderPackPage.cpp | 4 +- 11 files changed, 131 insertions(+), 126 deletions(-) rename launcher/minecraft/mod/tasks/{LocalModUpdateTask.cpp => LocalResourceUpdateTask.cpp} (63%) rename launcher/minecraft/mod/tasks/{LocalModUpdateTask.h => LocalResourceUpdateTask.h} (74%) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index cd4c64dec..5bc2d73a7 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -354,8 +354,8 @@ set(MINECRAFT_SOURCES minecraft/mod/tasks/ResourceFolderLoadTask.cpp minecraft/mod/tasks/LocalModParseTask.h minecraft/mod/tasks/LocalModParseTask.cpp - minecraft/mod/tasks/LocalModUpdateTask.h - minecraft/mod/tasks/LocalModUpdateTask.cpp + minecraft/mod/tasks/LocalResourceUpdateTask.h + minecraft/mod/tasks/LocalResourceUpdateTask.cpp minecraft/mod/tasks/LocalDataPackParseTask.h minecraft/mod/tasks/LocalDataPackParseTask.cpp minecraft/mod/tasks/LocalResourcePackParseTask.h diff --git a/launcher/ResourceDownloadTask.cpp b/launcher/ResourceDownloadTask.cpp index dffbaf478..e5828b569 100644 --- a/launcher/ResourceDownloadTask.cpp +++ b/launcher/ResourceDownloadTask.cpp @@ -33,9 +33,9 @@ ResourceDownloadTask::ResourceDownloadTask(ModPlatform::IndexedPack::Ptr pack, QString custom_target_folder) : m_pack(std::move(pack)), m_pack_version(std::move(version)), m_pack_model(packs), m_custom_target_folder(custom_target_folder) { - if (auto model = dynamic_cast(m_pack_model.get()); model && is_indexed) { - m_update_task.reset(new LocalModUpdateTask(model->indexDir(), *m_pack, m_pack_version)); - connect(m_update_task.get(), &LocalModUpdateTask::hasOldMod, this, &ResourceDownloadTask::hasOldResource); + if (is_indexed) { + m_update_task.reset(new LocalResourceUpdateTask(m_pack_model->indexDir(), *m_pack, m_pack_version)); + connect(m_update_task.get(), &LocalResourceUpdateTask::hasOldResource, this, &ResourceDownloadTask::hasOldResource); addTask(m_update_task); } diff --git a/launcher/ResourceDownloadTask.h b/launcher/ResourceDownloadTask.h index 2baddf8a8..7da5a4aad 100644 --- a/launcher/ResourceDownloadTask.h +++ b/launcher/ResourceDownloadTask.h @@ -22,7 +22,7 @@ #include "net/NetJob.h" #include "tasks/SequentialTask.h" -#include "minecraft/mod/tasks/LocalModUpdateTask.h" +#include "minecraft/mod/tasks/LocalResourceUpdateTask.h" #include "modplatform/ModIndex.h" class ResourceFolderModel; @@ -50,7 +50,7 @@ class ResourceDownloadTask : public SequentialTask { QString m_custom_target_folder; NetJob::Ptr m_filesNetJob; - LocalModUpdateTask::Ptr m_update_task; + LocalResourceUpdateTask::Ptr m_update_task; void downloadProgressChanged(qint64 current, qint64 total); void downloadFailed(QString reason); diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp index 733e1f655..43c64a667 100644 --- a/launcher/minecraft/mod/ModFolderModel.cpp +++ b/launcher/minecraft/mod/ModFolderModel.cpp @@ -53,7 +53,7 @@ #include "Resource.h" #include "minecraft/mod/tasks/LocalModParseTask.h" -#include "minecraft/mod/tasks/LocalModUpdateTask.h" +#include "minecraft/mod/tasks/LocalResourceUpdateTask.h" #include "modplatform/flame/FlameModIndex.h" ModFolderModel::ModFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent) diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index 9ac387904..27eb4d2e5 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -19,7 +19,7 @@ #include "minecraft/mod/tasks/ResourceFolderLoadTask.h" #include "Json.h" -#include "minecraft/mod/tasks/LocalModUpdateTask.h" +#include "minecraft/mod/tasks/LocalResourceUpdateTask.h" #include "modplatform/flame/FlameAPI.h" #include "modplatform/flame/FlameModIndex.h" #include "settings/Setting.h" @@ -192,7 +192,7 @@ bool ResourceFolderModel::installResource(QString path, ModPlatform::IndexedVers qDebug() << doc; qWarning() << "Error while reading mod info: " << e.cause(); } - LocalModUpdateTask update_metadata(indexDir(), pack, vers); + LocalResourceUpdateTask update_metadata(indexDir(), pack, vers); QObject::connect(&update_metadata, &Task::finished, &loop, &QEventLoop::quit); update_metadata.start(); }); diff --git a/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp b/launcher/minecraft/mod/tasks/LocalResourceUpdateTask.cpp similarity index 63% rename from launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp rename to launcher/minecraft/mod/tasks/LocalResourceUpdateTask.cpp index 4352fad91..c8fe1050a 100644 --- a/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalResourceUpdateTask.cpp @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -#include "LocalModUpdateTask.h" +#include "LocalResourceUpdateTask.h" #include "FileSystem.h" #include "minecraft/mod/MetadataHandler.h" @@ -26,12 +26,12 @@ #include #endif -LocalModUpdateTask::LocalModUpdateTask(QDir index_dir, ModPlatform::IndexedPack& mod, ModPlatform::IndexedVersion& mod_version) - : m_index_dir(index_dir), m_mod(mod), m_mod_version(mod_version) +LocalResourceUpdateTask::LocalResourceUpdateTask(QDir index_dir, ModPlatform::IndexedPack& project, ModPlatform::IndexedVersion& version) + : m_index_dir(index_dir), m_project(project), m_version(version) { // Ensure a '.index' folder exists in the mods folder, and create it if it does not if (!FS::ensureFolderPathExists(index_dir.path())) { - emitFailed(QString("Unable to create index for mod %1!").arg(m_mod.name)); + emitFailed(QString("Unable to create index directory at %1!").arg(index_dir.absolutePath())); } #ifdef Q_OS_WIN32 @@ -39,28 +39,28 @@ LocalModUpdateTask::LocalModUpdateTask(QDir index_dir, ModPlatform::IndexedPack& #endif } -void LocalModUpdateTask::executeTask() +void LocalResourceUpdateTask::executeTask() { - setStatus(tr("Updating index for mod:\n%1").arg(m_mod.name)); + setStatus(tr("Updating index for resource:\n%1").arg(m_project.name)); - auto old_metadata = Metadata::get(m_index_dir, m_mod.addonId); + auto old_metadata = Metadata::get(m_index_dir, m_project.addonId); if (old_metadata.isValid()) { - emit hasOldMod(old_metadata.name, old_metadata.filename); - if (m_mod.slug.isEmpty()) - m_mod.slug = old_metadata.slug; + emit hasOldResource(old_metadata.name, old_metadata.filename); + if (m_project.slug.isEmpty()) + m_project.slug = old_metadata.slug; } - auto pw_mod = Metadata::create(m_index_dir, m_mod, m_mod_version); + auto pw_mod = Metadata::create(m_index_dir, m_project, m_version); if (pw_mod.isValid()) { Metadata::update(m_index_dir, pw_mod); emitSucceeded(); } else { - qCritical() << "Tried to update an invalid mod!"; + qCritical() << "Tried to update an invalid resource!"; emitFailed(tr("Invalid metadata")); } } -auto LocalModUpdateTask::abort() -> bool +auto LocalResourceUpdateTask::abort() -> bool { emitAborted(); return true; diff --git a/launcher/minecraft/mod/tasks/LocalModUpdateTask.h b/launcher/minecraft/mod/tasks/LocalResourceUpdateTask.h similarity index 74% rename from launcher/minecraft/mod/tasks/LocalModUpdateTask.h rename to launcher/minecraft/mod/tasks/LocalResourceUpdateTask.h index 080999294..6e2efbd6a 100644 --- a/launcher/minecraft/mod/tasks/LocalModUpdateTask.h +++ b/launcher/minecraft/mod/tasks/LocalResourceUpdateTask.h @@ -23,12 +23,12 @@ #include "modplatform/ModIndex.h" #include "tasks/Task.h" -class LocalModUpdateTask : public Task { +class LocalResourceUpdateTask : public Task { Q_OBJECT public: - using Ptr = shared_qobject_ptr; + using Ptr = shared_qobject_ptr; - explicit LocalModUpdateTask(QDir index_dir, ModPlatform::IndexedPack& mod, ModPlatform::IndexedVersion& mod_version); + explicit LocalResourceUpdateTask(QDir index_dir, ModPlatform::IndexedPack& project, ModPlatform::IndexedVersion& version); auto canAbort() const -> bool override { return true; } auto abort() -> bool override; @@ -38,10 +38,10 @@ class LocalModUpdateTask : public Task { void executeTask() override; signals: - void hasOldMod(QString name, QString filename); + void hasOldResource(QString name, QString filename); private: QDir m_index_dir; - ModPlatform::IndexedPack& m_mod; - ModPlatform::IndexedVersion& m_mod_version; + ModPlatform::IndexedPack& m_project; + ModPlatform::IndexedVersion& m_version; }; diff --git a/launcher/modplatform/EnsureMetadataTask.cpp b/launcher/modplatform/EnsureMetadataTask.cpp index 05caa33c9..4adbebdb1 100644 --- a/launcher/modplatform/EnsureMetadataTask.cpp +++ b/launcher/modplatform/EnsureMetadataTask.cpp @@ -6,7 +6,7 @@ #include "Json.h" #include "minecraft/mod/Mod.h" -#include "minecraft/mod/tasks/LocalModUpdateTask.h" +#include "minecraft/mod/tasks/LocalResourceUpdateTask.h" #include "modplatform/flame/FlameAPI.h" #include "modplatform/flame/FlameModIndex.h" @@ -19,52 +19,52 @@ static ModPlatform::ProviderCapabilities ProviderCaps; static ModrinthAPI modrinth_api; static FlameAPI flame_api; -EnsureMetadataTask::EnsureMetadataTask(Mod* mod, QDir dir, ModPlatform::ResourceProvider prov) +EnsureMetadataTask::EnsureMetadataTask(Resource* resource, QDir dir, ModPlatform::ResourceProvider prov) : Task(nullptr), m_index_dir(dir), m_provider(prov), m_hashing_task(nullptr), m_current_task(nullptr) { - auto hash_task = createNewHash(mod); + auto hash_task = createNewHash(resource); if (!hash_task) return; - connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, mod](QString hash) { m_mods.insert(hash, mod); }); - connect(hash_task.get(), &Task::failed, [this, mod] { emitFail(mod, "", RemoveFromList::No); }); + connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, resource](QString hash) { m_resources.insert(hash, resource); }); + connect(hash_task.get(), &Task::failed, [this, resource] { emitFail(resource, "", RemoveFromList::No); }); hash_task->start(); } -EnsureMetadataTask::EnsureMetadataTask(QList& mods, QDir dir, ModPlatform::ResourceProvider prov) +EnsureMetadataTask::EnsureMetadataTask(QList& resources, QDir dir, ModPlatform::ResourceProvider prov) : Task(nullptr), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) { m_hashing_task.reset(new ConcurrentTask(this, "MakeHashesTask", 10)); - for (auto* mod : mods) { - auto hash_task = createNewHash(mod); + for (auto* resource : resources) { + auto hash_task = createNewHash(resource); if (!hash_task) continue; - connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, mod](QString hash) { m_mods.insert(hash, mod); }); - connect(hash_task.get(), &Task::failed, [this, mod] { emitFail(mod, "", RemoveFromList::No); }); + connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, resource](QString hash) { m_resources.insert(hash, resource); }); + connect(hash_task.get(), &Task::failed, [this, resource] { emitFail(resource, "", RemoveFromList::No); }); m_hashing_task->addTask(hash_task); } } -Hashing::Hasher::Ptr EnsureMetadataTask::createNewHash(Mod* mod) +Hashing::Hasher::Ptr EnsureMetadataTask::createNewHash(Resource* resource) { - if (!mod || !mod->valid() || mod->type() == ResourceType::FOLDER) + if (!resource || !resource->valid() || resource->type() == ResourceType::FOLDER) return nullptr; - return Hashing::createHasher(mod->fileinfo().absoluteFilePath(), m_provider); + return Hashing::createHasher(resource->fileinfo().absoluteFilePath(), m_provider); } -QString EnsureMetadataTask::getExistingHash(Mod* mod) +QString EnsureMetadataTask::getExistingHash(Resource* resource) { // Check for already computed hashes // (linear on the number of mods vs. linear on the size of the mod's JAR) - auto it = m_mods.keyValueBegin(); - while (it != m_mods.keyValueEnd()) { - if ((*it).second == mod) + auto it = m_resources.keyValueBegin(); + while (it != m_resources.keyValueEnd()) { + if ((*it).second == resource) break; it++; } // We already have the hash computed - if (it != m_mods.keyValueEnd()) { + if (it != m_resources.keyValueEnd()) { return (*it).first; } @@ -84,25 +84,25 @@ bool EnsureMetadataTask::abort() void EnsureMetadataTask::executeTask() { - setStatus(tr("Checking if mods have metadata...")); + setStatus(tr("Checking if resources have metadata...")); - for (auto* mod : m_mods) { - if (!mod->valid()) { - qDebug() << "Mod" << mod->name() << "is invalid!"; - emitFail(mod); + for (auto* resource : m_resources) { + if (!resource->valid()) { + qDebug() << "Resource" << resource->name() << "is invalid!"; + emitFail(resource); continue; } // They already have the right metadata :o - if (mod->status() != ResourceStatus::NO_METADATA && mod->metadata() && mod->metadata()->provider == m_provider) { - qDebug() << "Mod" << mod->name() << "already has metadata!"; - emitReady(mod); + if (resource->status() != ResourceStatus::NO_METADATA && resource->metadata() && resource->metadata()->provider == m_provider) { + qDebug() << "Resource" << resource->name() << "already has metadata!"; + emitReady(resource); continue; } // Folders don't have metadata - if (mod->type() == ResourceType::FOLDER) { - emitReady(mod); + if (resource->type() == ResourceType::FOLDER) { + emitReady(resource); } } @@ -118,9 +118,9 @@ void EnsureMetadataTask::executeTask() } auto invalidade_leftover = [this] { - for (auto mod = m_mods.constBegin(); mod != m_mods.constEnd(); mod++) - emitFail(mod.value(), mod.key(), RemoveFromList::No); - m_mods.clear(); + for (auto resource = m_resources.constBegin(); resource != m_resources.constEnd(); resource++) + emitFail(resource.value(), resource.key(), RemoveFromList::No); + m_resources.clear(); emitSucceeded(); }; @@ -159,53 +159,53 @@ void EnsureMetadataTask::executeTask() m_current_task.reset(); }); - if (m_mods.size() > 1) + if (m_resources.size() > 1) setStatus(tr("Requesting metadata information from %1...").arg(ProviderCaps.readableName(m_provider))); - else if (!m_mods.empty()) + else if (!m_resources.empty()) setStatus(tr("Requesting metadata information from %1 for '%2'...") - .arg(ProviderCaps.readableName(m_provider), m_mods.begin().value()->name())); + .arg(ProviderCaps.readableName(m_provider), m_resources.begin().value()->name())); m_current_task = version_task; version_task->start(); } -void EnsureMetadataTask::emitReady(Mod* m, QString key, RemoveFromList remove) +void EnsureMetadataTask::emitReady(Resource* resource, QString key, RemoveFromList remove) { - if (!m) { - qCritical() << "Tried to mark a null mod as ready."; + if (!resource) { + qCritical() << "Tried to mark a null resource as ready."; if (!key.isEmpty()) - m_mods.remove(key); + m_resources.remove(key); return; } - qDebug() << QString("Generated metadata for %1").arg(m->name()); - emit metadataReady(m); + qDebug() << QString("Generated metadata for %1").arg(resource->name()); + emit metadataReady(resource); if (remove == RemoveFromList::Yes) { if (key.isEmpty()) - key = getExistingHash(m); - m_mods.remove(key); + key = getExistingHash(resource); + m_resources.remove(key); } } -void EnsureMetadataTask::emitFail(Mod* m, QString key, RemoveFromList remove) +void EnsureMetadataTask::emitFail(Resource* resource, QString key, RemoveFromList remove) { - if (!m) { - qCritical() << "Tried to mark a null mod as failed."; + if (!resource) { + qCritical() << "Tried to mark a null resource as failed."; if (!key.isEmpty()) - m_mods.remove(key); + m_resources.remove(key); return; } - qDebug() << QString("Failed to generate metadata for %1").arg(m->name()); - emit metadataFailed(m); + qDebug() << QString("Failed to generate metadata for %1").arg(resource->name()); + emit metadataFailed(resource); if (remove == RemoveFromList::Yes) { if (key.isEmpty()) - key = getExistingHash(m); - m_mods.remove(key); + key = getExistingHash(resource); + m_resources.remove(key); } } @@ -216,7 +216,7 @@ Task::Ptr EnsureMetadataTask::modrinthVersionsTask() auto hash_type = ProviderCaps.hashType(ModPlatform::ResourceProvider::MODRINTH).first(); auto response = std::make_shared(); - auto ver_task = modrinth_api.currentVersions(m_mods.keys(), hash_type, response); + auto ver_task = modrinth_api.currentVersions(m_resources.keys(), hash_type, response); // Prevents unfortunate timings when aborting the task if (!ver_task) @@ -236,20 +236,20 @@ Task::Ptr EnsureMetadataTask::modrinthVersionsTask() try { auto entries = Json::requireObject(doc); - for (auto& hash : m_mods.keys()) { - auto mod = m_mods.find(hash).value(); + for (auto& hash : m_resources.keys()) { + auto resource = m_resources.find(hash).value(); try { auto entry = Json::requireObject(entries, hash); - setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(mod->name())); - qDebug() << "Getting version for" << mod->name() << "from Modrinth"; + setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(resource->name())); + qDebug() << "Getting version for" << resource->name() << "from Modrinth"; m_temp_versions.insert(hash, Modrinth::loadIndexedPackVersion(entry)); } catch (Json::JsonException& e) { qDebug() << e.cause(); qDebug() << entries; - emitFail(mod); + emitFail(resource); } } } catch (Json::JsonException& e) { @@ -321,23 +321,23 @@ Task::Ptr EnsureMetadataTask::modrinthProjectsTask() auto hash = addonIds.find(pack.addonId.toString()).value(); - auto mod_iter = m_mods.find(hash); - if (mod_iter == m_mods.end()) { + auto resource_iter = m_resources.find(hash); + if (resource_iter == m_resources.end()) { qWarning() << "Invalid project id from the API response."; continue; } - auto* mod = mod_iter.value(); + auto* resource = resource_iter.value(); try { - setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(mod->name())); + setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(resource->name())); - modrinthCallback(pack, m_temp_versions.find(hash).value(), mod); + modrinthCallback(pack, m_temp_versions.find(hash).value(), resource); } catch (Json::JsonException& e) { qDebug() << e.cause(); qDebug() << entries; - emitFail(mod); + emitFail(resource); } } }); @@ -351,7 +351,7 @@ Task::Ptr EnsureMetadataTask::flameVersionsTask() auto response = std::make_shared(); QList fingerprints; - for (auto& murmur : m_mods.keys()) { + for (auto& murmur : m_resources.keys()) { fingerprints.push_back(murmur.toUInt()); } @@ -391,13 +391,13 @@ Task::Ptr EnsureMetadataTask::flameVersionsTask() } auto fingerprint = QString::number(Json::ensureVariant(file_obj, "fileFingerprint").toUInt()); - auto mod = m_mods.find(fingerprint); - if (mod == m_mods.end()) { + auto resource = m_resources.find(fingerprint); + if (resource == m_resources.end()) { qWarning() << "Invalid fingerprint from the API response."; continue; } - setStatus(tr("Parsing API response from CurseForge for '%1'...").arg((*mod)->name())); + setStatus(tr("Parsing API response from CurseForge for '%1'...").arg((*resource)->name())); m_temp_versions.insert(fingerprint, FlameMod::loadIndexedPackVersion(file_obj)); } @@ -414,7 +414,7 @@ Task::Ptr EnsureMetadataTask::flameVersionsTask() Task::Ptr EnsureMetadataTask::flameProjectsTask() { QHash addonIds; - for (auto const& hash : m_mods.keys()) { + for (auto const& hash : m_resources.keys()) { if (m_temp_versions.contains(hash)) { auto data = m_temp_versions.find(hash).value(); @@ -461,20 +461,20 @@ Task::Ptr EnsureMetadataTask::flameProjectsTask() auto id = QString::number(Json::requireInteger(entry_obj, "id")); auto hash = addonIds.find(id).value(); - auto mod = m_mods.find(hash).value(); + auto resource = m_resources.find(hash).value(); try { - setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(mod->name())); + setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(resource->name())); ModPlatform::IndexedPack pack; FlameMod::loadIndexedPack(pack, entry_obj); - flameCallback(pack, m_temp_versions.find(hash).value(), mod); + flameCallback(pack, m_temp_versions.find(hash).value(), resource); } catch (Json::JsonException& e) { qDebug() << e.cause(); qDebug() << entries; - emitFail(mod); + emitFail(resource); } } } catch (Json::JsonException& e) { @@ -486,17 +486,17 @@ Task::Ptr EnsureMetadataTask::flameProjectsTask() return proj_task; } -void EnsureMetadataTask::modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod* mod) +void EnsureMetadataTask::modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Resource* resource) { // Prevent file name mismatch - ver.fileName = mod->fileinfo().fileName(); + ver.fileName = resource->fileinfo().fileName(); if (ver.fileName.endsWith(".disabled")) ver.fileName.chop(9); QDir tmp_index_dir(m_index_dir); { - LocalModUpdateTask update_metadata(m_index_dir, pack, ver); + LocalResourceUpdateTask update_metadata(m_index_dir, pack, ver); QEventLoop loop; QObject::connect(&update_metadata, &Task::finished, &loop, &QEventLoop::quit); @@ -510,27 +510,27 @@ void EnsureMetadataTask::modrinthCallback(ModPlatform::IndexedPack& pack, ModPla auto metadata = Metadata::get(tmp_index_dir, pack.slug); if (!metadata.isValid()) { qCritical() << "Failed to generate metadata at last step!"; - emitFail(mod); + emitFail(resource); return; } - mod->setMetadata(metadata); + resource->setMetadata(metadata); - emitReady(mod); + emitReady(resource); } -void EnsureMetadataTask::flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod* mod) +void EnsureMetadataTask::flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Resource* resource) { try { // Prevent file name mismatch - ver.fileName = mod->fileinfo().fileName(); + ver.fileName = resource->fileinfo().fileName(); if (ver.fileName.endsWith(".disabled")) ver.fileName.chop(9); QDir tmp_index_dir(m_index_dir); { - LocalModUpdateTask update_metadata(m_index_dir, pack, ver); + LocalResourceUpdateTask update_metadata(m_index_dir, pack, ver); QEventLoop loop; QObject::connect(&update_metadata, &Task::finished, &loop, &QEventLoop::quit); @@ -544,16 +544,16 @@ void EnsureMetadataTask::flameCallback(ModPlatform::IndexedPack& pack, ModPlatfo auto metadata = Metadata::get(tmp_index_dir, pack.slug); if (!metadata.isValid()) { qCritical() << "Failed to generate metadata at last step!"; - emitFail(mod); + emitFail(resource); return; } - mod->setMetadata(metadata); + resource->setMetadata(metadata); - emitReady(mod); + emitReady(resource); } catch (Json::JsonException& e) { qDebug() << e.cause(); - emitFail(mod); + emitFail(resource); } } diff --git a/launcher/modplatform/EnsureMetadataTask.h b/launcher/modplatform/EnsureMetadataTask.h index 2f276e5a0..d82d9c26e 100644 --- a/launcher/modplatform/EnsureMetadataTask.h +++ b/launcher/modplatform/EnsureMetadataTask.h @@ -5,6 +5,7 @@ #include "modplatform/helpers/HashUtils.h" +#include "minecraft/mod/Resource.h" #include "tasks/ConcurrentTask.h" class Mod; @@ -14,8 +15,8 @@ class EnsureMetadataTask : public Task { Q_OBJECT public: - EnsureMetadataTask(Mod*, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH); - EnsureMetadataTask(QList&, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH); + EnsureMetadataTask(Resource*, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH); + EnsureMetadataTask(QList&, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH); ~EnsureMetadataTask() = default; @@ -36,23 +37,23 @@ class EnsureMetadataTask : public Task { // Helpers enum class RemoveFromList { Yes, No }; - void emitReady(Mod*, QString key = {}, RemoveFromList = RemoveFromList::Yes); - void emitFail(Mod*, QString key = {}, RemoveFromList = RemoveFromList::Yes); + void emitReady(Resource*, QString key = {}, RemoveFromList = RemoveFromList::Yes); + void emitFail(Resource*, QString key = {}, RemoveFromList = RemoveFromList::Yes); // Hashes and stuff - auto createNewHash(Mod*) -> Hashing::Hasher::Ptr; - auto getExistingHash(Mod*) -> QString; + auto createNewHash(Resource*) -> Hashing::Hasher::Ptr; + auto getExistingHash(Resource*) -> QString; private slots: - void modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod*); - void flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod*); + void modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Resource*); + void flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Resource*); signals: - void metadataReady(Mod*); - void metadataFailed(Mod*); + void metadataReady(Resource*); + void metadataFailed(Resource*); private: - QHash m_mods; + QHash m_resources; QDir m_index_dir; ModPlatform::ResourceProvider m_provider; diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index c087e2be3..648ff7050 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -48,6 +48,7 @@ #include "minecraft/MinecraftInstance.h" +#include "Application.h" #include "ui/dialogs/ResourceDownloadDialog.h" #include "ui/pages/modplatform/ResourceModel.h" #include "ui/widgets/ProjectItem.h" @@ -332,7 +333,8 @@ void ResourcePage::addResourceToPage(ModPlatform::IndexedPack::Ptr pack, ModPlatform::IndexedVersion& ver, const std::shared_ptr base_model) { - m_model->addPack(pack, ver, base_model); + bool is_indexed = !APPLICATION->settings()->get("ModMetadataDisabled").toBool(); + m_model->addPack(pack, ver, base_model, is_indexed); } void ResourcePage::removeResourceFromPage(const QString& name) diff --git a/launcher/ui/pages/modplatform/ShaderPackPage.cpp b/launcher/ui/pages/modplatform/ShaderPackPage.cpp index 586dffc55..6f4120289 100644 --- a/launcher/ui/pages/modplatform/ShaderPackPage.cpp +++ b/launcher/ui/pages/modplatform/ShaderPackPage.cpp @@ -8,6 +8,7 @@ #include "ShaderPackModel.h" +#include "Application.h" #include "ui/dialogs/ResourceDownloadDialog.h" #include @@ -48,10 +49,11 @@ void ShaderPackResourcePage::addResourceToPage(ModPlatform::IndexedPack::Ptr pac ModPlatform::IndexedVersion& version, const std::shared_ptr base_model) { + bool is_indexed = !APPLICATION->settings()->get("ModMetadataDisabled").toBool(); QString custom_target_folder; if (version.loaders & ModPlatform::Cauldron) custom_target_folder = QStringLiteral("resourcepacks"); - m_model->addPack(pack, version, base_model, false, custom_target_folder); + m_model->addPack(pack, version, base_model, is_indexed, custom_target_folder); } } // namespace ResourceDownload From 179abfa03eff92404bce37388f994ba1692459a9 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 1 Sep 2023 22:05:44 +0100 Subject: [PATCH 026/616] Resource provider column Signed-off-by: TheKodeToad --- launcher/minecraft/mod/ModFolderModel.cpp | 2 +- .../minecraft/mod/ResourceFolderModel.cpp | 9 ++++++--- launcher/minecraft/mod/ResourceFolderModel.h | 8 ++++---- .../minecraft/mod/ResourcePackFolderModel.cpp | 14 ++++++++----- .../minecraft/mod/ResourcePackFolderModel.h | 2 +- .../minecraft/mod/TexturePackFolderModel.cpp | 20 ++++++++++--------- .../minecraft/mod/TexturePackFolderModel.h | 2 +- 7 files changed, 33 insertions(+), 24 deletions(-) diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp index 43c64a667..370bddb22 100644 --- a/launcher/minecraft/mod/ModFolderModel.cpp +++ b/launcher/minecraft/mod/ModFolderModel.cpp @@ -160,7 +160,7 @@ QVariant ModFolderModel::headerData(int section, [[maybe_unused]] Qt::Orientatio case DateColumn: return tr("The date and time this mod was last changed (or added)."); case ProviderColumn: - return tr("Where the mod was downloaded from."); + return tr("The source provider of the mod."); default: return QVariant(); } diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index 27eb4d2e5..0f155f695 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -466,6 +466,8 @@ QVariant ResourceFolderModel::data(const QModelIndex& index, int role) const return m_resources[row]->name(); case DATE_COLUMN: return m_resources[row]->dateTimeChanged(); + case PROVIDER_COLUMN: + return m_resources[row]->provider(); default: return {}; } @@ -535,21 +537,22 @@ QVariant ResourceFolderModel::headerData(int section, [[maybe_unused]] Qt::Orien case ACTIVE_COLUMN: case NAME_COLUMN: case DATE_COLUMN: + case PROVIDER_COLUMN: return columnNames().at(section); default: return {}; } case Qt::ToolTipRole: { + //: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc. switch (section) { case ACTIVE_COLUMN: - //: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc. return tr("Is the resource enabled?"); case NAME_COLUMN: - //: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc. return tr("The name of the resource."); case DATE_COLUMN: - //: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc. return tr("The date and time this resource was last changed (or added)."); + case PROVIDER_COLUMN: + return tr("The source provider of the resource."); default: return {}; } diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index e8f8d2b9e..7deff5fe9 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -100,7 +100,7 @@ class ResourceFolderModel : public QAbstractListModel { /* Qt behavior */ /* Basic columns */ - enum Columns { ACTIVE_COLUMN = 0, NAME_COLUMN, DATE_COLUMN, NUM_COLUMNS }; + enum Columns { ACTIVE_COLUMN = 0, NAME_COLUMN, DATE_COLUMN, PROVIDER_COLUMN, NUM_COLUMNS }; QStringList columnNames(bool translated = true) const { return translated ? m_column_names_translated : m_column_names; } [[nodiscard]] int rowCount(const QModelIndex& parent = {}) const override { return parent.isValid() ? 0 : static_cast(size()); } @@ -205,11 +205,11 @@ class ResourceFolderModel : public QAbstractListModel { // Represents the relationship between a column's index (represented by the list index), and it's sorting key. // As such, the order in with they appear is very important! QList m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::DATE }; - QStringList m_column_names = { "Enable", "Name", "Last Modified" }; - QStringList m_column_names_translated = { tr("Enable"), tr("Name"), tr("Last Modified") }; + QStringList m_column_names = { "Enable", "Name", "Last Modified", "Provider" }; + QStringList m_column_names_translated = { tr("Enable"), tr("Name"), tr("Last Modified"), tr("Provider") }; QList m_column_resize_modes = { QHeaderView::ResizeToContents, QHeaderView::Stretch, QHeaderView::ResizeToContents }; - QList m_columnsHideable = { false, false, true }; + QList m_columnsHideable = { false, false, true, true }; QDir m_dir; BaseInstance* m_instance; diff --git a/launcher/minecraft/mod/ResourcePackFolderModel.cpp b/launcher/minecraft/mod/ResourcePackFolderModel.cpp index 2e72e02f2..11175e5a6 100644 --- a/launcher/minecraft/mod/ResourcePackFolderModel.cpp +++ b/launcher/minecraft/mod/ResourcePackFolderModel.cpp @@ -50,12 +50,12 @@ ResourcePackFolderModel::ResourcePackFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent) : ResourceFolderModel(dir, instance, is_indexed, create_dir, parent) { - m_column_names = QStringList({ "Enable", "Image", "Name", "Pack Format", "Last Modified" }); - m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Pack Format"), tr("Last Modified") }); + m_column_names = QStringList({ "Enable", "Image", "Name", "Pack Format", "Last Modified", "Provider" }); + m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Pack Format"), tr("Last Modified"), tr("Provider") }); m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::PACK_FORMAT, SortType::DATE }; m_column_resize_modes = { QHeaderView::ResizeToContents, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::ResizeToContents, QHeaderView::ResizeToContents }; - m_columnsHideable = { false, true, false, true, true }; + m_columnsHideable = { false, true, false, true, true, true }; } QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const @@ -86,7 +86,8 @@ QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const } case DateColumn: return m_resources[row]->dateTimeChanged(); - + case ProviderColumn: + return m_resources[row]->provider(); default: return {}; } @@ -140,6 +141,7 @@ QVariant ResourcePackFolderModel::headerData(int section, [[maybe_unused]] Qt::O case PackFormatColumn: case DateColumn: case ImageColumn: + case ProviderColumn: return columnNames().at(section); default: return {}; @@ -148,7 +150,7 @@ QVariant ResourcePackFolderModel::headerData(int section, [[maybe_unused]] Qt::O case Qt::ToolTipRole: switch (section) { case ActiveColumn: - return tr("Is the resource pack enabled? (Only valid for ZIPs)"); + return tr("Is the resource pack enabled?"); case NameColumn: return tr("The name of the resource pack."); case PackFormatColumn: @@ -156,6 +158,8 @@ QVariant ResourcePackFolderModel::headerData(int section, [[maybe_unused]] Qt::O return tr("The resource pack format ID, as well as the Minecraft versions it was designed for."); case DateColumn: return tr("The date and time this resource pack was last changed (or added)."); + case ProviderColumn: + return tr("The source provider of the resource pack."); default: return {}; } diff --git a/launcher/minecraft/mod/ResourcePackFolderModel.h b/launcher/minecraft/mod/ResourcePackFolderModel.h index fd56c8c73..f00acee29 100644 --- a/launcher/minecraft/mod/ResourcePackFolderModel.h +++ b/launcher/minecraft/mod/ResourcePackFolderModel.h @@ -7,7 +7,7 @@ class ResourcePackFolderModel : public ResourceFolderModel { Q_OBJECT public: - enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, PackFormatColumn, DateColumn, NUM_COLUMNS }; + enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, PackFormatColumn, DateColumn, ProviderColumn, NUM_COLUMNS }; explicit ResourcePackFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent = nullptr); diff --git a/launcher/minecraft/mod/TexturePackFolderModel.cpp b/launcher/minecraft/mod/TexturePackFolderModel.cpp index 23a392421..a20e2b5db 100644 --- a/launcher/minecraft/mod/TexturePackFolderModel.cpp +++ b/launcher/minecraft/mod/TexturePackFolderModel.cpp @@ -45,12 +45,12 @@ TexturePackFolderModel::TexturePackFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent) : ResourceFolderModel(QDir(dir), instance, is_indexed, create_dir, parent) { - m_column_names = QStringList({ "Enable", "Image", "Name", "Last Modified" }); - m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Last Modified") }); + m_column_names = QStringList({ "Enable", "Image", "Name", "Last Modified", "Provider" }); + m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Last Modified"), tr("Provider") }); m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::DATE }; m_column_resize_modes = { QHeaderView::ResizeToContents, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::ResizeToContents }; - m_columnsHideable = { false, true, false, true }; + m_columnsHideable = { false, true, false, true, true }; } Task* TexturePackFolderModel::createParseTask(Resource& resource) @@ -73,6 +73,8 @@ QVariant TexturePackFolderModel::data(const QModelIndex& index, int role) const return m_resources[row]->name(); case DateColumn: return m_resources[row]->dateTimeChanged(); + case ProviderColumn: + return m_resources[row]->provider(); default: return {}; } @@ -119,6 +121,7 @@ QVariant TexturePackFolderModel::headerData(int section, [[maybe_unused]] Qt::Or case NameColumn: case DateColumn: case ImageColumn: + case ProviderColumn: return columnNames().at(section); default: return {}; @@ -126,14 +129,13 @@ QVariant TexturePackFolderModel::headerData(int section, [[maybe_unused]] Qt::Or case Qt::ToolTipRole: { switch (section) { case ActiveColumn: - //: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc. - return tr("Is the resource enabled?"); + return tr("Is the texture pack enabled?"); case NameColumn: - //: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc. - return tr("The name of the resource."); + return tr("The name of the texture pack."); case DateColumn: - //: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc. - return tr("The date and time this resource was last changed (or added)."); + return tr("The date and time this texture pack was last changed (or added)."); + case ProviderColumn: + return tr("The source provider of the texture pack."); default: return {}; } diff --git a/launcher/minecraft/mod/TexturePackFolderModel.h b/launcher/minecraft/mod/TexturePackFolderModel.h index 44b19b57a..649842e23 100644 --- a/launcher/minecraft/mod/TexturePackFolderModel.h +++ b/launcher/minecraft/mod/TexturePackFolderModel.h @@ -44,7 +44,7 @@ class TexturePackFolderModel : public ResourceFolderModel { Q_OBJECT public: - enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, DateColumn, NUM_COLUMNS }; + enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, DateColumn, ProviderColumn, NUM_COLUMNS }; explicit TexturePackFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent = nullptr); From 33cf7066b403e1438fd3c9dd36e33bf5e84c5f29 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 27 Oct 2023 21:51:35 +0300 Subject: [PATCH 027/616] formated the code Signed-off-by: Trial97 --- launcher/ui/widgets/JavaSettingsWidget.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 3c0352b13..63d7aa57c 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -40,7 +40,6 @@ JavaSettingsWidget::JavaSettingsWidget(QWidget* parent) : QWidget(parent) connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaSettingsWidget::javaPathEdited); connect(m_javaStatusBtn, &QToolButton::clicked, this, &JavaSettingsWidget::on_javaStatusBtn_clicked); connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaDownloadBtn_clicked); - } void JavaSettingsWidget::setupUi() @@ -274,7 +273,6 @@ void JavaSettingsWidget::on_javaBrowseBtn_clicked() void JavaSettingsWidget::on_javaDownloadBtn_clicked() { JavaDownloader::showPrompts(this); - } void JavaSettingsWidget::on_javaStatusBtn_clicked() { From d94e641900db85cab74df95fa5bf100247b83f59 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 7 Jan 2024 22:00:31 +0200 Subject: [PATCH 028/616] Load versions on first edit Signed-off-by: Trial97 --- launcher/ui/pages/instance/ModFolderPage.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 313fef2b6..aba87942a 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -321,6 +321,12 @@ bool CoreModFolderPage::shouldDisplay() const auto version = inst->getPackProfile(); + ProgressDialog loadDialog(parentWidget()); + auto update = inst->createUpdateTask(Net::Mode::Offline); + if (update) { + loadDialog.setSkipButton(true, tr("Abort")); + loadDialog.execWithTask(update.get()); + } if (!version) return true; if (!version->getComponent("net.minecraftforge")) From a0e7729aa62a5bb6a83e401dd863e69cbd886edc Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 24 Jan 2024 18:26:43 +0200 Subject: [PATCH 029/616] Started workin on stuff Signed-off-by: Trial97 --- launcher/Application.cpp | 18 +- launcher/Application.h | 2 - launcher/CMakeLists.txt | 2 - launcher/JavaCommon.cpp | 30 ++- launcher/JavaCommon.h | 12 +- launcher/MMCZip.cpp | 106 ++++++++++ launcher/MMCZip.h | 28 +++ launcher/SysInfo.cpp | 18 +- launcher/SysInfo.h | 1 + launcher/java/JavaChecker.cpp | 39 ++-- launcher/java/JavaChecker.h | 62 +++--- launcher/java/JavaCheckerJob.cpp | 41 ---- launcher/java/JavaCheckerJob.h | 56 ------ launcher/java/JavaInstallList.cpp | 37 ++-- launcher/java/JavaInstallList.h | 12 +- launcher/java/JavaUtils.h | 5 +- .../java/providers/AdoptiumJavaDownloader.cpp | 119 +++++++++++ .../java/providers/AdoptiumJavaDownloader.h | 36 ++++ .../java/providers/AzulJavaDownloader.cpp | 159 +++++++++++++++ launcher/java/providers/AzulJavaDownloader.h | 37 ++++ .../java/providers/BasicJavaDownloader.cpp | 29 +++ launcher/java/providers/BasicJavaDownloader.h | 41 ++++ .../java/providers/MojangJavaDownloader.cpp | 185 ++++++++++++++++++ .../java/providers/MojanglJavaDownloader.h | 37 ++++ launcher/launch/steps/CheckJava.cpp | 14 +- launcher/launch/steps/CheckJava.h | 4 +- launcher/ui/widgets/JavaSettingsWidget.cpp | 21 +- launcher/ui/widgets/JavaSettingsWidget.h | 4 +- 28 files changed, 908 insertions(+), 247 deletions(-) delete mode 100644 launcher/java/JavaCheckerJob.cpp delete mode 100644 launcher/java/JavaCheckerJob.h create mode 100644 launcher/java/providers/AdoptiumJavaDownloader.cpp create mode 100644 launcher/java/providers/AdoptiumJavaDownloader.h create mode 100644 launcher/java/providers/AzulJavaDownloader.cpp create mode 100644 launcher/java/providers/AzulJavaDownloader.h create mode 100644 launcher/java/providers/BasicJavaDownloader.cpp create mode 100644 launcher/java/providers/BasicJavaDownloader.h create mode 100644 launcher/java/providers/MojangJavaDownloader.cpp create mode 100644 launcher/java/providers/MojanglJavaDownloader.h diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 661c6c5be..aa702aa7e 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -44,6 +44,7 @@ #include "BuildConfig.h" #include "DataMigrationTask.h" +#include "java/JavaInstallList.h" #include "net/PasteUpload.h" #include "pathmatcher/MultiMatcher.h" #include "pathmatcher/SimplePrefixMatcher.h" @@ -125,6 +126,7 @@ #include #include +#include "SysInfo.h" #ifdef Q_OS_LINUX #include @@ -607,7 +609,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) // Memory m_settings->registerSetting({ "MinMemAlloc", "MinMemoryAlloc" }, 512); - m_settings->registerSetting({ "MaxMemAlloc", "MaxMemoryAlloc" }, suitableMaxMem()); + m_settings->registerSetting({ "MaxMemAlloc", "MaxMemoryAlloc" }, SysInfo::suitableMaxMem()); m_settings->registerSetting("PermGen", 128); // Java Settings @@ -1667,20 +1669,6 @@ QString Application::getUserAgentUncached() return BuildConfig.USER_AGENT_UNCACHED; } -int Application::suitableMaxMem() -{ - float totalRAM = (float)Sys::getSystemRam() / (float)Sys::mebibyte; - int maxMemoryAlloc; - - // If totalRAM < 6GB, use (totalRAM / 1.5), else 4GB - if (totalRAM < (4096 * 1.5)) - maxMemoryAlloc = (int)(totalRAM / 1.5); - else - maxMemoryAlloc = 4096; - - return maxMemoryAlloc; -} - bool Application::handleDataMigration(const QString& currentData, const QString& oldData, const QString& name, diff --git a/launcher/Application.h b/launcher/Application.h index 7669e08ec..85bf2dff4 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -180,8 +180,6 @@ class Application : public QApplication { void ShowGlobalSettings(class QWidget* parent, QString open_page = QString()); - int suitableMaxMem(); - bool updaterEnabled(); QString updaterBinaryName(); diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 48ca8f085..e735f2081 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -422,8 +422,6 @@ set(SETTINGS_SOURCES set(JAVA_SOURCES java/JavaChecker.h java/JavaChecker.cpp - java/JavaCheckerJob.h - java/JavaCheckerJob.cpp java/JavaInstall.h java/JavaInstall.cpp java/JavaInstallList.h diff --git a/launcher/JavaCommon.cpp b/launcher/JavaCommon.cpp index e16ac9255..cfc3cfe42 100644 --- a/launcher/JavaCommon.cpp +++ b/launcher/JavaCommon.cpp @@ -63,7 +63,7 @@ bool JavaCommon::checkJVMArgs(QString jvmargs, QWidget* parent) return true; } -void JavaCommon::javaWasOk(QWidget* parent, const JavaCheckResult& result) +void JavaCommon::javaWasOk(QWidget* parent, const JavaChecker::Result& result) { QString text; text += QObject::tr( @@ -79,7 +79,7 @@ void JavaCommon::javaWasOk(QWidget* parent, const JavaCheckResult& result) CustomMessageBox::selectable(parent, QObject::tr("Java test success"), text, QMessageBox::Information)->show(); } -void JavaCommon::javaArgsWereBad(QWidget* parent, const JavaCheckResult& result) +void JavaCommon::javaArgsWereBad(QWidget* parent, const JavaChecker::Result& result) { auto htmlError = result.errorLog; QString text; @@ -89,7 +89,7 @@ void JavaCommon::javaArgsWereBad(QWidget* parent, const JavaCheckResult& result) CustomMessageBox::selectable(parent, QObject::tr("Java test failure"), text, QMessageBox::Warning)->show(); } -void JavaCommon::javaBinaryWasBad(QWidget* parent, const JavaCheckResult& result) +void JavaCommon::javaBinaryWasBad(QWidget* parent, const JavaChecker::Result& result) { QString text; text += QObject::tr( @@ -116,34 +116,26 @@ void JavaCommon::TestCheck::run() emit finished(); return; } - checker.reset(new JavaChecker()); + checker.reset(new JavaChecker(m_path, "", 0, 0, 0, 0, this)); connect(checker.get(), &JavaChecker::checkFinished, this, &JavaCommon::TestCheck::checkFinished); - checker->m_path = m_path; - checker->performCheck(); + checker->start(); } -void JavaCommon::TestCheck::checkFinished(JavaCheckResult result) +void JavaCommon::TestCheck::checkFinished(JavaChecker::Result result) { - if (result.validity != JavaCheckResult::Validity::Valid) { + if (result.validity != JavaChecker::Result::Validity::Valid) { javaBinaryWasBad(m_parent, result); emit finished(); return; } - checker.reset(new JavaChecker()); + checker.reset(new JavaChecker(m_path, m_args, m_maxMem, m_maxMem, result.javaVersion.requiresPermGen() ? m_permGen : 0, 0, this)); connect(checker.get(), &JavaChecker::checkFinished, this, &JavaCommon::TestCheck::checkFinishedWithArgs); - checker->m_path = m_path; - checker->m_args = m_args; - checker->m_minMem = m_minMem; - checker->m_maxMem = m_maxMem; - if (result.javaVersion.requiresPermGen()) { - checker->m_permGen = m_permGen; - } - checker->performCheck(); + checker->start(); } -void JavaCommon::TestCheck::checkFinishedWithArgs(JavaCheckResult result) +void JavaCommon::TestCheck::checkFinishedWithArgs(JavaChecker::Result result) { - if (result.validity == JavaCheckResult::Validity::Valid) { + if (result.validity == JavaChecker::Result::Validity::Valid) { javaWasOk(m_parent, result); emit finished(); return; diff --git a/launcher/JavaCommon.h b/launcher/JavaCommon.h index c96f7a985..7c5510efc 100644 --- a/launcher/JavaCommon.h +++ b/launcher/JavaCommon.h @@ -10,11 +10,11 @@ namespace JavaCommon { bool checkJVMArgs(QString args, QWidget* parent); // Show a dialog saying that the Java binary was usable -void javaWasOk(QWidget* parent, const JavaCheckResult& result); +void javaWasOk(QWidget* parent, const JavaChecker::Result& result); // Show a dialog saying that the Java binary was not usable because of bad options -void javaArgsWereBad(QWidget* parent, const JavaCheckResult& result); +void javaArgsWereBad(QWidget* parent, const JavaChecker::Result& result); // Show a dialog saying that the Java binary was not usable -void javaBinaryWasBad(QWidget* parent, const JavaCheckResult& result); +void javaBinaryWasBad(QWidget* parent, const JavaChecker::Result& result); // Show a dialog if we couldn't find Java Checker void javaCheckNotFound(QWidget* parent); @@ -32,11 +32,11 @@ class TestCheck : public QObject { void finished(); private slots: - void checkFinished(JavaCheckResult result); - void checkFinishedWithArgs(JavaCheckResult result); + void checkFinished(JavaChecker::Result result); + void checkFinishedWithArgs(JavaChecker::Result result); private: - std::shared_ptr checker; + JavaChecker::Ptr checker; QWidget* m_parent = nullptr; QString m_path; QString m_args; diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index 3bfe16ab5..78a3b290d 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -507,6 +507,112 @@ bool ExportToZipTask::abort() } return false; } + +void ExtractZipTask::executeTask() +{ + m_zip_future = QtConcurrent::run(QThreadPool::globalInstance(), [this]() { return extractZip(); }); + connect(&m_zip_watcher, &QFutureWatcher::finished, this, &ExtractZipTask::finish); + m_zip_watcher.setFuture(m_zip_future); +} + +auto ExtractZipTask::extractZip() -> ZipResult +{ + auto target = m_output_dir.absolutePath(); + auto target_top_dir = QUrl::fromLocalFile(target); + + QStringList extracted; + + qDebug() << "Extracting subdir" << m_subdirectory << "from" << m_input->getZipName() << "to" << target; + auto numEntries = m_input->getEntriesCount(); + if (numEntries < 0) { + return ZipResult(tr("Failed to enumerate files in archive")); + } + if (numEntries == 0) { + logWarning(tr("Extracting empty archives seems odd...")); + return ZipResult(); + } + if (!m_input->goToFirstFile()) { + return ZipResult(tr("Failed to seek to first file in zip")); + } + + setStatus("Extracting files..."); + setProgress(0, numEntries); + do { + if (m_zip_future.isCanceled()) + return ZipResult(); + setProgress(m_progress + 1, m_progressTotal); + QString file_name = m_input->getCurrentFileName(); + if (!file_name.startsWith(m_subdirectory)) + continue; + + auto relative_file_name = QDir::fromNativeSeparators(file_name.remove(0, m_subdirectory.size())); + auto original_name = relative_file_name; + setStatus("Unziping: " + relative_file_name); + + // Fix subdirs/files ending with a / getting transformed into absolute paths + if (relative_file_name.startsWith('/')) + relative_file_name = relative_file_name.mid(1); + + // Fix weird "folders with a single file get squashed" thing + QString sub_path; + if (relative_file_name.contains('/') && !relative_file_name.endsWith('/')) { + sub_path = relative_file_name.section('/', 0, -2) + '/'; + FS::ensureFolderPathExists(FS::PathCombine(target, sub_path)); + + relative_file_name = relative_file_name.split('/').last(); + } + + QString target_file_path; + if (relative_file_name.isEmpty()) { + target_file_path = target + '/'; + } else { + target_file_path = FS::PathCombine(target_top_dir.toLocalFile(), sub_path, relative_file_name); + if (relative_file_name.endsWith('/') && !target_file_path.endsWith('/')) + target_file_path += '/'; + } + + if (!target_top_dir.isParentOf(QUrl::fromLocalFile(target_file_path))) { + return ZipResult(tr("Extracting %1 was cancelled, because it was effectively outside of the target path %2") + .arg(relative_file_name, target)); + } + + if (!JlCompress::extractFile(m_input.get(), "", target_file_path)) { + JlCompress::removeFile(extracted); + return ZipResult(tr("Failed to extract file %1 to %2").arg(original_name, target_file_path)); + } + + extracted.append(target_file_path); + QFile::setPermissions(target_file_path, + QFileDevice::Permission::ReadUser | QFileDevice::Permission::WriteUser | QFileDevice::Permission::ExeUser); + + qDebug() << "Extracted file" << relative_file_name << "to" << target_file_path; + } while (m_input->goToNextFile()); + + return ZipResult(); +} + +void ExtractZipTask::finish() +{ + if (m_zip_future.isCanceled()) { + emitAborted(); + } else if (auto result = m_zip_future.result(); result.has_value()) { + emitFailed(result.value()); + } else { + emitSucceeded(); + } +} + +bool ExtractZipTask::abort() +{ + if (m_zip_future.isRunning()) { + m_zip_future.cancel(); + // NOTE: Here we don't do `emitAborted()` because it will be done when `m_build_zip_future` actually cancels, which may not occur + // immediately. + return true; + } + return false; +} + #endif } // namespace MMCZip diff --git a/launcher/MMCZip.h b/launcher/MMCZip.h index 45b1df0b3..2b396eb9c 100644 --- a/launcher/MMCZip.h +++ b/launcher/MMCZip.h @@ -194,5 +194,33 @@ class ExportToZipTask : public Task { QFuture m_build_zip_future; QFutureWatcher m_build_zip_watcher; }; + +class ExtractZipTask : public Task { + public: + ExtractZipTask(QString input, QDir outputDir, QString subdirectory = "") + : ExtractZipTask(std::make_shared(input), outputDir, subdirectory) + {} + ExtractZipTask(std::shared_ptr input, QDir outputDir, QString subdirectory = "") + : m_input(input), m_output_dir(outputDir), m_subdirectory(subdirectory) + {} + virtual ~ExtractZipTask() = default; + + typedef std::optional ZipResult; + + protected: + virtual void executeTask() override; + bool abort() override; + + ZipResult extractZip(); + void finish(); + + private: + std::shared_ptr m_input; + QDir m_output_dir; + QString m_subdirectory; + + QFuture m_zip_future; + QFutureWatcher m_zip_watcher; +}; #endif } // namespace MMCZip diff --git a/launcher/SysInfo.cpp b/launcher/SysInfo.cpp index ad251e29f..f15dde0e4 100644 --- a/launcher/SysInfo.cpp +++ b/launcher/SysInfo.cpp @@ -1,5 +1,6 @@ #include #include +#include "sys.h" #ifdef Q_OS_MACOS #include #endif @@ -7,9 +8,6 @@ #include #include #include -#include "Application.h" -#include "Commandline.h" -#include "java/JavaUtils.h" #ifdef Q_OS_MACOS bool rosettaDetect() @@ -59,4 +57,18 @@ QString useQTForArch() #endif return qtArch; } + +int suitableMaxMem() +{ + float totalRAM = (float)Sys::getSystemRam() / (float)Sys::mebibyte; + int maxMemoryAlloc; + + // If totalRAM < 6GB, use (totalRAM / 1.5), else 4GB + if (totalRAM < (4096 * 1.5)) + maxMemoryAlloc = (int)(totalRAM / 1.5); + else + maxMemoryAlloc = 4096; + + return maxMemoryAlloc; +} } // namespace SysInfo diff --git a/launcher/SysInfo.h b/launcher/SysInfo.h index 3650bf008..499c3b1dd 100644 --- a/launcher/SysInfo.h +++ b/launcher/SysInfo.h @@ -3,4 +3,5 @@ namespace SysInfo { QString currentSystem(); QString useQTForArch(); +int suitableMaxMem(); } // namespace SysInfo diff --git a/launcher/java/JavaChecker.cpp b/launcher/java/JavaChecker.cpp index 20caba189..7271c0d09 100644 --- a/launcher/java/JavaChecker.cpp +++ b/launcher/java/JavaChecker.cpp @@ -40,14 +40,13 @@ #include #include -#include "Application.h" #include "Commandline.h" -#include "FileSystem.h" -#include "JavaUtils.h" +#include "java/JavaUtils.h" -JavaChecker::JavaChecker(QObject* parent) : QObject(parent) {} +JavaChecker::JavaChecker(QString path, QString args, int minMem, int maxMem, int permGen, int id, QObject* parent) + : Task(parent), m_path(path), m_args(args), m_minMem(minMem), m_maxMem(maxMem), m_permGen(permGen), m_id(id){}; -void JavaChecker::performCheck() +void JavaChecker::executeTask() { QString checkerJar = JavaUtils::getJavaCheckPath(); @@ -69,7 +68,7 @@ void JavaChecker::performCheck() if (m_maxMem != 0) { args << QString("-Xmx%1m").arg(m_maxMem); } - if (m_permGen != 64) { + if (m_permGen != 64 && m_permGen != 0) { args << QString("-XX:PermSize=%1m").arg(m_permGen); } @@ -112,11 +111,10 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) QProcessPtr _process = process; process.reset(); - JavaCheckResult result; - { - result.path = m_path; - result.id = m_id; - } + Result result = { + m_path, + m_id, + }; result.errorLog = m_stderr; result.outLog = m_stdout; qDebug() << "STDOUT" << m_stdout; @@ -124,8 +122,9 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) qDebug() << "Java checker finished with status" << status << "exit code" << exitcode; if (status == QProcess::CrashExit || exitcode == 1) { - result.validity = JavaCheckResult::Validity::Errored; + result.validity = Result::Validity::Errored; emit checkFinished(result); + emitSucceeded(); return; } @@ -158,8 +157,9 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) } if (!results.contains("os.arch") || !results.contains("java.version") || !results.contains("java.vendor") || !success) { - result.validity = JavaCheckResult::Validity::ReturnedInvalidData; + result.validity = Result::Validity::ReturnedInvalidData; emit checkFinished(result); + emitSucceeded(); return; } @@ -168,7 +168,7 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) auto java_vendor = results["java.vendor"]; bool is_64 = os_arch == "x86_64" || os_arch == "amd64" || os_arch == "aarch64" || os_arch == "arm64"; - result.validity = JavaCheckResult::Validity::Valid; + result.validity = Result::Validity::Valid; result.is_64bit = is_64; result.mojangPlatform = is_64 ? "64" : "32"; result.realPlatform = os_arch; @@ -176,6 +176,7 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) result.javaVendor = java_vendor; qDebug() << "Java checker succeeded."; emit checkFinished(result); + emitSucceeded(); } void JavaChecker::error(QProcess::ProcessError err) @@ -187,15 +188,9 @@ void JavaChecker::error(QProcess::ProcessError err) qDebug() << "Native environment:"; qDebug() << QProcessEnvironment::systemEnvironment().toStringList(); killTimer.stop(); - JavaCheckResult result; - { - result.path = m_path; - result.id = m_id; - } - - emit checkFinished(result); - return; + emit checkFinished({ m_path, m_id }); } + emitSucceeded(); } void JavaChecker::timeout() diff --git a/launcher/java/JavaChecker.h b/launcher/java/JavaChecker.h index 7111f8522..0c6191c21 100644 --- a/launcher/java/JavaChecker.h +++ b/launcher/java/JavaChecker.h @@ -3,49 +3,51 @@ #include #include -#include "QObjectPtr.h" - #include "JavaVersion.h" +#include "QObjectPtr.h" +#include "tasks/Task.h" -class JavaChecker; - -struct JavaCheckResult { - QString path; - QString mojangPlatform; - QString realPlatform; - JavaVersion javaVersion; - QString javaVendor; - QString outLog; - QString errorLog; - bool is_64bit = false; - int id; - enum class Validity { Errored, ReturnedInvalidData, Valid } validity = Validity::Errored; -}; - -using QProcessPtr = shared_qobject_ptr; -using JavaCheckerPtr = shared_qobject_ptr; -class JavaChecker : public QObject { +class JavaChecker : public Task { Q_OBJECT public: - explicit JavaChecker(QObject* parent = 0); - void performCheck(); + using QProcessPtr = shared_qobject_ptr; + using Ptr = shared_qobject_ptr; - QString m_path; - QString m_args; - int m_id = 0; - int m_minMem = 0; - int m_maxMem = 0; - int m_permGen = 64; + struct Result { + QString path; + int id; + QString mojangPlatform; + QString realPlatform; + JavaVersion javaVersion; + QString javaVendor; + QString outLog; + QString errorLog; + bool is_64bit = false; + enum class Validity { Errored, ReturnedInvalidData, Valid } validity = Validity::Errored; + }; + + explicit JavaChecker(QString path, QString args, int minMem = 0, int maxMem = 0, int permGen = 0, int id = 0, QObject* parent = 0); signals: - void checkFinished(JavaCheckResult result); + void checkFinished(Result result); + + protected: + virtual void executeTask() override; private: QProcessPtr process; QTimer killTimer; QString m_stdout; QString m_stderr; - public slots: + + QString m_path; + QString m_args; + int m_minMem = 0; + int m_maxMem = 0; + int m_permGen = 64; + int m_id = 0; + + private slots: void timeout(); void finished(int exitcode, QProcess::ExitStatus); void error(QProcess::ProcessError); diff --git a/launcher/java/JavaCheckerJob.cpp b/launcher/java/JavaCheckerJob.cpp deleted file mode 100644 index 870e2a09a..000000000 --- a/launcher/java/JavaCheckerJob.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "JavaCheckerJob.h" - -#include - -void JavaCheckerJob::partFinished(JavaCheckResult result) -{ - num_finished++; - qDebug() << m_job_name.toLocal8Bit() << "progress:" << num_finished << "/" << javacheckers.size(); - setProgress(num_finished, javacheckers.size()); - - javaresults.replace(result.id, result); - - if (num_finished == javacheckers.size()) { - emitSucceeded(); - } -} - -void JavaCheckerJob::executeTask() -{ - qDebug() << m_job_name.toLocal8Bit() << " started."; - for (auto iter : javacheckers) { - javaresults.append(JavaCheckResult()); - connect(iter.get(), &JavaChecker::checkFinished, this, &JavaCheckerJob::partFinished); - iter->performCheck(); - } -} diff --git a/launcher/java/JavaCheckerJob.h b/launcher/java/JavaCheckerJob.h deleted file mode 100644 index ddf827968..000000000 --- a/launcher/java/JavaCheckerJob.h +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include "JavaChecker.h" -#include "tasks/Task.h" - -class JavaCheckerJob; -using JavaCheckerJobPtr = shared_qobject_ptr; - -// FIXME: this just seems horribly redundant -class JavaCheckerJob : public Task { - Q_OBJECT - public: - explicit JavaCheckerJob(QString job_name) : Task(), m_job_name(job_name){}; - virtual ~JavaCheckerJob(){}; - - bool addJavaCheckerAction(JavaCheckerPtr base) - { - javacheckers.append(base); - // if this is already running, the action needs to be started right away! - if (isRunning()) { - setProgress(num_finished, javacheckers.size()); - connect(base.get(), &JavaChecker::checkFinished, this, &JavaCheckerJob::partFinished); - base->performCheck(); - } - return true; - } - QList getResults() { return javaresults; } - - private slots: - void partFinished(JavaCheckResult result); - - protected: - virtual void executeTask() override; - - private: - QString m_job_name; - QList javacheckers; - QList javaresults; - int num_finished = 0; -}; diff --git a/launcher/java/JavaInstallList.cpp b/launcher/java/JavaInstallList.cpp index d8be4963f..ef99d6853 100644 --- a/launcher/java/JavaInstallList.cpp +++ b/launcher/java/JavaInstallList.cpp @@ -38,11 +38,13 @@ #include #include +#include -#include "java/JavaCheckerJob.h" +#include "Application.h" +#include "java/JavaChecker.h" #include "java/JavaInstallList.h" #include "java/JavaUtils.h" -#include "minecraft/VersionFilterData.h" +#include "tasks/ConcurrentTask.h" JavaInstallList::JavaInstallList(QObject* parent) : BaseVersionList(parent) {} @@ -55,7 +57,7 @@ Task::Ptr JavaInstallList::getLoadTask() Task::Ptr JavaInstallList::getCurrentTask() { if (m_status == Status::InProgress) { - return m_loadTask; + return m_load_task; } return nullptr; } @@ -64,8 +66,8 @@ void JavaInstallList::load() { if (m_status != Status::InProgress) { m_status = Status::InProgress; - m_loadTask.reset(new JavaListLoadTask(this)); - m_loadTask->start(); + m_load_task.reset(new JavaListLoadTask(this)); + m_load_task->start(); } } @@ -129,7 +131,7 @@ void JavaInstallList::updateListData(QList versions) } endResetModel(); m_status = Status::Done; - m_loadTask.reset(); + m_load_task.reset(); } bool sortJavas(BaseVersion::Ptr left, BaseVersion::Ptr right) @@ -149,11 +151,9 @@ void JavaInstallList::sortVersions() JavaListLoadTask::JavaListLoadTask(JavaInstallList* vlist) : Task() { m_list = vlist; - m_currentRecommended = NULL; + m_current_recommended = NULL; } -JavaListLoadTask::~JavaListLoadTask() {} - void JavaListLoadTask::executeTask() { setStatus(tr("Detecting Java installations...")); @@ -161,20 +161,17 @@ void JavaListLoadTask::executeTask() JavaUtils ju; QList candidate_paths = ju.FindJavaPaths(); - m_job.reset(new JavaCheckerJob("Java detection")); + ConcurrentTask::Ptr job(new ConcurrentTask(this, "Java detection", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); + m_job.reset(job); connect(m_job.get(), &Task::finished, this, &JavaListLoadTask::javaCheckerFinished); connect(m_job.get(), &Task::progress, this, &Task::setProgress); qDebug() << "Probing the following Java paths: "; int id = 0; for (QString candidate : candidate_paths) { - qDebug() << " " << candidate; - - auto candidate_checker = new JavaChecker(); - candidate_checker->m_path = candidate; - candidate_checker->m_id = id; - m_job->addJavaCheckerAction(JavaCheckerPtr(candidate_checker)); - + auto checker = new JavaChecker(candidate, "", 0, 0, 0, id, this); + connect(checker, &JavaChecker::checkFinished, [this](JavaChecker::Result result) { m_results << result; }); + job->addTask(Task::Ptr(checker)); id++; } @@ -184,11 +181,11 @@ void JavaListLoadTask::executeTask() void JavaListLoadTask::javaCheckerFinished() { QList candidates; - auto results = m_job->getResults(); + std::sort(m_results.begin(), m_results.end(), [](JavaChecker::Result a, JavaChecker::Result b) { return a.id < b.id; }); qDebug() << "Found the following valid Java installations:"; - for (JavaCheckResult result : results) { - if (result.validity == JavaCheckResult::Validity::Valid) { + for (auto result : m_results) { + if (result.validity == JavaChecker::Result::Validity::Valid) { JavaInstallPtr javaVersion(new JavaInstall()); javaVersion->id = result.javaVersion; diff --git a/launcher/java/JavaInstallList.h b/launcher/java/JavaInstallList.h index 1eebadf23..08f0b310d 100644 --- a/launcher/java/JavaInstallList.h +++ b/launcher/java/JavaInstallList.h @@ -19,9 +19,9 @@ #include #include "BaseVersionList.h" +#include "java/JavaChecker.h" #include "tasks/Task.h" -#include "JavaCheckerJob.h" #include "JavaInstall.h" #include "QObjectPtr.h" @@ -53,7 +53,7 @@ class JavaInstallList : public BaseVersionList { protected: Status m_status = Status::NotDone; - shared_qobject_ptr m_loadTask; + shared_qobject_ptr m_load_task; QList m_vlist; }; @@ -62,14 +62,16 @@ class JavaListLoadTask : public Task { public: explicit JavaListLoadTask(JavaInstallList* vlist); - virtual ~JavaListLoadTask(); + virtual ~JavaListLoadTask() = default; + protected: void executeTask() override; public slots: void javaCheckerFinished(); protected: - shared_qobject_ptr m_job; + Task::Ptr m_job; JavaInstallList* m_list; - JavaInstall* m_currentRecommended; + JavaInstall* m_current_recommended; + QList m_results; }; diff --git a/launcher/java/JavaUtils.h b/launcher/java/JavaUtils.h index 616179706..c052ca325 100644 --- a/launcher/java/JavaUtils.h +++ b/launcher/java/JavaUtils.h @@ -15,10 +15,9 @@ #pragma once +#include #include - -#include "JavaChecker.h" -#include "JavaInstallList.h" +#include "java/JavaInstall.h" #ifdef Q_OS_WIN #include diff --git a/launcher/java/providers/AdoptiumJavaDownloader.cpp b/launcher/java/providers/AdoptiumJavaDownloader.cpp new file mode 100644 index 000000000..4f8499d4a --- /dev/null +++ b/launcher/java/providers/AdoptiumJavaDownloader.cpp @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "java/providers/AdoptiumJavaDownloader.h" +#include +#include +#include "MMCZip.h" + +#include "Application.h" +#include "net/NetJob.h" +#include "tasks/Task.h" + +void AdoptiumJavaDownloader::executeTask() +{ + downloadJava(); +}; + +QString AdoptiumJavaDownloader::getArch() const +{ + if (m_os_arch == "arm64") + return "aarch64"; + if (m_os_arch.isEmpty()) + return "x86"; + return m_os_arch; +} + +void AdoptiumJavaDownloader::downloadJava() +{ + // JRE found ! download the zip + setStatus(tr("Downloading Java from Adoptium")); + + auto javaVersion = m_is_legacy ? QString("8") : QString("17"); + auto azulOS = m_os_name == "osx" ? "mac" : m_os_name; + auto arch = getArch(); + MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("java", "adoptiumJRE.zip"); + + auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); + download->addNetAction(Net::Download::makeCached( + QString("https://api.adoptium.net/v3/binary/latest/%1/ga/%2/%3/jre/hotspot/normal/eclipse").arg(javaVersion, azulOS, arch), entry)); + auto fullPath = entry->getFullPath(); + + connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); + // connect(download.get(), &NetJob::aborted, [path] { APPLICATION->instances()->destroyStagingPath(path); }); + connect(download.get(), &NetJob::progress, this, &AdoptiumJavaDownloader::progress); + connect(download.get(), &NetJob::failed, this, &AdoptiumJavaDownloader::emitFailed); + connect(this, &Task::aborted, download.get(), &NetJob::abort); + connect(download.get(), &NetJob::succeeded, [this, fullPath] { + // This should do all of the extracting and creating folders + extractJava(fullPath); + }); + download->start(); +}; + +void AdoptiumJavaDownloader::extractJava(QString input) +{ + setStatus(tr("Extracting java")); + auto zip = std::make_shared(input); + auto files = zip->getFileNameList(); + if (files.isEmpty()) { + emitFailed("Empty archive"); + return; + } + auto zipTask = makeShared(input, m_final_path, files[0]); + + auto progressStep = std::make_shared(); + connect(zipTask.get(), &Task::finished, this, [this, progressStep] { + progressStep->state = TaskStepState::Succeeded; + stepProgress(*progressStep); + }); + + connect(this, &Task::aborted, zipTask.get(), &Task::abort); + connect(zipTask.get(), &Task::finished, [zipTask, this] { disconnect(this, &Task::aborted, zipTask.get(), &Task::abort); }); + + connect(zipTask.get(), &Task::succeeded, this, &AdoptiumJavaDownloader::emitSucceeded); + connect(zipTask.get(), &Task::aborted, this, &AdoptiumJavaDownloader::emitAborted); + connect(zipTask.get(), &Task::failed, this, [this, progressStep](QString reason) { + progressStep->state = TaskStepState::Failed; + stepProgress(*progressStep); + emitFailed(reason); + }); + connect(zipTask.get(), &Task::stepProgress, this, &AdoptiumJavaDownloader::propagateStepProgress); + + connect(zipTask.get(), &Task::progress, this, [this, progressStep](qint64 current, qint64 total) { + progressStep->update(current, total); + stepProgress(*progressStep); + }); + connect(zipTask.get(), &Task::status, this, [this, progressStep](QString status) { + progressStep->status = status; + stepProgress(*progressStep); + }); + zipTask->start(); +}; + +static const QStringList supportedOs = { + "linux", "windows", "mac", "solaris", "aix", "alpine-linux", +}; + +static const QStringList supportedArch = { + "x64", "x86", "x32", "ppc64", "ppc64le", "s390x", "aarch64", "arm", "sparcv9", "riscv64", +}; + +bool AdoptiumJavaDownloader::isSupported() const +{ + return supportedOs.contains(m_os_name == "osx" ? "mac" : m_os_name) && supportedArch.contains(getArch()); +}; \ No newline at end of file diff --git a/launcher/java/providers/AdoptiumJavaDownloader.h b/launcher/java/providers/AdoptiumJavaDownloader.h new file mode 100644 index 000000000..f0ae6239b --- /dev/null +++ b/launcher/java/providers/AdoptiumJavaDownloader.h @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "java/providers/BasicJavaDownloader.h" + +class AdoptiumJavaDownloader : public BasicJavaDownloader { + Q_OBJECT + public: + void executeTask() override; + + virtual QString name() const override { return "Adoptium"; }; + virtual bool isSupported() const override; + private slots: + void downloadJava(); + void extractJava(QString input); + + private: + QString getArch() const; +}; \ No newline at end of file diff --git a/launcher/java/providers/AzulJavaDownloader.cpp b/launcher/java/providers/AzulJavaDownloader.cpp new file mode 100644 index 000000000..674da592e --- /dev/null +++ b/launcher/java/providers/AzulJavaDownloader.cpp @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "java/providers/AzulJavaDownloader.h" +#include +#include "MMCZip.h" + +#include "Application.h" +#include "Json.h" +#include "net/NetJob.h" +#include "tasks/Task.h" + +void AzulJavaDownloader::executeTask() +{ + downloadJavaList(); +}; + +void AzulJavaDownloader::downloadJavaList() +{ + setStatus(tr("Querying Azul meta")); + + auto javaVersion = m_is_legacy ? QString("8.0") : QString("17.0"); + auto azulOS = m_os_name == "osx" ? "macos" : m_os_name; + auto arch = getArch(); + auto metaResponse = std::make_shared(); + auto downloadJob = makeShared(QString("JRE::QueryAzulMeta"), APPLICATION->network()); + downloadJob->addNetAction(Net::Download::makeByteArray(QString("https://api.azul.com/metadata/v1/zulu/packages/?" + "java_version=%1" + "&os=%2" + "&arch=%3" + "&archive_type=zip" + "&java_package_type=jre" + "&support_term=lts" + "&latest=true" + "status=ga" + "&availability_types=CA" + "&page=1" + "&page_size=1") + .arg(javaVersion, azulOS, arch), + metaResponse)); + connect(downloadJob.get(), &NetJob::finished, + [downloadJob, metaResponse, this] { disconnect(this, &Task::aborted, downloadJob.get(), &NetJob::abort); }); + connect(this, &Task::aborted, downloadJob.get(), &NetJob::abort); + connect(downloadJob.get(), &NetJob::failed, this, &AzulJavaDownloader::emitFailed); + connect(downloadJob.get(), &NetJob::progress, this, &AzulJavaDownloader::progress); + connect(downloadJob.get(), &NetJob::succeeded, [metaResponse, this] { + QJsonParseError parse_error{}; + QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); + qWarning() << *metaResponse; + return; + } + auto array = Json::ensureArray(doc.array()); + if (!array.empty()) { + downloadJava(array); + } else { + emitFailed(tr("No suitable JRE found")); + } + }); + downloadJob->start(); +}; + +QString AzulJavaDownloader::getArch() const +{ + if (m_os_arch == "arm64") + return "aarch64"; + if (m_os_arch == "arm") + return "aarch32"; + if (m_os_arch.isEmpty()) + return "x86"; + return m_os_arch; +} + +void AzulJavaDownloader::downloadJava(const QJsonArray& array) +{ + // JRE found ! download the zip + setStatus(tr("Downloading Java from Azul")); + + MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("java", "azulJRE.zip"); + + auto downloadURL = QUrl(array[0].toObject()["url"].toString()); + auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); + download->addNetAction(Net::Download::makeCached(downloadURL, entry)); + auto fullPath = entry->getFullPath(); + + connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); + // connect(download.get(), &NetJob::aborted, [path] { APPLICATION->instances()->destroyStagingPath(path); }); + connect(download.get(), &NetJob::progress, this, &AzulJavaDownloader::progress); + connect(download.get(), &NetJob::failed, this, &AzulJavaDownloader::emitFailed); + connect(this, &Task::aborted, download.get(), &NetJob::abort); + connect(download.get(), &NetJob::succeeded, [downloadURL, this, fullPath] { + // This should do all of the extracting and creating folders + extractJava(fullPath, downloadURL.fileName().chopped(4)); + }); + download->start(); +}; + +void AzulJavaDownloader::extractJava(QString input, QString subdirectory) +{ + setStatus(tr("Extracting java")); + auto zipTask = makeShared(input, m_final_path, subdirectory); + + auto progressStep = std::make_shared(); + connect(zipTask.get(), &Task::finished, this, [this, progressStep] { + progressStep->state = TaskStepState::Succeeded; + stepProgress(*progressStep); + }); + + connect(this, &Task::aborted, zipTask.get(), &Task::abort); + connect(zipTask.get(), &Task::finished, [zipTask, this] { disconnect(this, &Task::aborted, zipTask.get(), &Task::abort); }); + + connect(zipTask.get(), &Task::succeeded, this, &AzulJavaDownloader::emitSucceeded); + connect(zipTask.get(), &Task::aborted, this, &AzulJavaDownloader::emitAborted); + connect(zipTask.get(), &Task::failed, this, [this, progressStep](QString reason) { + progressStep->state = TaskStepState::Failed; + stepProgress(*progressStep); + emitFailed(reason); + }); + connect(zipTask.get(), &Task::stepProgress, this, &AzulJavaDownloader::propagateStepProgress); + + connect(zipTask.get(), &Task::progress, this, [this, progressStep](qint64 current, qint64 total) { + progressStep->update(current, total); + stepProgress(*progressStep); + }); + connect(zipTask.get(), &Task::status, this, [this, progressStep](QString status) { + progressStep->status = status; + stepProgress(*progressStep); + }); + zipTask->start(); +}; + +static const QStringList supportedOs = { + "macos", "linux", "windows", "linux-musl", "linux-glibc", "qnx", "solaris", "aix", +}; + +static const QStringList supportedArch = { + "x86", "x64", "amd64", "i686", "arm", "aarch64", "aarch32", "aarch32sf", "aarch32hf", "ppc", + "ppc64", "ppc32", "ppc32hf", "ppc32spe", "sparc", "sparc64", "sparc32", "sparcv9", "sparcv9-64", "sparcv9-32", +}; + +bool AzulJavaDownloader::isSupported() const +{ + return supportedOs.contains(m_os_name == "osx" ? "macos" : m_os_name) && supportedArch.contains(getArch()); +}; \ No newline at end of file diff --git a/launcher/java/providers/AzulJavaDownloader.h b/launcher/java/providers/AzulJavaDownloader.h new file mode 100644 index 000000000..c4bc8c761 --- /dev/null +++ b/launcher/java/providers/AzulJavaDownloader.h @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "java/providers/BasicJavaDownloader.h" + +class AzulJavaDownloader : public BasicJavaDownloader { + Q_OBJECT + public: + void executeTask() override; + + virtual QString name() const override { return "Azul"; }; + virtual bool isSupported() const override; + private slots: + void downloadJavaList(); + void downloadJava(const QJsonArray& doc); + void extractJava(QString input, QString subdirectory); + + private: + QString getArch() const; +}; \ No newline at end of file diff --git a/launcher/java/providers/BasicJavaDownloader.cpp b/launcher/java/providers/BasicJavaDownloader.cpp new file mode 100644 index 000000000..9f353d9c1 --- /dev/null +++ b/launcher/java/providers/BasicJavaDownloader.cpp @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "java/providers/BasicJavaDownloader.h" + +#include "SysInfo.h" +#include "tasks/Task.h" + +BasicJavaDownloader::BasicJavaDownloader(QString final_path, bool m_is_legacy, QObject* parent) + : Task(parent) + , m_os_name(SysInfo::currentSystem()) + , m_os_arch(SysInfo::useQTForArch()) + , m_final_path(final_path) + , m_is_legacy(m_is_legacy) +{} diff --git a/launcher/java/providers/BasicJavaDownloader.h b/launcher/java/providers/BasicJavaDownloader.h new file mode 100644 index 000000000..34c944ec8 --- /dev/null +++ b/launcher/java/providers/BasicJavaDownloader.h @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "tasks/Task.h" + +class BasicJavaDownloader : public Task { + Q_OBJECT + public: + BasicJavaDownloader(QString final_path, bool m_is_legacy = false, QObject* parent = nullptr); + virtual ~BasicJavaDownloader() = default; + + [[nodiscard]] bool canAbort() const override { return true; } + + virtual QString name() const = 0; + virtual bool isSupported() const = 0; + + protected: + QString m_os_name; + QString m_os_arch; + QString m_final_path; + bool m_is_legacy; + + Task::Ptr m_current_task; +}; \ No newline at end of file diff --git a/launcher/java/providers/MojangJavaDownloader.cpp b/launcher/java/providers/MojangJavaDownloader.cpp new file mode 100644 index 000000000..fc2a17e94 --- /dev/null +++ b/launcher/java/providers/MojangJavaDownloader.cpp @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "java/providers/MojanglJavaDownloader.h" + +#include "Application.h" +#include "FileSystem.h" +#include "Json.h" +#include "net/ChecksumValidator.h" +#include "net/NetJob.h" + +struct File { + QString path; + QString url; + QByteArray hash; + bool isExec; +}; + +void MojangJavaDownloader::executeTask() +{ + downloadJavaList(); +}; + +void MojangJavaDownloader::downloadJavaList() +{ + auto netJob = makeShared(QString("JRE::QueryVersions"), APPLICATION->network()); + auto response = std::make_shared(); + setStatus(tr("Querying mojang meta")); + netJob->addNetAction(Net::Download::makeByteArray( + QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); + + connect(netJob.get(), &NetJob::finished, [netJob, this] { + // delete so that it's not called on a deleted job + // FIXME: is this needed? qt should handle this + disconnect(this, &Task::aborted, netJob.get(), &NetJob::abort); + }); + connect(this, &Task::aborted, netJob.get(), &NetJob::abort); + + connect(netJob.get(), &NetJob::progress, this, &MojangJavaDownloader::progress); + connect(netJob.get(), &NetJob::failed, this, &MojangJavaDownloader::emitFailed); + connect(netJob.get(), &NetJob::succeeded, [response, this, netJob] { + QJsonParseError parse_error{}; + QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); + qWarning() << *response; + emitFailed(parse_error.errorString()); + return; + } + auto versionArray = Json::ensureArray(Json::ensureObject(doc.object(), getOS()), m_is_legacy ? "jre-legacy" : "java-runtime-gamma"); + if (!versionArray.empty()) { + parseManifest(versionArray); + + } else { + // mojang does not have a JRE for us, so fail + emitFailed("No suitable JRE found"); + } + }); + + netJob->start(); +}; + +QString MojangJavaDownloader::getOS() const +{ + if (m_os_name == "windows") { + if (m_os_arch == "x86_64") { + return "windows-x64"; + } + if (m_os_arch == "i386") { + return "windows-x86"; + } + // Unknown, maybe arm, appending arch for downloader + return "windows-" + m_os_arch; + } + if (m_os_name == "osx") { + if (m_os_arch == "arm64") { + return "mac-os-arm64"; + } + return "mac-os"; + } + if (m_os_name == "linux") { + if (m_os_arch == "x86_64") { + return "linux"; + } + // will work for i386, and arm(64) + return "linux-" + m_os_arch; + } + return {}; +} +void MojangJavaDownloader::parseManifest(const QJsonArray& versionArray) +{ + setStatus(tr("Downloading Java from Mojang")); + auto url = Json::ensureString(Json::ensureObject(Json::ensureObject(versionArray[0]), "manifest"), "url"); + auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); + auto files = std::make_shared(); + + download->addNetAction(Net::Download::makeByteArray(QUrl(url), files)); + + connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); + connect(download.get(), &NetJob::progress, this, &MojangJavaDownloader::progress); + connect(download.get(), &NetJob::failed, this, &MojangJavaDownloader::emitFailed); + connect(this, &Task::aborted, download.get(), &NetJob::abort); + + connect(download.get(), &NetJob::succeeded, [files, this] { + QJsonParseError parse_error{}; + QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); + qWarning() << *files; + emitFailed(parse_error.errorString()); + return; + } + downloadJava(doc); + }); + download->start(); +}; + +void MojangJavaDownloader::downloadJava(const QJsonDocument& doc) +{ + // valid json doc, begin making jre spot + FS::ensureFolderPathExists(m_final_path); + std::vector toDownload; + auto list = Json::ensureObject(Json::ensureObject(doc.object()), "files"); + for (const auto& paths : list.keys()) { + auto file = FS::PathCombine(m_final_path, paths); + + const QJsonObject& meta = Json::ensureObject(list, paths); + auto type = Json::ensureString(meta, "type"); + if (type == "directory") { + FS::ensureFolderPathExists(file); + } else if (type == "link") { + // this is linux only ! + auto path = Json::ensureString(meta, "target"); + if (!path.isEmpty()) { + auto target = FS::PathCombine(file, "../" + path); + QFile(target).link(file); + } + } else if (type == "file") { + // TODO download compressed version if it exists ? + auto raw = Json::ensureObject(Json::ensureObject(meta, "downloads"), "raw"); + auto isExec = Json::ensureBoolean(meta, "executable", false); + auto url = Json::ensureString(raw, "url"); + if (!url.isEmpty() && QUrl(url).isValid()) { + auto f = File{ file, url, QByteArray::fromHex(Json::ensureString(raw, "sha1").toLatin1()), isExec }; + toDownload.push_back(f); + } + } + } + auto elementDownload = new NetJob("JRE::FileDownload", APPLICATION->network()); + for (const auto& file : toDownload) { + auto dl = Net::Download::makeFile(file.url, file.path); + if (!file.hash.isEmpty()) { + dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, file.hash)); + } + if (file.isExec) { + connect(dl.get(), &Net::Download::succeeded, + [file] { QFile(file.path).setPermissions(QFile(file.path).permissions() | QFileDevice::Permissions(0x1111)); }); + } + elementDownload->addNetAction(dl); + } + connect(elementDownload, &NetJob::finished, [elementDownload, this] { + disconnect(this, &Task::aborted, elementDownload, &NetJob::abort); + elementDownload->deleteLater(); + }); + connect(elementDownload, &NetJob::progress, this, &MojangJavaDownloader::progress); + connect(elementDownload, &NetJob::failed, this, &MojangJavaDownloader::emitFailed); + + connect(this, &Task::aborted, elementDownload, &NetJob::abort); + connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); + elementDownload->start(); +}; diff --git a/launcher/java/providers/MojanglJavaDownloader.h b/launcher/java/providers/MojanglJavaDownloader.h new file mode 100644 index 000000000..a1b5b1765 --- /dev/null +++ b/launcher/java/providers/MojanglJavaDownloader.h @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "java/providers/BasicJavaDownloader.h" + +class MojangJavaDownloader : public BasicJavaDownloader { + Q_OBJECT + public: + void executeTask() override; + + virtual QString name() const override { return "Mojang"; }; + virtual bool isSupported() const override { return !getOS().isEmpty(); }; + private slots: + void downloadJavaList(); + void parseManifest(const QJsonArray& versionArray); + void downloadJava(const QJsonDocument& doc); + + private: + QString getOS() const; +}; \ No newline at end of file diff --git a/launcher/launch/steps/CheckJava.cpp b/launcher/launch/steps/CheckJava.cpp index 81337a88e..c776092fe 100644 --- a/launcher/launch/steps/CheckJava.cpp +++ b/launcher/launch/steps/CheckJava.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include "java/JavaUtils.h" @@ -90,11 +91,10 @@ void CheckJava::executeTask() // if timestamps are not the same, or something is missing, check! if (m_javaSignature != storedSignature || storedVersion.size() == 0 || storedArchitecture.size() == 0 || storedRealArchitecture.size() == 0 || storedVendor.size() == 0) { - m_JavaChecker.reset(new JavaChecker); + m_JavaChecker.reset(new JavaChecker(realJavaPath, "", 0, 0, 0, 0, this)); emit logLine(QString("Checking Java version..."), MessageLevel::Launcher); connect(m_JavaChecker.get(), &JavaChecker::checkFinished, this, &CheckJava::checkJavaFinished); - m_JavaChecker->m_path = realJavaPath; - m_JavaChecker->performCheck(); + m_JavaChecker->start(); return; } else { auto verString = instance->settings()->get("JavaVersion").toString(); @@ -106,10 +106,10 @@ void CheckJava::executeTask() emitSucceeded(); } -void CheckJava::checkJavaFinished(JavaCheckResult result) +void CheckJava::checkJavaFinished(JavaChecker::Result result) { switch (result.validity) { - case JavaCheckResult::Validity::Errored: { + case JavaChecker::Result::Validity::Errored: { // 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); @@ -117,14 +117,14 @@ void CheckJava::checkJavaFinished(JavaCheckResult result) emitFailed(QString("Could not start java!")); return; } - case JavaCheckResult::Validity::ReturnedInvalidData: { + case JavaChecker::Result::Validity::ReturnedInvalidData: { emit logLine(QString("Java checker returned some invalid data we don't understand:"), MessageLevel::Error); emit logLines(result.outLog.split('\n'), MessageLevel::Warning); emit logLine("\nMinecraft might not start properly.", MessageLevel::Launcher); emitSucceeded(); return; } - case JavaCheckResult::Validity::Valid: { + case JavaChecker::Result::Validity::Valid: { auto instance = m_parent->instance(); printJavaInfo(result.javaVersion.toString(), result.mojangPlatform, result.realPlatform, result.javaVendor); instance->settings()->set("JavaVersion", result.javaVersion.toString()); diff --git a/launcher/launch/steps/CheckJava.h b/launcher/launch/steps/CheckJava.h index 4436e2a55..5ba9e4018 100644 --- a/launcher/launch/steps/CheckJava.h +++ b/launcher/launch/steps/CheckJava.h @@ -28,7 +28,7 @@ class CheckJava : public LaunchStep { virtual void executeTask(); virtual bool canAbort() const { return false; } private slots: - void checkJavaFinished(JavaCheckResult result); + void checkJavaFinished(JavaChecker::Result result); private: void printJavaInfo(const QString& version, const QString& architecture, const QString& realArchitecture, const QString& vendor); @@ -37,5 +37,5 @@ class CheckJava : public LaunchStep { private: QString m_javaPath; QString m_javaSignature; - JavaCheckerPtr m_JavaChecker; + JavaChecker::Ptr m_JavaChecker; }; diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 63d7aa57c..be6b195dc 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -14,7 +14,9 @@ #include "FileSystem.h" #include "JavaCommon.h" #include "JavaDownloader.h" +#include "java/JavaChecker.h" #include "java/JavaInstall.h" +#include "java/JavaInstallList.h" #include "java/JavaUtils.h" #include "ui/dialogs/CustomMessageBox.h" @@ -368,30 +370,25 @@ void JavaSettingsWidget::checkJavaPath(const QString& path) return; } setJavaStatus(JavaStatus::Pending); - m_checker.reset(new JavaChecker()); - m_checker->m_path = path; - m_checker->m_minMem = minHeapSize(); - m_checker->m_maxMem = maxHeapSize(); - if (m_permGenSpinBox->isVisible()) { - m_checker->m_permGen = m_permGenSpinBox->value(); - } + m_checker.reset( + new JavaChecker(path, "", minHeapSize(), maxHeapSize(), m_permGenSpinBox->isVisible() ? m_permGenSpinBox->value() : 0, 0, this)); connect(m_checker.get(), &JavaChecker::checkFinished, this, &JavaSettingsWidget::checkFinished); - m_checker->performCheck(); + m_checker->start(); } -void JavaSettingsWidget::checkFinished(JavaCheckResult result) +void JavaSettingsWidget::checkFinished(JavaChecker::Result result) { m_result = result; switch (result.validity) { - case JavaCheckResult::Validity::Valid: { + case JavaChecker::Result::Validity::Valid: { setJavaStatus(JavaStatus::Good); break; } - case JavaCheckResult::Validity::ReturnedInvalidData: { + case JavaChecker::Result::Validity::ReturnedInvalidData: { setJavaStatus(JavaStatus::ReturnedInvalidData); break; } - case JavaCheckResult::Validity::Errored: { + case JavaChecker::Result::Validity::Errored: { setJavaStatus(JavaStatus::DoesNotStart); break; } diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index 0e05bf341..d3cd2c5a7 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -51,7 +51,7 @@ class JavaSettingsWidget : public QWidget { void on_javaBrowseBtn_clicked(); void on_javaStatusBtn_clicked(); void on_javaDownloadBtn_clicked(); - void checkFinished(JavaCheckResult result); + void checkFinished(JavaChecker::Result result); protected: /* methods */ void checkJavaPathOnEdit(const QString& path); @@ -89,5 +89,5 @@ class JavaSettingsWidget : public QWidget { QString queuedCheck; uint64_t m_availableMemory = 0ull; shared_qobject_ptr m_checker; - JavaCheckResult m_result; + JavaChecker::Result m_result; }; From 2c18d0f1a511c23898bb8f82d57c99458712bc30 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 25 Jan 2024 15:41:34 +0000 Subject: [PATCH 030/616] Store current version in packwiz metadata (temporarily using `x-prismlauncher-version-number`) Signed-off-by: TheKodeToad --- launcher/modplatform/packwiz/Packwiz.cpp | 9 ++++++--- launcher/modplatform/packwiz/Packwiz.h | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index d8d496af7..f68624c1a 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -91,8 +91,9 @@ auto intEntry(toml::table table, QString entry_name) -> int return node.value_or(0); } -auto V1::createModFormat([[maybe_unused]] const QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) - -> Mod +auto V1::createModFormat([[maybe_unused]] const QDir& index_dir, + ModPlatform::IndexedPack& mod_pack, + ModPlatform::IndexedVersion& mod_version) -> Mod { Mod mod; @@ -111,6 +112,7 @@ auto V1::createModFormat([[maybe_unused]] const QDir& index_dir, ModPlatform::In mod.hash = mod_version.hash; mod.provider = mod_pack.provider; + mod.version_number = mod_version.version_number; mod.file_id = mod_version.fileId; mod.project_id = mod_pack.addonId; mod.side = stringToSide(mod_pack.side); @@ -199,7 +201,8 @@ void V1::updateModIndex(const QDir& index_dir, Mod& mod) { "hash-format", mod.hash_format.toStdString() }, { "hash", mod.hash.toStdString() }, } }, - { "update", toml::table{ { ProviderCaps.name(mod.provider), update } } } }; + { "update", toml::table{ { ProviderCaps.name(mod.provider), update }, + { "x-prismlauncher-version-number", mod.version_number.toStdString() } } } }; std::stringstream ss; ss << tbl; in_stream << QString::fromStdString(ss.str()); diff --git a/launcher/modplatform/packwiz/Packwiz.h b/launcher/modplatform/packwiz/Packwiz.h index 97c8f4b16..07bb4248d 100644 --- a/launcher/modplatform/packwiz/Packwiz.h +++ b/launcher/modplatform/packwiz/Packwiz.h @@ -52,6 +52,7 @@ class V1 { // [update] ModPlatform::ResourceProvider provider{}; + QString version_number{}; QVariant file_id{}; QVariant project_id{}; From e89703238365cbcca8cce19b923a28bbb2057516 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 25 Jan 2024 22:22:21 +0200 Subject: [PATCH 031/616] Added java metadata Signed-off-by: Trial97 --- launcher/CMakeLists.txt | 3 +++ launcher/java/JavaVersion.cpp | 20 +++++++++++++++++++ launcher/java/JavaVersion.h | 4 ++++ launcher/minecraft/MojangVersionFormat.cpp | 6 ++++++ launcher/minecraft/OneSixVersionFormat.cpp | 14 +++++++++++++ launcher/minecraft/VersionFile.h | 8 ++++++++ .../ui/pages/instance/InstanceSettingsPage.ui | 2 -- 7 files changed, 55 insertions(+), 2 deletions(-) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index e735f2081..2af33178d 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -430,6 +430,9 @@ set(JAVA_SOURCES java/JavaUtils.cpp java/JavaVersion.h java/JavaVersion.cpp + + java/JavaRuntime.h + java/JavaRuntime.cpp ) set(TRANSLATIONS_SOURCES diff --git a/launcher/java/JavaVersion.cpp b/launcher/java/JavaVersion.cpp index b77bf2adf..3de6f5ad6 100644 --- a/launcher/java/JavaVersion.cpp +++ b/launcher/java/JavaVersion.cpp @@ -109,3 +109,23 @@ bool JavaVersion::operator>(const JavaVersion& rhs) { return (!operator<(rhs)) && (!operator==(rhs)); } + +JavaVersion::JavaVersion(int major, int minor, int security, int build, QString name) + : m_major(major), m_minor(minor), m_security(security), m_name(name), m_parseable(true) +{ + if (build != 0) { + m_prerelease = QString::number(build); + m_string = m_prerelease; + } + if (m_security != 0) + m_string = QString::number(m_security) + "." + m_string; + else if (!m_string.isEmpty()) { + m_string = "0." + m_string; + } + if (m_minor != 0) + m_string = QString::number(m_minor) + "." + m_string; + else if (!m_string.isEmpty()) { + m_string = "0." + m_string; + } + m_string = QString::number(m_major) + "." + m_string; +} diff --git a/launcher/java/JavaVersion.h b/launcher/java/JavaVersion.h index 421578ea1..eee992346 100644 --- a/launcher/java/JavaVersion.h +++ b/launcher/java/JavaVersion.h @@ -16,6 +16,7 @@ class JavaVersion { public: JavaVersion() {} JavaVersion(const QString& rhs); + JavaVersion(int major, int minor, int security, int build = 0, QString name = ""); JavaVersion& operator=(const QString& rhs); @@ -32,12 +33,15 @@ class JavaVersion { int major() { return m_major; } int minor() { return m_minor; } int security() { return m_security; } + QString build() { return m_prerelease; } + QString name() { return m_name; } private: QString m_string; int m_major = 0; int m_minor = 0; int m_security = 0; + QString m_name = ""; bool m_parseable = false; QString m_prerelease; }; diff --git a/launcher/minecraft/MojangVersionFormat.cpp b/launcher/minecraft/MojangVersionFormat.cpp index bb782e47f..d17a3a21f 100644 --- a/launcher/minecraft/MojangVersionFormat.cpp +++ b/launcher/minecraft/MojangVersionFormat.cpp @@ -185,6 +185,9 @@ void MojangVersionFormat::readVersionProperties(const QJsonObject& in, VersionFi out->compatibleJavaMajors.append(requireInteger(compatible)); } } + if (in.contains("compatibleJavaName")) { + out->compatibleJavaName = requireString(in.value("compatibleJavaName")); + } if (in.contains("downloads")) { auto downloadsObj = requireObject(in, "downloads"); @@ -259,6 +262,9 @@ void MojangVersionFormat::writeVersionProperties(const VersionFile* in, QJsonObj } out.insert("compatibleJavaMajors", compatibleJavaMajorsOut); } + if (!in->compatibleJavaName.isEmpty()) { + writeString(out, "compatibleJavaName", in->compatibleJavaName); + } } QJsonDocument MojangVersionFormat::versionFileToJson(const VersionFilePtr& patch) diff --git a/launcher/minecraft/OneSixVersionFormat.cpp b/launcher/minecraft/OneSixVersionFormat.cpp index 306c95a6a..5f3b4f2a2 100644 --- a/launcher/minecraft/OneSixVersionFormat.cpp +++ b/launcher/minecraft/OneSixVersionFormat.cpp @@ -36,6 +36,8 @@ #include "OneSixVersionFormat.h" #include #include +#include +#include "java/JavaRuntime.h" #include "minecraft/Agent.h" #include "minecraft/ParseUtils.h" @@ -255,6 +257,18 @@ VersionFilePtr OneSixVersionFormat::versionFileFromJson(const QJsonDocument& doc out->m_volatile = requireBoolean(root, "volatile"); } + if (root.contains("runtimes")) { + auto runtimes = requireObject(root, "runtimes"); + out->runtimes = {}; + for (auto key : runtimes.keys()) { + QList list; + for (auto runtime : ensureArray(runtimes, key)) { + list.append(JavaRuntime::parseJavaMeta(ensureObject(runtime))); + } + out->runtimes[key] = list; + } + } + /* removed features that shouldn't be used */ if (root.contains("tweakers")) { out->addProblem(ProblemSeverity::Error, QObject::tr("Version file contains unsupported element 'tweakers'")); diff --git a/launcher/minecraft/VersionFile.h b/launcher/minecraft/VersionFile.h index 280e35ee3..297c19709 100644 --- a/launcher/minecraft/VersionFile.h +++ b/launcher/minecraft/VersionFile.h @@ -36,6 +36,8 @@ #pragma once #include +#include +#include #include #include #include @@ -45,6 +47,7 @@ #include "Agent.h" #include "Library.h" #include "ProblemProvider.h" +#include "java/JavaRuntime.h" #include "minecraft/Rule.h" class PackProfile; @@ -98,6 +101,9 @@ class VersionFile : public ProblemContainer { /// Mojang: list of compatible java majors QList compatibleJavaMajors; + /// Mojang: the name of recomended java version + QString compatibleJavaName; + /// Mojang: type of the Minecraft version QString type; @@ -149,6 +155,8 @@ class VersionFile : public ProblemContainer { /// is volatile -- may be removed as soon as it is no longer needed by something else bool m_volatile = false; + QHash> runtimes; + public: // Mojang: DEPRECATED list of 'downloads' - client jar, server jar, windows server exe, maybe more. QMap> mojangDownloads; diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.ui b/launcher/ui/pages/instance/InstanceSettingsPage.ui index cb37366cc..7762ca8a7 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.ui +++ b/launcher/ui/pages/instance/InstanceSettingsPage.ui @@ -796,8 +796,6 @@ enableFeralGamemodeCheck enableMangoHud useDiscreteGpuCheck - modLoaderSettingsGroupBox - disableQuiltBeaconCheckBox gameTimeGroupBox serverJoinGroupBox serverJoinAddress From f36be3f0e3a32cb5f5711a727ecd07cf1c28b8dd Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 25 Jan 2024 22:58:12 +0200 Subject: [PATCH 032/616] Cleanup downloaders Signed-off-by: Trial97 --- launcher/CMakeLists.txt | 4 + launcher/java/JavaRuntime.cpp | 56 ++++++ launcher/java/JavaRuntime.h | 30 ++++ .../ArchiveJavaDownloader.cpp} | 53 ++---- .../ArchiveJavaDownloader.h} | 16 +- .../ManifestJavaDownloader.cpp} | 93 ++-------- .../ManifestJavaDownloader.h} | 20 ++- .../java/providers/AdoptiumJavaDownloader.h | 36 ---- .../java/providers/AzulJavaDownloader.cpp | 159 ------------------ launcher/java/providers/AzulJavaDownloader.h | 37 ---- .../java/providers/BasicJavaDownloader.cpp | 29 ---- 11 files changed, 132 insertions(+), 401 deletions(-) create mode 100644 launcher/java/JavaRuntime.cpp create mode 100644 launcher/java/JavaRuntime.h rename launcher/java/{providers/AdoptiumJavaDownloader.cpp => download/ArchiveJavaDownloader.cpp} (63%) rename launcher/java/{providers/BasicJavaDownloader.h => download/ArchiveJavaDownloader.h} (74%) rename launcher/java/{providers/MojangJavaDownloader.cpp => download/ManifestJavaDownloader.cpp} (55%) rename launcher/java/{providers/MojanglJavaDownloader.h => download/ManifestJavaDownloader.h} (70%) delete mode 100644 launcher/java/providers/AdoptiumJavaDownloader.h delete mode 100644 launcher/java/providers/AzulJavaDownloader.cpp delete mode 100644 launcher/java/providers/AzulJavaDownloader.h delete mode 100644 launcher/java/providers/BasicJavaDownloader.cpp diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 2af33178d..ac3f8eb68 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -433,6 +433,10 @@ set(JAVA_SOURCES java/JavaRuntime.h java/JavaRuntime.cpp + java/download/ArchiveJavaDownloader.cpp + java/download/ArchiveJavaDownloader.h + java/download/ManifestJavaDownloader.cpp + java/download/ManifestJavaDownloader.h ) set(TRANSLATIONS_SOURCES diff --git a/launcher/java/JavaRuntime.cpp b/launcher/java/JavaRuntime.cpp new file mode 100644 index 000000000..0de8c839b --- /dev/null +++ b/launcher/java/JavaRuntime.cpp @@ -0,0 +1,56 @@ +#include "java/JavaRuntime.h" + +#include + +#include "Json.h" +#include "java/JavaVersion.h" +#include "minecraft/ParseUtils.h" + +namespace JavaRuntime { + +DownloadType parseDownloadType(QString javaDownload) +{ + if (javaDownload == "manifest") + return DownloadType::Manifest; + // if (javaDownload == "archive") + return DownloadType::Archive; +} +QString downloadTypeToString(DownloadType javaDownload) +{ + switch (javaDownload) { + case DownloadType::Manifest: + return "manifest"; + case DownloadType::Archive: + return "archive"; + } +} +MetaPtr parseJavaMeta(const QJsonObject& in) +{ + auto meta = std::make_shared(); + + meta->name = Json::ensureString(in, "name", ""); + meta->vendor = Json::ensureString(in, "vendor", ""); + meta->url = Json::ensureString(in, "url", ""); + meta->releaseTime = timeFromS3Time(Json::ensureString(in, "releaseTime", "")); + meta->recommended = Json::ensureBoolean(in, "recommended", false); + meta->downloadType = parseDownloadType(Json::ensureString(in, "downloadType", "")); + meta->packageType = Json::ensureString(in, "packageType", ""); + + if (in.contains("checksum")) { + auto obj = Json::requireObject(in, "checksum"); + meta->checksumHash = Json::ensureString(obj, "hash", ""); + meta->checksumType = Json::ensureString(obj, "type", ""); + } + + if (in.contains("version")) { + auto obj = Json::requireObject(in, "checksum"); + auto name = Json::ensureString(obj, "name", ""); + auto major = Json::ensureInteger(obj, "major", 0); + auto minor = Json::ensureInteger(obj, "minor", 0); + auto security = Json::ensureInteger(obj, "security", 0); + auto build = Json::ensureInteger(obj, "build", 0); + meta->version = JavaVersion(major, minor, security, build, name); + } + return meta; +} +} // namespace JavaRuntime diff --git a/launcher/java/JavaRuntime.h b/launcher/java/JavaRuntime.h new file mode 100644 index 000000000..1ea5d2e48 --- /dev/null +++ b/launcher/java/JavaRuntime.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +#include "java/JavaVersion.h" + +namespace JavaRuntime { + +enum class DownloadType { Manifest, Archive }; + +struct Meta { + QString name; + QString vendor; + QString url; + QDateTime releaseTime; + QString checksumType; + QString checksumHash; + bool recommended; + DownloadType downloadType; + QString packageType; + JavaVersion version; +}; +using MetaPtr = std::shared_ptr; + +DownloadType parseDownloadType(QString javaDownload); +QString downloadTypeToString(DownloadType javaDownload); +MetaPtr parseJavaMeta(const QJsonObject& libObj); + +} // namespace JavaRuntime \ No newline at end of file diff --git a/launcher/java/providers/AdoptiumJavaDownloader.cpp b/launcher/java/download/ArchiveJavaDownloader.cpp similarity index 63% rename from launcher/java/providers/AdoptiumJavaDownloader.cpp rename to launcher/java/download/ArchiveJavaDownloader.cpp index 4f8499d4a..844be1dce 100644 --- a/launcher/java/providers/AdoptiumJavaDownloader.cpp +++ b/launcher/java/download/ArchiveJavaDownloader.cpp @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "java/providers/AdoptiumJavaDownloader.h" +#include "java/download/ArchiveJavaDownloader.h" #include #include #include "MMCZip.h" @@ -24,39 +24,21 @@ #include "net/NetJob.h" #include "tasks/Task.h" -void AdoptiumJavaDownloader::executeTask() -{ - downloadJava(); -}; - -QString AdoptiumJavaDownloader::getArch() const -{ - if (m_os_arch == "arm64") - return "aarch64"; - if (m_os_arch.isEmpty()) - return "x86"; - return m_os_arch; -} - -void AdoptiumJavaDownloader::downloadJava() +void ArchiveJavaDownloader::executeTask() { // JRE found ! download the zip - setStatus(tr("Downloading Java from Adoptium")); + setStatus(tr("Downloading Java")); - auto javaVersion = m_is_legacy ? QString("8") : QString("17"); - auto azulOS = m_os_name == "osx" ? "mac" : m_os_name; - auto arch = getArch(); - MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("java", "adoptiumJRE.zip"); + MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("java", m_url.toLocalFile()); auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); - download->addNetAction(Net::Download::makeCached( - QString("https://api.adoptium.net/v3/binary/latest/%1/ga/%2/%3/jre/hotspot/normal/eclipse").arg(javaVersion, azulOS, arch), entry)); + download->addNetAction(Net::Download::makeCached(m_url, entry)); auto fullPath = entry->getFullPath(); connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); // connect(download.get(), &NetJob::aborted, [path] { APPLICATION->instances()->destroyStagingPath(path); }); - connect(download.get(), &NetJob::progress, this, &AdoptiumJavaDownloader::progress); - connect(download.get(), &NetJob::failed, this, &AdoptiumJavaDownloader::emitFailed); + connect(download.get(), &NetJob::progress, this, &ArchiveJavaDownloader::progress); + connect(download.get(), &NetJob::failed, this, &ArchiveJavaDownloader::emitFailed); connect(this, &Task::aborted, download.get(), &NetJob::abort); connect(download.get(), &NetJob::succeeded, [this, fullPath] { // This should do all of the extracting and creating folders @@ -65,7 +47,7 @@ void AdoptiumJavaDownloader::downloadJava() download->start(); }; -void AdoptiumJavaDownloader::extractJava(QString input) +void ArchiveJavaDownloader::extractJava(QString input) { setStatus(tr("Extracting java")); auto zip = std::make_shared(input); @@ -85,14 +67,14 @@ void AdoptiumJavaDownloader::extractJava(QString input) connect(this, &Task::aborted, zipTask.get(), &Task::abort); connect(zipTask.get(), &Task::finished, [zipTask, this] { disconnect(this, &Task::aborted, zipTask.get(), &Task::abort); }); - connect(zipTask.get(), &Task::succeeded, this, &AdoptiumJavaDownloader::emitSucceeded); - connect(zipTask.get(), &Task::aborted, this, &AdoptiumJavaDownloader::emitAborted); + connect(zipTask.get(), &Task::succeeded, this, &ArchiveJavaDownloader::emitSucceeded); + connect(zipTask.get(), &Task::aborted, this, &ArchiveJavaDownloader::emitAborted); connect(zipTask.get(), &Task::failed, this, [this, progressStep](QString reason) { progressStep->state = TaskStepState::Failed; stepProgress(*progressStep); emitFailed(reason); }); - connect(zipTask.get(), &Task::stepProgress, this, &AdoptiumJavaDownloader::propagateStepProgress); + connect(zipTask.get(), &Task::stepProgress, this, &ArchiveJavaDownloader::propagateStepProgress); connect(zipTask.get(), &Task::progress, this, [this, progressStep](qint64 current, qint64 total) { progressStep->update(current, total); @@ -104,16 +86,3 @@ void AdoptiumJavaDownloader::extractJava(QString input) }); zipTask->start(); }; - -static const QStringList supportedOs = { - "linux", "windows", "mac", "solaris", "aix", "alpine-linux", -}; - -static const QStringList supportedArch = { - "x64", "x86", "x32", "ppc64", "ppc64le", "s390x", "aarch64", "arm", "sparcv9", "riscv64", -}; - -bool AdoptiumJavaDownloader::isSupported() const -{ - return supportedOs.contains(m_os_name == "osx" ? "mac" : m_os_name) && supportedArch.contains(getArch()); -}; \ No newline at end of file diff --git a/launcher/java/providers/BasicJavaDownloader.h b/launcher/java/download/ArchiveJavaDownloader.h similarity index 74% rename from launcher/java/providers/BasicJavaDownloader.h rename to launcher/java/download/ArchiveJavaDownloader.h index 34c944ec8..d17657086 100644 --- a/launcher/java/providers/BasicJavaDownloader.h +++ b/launcher/java/download/ArchiveJavaDownloader.h @@ -18,24 +18,24 @@ #pragma once +#include #include "tasks/Task.h" -class BasicJavaDownloader : public Task { +class ArchiveJavaDownloader : public Task { Q_OBJECT public: - BasicJavaDownloader(QString final_path, bool m_is_legacy = false, QObject* parent = nullptr); - virtual ~BasicJavaDownloader() = default; + ArchiveJavaDownloader(QUrl url, QString final_path); + virtual ~ArchiveJavaDownloader() = default; [[nodiscard]] bool canAbort() const override { return true; } + void executeTask() override; - virtual QString name() const = 0; - virtual bool isSupported() const = 0; + private slots: + void extractJava(QString input); protected: - QString m_os_name; - QString m_os_arch; + QUrl m_url; QString m_final_path; - bool m_is_legacy; Task::Ptr m_current_task; }; \ No newline at end of file diff --git a/launcher/java/providers/MojangJavaDownloader.cpp b/launcher/java/download/ManifestJavaDownloader.cpp similarity index 55% rename from launcher/java/providers/MojangJavaDownloader.cpp rename to launcher/java/download/ManifestJavaDownloader.cpp index fc2a17e94..4f7dab94e 100644 --- a/launcher/java/providers/MojangJavaDownloader.cpp +++ b/launcher/java/download/ManifestJavaDownloader.cpp @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "java/providers/MojanglJavaDownloader.h" +#include "java/download/ManifestJavaDownloader.h" #include "Application.h" #include "FileSystem.h" @@ -30,89 +30,18 @@ struct File { bool isExec; }; -void MojangJavaDownloader::executeTask() +ManifestJavaDownloader::ManifestJavaDownloader(QUrl url, QString final_path) : m_url(url), m_final_path(final_path){}; +void ManifestJavaDownloader::executeTask() { - downloadJavaList(); -}; - -void MojangJavaDownloader::downloadJavaList() -{ - auto netJob = makeShared(QString("JRE::QueryVersions"), APPLICATION->network()); - auto response = std::make_shared(); - setStatus(tr("Querying mojang meta")); - netJob->addNetAction(Net::Download::makeByteArray( - QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); - - connect(netJob.get(), &NetJob::finished, [netJob, this] { - // delete so that it's not called on a deleted job - // FIXME: is this needed? qt should handle this - disconnect(this, &Task::aborted, netJob.get(), &NetJob::abort); - }); - connect(this, &Task::aborted, netJob.get(), &NetJob::abort); - - connect(netJob.get(), &NetJob::progress, this, &MojangJavaDownloader::progress); - connect(netJob.get(), &NetJob::failed, this, &MojangJavaDownloader::emitFailed); - connect(netJob.get(), &NetJob::succeeded, [response, this, netJob] { - QJsonParseError parse_error{}; - QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); - if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); - qWarning() << *response; - emitFailed(parse_error.errorString()); - return; - } - auto versionArray = Json::ensureArray(Json::ensureObject(doc.object(), getOS()), m_is_legacy ? "jre-legacy" : "java-runtime-gamma"); - if (!versionArray.empty()) { - parseManifest(versionArray); - - } else { - // mojang does not have a JRE for us, so fail - emitFailed("No suitable JRE found"); - } - }); - - netJob->start(); -}; - -QString MojangJavaDownloader::getOS() const -{ - if (m_os_name == "windows") { - if (m_os_arch == "x86_64") { - return "windows-x64"; - } - if (m_os_arch == "i386") { - return "windows-x86"; - } - // Unknown, maybe arm, appending arch for downloader - return "windows-" + m_os_arch; - } - if (m_os_name == "osx") { - if (m_os_arch == "arm64") { - return "mac-os-arm64"; - } - return "mac-os"; - } - if (m_os_name == "linux") { - if (m_os_arch == "x86_64") { - return "linux"; - } - // will work for i386, and arm(64) - return "linux-" + m_os_arch; - } - return {}; -} -void MojangJavaDownloader::parseManifest(const QJsonArray& versionArray) -{ - setStatus(tr("Downloading Java from Mojang")); - auto url = Json::ensureString(Json::ensureObject(Json::ensureObject(versionArray[0]), "manifest"), "url"); + setStatus(tr("Downloading Java")); auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); auto files = std::make_shared(); - download->addNetAction(Net::Download::makeByteArray(QUrl(url), files)); + download->addNetAction(Net::Download::makeByteArray(m_url, files)); connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); - connect(download.get(), &NetJob::progress, this, &MojangJavaDownloader::progress); - connect(download.get(), &NetJob::failed, this, &MojangJavaDownloader::emitFailed); + connect(download.get(), &NetJob::progress, this, &ManifestJavaDownloader::progress); + connect(download.get(), &NetJob::failed, this, &ManifestJavaDownloader::emitFailed); connect(this, &Task::aborted, download.get(), &NetJob::abort); connect(download.get(), &NetJob::succeeded, [files, this] { @@ -129,7 +58,7 @@ void MojangJavaDownloader::parseManifest(const QJsonArray& versionArray) download->start(); }; -void MojangJavaDownloader::downloadJava(const QJsonDocument& doc) +void ManifestJavaDownloader::downloadJava(const QJsonDocument& doc) { // valid json doc, begin making jre spot FS::ensureFolderPathExists(m_final_path); @@ -176,10 +105,10 @@ void MojangJavaDownloader::downloadJava(const QJsonDocument& doc) disconnect(this, &Task::aborted, elementDownload, &NetJob::abort); elementDownload->deleteLater(); }); - connect(elementDownload, &NetJob::progress, this, &MojangJavaDownloader::progress); - connect(elementDownload, &NetJob::failed, this, &MojangJavaDownloader::emitFailed); + connect(elementDownload, &NetJob::progress, this, &ManifestJavaDownloader::progress); + connect(elementDownload, &NetJob::failed, this, &ManifestJavaDownloader::emitFailed); connect(this, &Task::aborted, elementDownload, &NetJob::abort); connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); elementDownload->start(); -}; +}; \ No newline at end of file diff --git a/launcher/java/providers/MojanglJavaDownloader.h b/launcher/java/download/ManifestJavaDownloader.h similarity index 70% rename from launcher/java/providers/MojanglJavaDownloader.h rename to launcher/java/download/ManifestJavaDownloader.h index a1b5b1765..44e9ed9de 100644 --- a/launcher/java/providers/MojanglJavaDownloader.h +++ b/launcher/java/download/ManifestJavaDownloader.h @@ -18,20 +18,24 @@ #pragma once -#include "java/providers/BasicJavaDownloader.h" +#include +#include "tasks/Task.h" -class MojangJavaDownloader : public BasicJavaDownloader { +class ManifestJavaDownloader : public Task { Q_OBJECT public: + ManifestJavaDownloader(QUrl url, QString final_path); + virtual ~ManifestJavaDownloader() = default; + + [[nodiscard]] bool canAbort() const override { return true; } void executeTask() override; - virtual QString name() const override { return "Mojang"; }; - virtual bool isSupported() const override { return !getOS().isEmpty(); }; private slots: - void downloadJavaList(); - void parseManifest(const QJsonArray& versionArray); void downloadJava(const QJsonDocument& doc); - private: - QString getOS() const; + protected: + QUrl m_url; + QString m_final_path; + + Task::Ptr m_current_task; }; \ No newline at end of file diff --git a/launcher/java/providers/AdoptiumJavaDownloader.h b/launcher/java/providers/AdoptiumJavaDownloader.h deleted file mode 100644 index f0ae6239b..000000000 --- a/launcher/java/providers/AdoptiumJavaDownloader.h +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include "java/providers/BasicJavaDownloader.h" - -class AdoptiumJavaDownloader : public BasicJavaDownloader { - Q_OBJECT - public: - void executeTask() override; - - virtual QString name() const override { return "Adoptium"; }; - virtual bool isSupported() const override; - private slots: - void downloadJava(); - void extractJava(QString input); - - private: - QString getArch() const; -}; \ No newline at end of file diff --git a/launcher/java/providers/AzulJavaDownloader.cpp b/launcher/java/providers/AzulJavaDownloader.cpp deleted file mode 100644 index 674da592e..000000000 --- a/launcher/java/providers/AzulJavaDownloader.cpp +++ /dev/null @@ -1,159 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#include "java/providers/AzulJavaDownloader.h" -#include -#include "MMCZip.h" - -#include "Application.h" -#include "Json.h" -#include "net/NetJob.h" -#include "tasks/Task.h" - -void AzulJavaDownloader::executeTask() -{ - downloadJavaList(); -}; - -void AzulJavaDownloader::downloadJavaList() -{ - setStatus(tr("Querying Azul meta")); - - auto javaVersion = m_is_legacy ? QString("8.0") : QString("17.0"); - auto azulOS = m_os_name == "osx" ? "macos" : m_os_name; - auto arch = getArch(); - auto metaResponse = std::make_shared(); - auto downloadJob = makeShared(QString("JRE::QueryAzulMeta"), APPLICATION->network()); - downloadJob->addNetAction(Net::Download::makeByteArray(QString("https://api.azul.com/metadata/v1/zulu/packages/?" - "java_version=%1" - "&os=%2" - "&arch=%3" - "&archive_type=zip" - "&java_package_type=jre" - "&support_term=lts" - "&latest=true" - "status=ga" - "&availability_types=CA" - "&page=1" - "&page_size=1") - .arg(javaVersion, azulOS, arch), - metaResponse)); - connect(downloadJob.get(), &NetJob::finished, - [downloadJob, metaResponse, this] { disconnect(this, &Task::aborted, downloadJob.get(), &NetJob::abort); }); - connect(this, &Task::aborted, downloadJob.get(), &NetJob::abort); - connect(downloadJob.get(), &NetJob::failed, this, &AzulJavaDownloader::emitFailed); - connect(downloadJob.get(), &NetJob::progress, this, &AzulJavaDownloader::progress); - connect(downloadJob.get(), &NetJob::succeeded, [metaResponse, this] { - QJsonParseError parse_error{}; - QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error); - if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); - qWarning() << *metaResponse; - return; - } - auto array = Json::ensureArray(doc.array()); - if (!array.empty()) { - downloadJava(array); - } else { - emitFailed(tr("No suitable JRE found")); - } - }); - downloadJob->start(); -}; - -QString AzulJavaDownloader::getArch() const -{ - if (m_os_arch == "arm64") - return "aarch64"; - if (m_os_arch == "arm") - return "aarch32"; - if (m_os_arch.isEmpty()) - return "x86"; - return m_os_arch; -} - -void AzulJavaDownloader::downloadJava(const QJsonArray& array) -{ - // JRE found ! download the zip - setStatus(tr("Downloading Java from Azul")); - - MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("java", "azulJRE.zip"); - - auto downloadURL = QUrl(array[0].toObject()["url"].toString()); - auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); - download->addNetAction(Net::Download::makeCached(downloadURL, entry)); - auto fullPath = entry->getFullPath(); - - connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); - // connect(download.get(), &NetJob::aborted, [path] { APPLICATION->instances()->destroyStagingPath(path); }); - connect(download.get(), &NetJob::progress, this, &AzulJavaDownloader::progress); - connect(download.get(), &NetJob::failed, this, &AzulJavaDownloader::emitFailed); - connect(this, &Task::aborted, download.get(), &NetJob::abort); - connect(download.get(), &NetJob::succeeded, [downloadURL, this, fullPath] { - // This should do all of the extracting and creating folders - extractJava(fullPath, downloadURL.fileName().chopped(4)); - }); - download->start(); -}; - -void AzulJavaDownloader::extractJava(QString input, QString subdirectory) -{ - setStatus(tr("Extracting java")); - auto zipTask = makeShared(input, m_final_path, subdirectory); - - auto progressStep = std::make_shared(); - connect(zipTask.get(), &Task::finished, this, [this, progressStep] { - progressStep->state = TaskStepState::Succeeded; - stepProgress(*progressStep); - }); - - connect(this, &Task::aborted, zipTask.get(), &Task::abort); - connect(zipTask.get(), &Task::finished, [zipTask, this] { disconnect(this, &Task::aborted, zipTask.get(), &Task::abort); }); - - connect(zipTask.get(), &Task::succeeded, this, &AzulJavaDownloader::emitSucceeded); - connect(zipTask.get(), &Task::aborted, this, &AzulJavaDownloader::emitAborted); - connect(zipTask.get(), &Task::failed, this, [this, progressStep](QString reason) { - progressStep->state = TaskStepState::Failed; - stepProgress(*progressStep); - emitFailed(reason); - }); - connect(zipTask.get(), &Task::stepProgress, this, &AzulJavaDownloader::propagateStepProgress); - - connect(zipTask.get(), &Task::progress, this, [this, progressStep](qint64 current, qint64 total) { - progressStep->update(current, total); - stepProgress(*progressStep); - }); - connect(zipTask.get(), &Task::status, this, [this, progressStep](QString status) { - progressStep->status = status; - stepProgress(*progressStep); - }); - zipTask->start(); -}; - -static const QStringList supportedOs = { - "macos", "linux", "windows", "linux-musl", "linux-glibc", "qnx", "solaris", "aix", -}; - -static const QStringList supportedArch = { - "x86", "x64", "amd64", "i686", "arm", "aarch64", "aarch32", "aarch32sf", "aarch32hf", "ppc", - "ppc64", "ppc32", "ppc32hf", "ppc32spe", "sparc", "sparc64", "sparc32", "sparcv9", "sparcv9-64", "sparcv9-32", -}; - -bool AzulJavaDownloader::isSupported() const -{ - return supportedOs.contains(m_os_name == "osx" ? "macos" : m_os_name) && supportedArch.contains(getArch()); -}; \ No newline at end of file diff --git a/launcher/java/providers/AzulJavaDownloader.h b/launcher/java/providers/AzulJavaDownloader.h deleted file mode 100644 index c4bc8c761..000000000 --- a/launcher/java/providers/AzulJavaDownloader.h +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include "java/providers/BasicJavaDownloader.h" - -class AzulJavaDownloader : public BasicJavaDownloader { - Q_OBJECT - public: - void executeTask() override; - - virtual QString name() const override { return "Azul"; }; - virtual bool isSupported() const override; - private slots: - void downloadJavaList(); - void downloadJava(const QJsonArray& doc); - void extractJava(QString input, QString subdirectory); - - private: - QString getArch() const; -}; \ No newline at end of file diff --git a/launcher/java/providers/BasicJavaDownloader.cpp b/launcher/java/providers/BasicJavaDownloader.cpp deleted file mode 100644 index 9f353d9c1..000000000 --- a/launcher/java/providers/BasicJavaDownloader.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#include "java/providers/BasicJavaDownloader.h" - -#include "SysInfo.h" -#include "tasks/Task.h" - -BasicJavaDownloader::BasicJavaDownloader(QString final_path, bool m_is_legacy, QObject* parent) - : Task(parent) - , m_os_name(SysInfo::currentSystem()) - , m_os_arch(SysInfo::useQTForArch()) - , m_final_path(final_path) - , m_is_legacy(m_is_legacy) -{} From 81282bf7e0189ede29d2db14f85ef2c886d8b583 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 26 Jan 2024 00:22:05 +0200 Subject: [PATCH 033/616] Autodetect Java? Signed-off-by: Trial97 --- launcher/java/JavaRuntime.cpp | 19 +++++++ launcher/java/JavaRuntime.h | 19 +++++++ launcher/java/JavaUtils.cpp | 1 + .../java/download/ArchiveJavaDownloader.cpp | 18 +++++-- .../java/download/ArchiveJavaDownloader.h | 4 +- .../java/download/ManifestJavaDownloader.cpp | 18 +++++-- .../java/download/ManifestJavaDownloader.h | 4 +- .../minecraft/launch/VerifyJavaInstall.cpp | 49 ++++++++++++++----- 8 files changed, 112 insertions(+), 20 deletions(-) diff --git a/launcher/java/JavaRuntime.cpp b/launcher/java/JavaRuntime.cpp index 0de8c839b..78651e991 100644 --- a/launcher/java/JavaRuntime.cpp +++ b/launcher/java/JavaRuntime.cpp @@ -1,3 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "java/JavaRuntime.h" #include @@ -23,6 +41,7 @@ QString downloadTypeToString(DownloadType javaDownload) case DownloadType::Archive: return "archive"; } + return ""; } MetaPtr parseJavaMeta(const QJsonObject& in) { diff --git a/launcher/java/JavaRuntime.h b/launcher/java/JavaRuntime.h index 1ea5d2e48..b44b546b6 100644 --- a/launcher/java/JavaRuntime.h +++ b/launcher/java/JavaRuntime.h @@ -1,8 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #pragma once #include #include +#include + #include "java/JavaVersion.h" namespace JavaRuntime { diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index 074bf54df..67f1fd3a7 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -393,6 +393,7 @@ QList JavaUtils::FindJavaPaths() scanJavaDir(snap + dirPath); } }; + scanJavaDir(FS::PathCombine(APPLICATION->dataRoot(), "java")); // oracle RPMs scanJavaDirs("/usr/java"); // general locations used by distro packaging diff --git a/launcher/java/download/ArchiveJavaDownloader.cpp b/launcher/java/download/ArchiveJavaDownloader.cpp index 844be1dce..32a3c39d2 100644 --- a/launcher/java/download/ArchiveJavaDownloader.cpp +++ b/launcher/java/download/ArchiveJavaDownloader.cpp @@ -21,9 +21,13 @@ #include "MMCZip.h" #include "Application.h" +#include "net/ChecksumValidator.h" #include "net/NetJob.h" #include "tasks/Task.h" +ArchiveJavaDownloader::ArchiveJavaDownloader(QUrl url, QString final_path, QString checksumType, QString checksumHash) + : m_url(url), m_final_path(final_path), m_checksum_type(checksumType), m_checksum_hash(checksumHash){}; + void ArchiveJavaDownloader::executeTask() { // JRE found ! download the zip @@ -32,7 +36,15 @@ void ArchiveJavaDownloader::executeTask() MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("java", m_url.toLocalFile()); auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); - download->addNetAction(Net::Download::makeCached(m_url, entry)); + auto action = Net::Download::makeCached(m_url, entry); + if (!m_checksum_hash.isEmpty() && !m_checksum_type.isEmpty()) { + auto hashType = QCryptographicHash::Algorithm::Sha1; + if (m_checksum_type == "sha256") { + hashType = QCryptographicHash::Algorithm::Sha256; + } + action->addValidator(new Net::ChecksumValidator(hashType, m_checksum_hash.toLatin1())); + } + download->addNetAction(action); auto fullPath = entry->getFullPath(); connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); @@ -45,7 +57,7 @@ void ArchiveJavaDownloader::executeTask() extractJava(fullPath); }); download->start(); -}; +} void ArchiveJavaDownloader::extractJava(QString input) { @@ -85,4 +97,4 @@ void ArchiveJavaDownloader::extractJava(QString input) stepProgress(*progressStep); }); zipTask->start(); -}; +} \ No newline at end of file diff --git a/launcher/java/download/ArchiveJavaDownloader.h b/launcher/java/download/ArchiveJavaDownloader.h index d17657086..230f62b4d 100644 --- a/launcher/java/download/ArchiveJavaDownloader.h +++ b/launcher/java/download/ArchiveJavaDownloader.h @@ -24,7 +24,7 @@ class ArchiveJavaDownloader : public Task { Q_OBJECT public: - ArchiveJavaDownloader(QUrl url, QString final_path); + ArchiveJavaDownloader(QUrl url, QString final_path, QString checksumType = "", QString checksumHash = ""); virtual ~ArchiveJavaDownloader() = default; [[nodiscard]] bool canAbort() const override { return true; } @@ -36,6 +36,8 @@ class ArchiveJavaDownloader : public Task { protected: QUrl m_url; QString m_final_path; + QString m_checksum_type; + QString m_checksum_hash; Task::Ptr m_current_task; }; \ No newline at end of file diff --git a/launcher/java/download/ManifestJavaDownloader.cpp b/launcher/java/download/ManifestJavaDownloader.cpp index 4f7dab94e..08321ca7f 100644 --- a/launcher/java/download/ManifestJavaDownloader.cpp +++ b/launcher/java/download/ManifestJavaDownloader.cpp @@ -30,14 +30,24 @@ struct File { bool isExec; }; -ManifestJavaDownloader::ManifestJavaDownloader(QUrl url, QString final_path) : m_url(url), m_final_path(final_path){}; +ManifestJavaDownloader::ManifestJavaDownloader(QUrl url, QString final_path, QString checksumType, QString checksumHash) + : m_url(url), m_final_path(final_path), m_checksum_type(checksumType), m_checksum_hash(checksumHash){}; + void ManifestJavaDownloader::executeTask() { setStatus(tr("Downloading Java")); auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); auto files = std::make_shared(); - download->addNetAction(Net::Download::makeByteArray(m_url, files)); + auto action = Net::Download::makeByteArray(m_url, files); + if (!m_checksum_hash.isEmpty() && !m_checksum_type.isEmpty()) { + auto hashType = QCryptographicHash::Algorithm::Sha1; + if (m_checksum_type == "sha256") { + hashType = QCryptographicHash::Algorithm::Sha256; + } + action->addValidator(new Net::ChecksumValidator(hashType, m_checksum_hash.toLatin1())); + } + download->addNetAction(action); connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); connect(download.get(), &NetJob::progress, this, &ManifestJavaDownloader::progress); @@ -56,7 +66,7 @@ void ManifestJavaDownloader::executeTask() downloadJava(doc); }); download->start(); -}; +} void ManifestJavaDownloader::downloadJava(const QJsonDocument& doc) { @@ -111,4 +121,4 @@ void ManifestJavaDownloader::downloadJava(const QJsonDocument& doc) connect(this, &Task::aborted, elementDownload, &NetJob::abort); connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); elementDownload->start(); -}; \ No newline at end of file +} \ No newline at end of file diff --git a/launcher/java/download/ManifestJavaDownloader.h b/launcher/java/download/ManifestJavaDownloader.h index 44e9ed9de..d7114f4bd 100644 --- a/launcher/java/download/ManifestJavaDownloader.h +++ b/launcher/java/download/ManifestJavaDownloader.h @@ -24,7 +24,7 @@ class ManifestJavaDownloader : public Task { Q_OBJECT public: - ManifestJavaDownloader(QUrl url, QString final_path); + ManifestJavaDownloader(QUrl url, QString final_path, QString checksumType = "", QString checksumHash = ""); virtual ~ManifestJavaDownloader() = default; [[nodiscard]] bool canAbort() const override { return true; } @@ -36,6 +36,8 @@ class ManifestJavaDownloader : public Task { protected: QUrl m_url; QString m_final_path; + QString m_checksum_type; + QString m_checksum_hash; Task::Ptr m_current_task; }; \ No newline at end of file diff --git a/launcher/minecraft/launch/VerifyJavaInstall.cpp b/launcher/minecraft/launch/VerifyJavaInstall.cpp index cdd1f7fd1..218811290 100644 --- a/launcher/minecraft/launch/VerifyJavaInstall.cpp +++ b/launcher/minecraft/launch/VerifyJavaInstall.cpp @@ -34,7 +34,11 @@ */ #include "VerifyJavaInstall.h" +#include +#include "Application.h" +#include "java/JavaInstall.h" +#include "java/JavaInstallList.h" #include "java/JavaVersion.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/PackProfile.h" @@ -46,6 +50,7 @@ void VerifyJavaInstall::executeTask() auto settings = instance->settings(); auto storedVersion = settings->get("JavaVersion").toString(); auto ignoreCompatibility = settings->get("IgnoreJavaCompatibility").toBool(); + auto automaticJavaSwitch = settings->get("AutomaticJavaSwitch").toBool(); auto compatibleMajors = packProfile->getProfile()->getCompatibleJavaMajors(); @@ -62,16 +67,38 @@ void VerifyJavaInstall::executeTask() return; } - emit logLine(tr("This instance is not compatible with Java version %1.\n" - "Please switch to one of the following Java versions for this instance:") - .arg(javaVersion.major()), - MessageLevel::Error); - for (auto major : compatibleMajors) { - emit logLine(tr("Java version %1").arg(major), MessageLevel::Error); - } - emit logLine(tr("Go to instance Java settings to change your Java version or disable the Java compatibility check if you know what " - "you're doing."), - MessageLevel::Error); + auto logFail = [this, &javaVersion, compatibleMajors] { + emit logLine(tr("This instance is not compatible with Java version %1.\n" + "Please switch to one of the following Java versions for this instance:") + .arg(javaVersion.major()), + MessageLevel::Error); + for (auto major : compatibleMajors) { + emit logLine(tr("Java version %1").arg(major), MessageLevel::Error); + } + emit logLine(tr("Go to instance Java settings to change your Java version or disable the Java compatibility check if you know what " + "you're doing."), + MessageLevel::Error); - emitFailed(QString("Incompatible Java major version")); + emitFailed(QString("Incompatible Java major version")); + }; + + if (automaticJavaSwitch || true) { + settings->set("OverrideJava", true); + auto javas = APPLICATION->javalist().get(); + auto task = javas->getLoadTask(); + connect(task.get(), &Task::finished, this, [this, javas, compatibleMajors, settings, &logFail] { + for (auto i = 0; i < javas->count(); i++) { + auto java = std::dynamic_pointer_cast(javas->at(i)); + if (java && compatibleMajors.contains(java->id.major())) { + settings->set("OverrideJavaLocation", true); + settings->set("JavaPath", java->path); + emitSucceeded(); + return; + } + } + logFail(); + }); + } else { + logFail(); + } } From 4cd236ed807e44666e6775126d27fef237eef168 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 26 Jan 2024 00:31:43 +0200 Subject: [PATCH 034/616] missing header Signed-off-by: Trial97 --- launcher/java/JavaChecker.cpp | 3 ++- launcher/java/JavaRuntime.h | 1 + launcher/java/download/ArchiveJavaDownloader.cpp | 3 ++- launcher/java/download/ManifestJavaDownloader.cpp | 3 ++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/launcher/java/JavaChecker.cpp b/launcher/java/JavaChecker.cpp index 7271c0d09..18f93d256 100644 --- a/launcher/java/JavaChecker.cpp +++ b/launcher/java/JavaChecker.cpp @@ -44,7 +44,8 @@ #include "java/JavaUtils.h" JavaChecker::JavaChecker(QString path, QString args, int minMem, int maxMem, int permGen, int id, QObject* parent) - : Task(parent), m_path(path), m_args(args), m_minMem(minMem), m_maxMem(maxMem), m_permGen(permGen), m_id(id){}; + : Task(parent), m_path(path), m_args(args), m_minMem(minMem), m_maxMem(maxMem), m_permGen(permGen), m_id(id) +{} void JavaChecker::executeTask() { diff --git a/launcher/java/JavaRuntime.h b/launcher/java/JavaRuntime.h index b44b546b6..4c4efa288 100644 --- a/launcher/java/JavaRuntime.h +++ b/launcher/java/JavaRuntime.h @@ -18,6 +18,7 @@ #pragma once #include +#include #include #include diff --git a/launcher/java/download/ArchiveJavaDownloader.cpp b/launcher/java/download/ArchiveJavaDownloader.cpp index 32a3c39d2..5350fc4e6 100644 --- a/launcher/java/download/ArchiveJavaDownloader.cpp +++ b/launcher/java/download/ArchiveJavaDownloader.cpp @@ -26,7 +26,8 @@ #include "tasks/Task.h" ArchiveJavaDownloader::ArchiveJavaDownloader(QUrl url, QString final_path, QString checksumType, QString checksumHash) - : m_url(url), m_final_path(final_path), m_checksum_type(checksumType), m_checksum_hash(checksumHash){}; + : m_url(url), m_final_path(final_path), m_checksum_type(checksumType), m_checksum_hash(checksumHash) +{} void ArchiveJavaDownloader::executeTask() { diff --git a/launcher/java/download/ManifestJavaDownloader.cpp b/launcher/java/download/ManifestJavaDownloader.cpp index 08321ca7f..368d6431c 100644 --- a/launcher/java/download/ManifestJavaDownloader.cpp +++ b/launcher/java/download/ManifestJavaDownloader.cpp @@ -31,7 +31,8 @@ struct File { }; ManifestJavaDownloader::ManifestJavaDownloader(QUrl url, QString final_path, QString checksumType, QString checksumHash) - : m_url(url), m_final_path(final_path), m_checksum_type(checksumType), m_checksum_hash(checksumHash){}; + : m_url(url), m_final_path(final_path), m_checksum_type(checksumType), m_checksum_hash(checksumHash) +{} void ManifestJavaDownloader::executeTask() { From 97ee0a19b5caf1714d033b282b5fca1bc70d6bff Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 26 Jan 2024 02:53:30 +0000 Subject: [PATCH 035/616] Refactor updating mechanisms to work with all resources Summary: - It compiles - I need to go to bed Signed-off-by: TheKodeToad --- launcher/CMakeLists.txt | 4 +- launcher/minecraft/mod/ModFolderModel.cpp | 39 +---- launcher/minecraft/mod/ModFolderModel.h | 3 - launcher/minecraft/mod/Resource.cpp | 2 +- launcher/minecraft/mod/Resource.h | 2 +- .../minecraft/mod/ResourceFolderModel.cpp | 6 +- launcher/minecraft/mod/ResourceFolderModel.h | 89 ++++++---- .../minecraft/mod/ResourcePackFolderModel.cpp | 18 +- .../minecraft/mod/TexturePackFolderModel.cpp | 15 +- launcher/modplatform/CheckUpdateTask.h | 34 ++-- .../modplatform/flame/FlameCheckUpdate.cpp | 63 ++++--- launcher/modplatform/flame/FlameCheckUpdate.h | 6 +- .../modrinth/ModrinthCheckUpdate.cpp | 84 ++++----- .../modrinth/ModrinthCheckUpdate.h | 6 +- launcher/modplatform/packwiz/Packwiz.cpp | 10 +- ...ateDialog.cpp => ResourceUpdateDialog.cpp} | 164 +++++++++--------- ...dUpdateDialog.h => ResourceUpdateDialog.h} | 33 ++-- launcher/ui/pages/instance/ModFolderPage.cpp | 13 +- 18 files changed, 298 insertions(+), 293 deletions(-) rename launcher/ui/dialogs/{ModUpdateDialog.cpp => ResourceUpdateDialog.cpp} (74%) rename launcher/ui/dialogs/{ModUpdateDialog.h => ResourceUpdateDialog.h} (53%) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index b341840df..bc48abdef 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -1031,8 +1031,8 @@ SET(LAUNCHER_SOURCES ui/dialogs/BlockedModsDialog.h ui/dialogs/ChooseProviderDialog.h ui/dialogs/ChooseProviderDialog.cpp - ui/dialogs/ModUpdateDialog.cpp - ui/dialogs/ModUpdateDialog.h + ui/dialogs/ResourceUpdateDialog.cpp + ui/dialogs/ResourceUpdateDialog.h ui/dialogs/InstallLoaderDialog.cpp ui/dialogs/InstallLoaderDialog.h diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp index 1ba09c8ec..d5735dcb8 100644 --- a/launcher/minecraft/mod/ModFolderModel.cpp +++ b/launcher/minecraft/mod/ModFolderModel.cpp @@ -89,35 +89,35 @@ QVariant ModFolderModel::data(const QModelIndex& index, int role) const default: break; } - return at(row)->version(); + return at(row).version(); } case DateColumn: return m_resources[row]->dateTimeChanged(); case ProviderColumn: - return at(row)->provider(); + return at(row).provider(); default: return QVariant(); } case Qt::ToolTipRole: if (column == NAME_COLUMN) { - if (at(row)->isSymLinkUnder(instDirPath())) { + if (at(row).isSymLinkUnder(instDirPath())) { return m_resources[row]->internal_id() + tr("\nWarning: This resource is symbolically linked from elsewhere. Editing it will also change the original." "\nCanonical Path: %1") - .arg(at(row)->fileinfo().canonicalFilePath()); + .arg(at(row).fileinfo().canonicalFilePath()); } - if (at(row)->isMoreThanOneHardLink()) { + if (at(row).isMoreThanOneHardLink()) { return m_resources[row]->internal_id() + tr("\nWarning: This resource is hard linked elsewhere. Editing it will also change the original."); } } return m_resources[row]->internal_id(); case Qt::DecorationRole: { - if (column == NAME_COLUMN && (at(row)->isSymLinkUnder(instDirPath()) || at(row)->isMoreThanOneHardLink())) + if (column == NAME_COLUMN && (at(row).isSymLinkUnder(instDirPath()) || at(row).isMoreThanOneHardLink())) return APPLICATION->getThemedIcon("status-yellow"); if (column == ImageColumn) { - return at(row)->icon({ 32, 32 }, Qt::AspectRatioMode::KeepAspectRatioByExpanding); + return at(row).icon({ 32, 32 }, Qt::AspectRatioMode::KeepAspectRatioByExpanding); } return {}; } @@ -129,7 +129,7 @@ QVariant ModFolderModel::data(const QModelIndex& index, int role) const case Qt::CheckStateRole: switch (column) { case ActiveColumn: - return at(row)->enabled() ? Qt::Checked : Qt::Unchecked; + return at(row).enabled() ? Qt::Checked : Qt::Unchecked; default: return QVariant(); } @@ -190,29 +190,6 @@ bool ModFolderModel::isValid() return m_dir.exists() && m_dir.isReadable(); } -auto ModFolderModel::selectedMods(QModelIndexList& indexes) -> QList -{ - QList selected_resources; - for (auto i : indexes) { - if (i.column() != 0) - continue; - - selected_resources.push_back(at(i.row())); - } - return selected_resources; -} - -auto ModFolderModel::allMods() -> QList -{ - QList mods; - - for (auto& res : qAsConst(m_resources)) { - mods.append(static_cast(res.get())); - } - - return mods; -} - void ModFolderModel::onParseSucceeded(int ticket, QString mod_id) { auto iter = m_active_parse_tasks.constFind(ticket); diff --git a/launcher/minecraft/mod/ModFolderModel.h b/launcher/minecraft/mod/ModFolderModel.h index c1db33c0c..cd5e99b11 100644 --- a/launcher/minecraft/mod/ModFolderModel.h +++ b/launcher/minecraft/mod/ModFolderModel.h @@ -76,9 +76,6 @@ class ModFolderModel : public ResourceFolderModel { bool isValid(); - auto selectedMods(QModelIndexList& indexes) -> QList; - auto allMods() -> QList; - RESOURCE_HELPERS(Mod) private slots: diff --git a/launcher/minecraft/mod/Resource.cpp b/launcher/minecraft/mod/Resource.cpp index ac81681cf..30b453812 100644 --- a/launcher/minecraft/mod/Resource.cpp +++ b/launcher/minecraft/mod/Resource.cpp @@ -184,7 +184,7 @@ auto Resource::destroy(const QDir& index_dir, bool preserve_metadata, bool attem return (attempt_trash && FS::trash(m_file_info.filePath())) || FS::deletePath(m_file_info.filePath()); } -auto Resource::destroyMetadata(const QDir& index_dir) -> bool +auto Resource::destroyMetadata(const QDir& index_dir) -> void { if (metadata()) { Metadata::remove(index_dir, metadata()->slug); diff --git a/launcher/minecraft/mod/Resource.h b/launcher/minecraft/mod/Resource.h index 0d77be7c9..772f456f1 100644 --- a/launcher/minecraft/mod/Resource.h +++ b/launcher/minecraft/mod/Resource.h @@ -101,7 +101,7 @@ class Resource : public QObject { // Delete all files of this resource. auto destroy(const QDir& index_dir, bool preserve_metadata = false, bool attempt_trash = true) -> bool; // Delete the metadata only. - auto destroyMetadata(const QDir& index_dir) -> bool; + auto destroyMetadata(const QDir& index_dir) -> void; [[nodiscard]] auto isSymLink() const -> bool { return m_file_info.isSymLink(); } diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index ff5e95983..a7a80db05 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -242,10 +242,10 @@ bool ResourceFolderModel::deleteResources(const QModelIndexList& indexes) return true; } -bool ResourceFolderModel::deleteMetadata(const QModelIndexList& indexes) +void ResourceFolderModel::deleteMetadata(const QModelIndexList& indexes) { if (indexes.isEmpty()) - return true; + return; for (auto i : indexes) { if (i.column() != 0) @@ -256,8 +256,6 @@ bool ResourceFolderModel::deleteMetadata(const QModelIndexList& indexes) } update(); - - return true; } bool ResourceFolderModel::setResourceEnabled(const QModelIndexList& indexes, EnableAction action) diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index 8b5ac68ad..3de3c5476 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -19,6 +19,58 @@ class QSortFilterProxyModel; +/* A macro to define useful functions to handle Resource* -> T* more easily on derived classes */ +#define RESOURCE_HELPERS(T) \ + [[nodiscard]] T& operator[](int index) \ + { \ + return *static_cast(m_resources[index].get()); \ + } \ + [[nodiscard]] T& at(int index) \ + { \ + return *static_cast(m_resources[index].get()); \ + } \ + [[nodiscard]] const T& at(int index) const \ + { \ + return *static_cast(m_resources.at(index).get()); \ + } \ + [[nodiscard]] T& first() \ + { \ + return *static_cast(m_resources.first().get()); \ + } \ + [[nodiscard]] T& last() \ + { \ + return *static_cast(m_resources.last().get()); \ + } \ + [[nodiscard]] T* find(QString id) \ + { \ + auto iter = std::find_if(m_resources.constBegin(), m_resources.constEnd(), \ + [&](Resource::Ptr const& r) { return r->internal_id() == id; }); \ + if (iter == m_resources.constEnd()) \ + return nullptr; \ + return static_cast((*iter).get()); \ + } \ + QList selected##T##s(const QModelIndexList& indexes) \ + { \ + QList result; \ + for (const QModelIndex& index : indexes) { \ + if (index.column() != 0) \ + continue; \ + \ + result.append(&at(index.row())); \ + } \ + return result; \ + } \ + QList all##T##s() \ + { \ + QList result; \ + result.reserve(m_resources.size()); \ + \ + for (const Resource::Ptr& resource : m_resources) \ + result.append(static_cast(resource.get())); \ + \ + return result; \ + } + /** A basic model for external resources. * * This model manages a list of resources. As such, external users of such resources do not own them, @@ -69,7 +121,7 @@ class ResourceFolderModel : public QAbstractListModel { */ virtual bool uninstallResource(QString file_name, bool preserve_metadata = false); virtual bool deleteResources(const QModelIndexList&); - virtual bool deleteMetadata(const QModelIndexList&); + virtual void deleteMetadata(const QModelIndexList&); /** Applies the given 'action' to the resources in 'indexes'. * @@ -85,9 +137,7 @@ class ResourceFolderModel : public QAbstractListModel { [[nodiscard]] qsizetype size() const { return m_resources.size(); } [[nodiscard]] bool empty() const { return size() == 0; } - [[nodiscard]] Resource& at(int index) { return *m_resources.at(index); } - [[nodiscard]] Resource const& at(int index) const { return *m_resources.at(index); } - [[nodiscard]] QList const& all() const { return m_resources; } + RESOURCE_HELPERS(Resource) [[nodiscard]] QDir const& dir() const { return m_dir; } @@ -232,37 +282,6 @@ class ResourceFolderModel : public QAbstractListModel { std::atomic m_next_resolution_ticket = 0; }; -/* A macro to define useful functions to handle Resource* -> T* more easily on derived classes */ -#define RESOURCE_HELPERS(T) \ - [[nodiscard]] T* operator[](int index) \ - { \ - return static_cast(m_resources[index].get()); \ - } \ - [[nodiscard]] T* at(int index) \ - { \ - return static_cast(m_resources[index].get()); \ - } \ - [[nodiscard]] const T* at(int index) const \ - { \ - return static_cast(m_resources.at(index).get()); \ - } \ - [[nodiscard]] T* first() \ - { \ - return static_cast(m_resources.first().get()); \ - } \ - [[nodiscard]] T* last() \ - { \ - return static_cast(m_resources.last().get()); \ - } \ - [[nodiscard]] T* find(QString id) \ - { \ - auto iter = std::find_if(m_resources.constBegin(), m_resources.constEnd(), \ - [&](Resource::Ptr const& r) { return r->internal_id() == id; }); \ - if (iter == m_resources.constEnd()) \ - return nullptr; \ - return static_cast((*iter).get()); \ - } - /* Template definition to avoid some code duplication */ template void ResourceFolderModel::applyUpdates(QSet& current_set, QSet& new_set, QMap& new_resources) diff --git a/launcher/minecraft/mod/ResourcePackFolderModel.cpp b/launcher/minecraft/mod/ResourcePackFolderModel.cpp index 8d0cd5fcd..b777dbafd 100644 --- a/launcher/minecraft/mod/ResourcePackFolderModel.cpp +++ b/launcher/minecraft/mod/ResourcePackFolderModel.cpp @@ -72,12 +72,12 @@ QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const case NameColumn: return m_resources[row]->name(); case PackFormatColumn: { - auto resource = at(row); - auto pack_format = resource->packFormat(); + auto& resource = at(row); + auto pack_format = resource.packFormat(); if (pack_format == 0) return tr("Unrecognized"); - auto version_bounds = resource->compatibleVersions(); + auto version_bounds = resource.compatibleVersions(); if (version_bounds.first.toString().isEmpty()) return QString::number(pack_format); @@ -92,10 +92,10 @@ QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const return {}; } case Qt::DecorationRole: { - if (column == NameColumn && (at(row)->isSymLinkUnder(instDirPath()) || at(row)->isMoreThanOneHardLink())) + if (column == NameColumn && (at(row).isSymLinkUnder(instDirPath()) || at(row).isMoreThanOneHardLink())) return APPLICATION->getThemedIcon("status-yellow"); if (column == ImageColumn) { - return at(row)->image({ 32, 32 }, Qt::AspectRatioMode::KeepAspectRatioByExpanding); + return at(row).image({ 32, 32 }, Qt::AspectRatioMode::KeepAspectRatioByExpanding); } return {}; } @@ -105,14 +105,14 @@ QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const return tr("The resource pack format ID, as well as the Minecraft versions it was designed for."); } if (column == NameColumn) { - if (at(row)->isSymLinkUnder(instDirPath())) { + if (at(row).isSymLinkUnder(instDirPath())) { return m_resources[row]->internal_id() + tr("\nWarning: This resource is symbolically linked from elsewhere. Editing it will also change the original." "\nCanonical Path: %1") - .arg(at(row)->fileinfo().canonicalFilePath()); + .arg(at(row).fileinfo().canonicalFilePath()); ; } - if (at(row)->isMoreThanOneHardLink()) { + if (at(row).isMoreThanOneHardLink()) { return m_resources[row]->internal_id() + tr("\nWarning: This resource is hard linked elsewhere. Editing it will also change the original."); } @@ -127,7 +127,7 @@ QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const case Qt::CheckStateRole: switch (column) { case ActiveColumn: - return at(row)->enabled() ? Qt::Checked : Qt::Unchecked; + return at(row).enabled() ? Qt::Checked : Qt::Unchecked; default: return {}; } diff --git a/launcher/minecraft/mod/TexturePackFolderModel.cpp b/launcher/minecraft/mod/TexturePackFolderModel.cpp index b4b06a62a..3795795a2 100644 --- a/launcher/minecraft/mod/TexturePackFolderModel.cpp +++ b/launcher/minecraft/mod/TexturePackFolderModel.cpp @@ -52,11 +52,6 @@ TexturePackFolderModel::TexturePackFolderModel(const QDir& dir, BaseInstance* in m_columnsHideable = { false, true, false, true, true }; } -Task* TexturePackFolderModel::createUpdateTask() -{ - return new BasicFolderLoadTask(m_dir, [](QFileInfo const& entry) { return makeShared(entry); }); -} - Task* TexturePackFolderModel::createParseTask(Resource& resource) { return new LocalTexturePackParseTask(m_next_resolution_ticket, static_cast(resource)); @@ -84,14 +79,14 @@ QVariant TexturePackFolderModel::data(const QModelIndex& index, int role) const } case Qt::ToolTipRole: if (column == NameColumn) { - if (at(row)->isSymLinkUnder(instDirPath())) { + if (at(row).isSymLinkUnder(instDirPath())) { return m_resources[row]->internal_id() + tr("\nWarning: This resource is symbolically linked from elsewhere. Editing it will also change the original." "\nCanonical Path: %1") - .arg(at(row)->fileinfo().canonicalFilePath()); + .arg(at(row).fileinfo().canonicalFilePath()); ; } - if (at(row)->isMoreThanOneHardLink()) { + if (at(row).isMoreThanOneHardLink()) { return m_resources[row]->internal_id() + tr("\nWarning: This resource is hard linked elsewhere. Editing it will also change the original."); } @@ -99,10 +94,10 @@ QVariant TexturePackFolderModel::data(const QModelIndex& index, int role) const return m_resources[row]->internal_id(); case Qt::DecorationRole: { - if (column == NameColumn && (at(row)->isSymLinkUnder(instDirPath()) || at(row)->isMoreThanOneHardLink())) + if (column == NameColumn && (at(row).isSymLinkUnder(instDirPath()) || at(row).isMoreThanOneHardLink())) return APPLICATION->getThemedIcon("status-yellow"); if (column == ImageColumn) { - return at(row)->image({ 32, 32 }, Qt::AspectRatioMode::KeepAspectRatioByExpanding); + return at(row).image({ 32, 32 }, Qt::AspectRatioMode::KeepAspectRatioByExpanding); } return {}; } diff --git a/launcher/modplatform/CheckUpdateTask.h b/launcher/modplatform/CheckUpdateTask.h index 8bd83d988..aaa997c16 100644 --- a/launcher/modplatform/CheckUpdateTask.h +++ b/launcher/modplatform/CheckUpdateTask.h @@ -13,13 +13,13 @@ class CheckUpdateTask : public Task { Q_OBJECT public: - CheckUpdateTask(QList& mods, + CheckUpdateTask(QList& resources, std::list& mcVersions, std::optional loaders, - std::shared_ptr mods_folder) - : Task(nullptr), m_mods(mods), m_game_versions(mcVersions), m_loaders(loaders), m_mods_folder(mods_folder){}; + std::shared_ptr resource_model) + : Task(nullptr), m_resources(resources), m_game_versions(mcVersions), m_loaders(loaders), m_resource_model(resource_model){}; - struct UpdatableMod { + struct Update { QString name; QString old_hash; QString old_version; @@ -30,14 +30,14 @@ class CheckUpdateTask : public Task { shared_qobject_ptr download; public: - UpdatableMod(QString name, - QString old_h, - QString old_v, - QString new_v, - std::optional new_v_type, - QString changelog, - ModPlatform::ResourceProvider p, - shared_qobject_ptr t) + Update(QString name, + QString old_h, + QString old_v, + QString new_v, + std::optional new_v_type, + QString changelog, + ModPlatform::ResourceProvider p, + shared_qobject_ptr t) : name(name) , old_hash(old_h) , old_version(old_v) @@ -49,7 +49,7 @@ class CheckUpdateTask : public Task { {} }; - auto getUpdatable() -> std::vector&& { return std::move(m_updatable); } + auto getUpdates() -> std::vector&& { return std::move(m_updates); } auto getDependencies() -> QList>&& { return std::move(m_deps); } public slots: @@ -59,14 +59,14 @@ class CheckUpdateTask : public Task { void executeTask() override = 0; signals: - void checkFailed(Mod* failed, QString reason, QUrl recover_url = {}); + void checkFailed(Resource* failed, QString reason, QUrl recover_url = {}); protected: - QList& m_mods; + QList& m_resources; std::list& m_game_versions; std::optional m_loaders; - std::shared_ptr m_mods_folder; + std::shared_ptr m_resource_model; - std::vector m_updatable; + std::vector m_updates; QList> m_deps; }; diff --git a/launcher/modplatform/flame/FlameCheckUpdate.cpp b/launcher/modplatform/flame/FlameCheckUpdate.cpp index a6a76adb6..9a3249bc7 100644 --- a/launcher/modplatform/flame/FlameCheckUpdate.cpp +++ b/launcher/modplatform/flame/FlameCheckUpdate.cpp @@ -120,19 +120,19 @@ ModPlatform::IndexedVersion FlameCheckUpdate::getFileInfo(int addonId, int fileI * */ void FlameCheckUpdate::executeTask() { - setStatus(tr("Preparing mods for CurseForge...")); + setStatus(tr("Preparing resources for CurseForge...")); int i = 0; - for (auto* mod : m_mods) { - if (!mod->enabled()) { - emit checkFailed(mod, tr("Disabled mods won't be updated, to prevent mod duplication issues!")); + for (auto* resource : m_resources) { + if (!resource->enabled()) { + emit checkFailed(resource, tr("Disabled resources won't be updated, to prevent resource duplication issues!")); continue; } - setStatus(tr("Getting API response from CurseForge for '%1'...").arg(mod->name())); - setProgress(i++, m_mods.size()); + setStatus(tr("Getting API response from CurseForge for '%1'...").arg(resource->name())); + setProgress(i++, m_resources.size()); - auto latest_ver = api.getLatestVersion({ { mod->metadata()->project_id.toString() }, m_game_versions, m_loaders }); + auto latest_ver = api.getLatestVersion({ { resource->metadata()->project_id.toString() }, m_game_versions, m_loaders }); // Check if we were aborted while getting the latest version if (m_was_aborted) { @@ -140,43 +140,50 @@ void FlameCheckUpdate::executeTask() return; } - setStatus(tr("Parsing the API response from CurseForge for '%1'...").arg(mod->name())); + setStatus(tr("Parsing the API response from CurseForge for '%1'...").arg(resource->name())); if (!latest_ver.addonId.isValid()) { - emit checkFailed(mod, tr("No valid version found for this mod. It's probably unavailable for the current game " - "version / mod loader.")); + QString reason; + if (dynamic_cast(resource) != nullptr) + reason = + tr("No valid version found for this resource. It's probably unavailable for the current game " + "version / mod loader."); + else + reason = tr("No valid version found for this resource. It's probably unavailable for the current game version."); + + emit checkFailed(resource, reason); continue; } - if (latest_ver.downloadUrl.isEmpty() && latest_ver.fileId != mod->metadata()->file_id) { + if (latest_ver.downloadUrl.isEmpty() && latest_ver.fileId != resource->metadata()->file_id) { auto pack = getProjectInfo(latest_ver); auto recover_url = QString("%1/download/%2").arg(pack.websiteUrl, latest_ver.fileId.toString()); - emit checkFailed(mod, tr("Mod has a new update available, but is not downloadable using CurseForge."), recover_url); + emit checkFailed(resource, tr("Resource has a new update available, but is not downloadable using CurseForge."), recover_url); continue; } // Fake pack with the necessary info to pass to the download task :) auto pack = std::make_shared(); - pack->name = mod->name(); - pack->slug = mod->metadata()->slug; - pack->addonId = mod->metadata()->project_id; - pack->websiteUrl = mod->homeurl(); - for (auto& author : mod->authors()) - pack->authors.append({ author }); - pack->description = mod->description(); + pack->name = resource->name(); + pack->slug = resource->metadata()->slug; + pack->addonId = resource->metadata()->project_id; pack->provider = ModPlatform::ResourceProvider::FLAME; - if (!latest_ver.hash.isEmpty() && (mod->metadata()->hash != latest_ver.hash || mod->status() == ResourceStatus::NOT_INSTALLED)) { - auto old_version = mod->version(); - if (old_version.isEmpty() && mod->status() != ResourceStatus::NOT_INSTALLED) { - auto current_ver = getFileInfo(latest_ver.addonId.toInt(), mod->metadata()->file_id.toInt()); - old_version = current_ver.version; + if (!latest_ver.hash.isEmpty() && + (resource->metadata()->hash != latest_ver.hash || resource->status() == ResourceStatus::NOT_INSTALLED)) { + auto download_task = makeShared(pack, latest_ver, m_resource_model); + + QString old_version = resource->metadata()->version_number; + if (old_version.isEmpty()) { + if (resource->status() == ResourceStatus::NOT_INSTALLED) + old_version = tr("Not installed"); + else + old_version = tr("Unknown"); } - auto download_task = makeShared(pack, latest_ver, m_mods_folder); - m_updatable.emplace_back(pack->name, mod->metadata()->hash, old_version, latest_ver.version, latest_ver.version_type, - api.getModFileChangelog(latest_ver.addonId.toInt(), latest_ver.fileId.toInt()), - ModPlatform::ResourceProvider::FLAME, download_task); + m_updates.emplace_back(pack->name, resource->metadata()->hash, old_version, latest_ver.version, latest_ver.version_type, + api.getModFileChangelog(latest_ver.addonId.toInt(), latest_ver.fileId.toInt()), + ModPlatform::ResourceProvider::FLAME, download_task); } m_deps.append(std::make_shared(pack, latest_ver)); } diff --git a/launcher/modplatform/flame/FlameCheckUpdate.h b/launcher/modplatform/flame/FlameCheckUpdate.h index f5bb1653d..9ae944153 100644 --- a/launcher/modplatform/flame/FlameCheckUpdate.h +++ b/launcher/modplatform/flame/FlameCheckUpdate.h @@ -8,11 +8,11 @@ class FlameCheckUpdate : public CheckUpdateTask { Q_OBJECT public: - FlameCheckUpdate(QList& mods, + FlameCheckUpdate(QList& resources, std::list& mcVersions, std::optional loaders, - std::shared_ptr mods_folder) - : CheckUpdateTask(mods, mcVersions, loaders, mods_folder) + std::shared_ptr resource_model) + : CheckUpdateTask(resources, mcVersions, loaders, resource_model) {} public slots: diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp index 13696d8a2..f7e9fb8a9 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp @@ -29,38 +29,38 @@ bool ModrinthCheckUpdate::abort() * */ void ModrinthCheckUpdate::executeTask() { - setStatus(tr("Preparing mods for Modrinth...")); + setStatus(tr("Preparing resources for Modrinth...")); setProgress(0, 3); - QHash mappings; + QHash mappings; // Create all hashes QStringList hashes; auto best_hash_type = ProviderCaps.hashType(ModPlatform::ResourceProvider::MODRINTH).first(); ConcurrentTask hashing_task(this, "MakeModrinthHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); - for (auto* mod : m_mods) { - if (!mod->enabled()) { - emit checkFailed(mod, tr("Disabled mods won't be updated, to prevent mod duplication issues!")); + for (auto* resource : m_resources) { + if (!resource->enabled()) { + emit checkFailed(resource, tr("Disabled resources won't be updated, to prevent resource duplication issues!")); continue; } - auto hash = mod->metadata()->hash; + auto hash = resource->metadata()->hash; // Sadly the API can only handle one hash type per call, se we // need to generate a new hash if the current one is innadequate // (though it will rarely happen, if at all) - if (mod->metadata()->hash_format != best_hash_type) { - auto hash_task = Hashing::createModrinthHasher(mod->fileinfo().absoluteFilePath()); - connect(hash_task.get(), &Hashing::Hasher::resultsReady, [&hashes, &mappings, mod](QString hash) { + if (resource->metadata()->hash_format != best_hash_type) { + auto hash_task = Hashing::createModrinthHasher(resource->fileinfo().absoluteFilePath()); + connect(hash_task.get(), &Hashing::Hasher::resultsReady, [&hashes, &mappings, resource](QString hash) { hashes.append(hash); - mappings.insert(hash, mod); + mappings.insert(hash, resource); }); connect(hash_task.get(), &Task::failed, [this] { failed("Failed to generate hash"); }); hashing_task.addTask(hash_task); } else { hashes.append(hash); - mappings.insert(hash, mod); + mappings.insert(hash, resource); } } @@ -88,19 +88,26 @@ void ModrinthCheckUpdate::executeTask() setProgress(2, 3); try { - for (auto hash : mappings.keys()) { + for (auto iter = mappings.begin(); iter != mappings.end(); iter++) { + const QString& hash = iter.key(); + Resource* resource = iter.value(); auto project_obj = doc[hash].toObject(); // If the returned project is empty, but we have Modrinth metadata, // it means this specific version is not available if (project_obj.isEmpty()) { - qDebug() << "Mod " << mappings.find(hash).value()->name() << " got an empty response."; + qDebug() << "Resource " << resource->name() << " got an empty response."; qDebug() << "Hash: " << hash; - emit checkFailed( - mappings.find(hash).value(), - tr("No valid version found for this mod. It's probably unavailable for the current game version / mod loader.")); + QString reason; + if (dynamic_cast(resource) != nullptr) + reason = + tr("No valid version found for this resource. It's probably unavailable for the current game " + "version / mod loader."); + else + reason = tr("No valid version found for this resource. It's probably unavailable for the current game version."); + emit checkFailed(resource, reason); continue; } @@ -109,7 +116,8 @@ void ModrinthCheckUpdate::executeTask() QString loader_filter; if (m_loaders.has_value()) { static auto flags = { ModPlatform::ModLoaderType::NeoForge, ModPlatform::ModLoaderType::Forge, - ModPlatform::ModLoaderType::Fabric, ModPlatform::ModLoaderType::Quilt }; + ModPlatform::ModLoaderType::Fabric, ModPlatform::ModLoaderType::Quilt, + ModPlatform::ModLoaderType::LiteLoader }; for (auto flag : flags) { if (m_loaders.value().testFlag(flag)) { loader_filter = ModPlatform::getModLoaderString(flag); @@ -126,46 +134,44 @@ void ModrinthCheckUpdate::executeTask() auto project_ver = Modrinth::loadIndexedPackVersion(project_obj, best_hash_type, loader_filter); if (project_ver.downloadUrl.isEmpty()) { - qCritical() << "Modrinth mod without download url!"; + qCritical() << "Modrinth resource without download url!"; qCritical() << project_ver.fileName; - emit checkFailed(mappings.find(hash).value(), tr("Mod has an empty download URL")); + emit checkFailed(mappings.find(hash).value(), tr("Resource has an empty download URL")); continue; } - auto mod_iter = mappings.find(hash); - if (mod_iter == mappings.end()) { - qCritical() << "Failed to remap mod from Modrinth!"; + auto resource_iter = mappings.find(hash); + if (resource_iter == mappings.end()) { + qCritical() << "Failed to remap resource from Modrinth!"; continue; } - auto mod = *mod_iter; - - auto key = project_ver.hash; // Fake pack with the necessary info to pass to the download task :) auto pack = std::make_shared(); - pack->name = mod->name(); - pack->slug = mod->metadata()->slug; - pack->addonId = mod->metadata()->project_id; - pack->websiteUrl = mod->homeurl(); - for (auto& author : mod->authors()) - pack->authors.append({ author }); - pack->description = mod->description(); + pack->name = resource->name(); + pack->slug = resource->metadata()->slug; + pack->addonId = resource->metadata()->project_id; pack->provider = ModPlatform::ResourceProvider::MODRINTH; - if ((key != hash && project_ver.is_preferred) || (mod->status() == ResourceStatus::NOT_INSTALLED)) { - if (mod->version() == project_ver.version_number) - continue; + if ((project_ver.hash != hash && project_ver.is_preferred) || (resource->status() == ResourceStatus::NOT_INSTALLED)) { + auto download_task = makeShared(pack, project_ver, m_resource_model); - auto download_task = makeShared(pack, project_ver, m_mods_folder); + QString old_version = resource->metadata()->version_number; + if (old_version.isEmpty()) { + if (resource->status() == ResourceStatus::NOT_INSTALLED) + old_version = tr("Not installed"); + else + old_version = tr("Unknown"); + } - m_updatable.emplace_back(pack->name, hash, mod->version(), project_ver.version_number, project_ver.version_type, - project_ver.changelog, ModPlatform::ResourceProvider::MODRINTH, download_task); + m_updates.emplace_back(pack->name, hash, old_version, project_ver.version_number, project_ver.version_type, + project_ver.changelog, ModPlatform::ResourceProvider::MODRINTH, download_task); } m_deps.append(std::make_shared(pack, project_ver)); } } catch (Json::JsonException& e) { - emitFailed(e.cause() + " : " + e.what()); + emitFailed(e.cause() + ": " + e.what()); return; } emitSucceeded(); diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.h b/launcher/modplatform/modrinth/ModrinthCheckUpdate.h index f2f2c7e92..5aa3c8cb6 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.h +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.h @@ -8,11 +8,11 @@ class ModrinthCheckUpdate : public CheckUpdateTask { Q_OBJECT public: - ModrinthCheckUpdate(QList& mods, + ModrinthCheckUpdate(QList& resources, std::list& mcVersions, std::optional loaders, - std::shared_ptr mods_folder) - : CheckUpdateTask(mods, mcVersions, loaders, mods_folder) + std::shared_ptr resource_model) + : CheckUpdateTask(resources, mcVersions, loaders, resource_model) {} public slots: diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index f68624c1a..81c0a1efb 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -297,18 +297,20 @@ auto V1::getIndexForMod(const QDir& index_dir, QString slug) -> Mod { // [update] info using Provider = ModPlatform::ResourceProvider; - auto update_table = table["update"]; - if (!update_table || !update_table.is_table()) { + auto update_table = table["update"].as_table(); + if (!update_table) { qCritical() << QString("No [update] section found on mod metadata!"); return {}; } + mod.version_number = stringEntry(*update_table, "x-prismlauncher-version-number"); + toml::table* mod_provider_table = nullptr; - if ((mod_provider_table = update_table[ProviderCaps.name(Provider::FLAME)].as_table())) { + if ((mod_provider_table = (*update_table)[ProviderCaps.name(Provider::FLAME)].as_table())) { mod.provider = Provider::FLAME; mod.file_id = intEntry(*mod_provider_table, "file-id"); mod.project_id = intEntry(*mod_provider_table, "project-id"); - } else if ((mod_provider_table = update_table[ProviderCaps.name(Provider::MODRINTH)].as_table())) { + } else if ((mod_provider_table = (*update_table)[ProviderCaps.name(Provider::MODRINTH)].as_table())) { mod.provider = Provider::MODRINTH; mod.mod_id() = stringEntry(*mod_provider_table, "mod-id"); mod.version() = stringEntry(*mod_provider_table, "version"); diff --git a/launcher/ui/dialogs/ModUpdateDialog.cpp b/launcher/ui/dialogs/ResourceUpdateDialog.cpp similarity index 74% rename from launcher/ui/dialogs/ModUpdateDialog.cpp rename to launcher/ui/dialogs/ResourceUpdateDialog.cpp index eef690d57..cad5b9f7f 100644 --- a/launcher/ui/dialogs/ModUpdateDialog.cpp +++ b/launcher/ui/dialogs/ResourceUpdateDialog.cpp @@ -1,4 +1,4 @@ -#include "ModUpdateDialog.h" +#include "ResourceUpdateDialog.h" #include "ChooseProviderDialog.h" #include "CustomMessageBox.h" #include "ProgressDialog.h" @@ -36,14 +36,14 @@ static std::optional mcLoaders(BaseInstance* inst) return { static_cast(inst)->getPackProfile()->getSupportedModLoaders() }; } -ModUpdateDialog::ModUpdateDialog(QWidget* parent, - BaseInstance* instance, - const std::shared_ptr mods, - QList& search_for, - bool includeDeps) +ResourceUpdateDialog::ResourceUpdateDialog(QWidget* parent, + BaseInstance* instance, + const std::shared_ptr resource_model, + QList& search_for, + bool includeDeps) : ReviewMessageBox(parent, tr("Confirm mods to update"), "") , m_parent(parent) - , m_mod_model(mods) + , m_resource_model(resource_model) , m_candidates(search_for) , m_second_try_metadata( new ConcurrentTask(nullptr, "Second Metadata Search", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())) @@ -56,7 +56,7 @@ ModUpdateDialog::ModUpdateDialog(QWidget* parent, ui->onlyCheckedLabel->setText(tr("Only mods with a check will be updated!")); } -void ModUpdateDialog::checkCandidates() +void ResourceUpdateDialog::checkCandidates() { // Ensure mods have valid metadata auto went_well = ensureMetadata(); @@ -92,18 +92,20 @@ void ModUpdateDialog::checkCandidates() SequentialTask check_task(m_parent, tr("Checking for updates")); if (!m_modrinth_to_update.empty()) { - m_modrinth_check_task.reset(new ModrinthCheckUpdate(m_modrinth_to_update, versions, loaders, m_mod_model)); - connect(m_modrinth_check_task.get(), &CheckUpdateTask::checkFailed, this, [this](Mod* mod, QString reason, QUrl recover_url) { - m_failed_check_update.append({ mod, reason, recover_url }); - }); + m_modrinth_check_task.reset(new ModrinthCheckUpdate(m_modrinth_to_update, versions, loaders, m_resource_model)); + connect(m_modrinth_check_task.get(), &CheckUpdateTask::checkFailed, this, + [this](Resource* resource, QString reason, QUrl recover_url) { + m_failed_check_update.append({ resource, reason, recover_url }); + }); check_task.addTask(m_modrinth_check_task); } if (!m_flame_to_update.empty()) { - m_flame_check_task.reset(new FlameCheckUpdate(m_flame_to_update, versions, loaders, m_mod_model)); - connect(m_flame_check_task.get(), &CheckUpdateTask::checkFailed, this, [this](Mod* mod, QString reason, QUrl recover_url) { - m_failed_check_update.append({ mod, reason, recover_url }); - }); + m_flame_check_task.reset(new FlameCheckUpdate(m_flame_to_update, versions, loaders, m_resource_model)); + connect(m_flame_check_task.get(), &CheckUpdateTask::checkFailed, this, + [this](Resource* resource, QString reason, QUrl recover_url) { + m_failed_check_update.append({ resource, reason, recover_url }); + }); check_task.addTask(m_flame_check_task); } @@ -134,11 +136,11 @@ void ModUpdateDialog::checkCandidates() // Add found updates for Modrinth if (m_modrinth_check_task) { - auto modrinth_updates = m_modrinth_check_task->getUpdatable(); + auto modrinth_updates = m_modrinth_check_task->getUpdates(); for (auto& updatable : modrinth_updates) { qDebug() << QString("Mod %1 has an update available!").arg(updatable.name); - appendMod(updatable); + appendResource(updatable); m_tasks.insert(updatable.name, updatable.download); } selectedVers.append(m_modrinth_check_task->getDependencies()); @@ -146,11 +148,11 @@ void ModUpdateDialog::checkCandidates() // Add found updated for Flame if (m_flame_check_task) { - auto flame_updates = m_flame_check_task->getUpdatable(); + auto flame_updates = m_flame_check_task->getUpdates(); for (auto& updatable : flame_updates) { qDebug() << QString("Mod %1 has an update available!").arg(updatable.name); - appendMod(updatable); + appendResource(updatable); m_tasks.insert(updatable.name, updatable.download); } selectedVers.append(m_flame_check_task->getDependencies()); @@ -189,49 +191,53 @@ void ModUpdateDialog::checkCandidates() } if (m_include_deps && !APPLICATION->settings()->get("ModDependenciesDisabled").toBool()) { // dependencies - auto depTask = makeShared(this, m_instance, m_mod_model.get(), selectedVers); + auto* mod_model = dynamic_cast(m_resource_model.get()); - connect(depTask.get(), &Task::failed, this, - [&](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); + if (mod_model != nullptr) { + auto depTask = makeShared(this, m_instance, mod_model, selectedVers); - connect(depTask.get(), &Task::succeeded, this, [&]() { - QStringList warnings = depTask->warnings(); - if (warnings.count()) { - CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->exec(); + connect(depTask.get(), &Task::failed, this, + [&](const QString& reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); + + connect(depTask.get(), &Task::succeeded, this, [&]() { + QStringList warnings = depTask->warnings(); + if (warnings.count()) { + CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->exec(); + } + }); + + ProgressDialog progress_dialog_deps(m_parent); + progress_dialog_deps.setSkipButton(true, tr("Abort")); + progress_dialog_deps.setWindowTitle(tr("Checking for dependencies...")); + auto dret = progress_dialog_deps.execWithTask(depTask.get()); + + // If the dialog was skipped / some download error happened + if (dret == QDialog::DialogCode::Rejected) { + m_aborted = true; + QMetaObject::invokeMethod(this, "reject", Qt::QueuedConnection); + return; } - }); + static FlameAPI api; - ProgressDialog progress_dialog_deps(m_parent); - progress_dialog_deps.setSkipButton(true, tr("Abort")); - progress_dialog_deps.setWindowTitle(tr("Checking for dependencies...")); - auto dret = progress_dialog_deps.execWithTask(depTask.get()); + auto getRequiredBy = depTask->getRequiredBy(); - // If the dialog was skipped / some download error happened - if (dret == QDialog::DialogCode::Rejected) { - m_aborted = true; - QMetaObject::invokeMethod(this, "reject", Qt::QueuedConnection); - return; - } - static FlameAPI api; + for (const auto& dep : depTask->getDependecies()) { + auto changelog = dep->version.changelog; + if (dep->pack->provider == ModPlatform::ResourceProvider::FLAME) + changelog = api.getModFileChangelog(dep->version.addonId.toInt(), dep->version.fileId.toInt()); + auto download_task = makeShared(dep->pack, dep->version, m_resource_model); + CheckUpdateTask::Update updatable = { + dep->pack->name, dep->version.hash, tr("Not installed"), dep->version.version, dep->version.version_type, + changelog, dep->pack->provider, download_task + }; - auto getRequiredBy = depTask->getRequiredBy(); - - for (auto dep : depTask->getDependecies()) { - auto changelog = dep->version.changelog; - if (dep->pack->provider == ModPlatform::ResourceProvider::FLAME) - changelog = api.getModFileChangelog(dep->version.addonId.toInt(), dep->version.fileId.toInt()); - auto download_task = makeShared(dep->pack, dep->version, m_mod_model); - CheckUpdateTask::UpdatableMod updatable = { - dep->pack->name, dep->version.hash, "", dep->version.version, dep->version.version_type, - changelog, dep->pack->provider, download_task - }; - - appendMod(updatable, getRequiredBy.value(dep->version.addonId.toString())); - m_tasks.insert(updatable.name, updatable.download); + appendResource(updatable, getRequiredBy.value(dep->version.addonId.toString())); + m_tasks.insert(updatable.name, updatable.download); + } } } - // If there's no mod to be updated + // If there's no resource to be updated if (ui->modTreeWidget->topLevelItemCount() == 0) { m_no_updates = true; } else { @@ -253,7 +259,7 @@ void ModUpdateDialog::checkCandidates() } // Part 1: Ensure we have a valid metadata -auto ModUpdateDialog::ensureMetadata() -> bool +auto ResourceUpdateDialog::ensureMetadata() -> bool { auto index_dir = indexDir(); @@ -261,21 +267,21 @@ auto ModUpdateDialog::ensureMetadata() -> bool // A better use of data structures here could remove the need for this QHash QHash should_try_others; - QList modrinth_tmp; - QList flame_tmp; + QList modrinth_tmp; + QList flame_tmp; bool confirm_rest = false; bool try_others_rest = false; bool skip_rest = false; ModPlatform::ResourceProvider provider_rest = ModPlatform::ResourceProvider::MODRINTH; - auto addToTmp = [&](Mod* m, ModPlatform::ResourceProvider p) { + auto addToTmp = [&](Resource* resource, ModPlatform::ResourceProvider p) { switch (p) { case ModPlatform::ResourceProvider::MODRINTH: - modrinth_tmp.push_back(m); + modrinth_tmp.push_back(resource); break; case ModPlatform::ResourceProvider::FLAME: - flame_tmp.push_back(m); + flame_tmp.push_back(resource); break; } }; @@ -300,7 +306,7 @@ auto ModUpdateDialog::ensureMetadata() -> bool } ChooseProviderDialog chooser(this); - chooser.setDescription(tr("The mod '%1' does not have a metadata yet. We need to generate it in order to track relevant " + chooser.setDescription(tr("The resource '%1' does not have a metadata yet. We need to generate it in order to track relevant " "information on how to update this mod. " "To do this, please select a mod provider which we can use to check for updates for this mod.") .arg(candidate->name())); @@ -324,8 +330,8 @@ auto ModUpdateDialog::ensureMetadata() -> bool if (!modrinth_tmp.empty()) { auto modrinth_task = makeShared(modrinth_tmp, index_dir, ModPlatform::ResourceProvider::MODRINTH); - connect(modrinth_task.get(), &EnsureMetadataTask::metadataReady, [this](Mod* candidate) { onMetadataEnsured(candidate); }); - connect(modrinth_task.get(), &EnsureMetadataTask::metadataFailed, [this, &should_try_others](Mod* candidate) { + connect(modrinth_task.get(), &EnsureMetadataTask::metadataReady, [this](Resource* candidate) { onMetadataEnsured(candidate); }); + connect(modrinth_task.get(), &EnsureMetadataTask::metadataFailed, [this, &should_try_others](Resource* candidate) { onMetadataFailed(candidate, should_try_others.find(candidate->internal_id()).value(), ModPlatform::ResourceProvider::MODRINTH); }); connect(modrinth_task.get(), &EnsureMetadataTask::failed, @@ -339,8 +345,8 @@ auto ModUpdateDialog::ensureMetadata() -> bool if (!flame_tmp.empty()) { auto flame_task = makeShared(flame_tmp, index_dir, ModPlatform::ResourceProvider::FLAME); - connect(flame_task.get(), &EnsureMetadataTask::metadataReady, [this](Mod* candidate) { onMetadataEnsured(candidate); }); - connect(flame_task.get(), &EnsureMetadataTask::metadataFailed, [this, &should_try_others](Mod* candidate) { + connect(flame_task.get(), &EnsureMetadataTask::metadataReady, [this](Resource* candidate) { onMetadataEnsured(candidate); }); + connect(flame_task.get(), &EnsureMetadataTask::metadataFailed, [this, &should_try_others](Resource* candidate) { onMetadataFailed(candidate, should_try_others.find(candidate->internal_id()).value(), ModPlatform::ResourceProvider::FLAME); }); connect(flame_task.get(), &EnsureMetadataTask::failed, @@ -362,18 +368,18 @@ auto ModUpdateDialog::ensureMetadata() -> bool return (ret_metadata != QDialog::DialogCode::Rejected); } -void ModUpdateDialog::onMetadataEnsured(Mod* mod) +void ResourceUpdateDialog::onMetadataEnsured(Resource* resource) { // When the mod is a folder, for instance - if (!mod->metadata()) + if (!resource->metadata()) return; - switch (mod->metadata()->provider) { + switch (resource->metadata()->provider) { case ModPlatform::ResourceProvider::MODRINTH: - m_modrinth_to_update.push_back(mod); + m_modrinth_to_update.push_back(resource); break; case ModPlatform::ResourceProvider::FLAME: - m_flame_to_update.push_back(mod); + m_flame_to_update.push_back(resource); break; } } @@ -390,26 +396,26 @@ ModPlatform::ResourceProvider next(ModPlatform::ResourceProvider p) return ModPlatform::ResourceProvider::FLAME; } -void ModUpdateDialog::onMetadataFailed(Mod* mod, bool try_others, ModPlatform::ResourceProvider first_choice) +void ResourceUpdateDialog::onMetadataFailed(Resource* resource, bool try_others, ModPlatform::ResourceProvider first_choice) { if (try_others) { auto index_dir = indexDir(); - auto task = makeShared(mod, index_dir, next(first_choice)); - connect(task.get(), &EnsureMetadataTask::metadataReady, [this](Mod* candidate) { onMetadataEnsured(candidate); }); - connect(task.get(), &EnsureMetadataTask::metadataFailed, [this](Mod* candidate) { onMetadataFailed(candidate, false); }); + auto task = makeShared(resource, index_dir, next(first_choice)); + connect(task.get(), &EnsureMetadataTask::metadataReady, [this](Resource* candidate) { onMetadataEnsured(candidate); }); + connect(task.get(), &EnsureMetadataTask::metadataFailed, [this](Resource* candidate) { onMetadataFailed(candidate, false); }); connect(task.get(), &EnsureMetadataTask::failed, - [this](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); + [this](const QString& reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); m_second_try_metadata->addTask(task); } else { QString reason{ tr("Couldn't find a valid version on the selected mod provider(s)") }; - m_failed_metadata.append({ mod, reason }); + m_failed_metadata.append({ resource, reason }); } } -void ModUpdateDialog::appendMod(CheckUpdateTask::UpdatableMod const& info, QStringList requiredBy) +void ResourceUpdateDialog::appendResource(CheckUpdateTask::Update const& info, QStringList requiredBy) { auto item_top = new QTreeWidgetItem(ui->modTreeWidget); item_top->setCheckState(0, Qt::CheckState::Checked); @@ -420,7 +426,7 @@ void ModUpdateDialog::appendMod(CheckUpdateTask::UpdatableMod const& info, QStri provider_item->setText(0, tr("Provider: %1").arg(ProviderCaps.readableName(info.provider))); auto old_version_item = new QTreeWidgetItem(item_top); - old_version_item->setText(0, tr("Old version: %1").arg(info.old_version.isEmpty() ? tr("Not installed") : info.old_version)); + old_version_item->setText(0, tr("Old version: %1").arg(info.old_version)); auto new_version_item = new QTreeWidgetItem(item_top); new_version_item->setText(0, tr("New version: %1").arg(info.new_version)); @@ -474,7 +480,7 @@ void ModUpdateDialog::appendMod(CheckUpdateTask::UpdatableMod const& info, QStri ui->modTreeWidget->addTopLevelItem(item_top); } -auto ModUpdateDialog::getTasks() -> const QList +auto ResourceUpdateDialog::getTasks() -> const QList { QList list; diff --git a/launcher/ui/dialogs/ModUpdateDialog.h b/launcher/ui/dialogs/ResourceUpdateDialog.h similarity index 53% rename from launcher/ui/dialogs/ModUpdateDialog.h rename to launcher/ui/dialogs/ResourceUpdateDialog.h index de5ab46a5..31aab8f5d 100644 --- a/launcher/ui/dialogs/ModUpdateDialog.h +++ b/launcher/ui/dialogs/ResourceUpdateDialog.h @@ -13,22 +13,21 @@ class ModrinthCheckUpdate; class FlameCheckUpdate; class ConcurrentTask; -class ModUpdateDialog final : public ReviewMessageBox { +class ResourceUpdateDialog final : public ReviewMessageBox { Q_OBJECT public: - explicit ModUpdateDialog(QWidget* parent, BaseInstance* instance, std::shared_ptr mod_model, QList& search_for); - explicit ModUpdateDialog(QWidget* parent, - BaseInstance* instance, - std::shared_ptr mod_model, - QList& search_for, - bool includeDeps); + explicit ResourceUpdateDialog(QWidget* parent, + BaseInstance* instance, + std::shared_ptr resource_model, + QList& search_for, + bool includeDeps); void checkCandidates(); - void appendMod(const CheckUpdateTask::UpdatableMod& info, QStringList requiredBy = {}); + void appendResource(const CheckUpdateTask::Update& info, QStringList requiredBy = {}); const QList getTasks(); - auto indexDir() const -> QDir { return m_mod_model->indexDir(); } + auto indexDir() const -> QDir { return m_resource_model->indexDir(); } auto noUpdates() const -> bool { return m_no_updates; }; auto aborted() const -> bool { return m_aborted; }; @@ -37,8 +36,8 @@ class ModUpdateDialog final : public ReviewMessageBox { auto ensureMetadata() -> bool; private slots: - void onMetadataEnsured(Mod*); - void onMetadataFailed(Mod*, + void onMetadataEnsured(Resource* resource); + void onMetadataFailed(Resource* resource, bool try_others = false, ModPlatform::ResourceProvider first_choice = ModPlatform::ResourceProvider::MODRINTH); @@ -48,15 +47,15 @@ class ModUpdateDialog final : public ReviewMessageBox { shared_qobject_ptr m_modrinth_check_task; shared_qobject_ptr m_flame_check_task; - const std::shared_ptr m_mod_model; + const std::shared_ptr m_resource_model; - QList& m_candidates; - QList m_modrinth_to_update; - QList m_flame_to_update; + QList& m_candidates; + QList m_modrinth_to_update; + QList m_flame_to_update; ConcurrentTask::Ptr m_second_try_metadata; - QList> m_failed_metadata; - QList> m_failed_check_update; + QList> m_failed_metadata; + QList> m_failed_check_update; QHash m_tasks; BaseInstance* m_instance; diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 0cc60205d..e513cb1fa 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -51,8 +51,8 @@ #include "ui/GuiUtil.h" #include "ui/dialogs/CustomMessageBox.h" -#include "ui/dialogs/ModUpdateDialog.h" #include "ui/dialogs/ResourceDownloadDialog.h" +#include "ui/dialogs/ResourceUpdateDialog.h" #include "DesktopServices.h" @@ -161,9 +161,8 @@ bool ModFolderPage::onSelectionChanged(const QModelIndex& current, [[maybe_unuse { auto sourceCurrent = m_filterModel->mapToSource(current); int row = sourceCurrent.row(); - Mod const* m = m_model->at(row); - if (m) - ui->frame->updateWithMod(*m); + const Mod& mod = m_model->at(row); + ui->frame->updateWithMod(mod); return true; } @@ -253,12 +252,12 @@ void ModFolderPage::updateMods(bool includeDeps) } auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); - auto mods_list = m_model->selectedMods(selection); + auto mods_list = m_model->selectedResources(selection); bool use_all = mods_list.empty(); if (use_all) - mods_list = m_model->allMods(); + mods_list = m_model->allResources(); - ModUpdateDialog update_dialog(this, m_instance, m_model, mods_list, includeDeps); + ResourceUpdateDialog update_dialog(this, m_instance, m_model, mods_list, includeDeps); update_dialog.checkCandidates(); if (update_dialog.aborted()) { From 82d0f204e2293e8969cc6604c1dff0d601a47b4d Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 26 Jan 2024 03:01:02 +0000 Subject: [PATCH 036/616] De-OOP ProviderCapabilities There was no reason for it to be a class, and imo it created quite a code-smell needing to initialise it everywhere. Signed-off-by: TheKodeToad --- launcher/minecraft/mod/Resource.cpp | 4 +--- launcher/modplatform/EnsureMetadataTask.cpp | 8 +++----- launcher/modplatform/ModIndex.h | 3 +-- launcher/modplatform/flame/FlameModIndex.cpp | 3 +-- launcher/modplatform/helpers/HashUtils.cpp | 14 ++++++-------- .../modplatform/modrinth/ModrinthCheckUpdate.cpp | 3 +-- .../modplatform/modrinth/ModrinthPackIndex.cpp | 3 +-- launcher/modplatform/packwiz/Packwiz.cpp | 8 +++----- launcher/ui/dialogs/ChooseProviderDialog.cpp | 4 +--- launcher/ui/dialogs/ResourceDownloadDialog.cpp | 4 +--- launcher/ui/dialogs/ResourceUpdateDialog.cpp | 4 +--- 11 files changed, 20 insertions(+), 38 deletions(-) diff --git a/launcher/minecraft/mod/Resource.cpp b/launcher/minecraft/mod/Resource.cpp index 30b453812..7c1fb9108 100644 --- a/launcher/minecraft/mod/Resource.cpp +++ b/launcher/minecraft/mod/Resource.cpp @@ -5,8 +5,6 @@ #include "FileSystem.h" -static ModPlatform::ProviderCapabilities ProviderCaps; - Resource::Resource(QObject* parent) : QObject(parent) {} Resource::Resource(QFileInfo file_info) : QObject() @@ -74,7 +72,7 @@ static void removeThePrefix(QString& string) auto Resource::provider() const -> QString { if (metadata()) - return ProviderCaps.readableName(metadata()->provider); + return ModPlatform::ProviderCapabilities::readableName(metadata()->provider); return tr("Unknown"); } diff --git a/launcher/modplatform/EnsureMetadataTask.cpp b/launcher/modplatform/EnsureMetadataTask.cpp index b71bb1e0e..277cd0764 100644 --- a/launcher/modplatform/EnsureMetadataTask.cpp +++ b/launcher/modplatform/EnsureMetadataTask.cpp @@ -15,8 +15,6 @@ #include "modplatform/modrinth/ModrinthAPI.h" #include "modplatform/modrinth/ModrinthPackIndex.h" -static ModPlatform::ProviderCapabilities ProviderCaps; - static ModrinthAPI modrinth_api; static FlameAPI flame_api; @@ -162,10 +160,10 @@ void EnsureMetadataTask::executeTask() }); if (m_resources.size() > 1) - setStatus(tr("Requesting metadata information from %1...").arg(ProviderCaps.readableName(m_provider))); + setStatus(tr("Requesting metadata information from %1...").arg(ModPlatform::ProviderCapabilities::readableName(m_provider))); else if (!m_resources.empty()) setStatus(tr("Requesting metadata information from %1 for '%2'...") - .arg(ProviderCaps.readableName(m_provider), m_resources.begin().value()->name())); + .arg(ModPlatform::ProviderCapabilities::readableName(m_provider), m_resources.begin().value()->name())); m_current_task = version_task; version_task->start(); @@ -215,7 +213,7 @@ void EnsureMetadataTask::emitFail(Resource* resource, QString key, RemoveFromLis Task::Ptr EnsureMetadataTask::modrinthVersionsTask() { - auto hash_type = ProviderCaps.hashType(ModPlatform::ResourceProvider::MODRINTH).first(); + auto hash_type = ModPlatform::ProviderCapabilities::hashType(ModPlatform::ResourceProvider::MODRINTH).first(); auto response = std::make_shared(); auto ver_task = modrinth_api.currentVersions(m_resources.keys(), hash_type, response); diff --git a/launcher/modplatform/ModIndex.h b/launcher/modplatform/ModIndex.h index eff7e7f9f..aeae87235 100644 --- a/launcher/modplatform/ModIndex.h +++ b/launcher/modplatform/ModIndex.h @@ -40,8 +40,7 @@ enum class ResourceType { MOD, RESOURCE_PACK, SHADER_PACK }; enum class DependencyType { REQUIRED, OPTIONAL, INCOMPATIBLE, EMBEDDED, TOOL, INCLUDE, UNKNOWN }; -class ProviderCapabilities { - public: +namespace ProviderCapabilities { auto name(ResourceProvider) -> const char*; auto readableName(ResourceProvider) -> QString; auto hashType(ResourceProvider) -> QStringList; diff --git a/launcher/modplatform/flame/FlameModIndex.cpp b/launcher/modplatform/flame/FlameModIndex.cpp index 345883c17..16cbbade4 100644 --- a/launcher/modplatform/flame/FlameModIndex.cpp +++ b/launcher/modplatform/flame/FlameModIndex.cpp @@ -6,7 +6,6 @@ #include "modplatform/flame/FlameAPI.h" static FlameAPI api; -static ModPlatform::ProviderCapabilities ProviderCaps; void FlameMod::loadIndexedPack(ModPlatform::IndexedPack& pack, QJsonObject& obj) { @@ -158,7 +157,7 @@ auto FlameMod::loadIndexedPackVersion(QJsonObject& obj, bool load_changelog) -> auto hash_list = Json::ensureArray(obj, "hashes"); for (auto h : hash_list) { auto hash_entry = Json::ensureObject(h); - auto hash_types = ProviderCaps.hashType(ModPlatform::ResourceProvider::FLAME); + auto hash_types = ModPlatform::ProviderCapabilities::hashType(ModPlatform::ResourceProvider::FLAME); auto hash_algo = enumToString(Json::ensureInteger(hash_entry, "algo", 1, "algorithm")); if (hash_types.contains(hash_algo)) { file.hash = Json::requireString(hash_entry, "value"); diff --git a/launcher/modplatform/helpers/HashUtils.cpp b/launcher/modplatform/helpers/HashUtils.cpp index 6ff1d1710..19e5b447a 100644 --- a/launcher/modplatform/helpers/HashUtils.cpp +++ b/launcher/modplatform/helpers/HashUtils.cpp @@ -10,8 +10,6 @@ namespace Hashing { -static ModPlatform::ProviderCapabilities ProviderCaps; - Hasher::Ptr createHasher(QString file_path, ModPlatform::ResourceProvider provider) { switch (provider) { @@ -62,8 +60,8 @@ void ModrinthHasher::executeTask() return; } - auto hash_type = ProviderCaps.hashType(ModPlatform::ResourceProvider::MODRINTH).first(); - m_hash = ProviderCaps.hash(ModPlatform::ResourceProvider::MODRINTH, &file, hash_type); + auto hash_type = ModPlatform::ProviderCapabilities::hashType(ModPlatform::ResourceProvider::MODRINTH).first(); + m_hash = ModPlatform::ProviderCapabilities::hash(ModPlatform::ResourceProvider::MODRINTH, &file, hash_type); file.close(); @@ -96,7 +94,7 @@ void FlameHasher::executeTask() BlockedModHasher::BlockedModHasher(QString file_path, ModPlatform::ResourceProvider provider) : Hasher(file_path), provider(provider) { setObjectName(QString("BlockedModHasher: %1").arg(file_path)); - hash_type = ProviderCaps.hashType(provider).first(); + hash_type = ModPlatform::ProviderCapabilities::hashType(provider).first(); } void BlockedModHasher::executeTask() @@ -113,7 +111,7 @@ void BlockedModHasher::executeTask() return; } - m_hash = ProviderCaps.hash(provider, &file, hash_type); + m_hash = ModPlatform::ProviderCapabilities::hash(provider, &file, hash_type); file.close(); @@ -127,12 +125,12 @@ void BlockedModHasher::executeTask() QStringList BlockedModHasher::getHashTypes() { - return ProviderCaps.hashType(provider); + return ModPlatform::ProviderCapabilities::hashType(provider); } bool BlockedModHasher::useHashType(QString type) { - auto types = ProviderCaps.hashType(provider); + auto types = ModPlatform::ProviderCapabilities::hashType(provider); if (types.contains(type)) { hash_type = type; return true; diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp index f7e9fb8a9..881f5499c 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp @@ -13,7 +13,6 @@ #include "minecraft/mod/ModFolderModel.h" static ModrinthAPI api; -static ModPlatform::ProviderCapabilities ProviderCaps; bool ModrinthCheckUpdate::abort() { @@ -36,7 +35,7 @@ void ModrinthCheckUpdate::executeTask() // Create all hashes QStringList hashes; - auto best_hash_type = ProviderCaps.hashType(ModPlatform::ResourceProvider::MODRINTH).first(); + auto best_hash_type = ModPlatform::ProviderCapabilities::hashType(ModPlatform::ResourceProvider::MODRINTH).first(); ConcurrentTask hashing_task(this, "MakeModrinthHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); for (auto* resource : m_resources) { diff --git a/launcher/modplatform/modrinth/ModrinthPackIndex.cpp b/launcher/modplatform/modrinth/ModrinthPackIndex.cpp index c1c30ab5f..7a74619e5 100644 --- a/launcher/modplatform/modrinth/ModrinthPackIndex.cpp +++ b/launcher/modplatform/modrinth/ModrinthPackIndex.cpp @@ -25,7 +25,6 @@ #include "modplatform/ModIndex.h" static ModrinthAPI api; -static ModPlatform::ProviderCapabilities ProviderCaps; bool shouldDownloadOnSide(QString side) { @@ -233,7 +232,7 @@ auto Modrinth::loadIndexedPackVersion(QJsonObject& obj, QString preferred_hash_t file.hash = Json::requireString(hash_list, preferred_hash_type); file.hash_type = preferred_hash_type; } else { - auto hash_types = ProviderCaps.hashType(ModPlatform::ResourceProvider::MODRINTH); + auto hash_types = ModPlatform::ProviderCapabilities::hashType(ModPlatform::ResourceProvider::MODRINTH); for (auto& hash_type : hash_types) { if (hash_list.contains(hash_type)) { file.hash = Json::requireString(hash_list, hash_type); diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index 81c0a1efb..c609e78fc 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -66,8 +66,6 @@ static inline auto indexFileName(QString const& mod_slug) -> QString return QString("%1.pw.toml").arg(mod_slug); } -static ModPlatform::ProviderCapabilities ProviderCaps; - // Helper functions for extracting data from the TOML file auto stringEntry(toml::table table, QString entry_name) -> QString { @@ -201,7 +199,7 @@ void V1::updateModIndex(const QDir& index_dir, Mod& mod) { "hash-format", mod.hash_format.toStdString() }, { "hash", mod.hash.toStdString() }, } }, - { "update", toml::table{ { ProviderCaps.name(mod.provider), update }, + { "update", toml::table{ { ModPlatform::ProviderCapabilities::name(mod.provider), update }, { "x-prismlauncher-version-number", mod.version_number.toStdString() } } } }; std::stringstream ss; ss << tbl; @@ -306,11 +304,11 @@ auto V1::getIndexForMod(const QDir& index_dir, QString slug) -> Mod mod.version_number = stringEntry(*update_table, "x-prismlauncher-version-number"); toml::table* mod_provider_table = nullptr; - if ((mod_provider_table = (*update_table)[ProviderCaps.name(Provider::FLAME)].as_table())) { + if ((mod_provider_table = (*update_table)[ModPlatform::ProviderCapabilities::name(Provider::FLAME)].as_table())) { mod.provider = Provider::FLAME; mod.file_id = intEntry(*mod_provider_table, "file-id"); mod.project_id = intEntry(*mod_provider_table, "project-id"); - } else if ((mod_provider_table = (*update_table)[ProviderCaps.name(Provider::MODRINTH)].as_table())) { + } else if ((mod_provider_table = (*update_table)[ModPlatform::ProviderCapabilities::name(Provider::MODRINTH)].as_table())) { mod.provider = Provider::MODRINTH; mod.mod_id() = stringEntry(*mod_provider_table, "mod-id"); mod.version() = stringEntry(*mod_provider_table, "version"); diff --git a/launcher/ui/dialogs/ChooseProviderDialog.cpp b/launcher/ui/dialogs/ChooseProviderDialog.cpp index 83748e1e2..68457802d 100644 --- a/launcher/ui/dialogs/ChooseProviderDialog.cpp +++ b/launcher/ui/dialogs/ChooseProviderDialog.cpp @@ -6,8 +6,6 @@ #include "modplatform/ModIndex.h" -static ModPlatform::ProviderCapabilities ProviderCaps; - ChooseProviderDialog::ChooseProviderDialog(QWidget* parent, bool single_choice, bool allow_skipping) : QDialog(parent), ui(new Ui::ChooseProviderDialog) { @@ -78,7 +76,7 @@ void ChooseProviderDialog::addProviders() QRadioButton* btn; for (auto& provider : { ModPlatform::ResourceProvider::MODRINTH, ModPlatform::ResourceProvider::FLAME }) { - btn = new QRadioButton(ProviderCaps.readableName(provider), this); + btn = new QRadioButton(ModPlatform::ProviderCapabilities::readableName(provider), this); m_providers.addButton(btn, btn_index++); ui->providersLayout->addWidget(btn); } diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.cpp b/launcher/ui/dialogs/ResourceDownloadDialog.cpp index 1431ea92c..3f2be760a 100644 --- a/launcher/ui/dialogs/ResourceDownloadDialog.cpp +++ b/launcher/ui/dialogs/ResourceDownloadDialog.cpp @@ -125,8 +125,6 @@ void ResourceDownloadDialog::connectButtons() connect(HelpButton, &QPushButton::clicked, m_container, &PageContainer::help); } -static ModPlatform::ProviderCapabilities ProviderCaps; - void ResourceDownloadDialog::confirm() { auto confirm_dialog = ReviewMessageBox::create(this, tr("Confirm %1 to download").arg(resourcesString())); @@ -167,7 +165,7 @@ void ResourceDownloadDialog::confirm() }); for (auto& task : selected) { confirm_dialog->appendResource({ task->getName(), task->getFilename(), task->getCustomPath(), - ProviderCaps.name(task->getProvider()), getRequiredBy.value(task->getPack()->addonId.toString()), + ModPlatform::ProviderCapabilities::name(task->getProvider()), getRequiredBy.value(task->getPack()->addonId.toString()), task->getVersion().version_type.toString() }); } diff --git a/launcher/ui/dialogs/ResourceUpdateDialog.cpp b/launcher/ui/dialogs/ResourceUpdateDialog.cpp index cad5b9f7f..459ba7f23 100644 --- a/launcher/ui/dialogs/ResourceUpdateDialog.cpp +++ b/launcher/ui/dialogs/ResourceUpdateDialog.cpp @@ -24,8 +24,6 @@ #include -static ModPlatform::ProviderCapabilities ProviderCaps; - static std::list mcVersions(BaseInstance* inst) { return { static_cast(inst)->getPackProfile()->getComponent("net.minecraft")->getVersion() }; @@ -423,7 +421,7 @@ void ResourceUpdateDialog::appendResource(CheckUpdateTask::Update const& info, Q item_top->setExpanded(true); auto provider_item = new QTreeWidgetItem(item_top); - provider_item->setText(0, tr("Provider: %1").arg(ProviderCaps.readableName(info.provider))); + provider_item->setText(0, tr("Provider: %1").arg(ModPlatform::ProviderCapabilities::readableName(info.provider))); auto old_version_item = new QTreeWidgetItem(item_top); old_version_item->setText(0, tr("Old version: %1").arg(info.old_version)); From ad98f600d5666396577295a3915e039314767f60 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 26 Jan 2024 18:36:31 +0200 Subject: [PATCH 037/616] corecly display core mods tab Signed-off-by: Trial97 --- launcher/ui/pages/instance/ModFolderPage.cpp | 31 +++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index aba87942a..4b96338ae 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -66,6 +66,7 @@ #include "Version.h" #include "tasks/ConcurrentTask.h" +#include "tasks/Task.h" #include "ui/dialogs/ProgressDialog.h" ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr mods, QWidget* parent) @@ -320,21 +321,23 @@ bool CoreModFolderPage::shouldDisplay() const return true; auto version = inst->getPackProfile(); - - ProgressDialog loadDialog(parentWidget()); - auto update = inst->createUpdateTask(Net::Mode::Offline); - if (update) { - loadDialog.setSkipButton(true, tr("Abort")); - loadDialog.execWithTask(update.get()); + if (!version || !version->getComponent("net.minecraftforge") || !version->getComponent("net.minecraft")) + return false; + auto minecraftCmp = version->getComponent("net.minecraft"); + if (!minecraftCmp->m_loaded) { + version->reload(Net::Mode::Offline); + auto update = version->getCurrentTask(); + if (update) { + connect(update.get(), &Task::finished, this, [this] { + if (m_container) { + m_container->refreshContainer(); + } + }); + update->start(); + } + return false; } - if (!version) - return true; - if (!version->getComponent("net.minecraftforge")) - return false; - if (!version->getComponent("net.minecraft")) - return false; - if (version->getComponent("net.minecraft")->getReleaseDateTime() < g_VersionFilterData.legacyCutoffDate) - return true; + return minecraftCmp->getReleaseDateTime() < g_VersionFilterData.legacyCutoffDate; } return false; } From 7317105e4d8c7a65f4a722dbebf8d5e3247f80dc Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 27 Jan 2024 22:47:28 +0200 Subject: [PATCH 038/616] Code spaghetti and more chaos Signed-off-by: Trial97 --- launcher/BaseVersionList.cpp | 1 + launcher/BaseVersionList.h | 1 + launcher/CMakeLists.txt | 8 +- launcher/JavaDownloader.cpp | 332 ------------------ launcher/JavaDownloader.h | 28 -- launcher/SysInfo.cpp | 43 ++- launcher/SysInfo.h | 1 + launcher/VersionProxyModel.cpp | 9 + launcher/VersionProxyModel.h | 2 +- launcher/java/JavaRuntime.cpp | 2 +- launcher/java/JavaVersion.cpp | 21 +- .../java/download/ArchiveJavaDownloader.cpp | 2 +- .../java/download/ManifestJavaDownloader.cpp | 2 +- launcher/ui/java/JavaDownload.cpp | 103 ++++++ launcher/ui/java/JavaDownload.h | 48 +++ launcher/ui/java/JavaDownload.ui | 100 ++++++ launcher/ui/java/ListModel.cpp | 154 ++++++++ launcher/ui/java/ListModel.h | 132 +++++++ launcher/ui/pages/global/JavaPage.cpp | 5 +- .../pages/instance/InstanceSettingsPage.cpp | 5 +- launcher/ui/widgets/JavaSettingsWidget.cpp | 5 +- 21 files changed, 613 insertions(+), 391 deletions(-) delete mode 100644 launcher/JavaDownloader.cpp delete mode 100644 launcher/JavaDownloader.h create mode 100644 launcher/ui/java/JavaDownload.cpp create mode 100644 launcher/ui/java/JavaDownload.h create mode 100644 launcher/ui/java/JavaDownload.ui create mode 100644 launcher/ui/java/ListModel.cpp create mode 100644 launcher/ui/java/ListModel.h diff --git a/launcher/BaseVersionList.cpp b/launcher/BaseVersionList.cpp index e11560d5e..576c3a413 100644 --- a/launcher/BaseVersionList.cpp +++ b/launcher/BaseVersionList.cpp @@ -110,6 +110,7 @@ QHash BaseVersionList::roleNames() const roles.insert(TypeRole, "type"); roles.insert(BranchRole, "branch"); roles.insert(PathRole, "path"); + roles.insert(AliasRole, "alias"); roles.insert(ArchitectureRole, "architecture"); return roles; } diff --git a/launcher/BaseVersionList.h b/launcher/BaseVersionList.h index 231887c4e..c59d70570 100644 --- a/launcher/BaseVersionList.h +++ b/launcher/BaseVersionList.h @@ -48,6 +48,7 @@ class BaseVersionList : public QAbstractListModel { TypeRole, BranchRole, PathRole, + AliasRole, ArchitectureRole, SortRole }; diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index ac3f8eb68..d703b8263 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -437,6 +437,11 @@ set(JAVA_SOURCES java/download/ArchiveJavaDownloader.h java/download/ManifestJavaDownloader.cpp java/download/ManifestJavaDownloader.h + + ui/java/JavaDownload.h + ui/java/JavaDownload.cpp + ui/java/ListModel.h + ui/java/ListModel.cpp ) set(TRANSLATIONS_SOURCES @@ -1107,8 +1112,6 @@ SET(LAUNCHER_SOURCES ui/instanceview/InstanceDelegate.h ui/instanceview/VisualGroup.cpp ui/instanceview/VisualGroup.h - JavaDownloader.cpp - JavaDownloader.h ) if (NOT Apple) @@ -1189,6 +1192,7 @@ qt_wrap_ui(LAUNCHER_UI ui/dialogs/ScrollMessageBox.ui ui/dialogs/BlockedModsDialog.ui ui/dialogs/ChooseProviderDialog.ui + ui/java/JavaDownload.ui ) qt_wrap_ui(PRISM_UPDATE_UI diff --git a/launcher/JavaDownloader.cpp b/launcher/JavaDownloader.cpp deleted file mode 100644 index e4f4b5f09..000000000 --- a/launcher/JavaDownloader.cpp +++ /dev/null @@ -1,332 +0,0 @@ -#include "JavaDownloader.h" -#include -#include -#include -#include -#include "Application.h" -#include "FileSystem.h" -#include "InstanceList.h" -#include "Json.h" -#include "MMCZip.h" -#include "SysInfo.h" -#include "net/ChecksumValidator.h" -#include "net/NetJob.h" -#include "ui/dialogs/ProgressDialog.h" - -// Quick & dirty struct to store files -struct File { - QString path; - QString url; - QByteArray hash; - bool isExec; -}; - -void JavaDownloader::executeTask() -{ - auto OS = m_OS; - auto isLegacy = m_isLegacy; - - downloadMojangJavaList(OS, isLegacy); -} -void JavaDownloader::downloadMojangJavaList(const QString& OS, bool isLegacy) -{ - auto netJob = makeShared(QString("JRE::QueryVersions"), APPLICATION->network()); - auto response = std::make_shared(); - setStatus(tr("Querying mojang meta")); - netJob->addNetAction(Net::Download::makeByteArray( - QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); - - connect(this, &Task::aborted, [isLegacy] { - QDir(FS::PathCombine(QCoreApplication::applicationDirPath(), "java", (isLegacy ? "java-legacy" : "java-current"))) - .removeRecursively(); - }); - - connect(netJob.get(), &NetJob::finished, [netJob, response, this] { - // delete so that it's not called on a deleted job - // FIXME: is this needed? qt should handle this - disconnect(this, &Task::aborted, netJob.get(), &NetJob::abort); - }); - connect(netJob.get(), &NetJob::progress, this, &JavaDownloader::progress); - connect(netJob.get(), &NetJob::failed, this, &JavaDownloader::emitFailed); - - connect(this, &Task::aborted, netJob.get(), &NetJob::abort); - - connect(netJob.get(), &NetJob::succeeded, [response, OS, isLegacy, this, netJob] { - QJsonParseError parse_error{}; - QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); - if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); - qWarning() << *response; - return; - } - auto versionArray = Json::ensureArray(Json::ensureObject(doc.object(), OS), isLegacy ? "jre-legacy" : "java-runtime-gamma"); - if (!versionArray.empty()) { - parseMojangManifest(isLegacy, versionArray); - - } else { - // mojang does not have a JRE for us, let's get azul zulu - downloadAzulMeta(OS, isLegacy, netJob.get()); - } - }); - - netJob->start(); -} -void JavaDownloader::parseMojangManifest(bool isLegacy, const QJsonArray& versionArray) -{ - setStatus(tr("Downloading Java from Mojang")); - auto url = Json::ensureString(Json::ensureObject(Json::ensureObject(versionArray[0]), "manifest"), "url"); - auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); - auto files = std::make_shared(); - - download->addNetAction(Net::Download::makeByteArray(QUrl(url), files)); - - connect(download.get(), &NetJob::finished, - [download, files, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); - connect(download.get(), &NetJob::progress, this, &JavaDownloader::progress); - connect(download.get(), &NetJob::failed, this, &JavaDownloader::emitFailed); - connect(this, &Task::aborted, download.get(), &NetJob::abort); - - connect(download.get(), &NetJob::succeeded, [files, isLegacy, this] { - QJsonParseError parse_error{}; - QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); - if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); - qWarning() << *files; - return; - } - downloadMojangJava(isLegacy, doc); - }); - download->start(); -} -void JavaDownloader::downloadMojangJava(bool isLegacy, const QJsonDocument& doc) -{ // valid json doc, begin making jre spot - auto output = FS::PathCombine(QCoreApplication::applicationDirPath(), QString("java"), (isLegacy ? "java-legacy" : "java-current")); - FS::ensureFolderPathExists(output); - std::vector toDownload; - auto list = Json::ensureObject(Json::ensureObject(doc.object()), "files"); - for (const auto& paths : list.keys()) { - auto file = FS::PathCombine(output, paths); - - const QJsonObject& meta = Json::ensureObject(list, paths); - auto type = Json::ensureString(meta, "type"); - if (type == "directory") { - FS::ensureFolderPathExists(file); - } else if (type == "link") { - // this is linux only ! - auto path = Json::ensureString(meta, "target"); - if (!path.isEmpty()) { - auto target = FS::PathCombine(file, "../" + path); - QFile(target).link(file); - } - } else if (type == "file") { - // TODO download compressed version if it exists ? - auto raw = Json::ensureObject(Json::ensureObject(meta, "downloads"), "raw"); - auto isExec = Json::ensureBoolean(meta, "executable", false); - auto url = Json::ensureString(raw, "url"); - if (!url.isEmpty() && QUrl(url).isValid()) { - auto f = File{ file, url, QByteArray::fromHex(Json::ensureString(raw, "sha1").toLatin1()), isExec }; - toDownload.push_back(f); - } - } - } - auto elementDownload = new NetJob("JRE::FileDownload", APPLICATION->network()); - for (const auto& file : toDownload) { - auto dl = Net::Download::makeFile(file.url, file.path); - if (!file.hash.isEmpty()) { - dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, file.hash)); - } - if (file.isExec) { - connect(dl.get(), &Net::Download::succeeded, - [file] { QFile(file.path).setPermissions(QFile(file.path).permissions() | QFileDevice::Permissions(0x1111)); }); - } - elementDownload->addNetAction(dl); - } - connect(elementDownload, &NetJob::finished, [elementDownload, this] { - disconnect(this, &Task::aborted, elementDownload, &NetJob::abort); - elementDownload->deleteLater(); - }); - connect(elementDownload, &NetJob::progress, this, &JavaDownloader::progress); - connect(elementDownload, &NetJob::failed, this, &JavaDownloader::emitFailed); - - connect(this, &Task::aborted, elementDownload, &NetJob::abort); - connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); - elementDownload->start(); -} -void JavaDownloader::downloadAzulMeta(const QString& OS, bool isLegacy, const NetJob* netJob) -{ - setStatus(tr("Querying Azul meta")); - QString javaVersion = isLegacy ? QString("8.0") : QString("17.0"); - - QString azulOS; - QString arch; - QString bitness; - - mojangOStoAzul(OS, azulOS, arch, bitness); - auto metaResponse = std::make_shared(); - auto downloadJob = makeShared(QString("JRE::QueryAzulMeta"), APPLICATION->network()); - downloadJob->addNetAction( - Net::Download::makeByteArray(QString("https://api.azul.com/zulu/download/community/v1.0/bundles/?" - "java_version=%1" - "&os=%2" - "&arch=%3" - "&hw_bitness=%4" - "&ext=zip" // as a zip for all os, even linux NOTE !! Linux ARM is .deb or .tar.gz only !! - "&bundle_type=jre" // jre only - "&latest=true" // only get the one latest entry - ) - .arg(javaVersion, azulOS, arch, bitness), - metaResponse)); - connect(downloadJob.get(), &NetJob::finished, - [downloadJob, metaResponse, this] { disconnect(this, &Task::aborted, downloadJob.get(), &NetJob::abort); }); - connect(this, &Task::aborted, downloadJob.get(), &NetJob::abort); - connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed); - connect(downloadJob.get(), &NetJob::progress, this, &JavaDownloader::progress); - connect(downloadJob.get(), &NetJob::succeeded, [metaResponse, isLegacy, this] { - QJsonParseError parse_error{}; - QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error); - if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); - qWarning() << *metaResponse; - return; - } - auto array = Json::ensureArray(doc.array()); - if (!array.empty()) { - downloadAzulJava(isLegacy, array); - } else { - emitFailed(tr("No suitable JRE found")); - } - }); - downloadJob->start(); -} -void JavaDownloader::mojangOStoAzul(const QString& OS, QString& azulOS, QString& arch, QString& bitness) -{ - if (OS == "mac-os-arm64") { - // macos arm64 - azulOS = "macos"; - arch = "arm"; - bitness = "64"; - } else if (OS == "linux-arm64") { - // linux arm64 - azulOS = "linux"; - arch = "arm"; - bitness = "64"; - } else if (OS == "linux-arm") { - // linux arm (32) - azulOS = "linux"; - arch = "arm"; - bitness = "32"; - } else if (OS == "linux") { - // linux x86 64 (used for debugging, should never reach here) - azulOS = "linux"; - arch = "x86"; - bitness = "64"; - } -} -void JavaDownloader::downloadAzulJava(bool isLegacy, const QJsonArray& array) -{ // JRE found ! download the zip - setStatus(tr("Downloading Java from Azul")); - auto downloadURL = QUrl(array[0].toObject()["url"].toString()); - auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); - auto path = APPLICATION->instances()->getStagedInstancePath(); - auto temp = FS::PathCombine(path, "azulJRE.zip"); - - download->addNetAction(Net::Download::makeFile(downloadURL, temp)); - connect(download, &NetJob::finished, [download, this] { - disconnect(this, &Task::aborted, download, &NetJob::abort); - download->deleteLater(); - }); - connect(download, &NetJob::aborted, [path] { APPLICATION->instances()->destroyStagingPath(path); }); - connect(download, &NetJob::progress, this, &JavaDownloader::progress); - connect(download, &NetJob::failed, this, [this, path](QString reason) { - APPLICATION->instances()->destroyStagingPath(path); - emitFailed(std::move(reason)); - }); - connect(this, &Task::aborted, download, &NetJob::abort); - connect(download, &NetJob::succeeded, [isLegacy, temp, downloadURL, path, this] { - setStatus(tr("Extracting java")); - auto output = FS::PathCombine(QCoreApplication::applicationDirPath(), "java", isLegacy ? "java-legacy" : "java-current"); - // This should do all of the extracting and creating folders - MMCZip::extractDir(temp, downloadURL.fileName().chopped(4), output); - APPLICATION->instances()->destroyStagingPath(path); - emitSucceeded(); - }); - download->start(); -} -void JavaDownloader::showPrompts(QWidget* parent) -{ - QString sys = SysInfo::currentSystem(); - if (sys == "osx") { - sys = "mac-os"; - } - QString arch = SysInfo::useQTForArch(); - QString version; - if (sys == "windows") { - if (arch == "x86_64") { - version = "windows-x64"; - } else if (arch == "i386") { - version = "windows-x86"; - } else { - // Unknown, maybe arm, appending arch for downloader - version = "windows-" + arch; - } - } else if (sys == "mac-os") { - if (arch == "arm64") { - version = "mac-os-arm64"; - } else { - version = "mac-os"; - } - } else if (sys == "linux") { - if (arch == "x86_64") { - version = "linux"; - } else { - // will work for i386, and arm(64) - version = "linux-" + arch; - } - } else { - // ? ? ? ? ? unknown os, at least it won't have a java version on mojang or azul, display warning - QMessageBox::warning(parent, tr("Unknown OS"), - tr("The OS you are running is not supported by Mojang or Azul. Please install Java manually.")); - return; - } - // Selection using QMessageBox for java 8 or 17 - QMessageBox box( - QMessageBox::Icon::Question, tr("Java version"), - tr("Do you want to download Java version 8 or 17?\n Java 8 is recommended for older Minecraft versions, below 1.17\n Java 17 " - "is recommended for newer Minecraft versions, starting from 1.17"), - QMessageBox::NoButton, parent); - auto yes = box.addButton("Java 17", QMessageBox::AcceptRole); - auto no = box.addButton("Java 8", QMessageBox::AcceptRole); - auto both = box.addButton(tr("Download both"), QMessageBox::AcceptRole); - auto cancel = box.addButton(QMessageBox::Cancel); - - if (QFileInfo::exists(FS::PathCombine(QCoreApplication::applicationDirPath(), QString("java"), "java-legacy"))) { - no->setEnabled(false); - } - if (QFileInfo::exists(FS::PathCombine(QCoreApplication::applicationDirPath(), QString("java"), "java-current"))) { - yes->setEnabled(false); - } - if (!yes->isEnabled() || !no->isEnabled()) { - both->setEnabled(false); - } - if (!yes->isEnabled() && !no->isEnabled()) { - QMessageBox::information(parent, tr("Already installed!"), tr("Both versions of Java are already installed!")); - return; - } - box.exec(); - if (box.clickedButton() == nullptr || box.clickedButton() == cancel) { - return; - } - bool isLegacy = box.clickedButton() == no; - - auto down = new JavaDownloader(isLegacy, version); - ProgressDialog dialog(parent); - dialog.setSkipButton(true, tr("Abort")); - bool finished_successfully = dialog.execWithTask(down); - // Run another download task for the other option as well! - if (finished_successfully && box.clickedButton() == both) { - auto dwn = new JavaDownloader(false, version); - ProgressDialog dg(parent); - dg.setSkipButton(true, tr("Abort")); - dg.execWithTask(dwn); - } -} diff --git a/launcher/JavaDownloader.h b/launcher/JavaDownloader.h deleted file mode 100644 index 54f058970..000000000 --- a/launcher/JavaDownloader.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include -#include "net/NetJob.h" -#include "tasks/Task.h" - -class JavaDownloader : public Task { - Q_OBJECT - public: - /*Downloads the java to the runtimes folder*/ - explicit JavaDownloader(bool isLegacy, const QString& OS) : m_isLegacy(isLegacy), m_OS(OS) {} - - void executeTask() override; - [[nodiscard]] bool canAbort() const override { return true; } - static void showPrompts(QWidget* parent = nullptr); - - private: - bool m_isLegacy; - const QString& m_OS; - - void downloadMojangJavaList(const QString& OS, bool isLegacy); - void parseMojangManifest(bool isLegacy, const QJsonArray& versionArray); - void downloadMojangJava(bool isLegacy, const QJsonDocument& doc); - - static void mojangOStoAzul(const QString& OS, QString& azulOS, QString& arch, QString& bitness); - void downloadAzulMeta(const QString& OS, bool isLegacy, const NetJob* netJob); - void downloadAzulJava(bool isLegacy, const QJsonArray& array); -}; diff --git a/launcher/SysInfo.cpp b/launcher/SysInfo.cpp index f15dde0e4..0dfa74de7 100644 --- a/launcher/SysInfo.cpp +++ b/launcher/SysInfo.cpp @@ -17,13 +17,7 @@ bool rosettaDetect() if (sysctlbyname("sysctl.proc_translated", &ret, &size, NULL, 0) == -1) { return false; } - if (ret == 0) { - return false; - } - if (ret == 1) { - return true; - } - return false; + return ret == 1; } #endif @@ -47,7 +41,6 @@ QString currentSystem() QString useQTForArch() { - auto qtArch = QSysInfo::currentCpuArchitecture(); #if defined(Q_OS_MACOS) && !defined(Q_PROCESSOR_ARM) if (rosettaDetect()) { return "arm64"; @@ -55,7 +48,7 @@ QString useQTForArch() return "x86_64"; } #endif - return qtArch; + return QSysInfo::currentCpuArchitecture(); } int suitableMaxMem() @@ -71,4 +64,36 @@ int suitableMaxMem() return maxMemoryAlloc; } + +QString getSupportedJavaArchitecture() +{ + auto sys = currentSystem(); + auto arch = useQTForArch(); + if (sys == "windows") { + if (arch == "x86_64") + return "windows-x64"; + if (arch == "i386") + return "windows-x86"; + // Unknown, maybe arm, appending arch + return "windows-" + arch; + } + if (sys == "osx") { + if (arch == "arm64") + return "mac-os-arm64"; + if (arch.contains("64")) + return "mac-os-64"; + if (arch.contains("86")) + return "mac-os-86"; + // Unknown, maybe something new, appending arch + return "mac-os-" + arch; + } else if (sys == "linux") { + if (arch == "x86_64") + return "linux-x64"; + if (arch == "i386") + return "linux-x86"; + // will work for arm32 arm(64) + return "linux-" + arch; + } + return {}; +} } // namespace SysInfo diff --git a/launcher/SysInfo.h b/launcher/SysInfo.h index 499c3b1dd..f3688d60d 100644 --- a/launcher/SysInfo.h +++ b/launcher/SysInfo.h @@ -3,5 +3,6 @@ namespace SysInfo { QString currentSystem(); QString useQTForArch(); +QString getSupportedJavaArchitecture(); int suitableMaxMem(); } // namespace SysInfo diff --git a/launcher/VersionProxyModel.cpp b/launcher/VersionProxyModel.cpp index 0ab9ae2c3..f1218f162 100644 --- a/launcher/VersionProxyModel.cpp +++ b/launcher/VersionProxyModel.cpp @@ -118,6 +118,8 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, return tr("Architecture"); case Path: return tr("Path"); + case Alias: + return tr("Alias"); case Time: return tr("Released"); } @@ -135,6 +137,8 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, return tr("CPU Architecture"); case Path: return tr("Filesystem path to this version"); + case Alias: + return tr("The alternative name of the java version"); case Time: return tr("Release date of this version"); } @@ -169,6 +173,8 @@ QVariant VersionProxyModel::data(const QModelIndex& index, int role) const return sourceModel()->data(parentIndex, BaseVersionList::ArchitectureRole); case Path: return sourceModel()->data(parentIndex, BaseVersionList::PathRole); + case Alias: + return sourceModel()->data(parentIndex, BaseVersionList::AliasRole); case Time: return sourceModel()->data(parentIndex, Meta::VersionList::TimeRole).toDate(); default: @@ -314,6 +320,9 @@ void VersionProxyModel::setSourceModel(QAbstractItemModel* replacingRaw) if (roles.contains(BaseVersionList::PathRole)) { m_columns.push_back(Path); } + if (roles.contains(BaseVersionList::AliasRole)) { + m_columns.push_back(Alias); + } if (roles.contains(Meta::VersionList::TimeRole)) { m_columns.push_back(Time); } diff --git a/launcher/VersionProxyModel.h b/launcher/VersionProxyModel.h index 0863a7c80..2dc35a625 100644 --- a/launcher/VersionProxyModel.h +++ b/launcher/VersionProxyModel.h @@ -9,7 +9,7 @@ class VersionFilterModel; class VersionProxyModel : public QAbstractProxyModel { Q_OBJECT public: - enum Column { Name, ParentVersion, Branch, Type, Architecture, Path, Time }; + enum Column { Name, ParentVersion, Branch, Type, Architecture, Path, Time, Alias }; using FilterMap = QHash>; public: diff --git a/launcher/java/JavaRuntime.cpp b/launcher/java/JavaRuntime.cpp index 78651e991..be13f47e4 100644 --- a/launcher/java/JavaRuntime.cpp +++ b/launcher/java/JavaRuntime.cpp @@ -62,7 +62,7 @@ MetaPtr parseJavaMeta(const QJsonObject& in) } if (in.contains("version")) { - auto obj = Json::requireObject(in, "checksum"); + auto obj = Json::requireObject(in, "version"); auto name = Json::ensureString(obj, "name", ""); auto major = Json::ensureInteger(obj, "major", 0); auto minor = Json::ensureInteger(obj, "minor", 0); diff --git a/launcher/java/JavaVersion.cpp b/launcher/java/JavaVersion.cpp index 3de6f5ad6..f3ded9709 100644 --- a/launcher/java/JavaVersion.cpp +++ b/launcher/java/JavaVersion.cpp @@ -113,19 +113,20 @@ bool JavaVersion::operator>(const JavaVersion& rhs) JavaVersion::JavaVersion(int major, int minor, int security, int build, QString name) : m_major(major), m_minor(minor), m_security(security), m_name(name), m_parseable(true) { + QStringList versions; if (build != 0) { m_prerelease = QString::number(build); - m_string = m_prerelease; + versions.push_front(m_prerelease); } if (m_security != 0) - m_string = QString::number(m_security) + "." + m_string; - else if (!m_string.isEmpty()) { - m_string = "0." + m_string; - } + versions.push_front(QString::number(m_security)); + else if (!versions.isEmpty()) + versions.push_front("0"); + if (m_minor != 0) - m_string = QString::number(m_minor) + "." + m_string; - else if (!m_string.isEmpty()) { - m_string = "0." + m_string; - } - m_string = QString::number(m_major) + "." + m_string; + versions.push_front(QString::number(m_minor)); + else if (!versions.isEmpty()) + versions.push_front("0"); + versions.push_front(QString::number(m_major)); + m_string = versions.join("."); } diff --git a/launcher/java/download/ArchiveJavaDownloader.cpp b/launcher/java/download/ArchiveJavaDownloader.cpp index 5350fc4e6..bee65cf91 100644 --- a/launcher/java/download/ArchiveJavaDownloader.cpp +++ b/launcher/java/download/ArchiveJavaDownloader.cpp @@ -43,7 +43,7 @@ void ArchiveJavaDownloader::executeTask() if (m_checksum_type == "sha256") { hashType = QCryptographicHash::Algorithm::Sha256; } - action->addValidator(new Net::ChecksumValidator(hashType, m_checksum_hash.toLatin1())); + action->addValidator(new Net::ChecksumValidator(hashType, QByteArray::fromHex(m_checksum_hash.toUtf8()))); } download->addNetAction(action); auto fullPath = entry->getFullPath(); diff --git a/launcher/java/download/ManifestJavaDownloader.cpp b/launcher/java/download/ManifestJavaDownloader.cpp index 368d6431c..c0b7942a7 100644 --- a/launcher/java/download/ManifestJavaDownloader.cpp +++ b/launcher/java/download/ManifestJavaDownloader.cpp @@ -46,7 +46,7 @@ void ManifestJavaDownloader::executeTask() if (m_checksum_type == "sha256") { hashType = QCryptographicHash::Algorithm::Sha256; } - action->addValidator(new Net::ChecksumValidator(hashType, m_checksum_hash.toLatin1())); + action->addValidator(new Net::ChecksumValidator(hashType, QByteArray::fromHex(m_checksum_hash.toUtf8()))); } download->addNetAction(action); diff --git a/launcher/ui/java/JavaDownload.cpp b/launcher/ui/java/JavaDownload.cpp new file mode 100644 index 000000000..c03fb10e8 --- /dev/null +++ b/launcher/ui/java/JavaDownload.cpp @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "JavaDownload.h" +#include +#include +#include +#include +#include +#include "Application.h" +#include "BaseVersionList.h" +#include "FileSystem.h" +#include "QObjectPtr.h" +#include "SysInfo.h" +#include "java/JavaInstallList.h" +#include "java/download/ArchiveJavaDownloader.h" +#include "java/download/ManifestJavaDownloader.h" +#include "meta/Index.h" +#include "meta/Version.h" +#include "ui/dialogs/ProgressDialog.h" +#include "ui/java/ListModel.h" +#include "ui_JavaDownload.h" + +JavaDownload::JavaDownload(QWidget* parent) : QDialog(parent), ui(new Ui::JavaDownload) +{ + ui->setupUi(this); + ui->widget->initialize(new Java::JavaBaseVersionList("net.minecraft.java")); + ui->widget->selectCurrent(); + connect(ui->widget, &VersionSelectWidget::selectedVersionChanged, this, &JavaDownload::setSelectedVersion); + auto reset = ui->buttonBox->button(QDialogButtonBox::Reset); + connect(reset, &QPushButton::clicked, this, &JavaDownload::refresh); + connect(ui->widget_2, &VersionSelectWidget::selectedVersionChanged, this, &JavaDownload::setSelectedVersion2); +} + +JavaDownload::~JavaDownload() +{ + delete ui; +} + +void JavaDownload::setSelectedVersion(BaseVersion::Ptr version) +{ + if (!version) + return; + auto dcast = std::dynamic_pointer_cast(version); + if (!dcast) { + return; + } + ui->widget_2->initialize(new Java::InstallList(dcast, this)); + ui->widget_2->selectCurrent(); +} + +void JavaDownload::setSelectedVersion2(BaseVersion::Ptr version) +{ + if (!version) + return; + m_selectedVersion = std::dynamic_pointer_cast(ui->widget_2->selectedVersion()); +} +void JavaDownload::accept() +{ + if (!m_selectedVersion) { + m_selectedVersion = std::dynamic_pointer_cast(ui->widget_2->selectedVersion()); + qDebug() << "=========?" << (ui->widget_2->selectedVersion() != nullptr); + } + if (!m_selectedVersion) { + qDebug() << "faillllllllllllllllllllllllllll"; + return; + } + auto meta = m_selectedVersion->meta; + Task::Ptr task; + auto final_path = FS::PathCombine(APPLICATION->dataRoot(), "java", meta->name); + qDebug() << "===============>>=>>" << meta->checksumType << meta->checksumHash; + switch (meta->downloadType) { + case JavaRuntime::DownloadType::Manifest: + task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); + break; + case JavaRuntime::DownloadType::Archive: + task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); + break; + } + ProgressDialog pg(this); + pg.execWithTask(task.get()); + QDialog::accept(); +} + +void JavaDownload::refresh() +{ + ui->widget->loadList(); +} diff --git a/launcher/ui/java/JavaDownload.h b/launcher/ui/java/JavaDownload.h new file mode 100644 index 000000000..916d6b495 --- /dev/null +++ b/launcher/ui/java/JavaDownload.h @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include +#include "BaseVersion.h" +#include "ui/java/ListModel.h" + +namespace Ui { +class JavaDownload; +} + +class JavaDownload : public QDialog { + Q_OBJECT + + public: + explicit JavaDownload(QWidget* parent = 0); + ~JavaDownload(); + + void accept(); + + public slots: + void refresh(); + + protected slots: + void setSelectedVersion(BaseVersion::Ptr version); + void setSelectedVersion2(BaseVersion::Ptr version); + + private: + Ui::JavaDownload* ui; + Java::JavaRuntimePtr m_selectedVersion; +}; diff --git a/launcher/ui/java/JavaDownload.ui b/launcher/ui/java/JavaDownload.ui new file mode 100644 index 000000000..bbc638e9b --- /dev/null +++ b/launcher/ui/java/JavaDownload.ui @@ -0,0 +1,100 @@ + + + JavaDownload + + + + 0 + 0 + 821 + 593 + + + + Dialog + + + + + + + + Major + + + + + + + + + + + + Runtime + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Retry + + + + + + + + VersionSelectWidget + QWidget +
ui/widgets/VersionSelectWidget.h
+ 1 +
+
+ + + + buttonBox + accepted() + JavaDownload + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + JavaDownload + reject() + + + 316 + 260 + + + 286 + 274 + + + + +
diff --git a/launcher/ui/java/ListModel.cpp b/launcher/ui/java/ListModel.cpp new file mode 100644 index 000000000..71f8765eb --- /dev/null +++ b/launcher/ui/java/ListModel.cpp @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ListModel.h" +#include +#include +#include "BaseVersionList.h" +#include "StringUtils.h" +#include "SysInfo.h" + +namespace Java { + +InstallList::InstallList(Meta::Version::Ptr version, QObject* parent) : BaseVersionList(parent), m_version(version) +{ + if (version->isLoaded()) + sortVersions(); +} + +Task::Ptr InstallList::getLoadTask() +{ + m_version->load(Net::Mode::Online); + auto task = m_version->getCurrentTask(); + connect(task.get(), &Task::finished, this, &InstallList::sortVersions); + return task; +} + +const BaseVersion::Ptr InstallList::at(int i) const +{ + return m_vlist.at(i); +} + +bool InstallList::isLoaded() +{ + return m_version->isLoaded(); +} + +int InstallList::count() const +{ + return m_vlist.count(); +} + +QVariant InstallList::data(const QModelIndex& index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (index.row() > count()) + return QVariant(); + + auto version = (m_vlist[index.row()]); + switch (role) { + case SortRole: + return -index.row(); + case VersionPointerRole: + return QVariant::fromValue(std::dynamic_pointer_cast(m_vlist[index.row()])); + case VersionIdRole: + return version->descriptor(); + case VersionRole: + return version->meta->version.toString(); + case RecommendedRole: + return version->meta->recommended; + case AliasRole: + return version->meta->name; + case ArchitectureRole: + return version->meta->vendor; + default: + return QVariant(); + } +} + +BaseVersionList::RoleList InstallList::providesRoles() const +{ + return { VersionPointerRole, VersionIdRole, VersionRole, RecommendedRole, AliasRole, ArchitectureRole }; +} + +bool sortJavas(BaseVersion::Ptr left, BaseVersion::Ptr right) +{ + auto rleft = std::dynamic_pointer_cast(right); + auto rright = std::dynamic_pointer_cast(left); + return (*rleft) > (*rright); +} + +void InstallList::sortVersions() +{ + QString versionStr = SysInfo::getSupportedJavaArchitecture(); + beginResetModel(); + auto runtimes = m_version->data()->runtimes; + if (versionStr.isEmpty() || !runtimes.contains(versionStr)) { + return; + } + auto javaruntimes = runtimes.value(versionStr); + for (auto v : javaruntimes) { + m_vlist.append(std::make_shared(v)); + } + std::sort(m_vlist.begin(), m_vlist.end(), sortJavas); + endResetModel(); +} + +bool JavaRuntime2::operator<(const JavaRuntime2& rhs) +{ + auto id = meta->version; + if (id < rhs.meta->version) { + return true; + } + if (id > rhs.meta->version) { + return false; + } + return StringUtils::naturalCompare(meta->name, rhs.meta->name, Qt::CaseInsensitive) < 0; +} + +bool JavaRuntime2::operator==(const JavaRuntime2& rhs) +{ + return meta->version == rhs.meta->version && meta->name == rhs.meta->name; +} + +bool JavaRuntime2::operator>(const JavaRuntime2& rhs) +{ + return (!operator<(rhs)) && (!operator==(rhs)); +} + +bool JavaRuntime2::operator<(BaseVersion& a) +{ + try { + return operator<(dynamic_cast(a)); + } catch (const std::bad_cast& e) { + return BaseVersion::operator<(a); + } +} + +bool JavaRuntime2::operator>(BaseVersion& a) +{ + try { + return operator>(dynamic_cast(a)); + } catch (const std::bad_cast& e) { + return BaseVersion::operator>(a); + } +} + +} // namespace Java diff --git a/launcher/ui/java/ListModel.h b/launcher/ui/java/ListModel.h new file mode 100644 index 000000000..3685d611d --- /dev/null +++ b/launcher/ui/java/ListModel.h @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include +#include +#include +#include "java/JavaRuntime.h" +#include "meta/VersionList.h" + +namespace Java { + +class JavaBaseVersionList : public Meta::VersionList { + Q_OBJECT + public: + explicit JavaBaseVersionList(const QString& uid, QObject* parent = nullptr) : VersionList(uid, parent) {} + BaseVersionList::RoleList providesRoles() const { return { VersionRole, RecommendedRole, VersionPointerRole }; } +}; + +struct JavaRuntime2 : public BaseVersion { + JavaRuntime2() {} + JavaRuntime2(JavaRuntime::MetaPtr m) : meta(m) {} + virtual QString descriptor() override { return meta->version.toString(); } + + virtual QString name() override { return meta->name; } + + virtual QString typeString() const override { return meta->vendor; } + + virtual bool operator<(BaseVersion& a) override; + virtual bool operator>(BaseVersion& a) override; + bool operator<(const JavaRuntime2& rhs); + bool operator==(const JavaRuntime2& rhs); + bool operator>(const JavaRuntime2& rhs); + + JavaRuntime::MetaPtr meta; +}; + +using JavaRuntimePtr = std::shared_ptr; + +class InstallList : public BaseVersionList { + Q_OBJECT + + public: + explicit InstallList(Meta::Version::Ptr m_version, QObject* parent = 0); + + Task::Ptr getLoadTask() override; + bool isLoaded() override; + const BaseVersion::Ptr at(int i) const override; + int count() const override; + void sortVersions() override; + + QVariant data(const QModelIndex& index, int role) const override; + RoleList providesRoles() const override; + + protected slots: + void updateListData(QList) override {} + + protected: + Meta::Version::Ptr m_version; + QList m_vlist; +}; + +} // namespace Java +// class FilterModel : public QSortFilterProxyModel { +// Q_OBJECT +// public: +// FilterModel(QObject* parent = Q_NULLPTR); +// enum Sorting { ByName, ByGameVersion }; +// const QMap getAvailableSortings(); +// QString translateCurrentSorting(); +// void setSorting(Sorting sorting); +// Sorting getCurrentSorting(); +// void setSearchTerm(QString term); + +// protected: +// bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override; +// bool lessThan(const QModelIndex& left, const QModelIndex& right) const override; + +// private: +// QMap sortings; +// Sorting currentSorting; +// QString searchTerm; +// }; + +// class ListModel : public QAbstractListModel { +// Q_OBJECT +// private: +// ModpackList modpacks; +// QStringList m_failedLogos; +// QStringList m_loadingLogos; +// FTBLogoMap m_logoMap; +// QMap waitingCallbacks; + +// void requestLogo(QString file); +// QString translatePackType(PackType type) const; + +// private slots: +// void logoFailed(QString logo); +// void logoLoaded(QString logo, QIcon out); + +// public: +// ListModel(QObject* parent); +// ~ListModel(); +// int rowCount(const QModelIndex& parent) const override; +// int columnCount(const QModelIndex& parent) const override; +// QVariant data(const QModelIndex& index, int role) const override; +// Qt::ItemFlags flags(const QModelIndex& index) const override; + +// void fill(ModpackList modpacks); +// void addPack(Modpack modpack); +// void clear(); +// void remove(int row); + +// Modpack at(int row); +// void getLogo(const QString& logo, LogoCallback callback); +// }; diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 0f05b6c8f..09c951a3c 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -36,6 +36,7 @@ #include "JavaPage.h" #include "JavaCommon.h" +#include "ui/java/JavaDownload.h" #include "ui_JavaPage.h" #include @@ -51,7 +52,6 @@ #include #include #include "Application.h" -#include "JavaDownloader.h" #include "settings/SettingsObject.h" JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage) @@ -169,7 +169,8 @@ void JavaPage::on_javaTestBtn_clicked() void JavaPage::on_javaDownloadBtn_clicked() { - JavaDownloader::showPrompts(this); + auto jdialog = new JavaDownload(this); + jdialog->exec(); } void JavaPage::on_maxMemSpinBox_valueChanged([[maybe_unused]] int i) diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index a386a3bfe..df380bfb3 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -36,6 +36,7 @@ */ #include "InstanceSettingsPage.h" +#include "ui/java/JavaDownload.h" #include "ui_InstanceSettingsPage.h" #include @@ -53,7 +54,6 @@ #include "minecraft/auth/AccountList.h" #include "FileSystem.h" -#include "JavaDownloader.h" #include "java/JavaInstallList.h" #include "java/JavaUtils.h" @@ -387,7 +387,8 @@ void InstanceSettingsPage::loadSettings() void InstanceSettingsPage::on_javaDownloadBtn_clicked() { - JavaDownloader::showPrompts(this); + auto jdialog = new JavaDownload(this); + jdialog->exec(); } void InstanceSettingsPage::on_javaDetectBtn_clicked() diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 909ad7a01..7405ad114 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -13,13 +13,13 @@ #include "FileSystem.h" #include "JavaCommon.h" -#include "JavaDownloader.h" #include "java/JavaChecker.h" #include "java/JavaInstall.h" #include "java/JavaInstallList.h" #include "java/JavaUtils.h" #include "ui/dialogs/CustomMessageBox.h" +#include "ui/java/JavaDownload.h" #include "ui/widgets/VersionSelectWidget.h" #include "Application.h" @@ -274,7 +274,8 @@ void JavaSettingsWidget::on_javaBrowseBtn_clicked() } void JavaSettingsWidget::on_javaDownloadBtn_clicked() { - JavaDownloader::showPrompts(this); + auto jdialog = new JavaDownload(this); + jdialog->exec(); } void JavaSettingsWidget::on_javaStatusBtn_clicked() { From 5afe75e821516dbbde60d1b2d3a627a0d243b1fe Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 30 Jan 2024 12:37:34 +0200 Subject: [PATCH 039/616] Fixed some codeql warnings Signed-off-by: Trial97 --- launcher/JavaCommon.cpp | 4 ++-- launcher/JavaCommon.h | 4 ++-- launcher/java/JavaChecker.h | 2 +- launcher/java/JavaInstallList.cpp | 4 ++-- launcher/java/JavaVersion.cpp | 4 ++-- launcher/java/JavaVersion.h | 4 ++-- launcher/java/download/ArchiveJavaDownloader.cpp | 1 - launcher/launch/steps/CheckJava.cpp | 2 +- launcher/launch/steps/CheckJava.h | 2 +- launcher/ui/widgets/JavaSettingsWidget.cpp | 2 +- launcher/ui/widgets/JavaSettingsWidget.h | 2 +- 11 files changed, 15 insertions(+), 16 deletions(-) diff --git a/launcher/JavaCommon.cpp b/launcher/JavaCommon.cpp index cfc3cfe42..3cbf9f9d5 100644 --- a/launcher/JavaCommon.cpp +++ b/launcher/JavaCommon.cpp @@ -121,7 +121,7 @@ void JavaCommon::TestCheck::run() checker->start(); } -void JavaCommon::TestCheck::checkFinished(JavaChecker::Result result) +void JavaCommon::TestCheck::checkFinished(const JavaChecker::Result& result) { if (result.validity != JavaChecker::Result::Validity::Valid) { javaBinaryWasBad(m_parent, result); @@ -133,7 +133,7 @@ void JavaCommon::TestCheck::checkFinished(JavaChecker::Result result) checker->start(); } -void JavaCommon::TestCheck::checkFinishedWithArgs(JavaChecker::Result result) +void JavaCommon::TestCheck::checkFinishedWithArgs(const JavaChecker::Result& result) { if (result.validity == JavaChecker::Result::Validity::Valid) { javaWasOk(m_parent, result); diff --git a/launcher/JavaCommon.h b/launcher/JavaCommon.h index 7c5510efc..ca208b593 100644 --- a/launcher/JavaCommon.h +++ b/launcher/JavaCommon.h @@ -32,8 +32,8 @@ class TestCheck : public QObject { void finished(); private slots: - void checkFinished(JavaChecker::Result result); - void checkFinishedWithArgs(JavaChecker::Result result); + void checkFinished(const JavaChecker::Result& result); + void checkFinishedWithArgs(const JavaChecker::Result& result); private: JavaChecker::Ptr checker; diff --git a/launcher/java/JavaChecker.h b/launcher/java/JavaChecker.h index 0c6191c21..171a18b76 100644 --- a/launcher/java/JavaChecker.h +++ b/launcher/java/JavaChecker.h @@ -29,7 +29,7 @@ class JavaChecker : public Task { explicit JavaChecker(QString path, QString args, int minMem = 0, int maxMem = 0, int permGen = 0, int id = 0, QObject* parent = 0); signals: - void checkFinished(Result result); + void checkFinished(const Result& result); protected: virtual void executeTask() override; diff --git a/launcher/java/JavaInstallList.cpp b/launcher/java/JavaInstallList.cpp index ef99d6853..c14056964 100644 --- a/launcher/java/JavaInstallList.cpp +++ b/launcher/java/JavaInstallList.cpp @@ -170,7 +170,7 @@ void JavaListLoadTask::executeTask() int id = 0; for (QString candidate : candidate_paths) { auto checker = new JavaChecker(candidate, "", 0, 0, 0, id, this); - connect(checker, &JavaChecker::checkFinished, [this](JavaChecker::Result result) { m_results << result; }); + connect(checker, &JavaChecker::checkFinished, [this](const JavaChecker::Result& result) { m_results << result; }); job->addTask(Task::Ptr(checker)); id++; } @@ -181,7 +181,7 @@ void JavaListLoadTask::executeTask() void JavaListLoadTask::javaCheckerFinished() { QList candidates; - std::sort(m_results.begin(), m_results.end(), [](JavaChecker::Result a, JavaChecker::Result b) { return a.id < b.id; }); + std::sort(m_results.begin(), m_results.end(), [](const JavaChecker::Result& a, const JavaChecker::Result& b) { return a.id < b.id; }); qDebug() << "Found the following valid Java installations:"; for (auto result : m_results) { diff --git a/launcher/java/JavaVersion.cpp b/launcher/java/JavaVersion.cpp index f3ded9709..2dc23472e 100644 --- a/launcher/java/JavaVersion.cpp +++ b/launcher/java/JavaVersion.cpp @@ -43,12 +43,12 @@ QString JavaVersion::toString() const return m_string; } -bool JavaVersion::requiresPermGen() +bool JavaVersion::requiresPermGen() const { return !m_parseable || m_major < 8; } -bool JavaVersion::isModular() +bool JavaVersion::isModular() const { return m_parseable && m_major >= 9; } diff --git a/launcher/java/JavaVersion.h b/launcher/java/JavaVersion.h index eee992346..92c743bfb 100644 --- a/launcher/java/JavaVersion.h +++ b/launcher/java/JavaVersion.h @@ -24,9 +24,9 @@ class JavaVersion { bool operator==(const JavaVersion& rhs); bool operator>(const JavaVersion& rhs); - bool requiresPermGen(); + bool requiresPermGen() const; - bool isModular(); + bool isModular() const; QString toString() const; diff --git a/launcher/java/download/ArchiveJavaDownloader.cpp b/launcher/java/download/ArchiveJavaDownloader.cpp index bee65cf91..cb642357a 100644 --- a/launcher/java/download/ArchiveJavaDownloader.cpp +++ b/launcher/java/download/ArchiveJavaDownloader.cpp @@ -49,7 +49,6 @@ void ArchiveJavaDownloader::executeTask() auto fullPath = entry->getFullPath(); connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); - // connect(download.get(), &NetJob::aborted, [path] { APPLICATION->instances()->destroyStagingPath(path); }); connect(download.get(), &NetJob::progress, this, &ArchiveJavaDownloader::progress); connect(download.get(), &NetJob::failed, this, &ArchiveJavaDownloader::emitFailed); connect(this, &Task::aborted, download.get(), &NetJob::abort); diff --git a/launcher/launch/steps/CheckJava.cpp b/launcher/launch/steps/CheckJava.cpp index c776092fe..a8c7305ab 100644 --- a/launcher/launch/steps/CheckJava.cpp +++ b/launcher/launch/steps/CheckJava.cpp @@ -106,7 +106,7 @@ void CheckJava::executeTask() emitSucceeded(); } -void CheckJava::checkJavaFinished(JavaChecker::Result result) +void CheckJava::checkJavaFinished(const JavaChecker::Result& result) { switch (result.validity) { case JavaChecker::Result::Validity::Errored: { diff --git a/launcher/launch/steps/CheckJava.h b/launcher/launch/steps/CheckJava.h index 5ba9e4018..62b0c6bbb 100644 --- a/launcher/launch/steps/CheckJava.h +++ b/launcher/launch/steps/CheckJava.h @@ -28,7 +28,7 @@ class CheckJava : public LaunchStep { virtual void executeTask(); virtual bool canAbort() const { return false; } private slots: - void checkJavaFinished(JavaChecker::Result result); + void checkJavaFinished(const JavaChecker::Result& result); private: void printJavaInfo(const QString& version, const QString& architecture, const QString& realArchitecture, const QString& vendor); diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 7405ad114..d6fbf00a3 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -377,7 +377,7 @@ void JavaSettingsWidget::checkJavaPath(const QString& path) m_checker->start(); } -void JavaSettingsWidget::checkFinished(JavaChecker::Result result) +void JavaSettingsWidget::checkFinished(const JavaChecker::Result& result) { m_result = result; switch (result.validity) { diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index d3cd2c5a7..b7db955a4 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -51,7 +51,7 @@ class JavaSettingsWidget : public QWidget { void on_javaBrowseBtn_clicked(); void on_javaStatusBtn_clicked(); void on_javaDownloadBtn_clicked(); - void checkFinished(JavaChecker::Result result); + void checkFinished(const JavaChecker::Result& result); protected: /* methods */ void checkJavaPathOnEdit(const QString& path); From 6c5bb3817bfe1a51924127f77965ea72506452aa Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 31 Jan 2024 18:07:28 +0200 Subject: [PATCH 040/616] Cleaned some code Signed-off-by: Trial97 --- launcher/java/JavaRuntime.cpp | 44 ++++++++++++++++- launcher/java/JavaRuntime.h | 18 ++++++- launcher/ui/java/JavaDownload.cpp | 35 +++++--------- launcher/ui/java/JavaDownload.h | 3 -- launcher/ui/java/ListModel.cpp | 69 ++++++--------------------- launcher/ui/java/ListModel.h | 78 +------------------------------ 6 files changed, 85 insertions(+), 162 deletions(-) diff --git a/launcher/java/JavaRuntime.cpp b/launcher/java/JavaRuntime.cpp index be13f47e4..e88955772 100644 --- a/launcher/java/JavaRuntime.cpp +++ b/launcher/java/JavaRuntime.cpp @@ -21,6 +21,7 @@ #include #include "Json.h" +#include "StringUtils.h" #include "java/JavaVersion.h" #include "minecraft/ParseUtils.h" @@ -47,7 +48,7 @@ MetaPtr parseJavaMeta(const QJsonObject& in) { auto meta = std::make_shared(); - meta->name = Json::ensureString(in, "name", ""); + meta->m_name = Json::ensureString(in, "name", ""); meta->vendor = Json::ensureString(in, "vendor", ""); meta->url = Json::ensureString(in, "url", ""); meta->releaseTime = timeFromS3Time(Json::ensureString(in, "releaseTime", "")); @@ -72,4 +73,45 @@ MetaPtr parseJavaMeta(const QJsonObject& in) } return meta; } + +bool Meta::operator<(const Meta& rhs) +{ + auto id = version; + if (id < rhs.version) { + return true; + } + if (id > rhs.version) { + return false; + } + return StringUtils::naturalCompare(m_name, rhs.m_name, Qt::CaseInsensitive) < 0; +} + +bool Meta::operator==(const Meta& rhs) +{ + return version == rhs.version && m_name == rhs.m_name; +} + +bool Meta::operator>(const Meta& rhs) +{ + return (!operator<(rhs)) && (!operator==(rhs)); +} + +bool Meta::operator<(BaseVersion& a) +{ + try { + return operator<(dynamic_cast(a)); + } catch (const std::bad_cast& e) { + return BaseVersion::operator<(a); + } +} + +bool Meta::operator>(BaseVersion& a) +{ + try { + return operator>(dynamic_cast(a)); + } catch (const std::bad_cast& e) { + return BaseVersion::operator>(a); + } +} + } // namespace JavaRuntime diff --git a/launcher/java/JavaRuntime.h b/launcher/java/JavaRuntime.h index 4c4efa288..654ba030a 100644 --- a/launcher/java/JavaRuntime.h +++ b/launcher/java/JavaRuntime.h @@ -23,14 +23,28 @@ #include +#include "BaseVersion.h" #include "java/JavaVersion.h" namespace JavaRuntime { enum class DownloadType { Manifest, Archive }; -struct Meta { - QString name; +class Meta : public BaseVersion { + public: + virtual QString descriptor() override { return version.toString(); } + + virtual QString name() override { return m_name; } + + virtual QString typeString() const override { return vendor; } + + virtual bool operator<(BaseVersion& a) override; + virtual bool operator>(BaseVersion& a) override; + bool operator<(const Meta& rhs); + bool operator==(const Meta& rhs); + bool operator>(const Meta& rhs); + + QString m_name; QString vendor; QString url; QDateTime releaseTime; diff --git a/launcher/ui/java/JavaDownload.cpp b/launcher/ui/java/JavaDownload.cpp index c03fb10e8..bae61a060 100644 --- a/launcher/ui/java/JavaDownload.cpp +++ b/launcher/ui/java/JavaDownload.cpp @@ -17,21 +17,23 @@ */ #include "JavaDownload.h" -#include -#include -#include -#include + +#include + #include + #include "Application.h" -#include "BaseVersionList.h" #include "FileSystem.h" #include "QObjectPtr.h" #include "SysInfo.h" -#include "java/JavaInstallList.h" + +#include "java/JavaRuntime.h" #include "java/download/ArchiveJavaDownloader.h" #include "java/download/ManifestJavaDownloader.h" + #include "meta/Index.h" #include "meta/Version.h" + #include "ui/dialogs/ProgressDialog.h" #include "ui/java/ListModel.h" #include "ui_JavaDownload.h" @@ -44,7 +46,6 @@ JavaDownload::JavaDownload(QWidget* parent) : QDialog(parent), ui(new Ui::JavaDo connect(ui->widget, &VersionSelectWidget::selectedVersionChanged, this, &JavaDownload::setSelectedVersion); auto reset = ui->buttonBox->button(QDialogButtonBox::Reset); connect(reset, &QPushButton::clicked, this, &JavaDownload::refresh); - connect(ui->widget_2, &VersionSelectWidget::selectedVersionChanged, this, &JavaDownload::setSelectedVersion2); } JavaDownload::~JavaDownload() @@ -54,8 +55,6 @@ JavaDownload::~JavaDownload() void JavaDownload::setSelectedVersion(BaseVersion::Ptr version) { - if (!version) - return; auto dcast = std::dynamic_pointer_cast(version); if (!dcast) { return; @@ -64,26 +63,14 @@ void JavaDownload::setSelectedVersion(BaseVersion::Ptr version) ui->widget_2->selectCurrent(); } -void JavaDownload::setSelectedVersion2(BaseVersion::Ptr version) -{ - if (!version) - return; - m_selectedVersion = std::dynamic_pointer_cast(ui->widget_2->selectedVersion()); -} void JavaDownload::accept() { - if (!m_selectedVersion) { - m_selectedVersion = std::dynamic_pointer_cast(ui->widget_2->selectedVersion()); - qDebug() << "=========?" << (ui->widget_2->selectedVersion() != nullptr); - } - if (!m_selectedVersion) { - qDebug() << "faillllllllllllllllllllllllllll"; + auto meta = std::dynamic_pointer_cast(ui->widget_2->selectedVersion()); + if (!meta) { return; } - auto meta = m_selectedVersion->meta; Task::Ptr task; - auto final_path = FS::PathCombine(APPLICATION->dataRoot(), "java", meta->name); - qDebug() << "===============>>=>>" << meta->checksumType << meta->checksumHash; + auto final_path = FS::PathCombine(APPLICATION->dataRoot(), "java", meta->m_name); switch (meta->downloadType) { case JavaRuntime::DownloadType::Manifest: task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); diff --git a/launcher/ui/java/JavaDownload.h b/launcher/ui/java/JavaDownload.h index 916d6b495..de0916ae5 100644 --- a/launcher/ui/java/JavaDownload.h +++ b/launcher/ui/java/JavaDownload.h @@ -20,7 +20,6 @@ #include #include "BaseVersion.h" -#include "ui/java/ListModel.h" namespace Ui { class JavaDownload; @@ -40,9 +39,7 @@ class JavaDownload : public QDialog { protected slots: void setSelectedVersion(BaseVersion::Ptr version); - void setSelectedVersion2(BaseVersion::Ptr version); private: Ui::JavaDownload* ui; - Java::JavaRuntimePtr m_selectedVersion; }; diff --git a/launcher/ui/java/ListModel.cpp b/launcher/ui/java/ListModel.cpp index 71f8765eb..11cd01130 100644 --- a/launcher/ui/java/ListModel.cpp +++ b/launcher/ui/java/ListModel.cpp @@ -17,11 +17,12 @@ */ #include "ListModel.h" -#include + #include + #include "BaseVersionList.h" -#include "StringUtils.h" #include "SysInfo.h" +#include "java/JavaRuntime.h" namespace Java { @@ -71,13 +72,13 @@ QVariant InstallList::data(const QModelIndex& index, int role) const case VersionIdRole: return version->descriptor(); case VersionRole: - return version->meta->version.toString(); + return version->version.toString(); case RecommendedRole: - return version->meta->recommended; + return version->recommended; case AliasRole: - return version->meta->name; + return version->name(); case ArchitectureRole: - return version->meta->vendor; + return version->vendor; default: return QVariant(); } @@ -90,8 +91,8 @@ BaseVersionList::RoleList InstallList::providesRoles() const bool sortJavas(BaseVersion::Ptr left, BaseVersion::Ptr right) { - auto rleft = std::dynamic_pointer_cast(right); - auto rright = std::dynamic_pointer_cast(left); + auto rleft = std::dynamic_pointer_cast(right); + auto rright = std::dynamic_pointer_cast(left); return (*rleft) > (*rright); } @@ -100,55 +101,13 @@ void InstallList::sortVersions() QString versionStr = SysInfo::getSupportedJavaArchitecture(); beginResetModel(); auto runtimes = m_version->data()->runtimes; - if (versionStr.isEmpty() || !runtimes.contains(versionStr)) { - return; + if (!versionStr.isEmpty() && runtimes.contains(versionStr)) { + m_vlist = runtimes.value(versionStr); + std::sort(m_vlist.begin(), m_vlist.end(), sortJavas); + } else { + m_vlist = {}; } - auto javaruntimes = runtimes.value(versionStr); - for (auto v : javaruntimes) { - m_vlist.append(std::make_shared(v)); - } - std::sort(m_vlist.begin(), m_vlist.end(), sortJavas); endResetModel(); } -bool JavaRuntime2::operator<(const JavaRuntime2& rhs) -{ - auto id = meta->version; - if (id < rhs.meta->version) { - return true; - } - if (id > rhs.meta->version) { - return false; - } - return StringUtils::naturalCompare(meta->name, rhs.meta->name, Qt::CaseInsensitive) < 0; -} - -bool JavaRuntime2::operator==(const JavaRuntime2& rhs) -{ - return meta->version == rhs.meta->version && meta->name == rhs.meta->name; -} - -bool JavaRuntime2::operator>(const JavaRuntime2& rhs) -{ - return (!operator<(rhs)) && (!operator==(rhs)); -} - -bool JavaRuntime2::operator<(BaseVersion& a) -{ - try { - return operator<(dynamic_cast(a)); - } catch (const std::bad_cast& e) { - return BaseVersion::operator<(a); - } -} - -bool JavaRuntime2::operator>(BaseVersion& a) -{ - try { - return operator>(dynamic_cast(a)); - } catch (const std::bad_cast& e) { - return BaseVersion::operator>(a); - } -} - } // namespace Java diff --git a/launcher/ui/java/ListModel.h b/launcher/ui/java/ListModel.h index 3685d611d..a157e0e8d 100644 --- a/launcher/ui/java/ListModel.h +++ b/launcher/ui/java/ListModel.h @@ -18,9 +18,6 @@ #pragma once -#include -#include -#include #include "java/JavaRuntime.h" #include "meta/VersionList.h" @@ -33,26 +30,6 @@ class JavaBaseVersionList : public Meta::VersionList { BaseVersionList::RoleList providesRoles() const { return { VersionRole, RecommendedRole, VersionPointerRole }; } }; -struct JavaRuntime2 : public BaseVersion { - JavaRuntime2() {} - JavaRuntime2(JavaRuntime::MetaPtr m) : meta(m) {} - virtual QString descriptor() override { return meta->version.toString(); } - - virtual QString name() override { return meta->name; } - - virtual QString typeString() const override { return meta->vendor; } - - virtual bool operator<(BaseVersion& a) override; - virtual bool operator>(BaseVersion& a) override; - bool operator<(const JavaRuntime2& rhs); - bool operator==(const JavaRuntime2& rhs); - bool operator>(const JavaRuntime2& rhs); - - JavaRuntime::MetaPtr meta; -}; - -using JavaRuntimePtr = std::shared_ptr; - class InstallList : public BaseVersionList { Q_OBJECT @@ -73,60 +50,7 @@ class InstallList : public BaseVersionList { protected: Meta::Version::Ptr m_version; - QList m_vlist; + QList m_vlist; }; } // namespace Java -// class FilterModel : public QSortFilterProxyModel { -// Q_OBJECT -// public: -// FilterModel(QObject* parent = Q_NULLPTR); -// enum Sorting { ByName, ByGameVersion }; -// const QMap getAvailableSortings(); -// QString translateCurrentSorting(); -// void setSorting(Sorting sorting); -// Sorting getCurrentSorting(); -// void setSearchTerm(QString term); - -// protected: -// bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override; -// bool lessThan(const QModelIndex& left, const QModelIndex& right) const override; - -// private: -// QMap sortings; -// Sorting currentSorting; -// QString searchTerm; -// }; - -// class ListModel : public QAbstractListModel { -// Q_OBJECT -// private: -// ModpackList modpacks; -// QStringList m_failedLogos; -// QStringList m_loadingLogos; -// FTBLogoMap m_logoMap; -// QMap waitingCallbacks; - -// void requestLogo(QString file); -// QString translatePackType(PackType type) const; - -// private slots: -// void logoFailed(QString logo); -// void logoLoaded(QString logo, QIcon out); - -// public: -// ListModel(QObject* parent); -// ~ListModel(); -// int rowCount(const QModelIndex& parent) const override; -// int columnCount(const QModelIndex& parent) const override; -// QVariant data(const QModelIndex& index, int role) const override; -// Qt::ItemFlags flags(const QModelIndex& index) const override; - -// void fill(ModpackList modpacks); -// void addPack(Modpack modpack); -// void clear(); -// void remove(int row); - -// Modpack at(int row); -// void getLogo(const QString& logo, LogoCallback callback); -// }; From 3c58fb06776000808029e8cc4d5207bfd0f57321 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 2 Feb 2024 15:51:32 +0200 Subject: [PATCH 041/616] Moving files around Signed-off-by: Trial97 --- launcher/BaseVersionList.cpp | 4 +- launcher/BaseVersionList.h | 4 +- launcher/CMakeLists.txt | 22 ++-- launcher/VersionProxyModel.cpp | 26 ++--- launcher/VersionProxyModel.h | 2 +- launcher/java/JavaInstallList.cpp | 4 +- .../{JavaRuntime.cpp => JavaMetadata.cpp} | 24 ++-- .../java/{JavaRuntime.h => JavaMetadata.h} | 16 +-- ...Downloader.cpp => ArchiveDownloadTask.cpp} | 22 ++-- ...JavaDownloader.h => ArchiveDownloadTask.h} | 12 +- ...ownloader.cpp => ManifestDownloadTask.cpp} | 20 ++-- ...avaDownloader.h => ManifestDownloadTask.h} | 13 ++- launcher/meta/VersionList.cpp | 8 +- launcher/meta/VersionList.h | 5 + launcher/minecraft/OneSixVersionFormat.cpp | 6 +- launcher/minecraft/VersionFile.h | 4 +- launcher/ui/java/JavaDownload.cpp | 90 --------------- launcher/ui/java/JavaDownloader.cpp | 109 ++++++++++++++++++ .../java/{JavaDownload.h => JavaDownloader.h} | 13 ++- .../{JavaDownload.ui => JavaDownloader.ui} | 12 +- .../java/{ListModel.cpp => VersionList.cpp} | 32 ++--- .../ui/java/{ListModel.h => VersionList.h} | 18 +-- launcher/ui/pages/global/JavaPage.cpp | 4 +- .../pages/instance/InstanceSettingsPage.cpp | 4 +- launcher/ui/widgets/JavaSettingsWidget.cpp | 4 +- 25 files changed, 254 insertions(+), 224 deletions(-) rename launcher/java/{JavaRuntime.cpp => JavaMetadata.cpp} (86%) rename launcher/java/{JavaRuntime.h => JavaMetadata.h} (84%) rename launcher/java/download/{ArchiveJavaDownloader.cpp => ArchiveDownloadTask.cpp} (82%) rename launcher/java/download/{ArchiveJavaDownloader.h => ArchiveDownloadTask.h} (82%) rename launcher/java/download/{ManifestJavaDownloader.cpp => ManifestDownloadTask.cpp} (87%) rename launcher/java/download/{ManifestJavaDownloader.h => ManifestDownloadTask.h} (82%) delete mode 100644 launcher/ui/java/JavaDownload.cpp create mode 100644 launcher/ui/java/JavaDownloader.cpp rename launcher/ui/java/{JavaDownload.h => JavaDownloader.h} (84%) rename launcher/ui/java/{JavaDownload.ui => JavaDownloader.ui} (86%) rename launcher/ui/java/{ListModel.cpp => VersionList.cpp} (76%) rename launcher/ui/java/{ListModel.h => VersionList.h} (71%) diff --git a/launcher/BaseVersionList.cpp b/launcher/BaseVersionList.cpp index 576c3a413..afee8388a 100644 --- a/launcher/BaseVersionList.cpp +++ b/launcher/BaseVersionList.cpp @@ -110,7 +110,7 @@ QHash BaseVersionList::roleNames() const roles.insert(TypeRole, "type"); roles.insert(BranchRole, "branch"); roles.insert(PathRole, "path"); - roles.insert(AliasRole, "alias"); - roles.insert(ArchitectureRole, "architecture"); + roles.insert(JavaNameRole, "javaName"); + roles.insert(CPUArchitectureRole, "architecture"); return roles; } diff --git a/launcher/BaseVersionList.h b/launcher/BaseVersionList.h index c59d70570..bc37e9e53 100644 --- a/launcher/BaseVersionList.h +++ b/launcher/BaseVersionList.h @@ -48,8 +48,8 @@ class BaseVersionList : public QAbstractListModel { TypeRole, BranchRole, PathRole, - AliasRole, - ArchitectureRole, + JavaNameRole, + CPUArchitectureRole, SortRole }; using RoleList = QList; diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index d703b8263..c7945d1b8 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -431,17 +431,17 @@ set(JAVA_SOURCES java/JavaVersion.h java/JavaVersion.cpp - java/JavaRuntime.h - java/JavaRuntime.cpp - java/download/ArchiveJavaDownloader.cpp - java/download/ArchiveJavaDownloader.h - java/download/ManifestJavaDownloader.cpp - java/download/ManifestJavaDownloader.h + java/JavaMetadata.h + java/JavaMetadata.cpp + java/download/ArchiveDownloadTask.cpp + java/download/ArchiveDownloadTask.h + java/download/ManifestDownloadTask.cpp + java/download/ManifestDownloadTask.h - ui/java/JavaDownload.h - ui/java/JavaDownload.cpp - ui/java/ListModel.h - ui/java/ListModel.cpp + ui/java/JavaDownloader.h + ui/java/JavaDownloader.cpp + ui/java/VersionList.h + ui/java/VersionList.cpp ) set(TRANSLATIONS_SOURCES @@ -1192,7 +1192,7 @@ qt_wrap_ui(LAUNCHER_UI ui/dialogs/ScrollMessageBox.ui ui/dialogs/BlockedModsDialog.ui ui/dialogs/ChooseProviderDialog.ui - ui/java/JavaDownload.ui + ui/java/JavaDownloader.ui ) qt_wrap_ui(PRISM_UPDATE_UI diff --git a/launcher/VersionProxyModel.cpp b/launcher/VersionProxyModel.cpp index f1218f162..070e952a4 100644 --- a/launcher/VersionProxyModel.cpp +++ b/launcher/VersionProxyModel.cpp @@ -114,12 +114,12 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, return tr("Branch"); case Type: return tr("Type"); - case Architecture: + case CPUArchitecture: return tr("Architecture"); case Path: return tr("Path"); - case Alias: - return tr("Alias"); + case JavaName: + return tr("Java Name"); case Time: return tr("Released"); } @@ -133,11 +133,11 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, return tr("The version's branch"); case Type: return tr("The version's type"); - case Architecture: + case CPUArchitecture: return tr("CPU Architecture"); case Path: return tr("Filesystem path to this version"); - case Alias: + case JavaName: return tr("The alternative name of the java version"); case Time: return tr("Release date of this version"); @@ -169,12 +169,12 @@ QVariant VersionProxyModel::data(const QModelIndex& index, int role) const return sourceModel()->data(parentIndex, BaseVersionList::BranchRole); case Type: return sourceModel()->data(parentIndex, BaseVersionList::TypeRole); - case Architecture: - return sourceModel()->data(parentIndex, BaseVersionList::ArchitectureRole); + case CPUArchitecture: + return sourceModel()->data(parentIndex, BaseVersionList::CPUArchitectureRole); case Path: return sourceModel()->data(parentIndex, BaseVersionList::PathRole); - case Alias: - return sourceModel()->data(parentIndex, BaseVersionList::AliasRole); + case JavaName: + return sourceModel()->data(parentIndex, BaseVersionList::JavaNameRole); case Time: return sourceModel()->data(parentIndex, Meta::VersionList::TimeRole).toDate(); default: @@ -314,14 +314,14 @@ void VersionProxyModel::setSourceModel(QAbstractItemModel* replacingRaw) m_columns.push_back(ParentVersion); } */ - if (roles.contains(BaseVersionList::ArchitectureRole)) { - m_columns.push_back(Architecture); + if (roles.contains(BaseVersionList::CPUArchitectureRole)) { + m_columns.push_back(CPUArchitecture); } if (roles.contains(BaseVersionList::PathRole)) { m_columns.push_back(Path); } - if (roles.contains(BaseVersionList::AliasRole)) { - m_columns.push_back(Alias); + if (roles.contains(BaseVersionList::JavaNameRole)) { + m_columns.push_back(JavaName); } if (roles.contains(Meta::VersionList::TimeRole)) { m_columns.push_back(Time); diff --git a/launcher/VersionProxyModel.h b/launcher/VersionProxyModel.h index 2dc35a625..cb55b7f14 100644 --- a/launcher/VersionProxyModel.h +++ b/launcher/VersionProxyModel.h @@ -9,7 +9,7 @@ class VersionFilterModel; class VersionProxyModel : public QAbstractProxyModel { Q_OBJECT public: - enum Column { Name, ParentVersion, Branch, Type, Architecture, Path, Time, Alias }; + enum Column { Name, ParentVersion, Branch, Type, CPUArchitecture, Path, Time, JavaName }; using FilterMap = QHash>; public: diff --git a/launcher/java/JavaInstallList.cpp b/launcher/java/JavaInstallList.cpp index c14056964..d99201f24 100644 --- a/launcher/java/JavaInstallList.cpp +++ b/launcher/java/JavaInstallList.cpp @@ -108,7 +108,7 @@ QVariant JavaInstallList::data(const QModelIndex& index, int role) const return version->recommended; case PathRole: return version->path; - case ArchitectureRole: + case CPUArchitectureRole: return version->arch; default: return QVariant(); @@ -117,7 +117,7 @@ QVariant JavaInstallList::data(const QModelIndex& index, int role) const BaseVersionList::RoleList JavaInstallList::providesRoles() const { - return { VersionPointerRole, VersionIdRole, VersionRole, RecommendedRole, PathRole, ArchitectureRole }; + return { VersionPointerRole, VersionIdRole, VersionRole, RecommendedRole, PathRole, CPUArchitectureRole }; } void JavaInstallList::updateListData(QList versions) diff --git a/launcher/java/JavaRuntime.cpp b/launcher/java/JavaMetadata.cpp similarity index 86% rename from launcher/java/JavaRuntime.cpp rename to launcher/java/JavaMetadata.cpp index e88955772..b261122dc 100644 --- a/launcher/java/JavaRuntime.cpp +++ b/launcher/java/JavaMetadata.cpp @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -#include "java/JavaRuntime.h" +#include "java/JavaMetadata.h" #include @@ -25,7 +25,7 @@ #include "java/JavaVersion.h" #include "minecraft/ParseUtils.h" -namespace JavaRuntime { +namespace Java { DownloadType parseDownloadType(QString javaDownload) { @@ -44,9 +44,9 @@ QString downloadTypeToString(DownloadType javaDownload) } return ""; } -MetaPtr parseJavaMeta(const QJsonObject& in) +MetadataPtr parseJavaMeta(const QJsonObject& in) { - auto meta = std::make_shared(); + auto meta = std::make_shared(); meta->m_name = Json::ensureString(in, "name", ""); meta->vendor = Json::ensureString(in, "vendor", ""); @@ -74,7 +74,7 @@ MetaPtr parseJavaMeta(const QJsonObject& in) return meta; } -bool Meta::operator<(const Meta& rhs) +bool Metadata::operator<(const Metadata& rhs) { auto id = version; if (id < rhs.version) { @@ -86,32 +86,32 @@ bool Meta::operator<(const Meta& rhs) return StringUtils::naturalCompare(m_name, rhs.m_name, Qt::CaseInsensitive) < 0; } -bool Meta::operator==(const Meta& rhs) +bool Metadata::operator==(const Metadata& rhs) { return version == rhs.version && m_name == rhs.m_name; } -bool Meta::operator>(const Meta& rhs) +bool Metadata::operator>(const Metadata& rhs) { return (!operator<(rhs)) && (!operator==(rhs)); } -bool Meta::operator<(BaseVersion& a) +bool Metadata::operator<(BaseVersion& a) { try { - return operator<(dynamic_cast(a)); + return operator<(dynamic_cast(a)); } catch (const std::bad_cast& e) { return BaseVersion::operator<(a); } } -bool Meta::operator>(BaseVersion& a) +bool Metadata::operator>(BaseVersion& a) { try { - return operator>(dynamic_cast(a)); + return operator>(dynamic_cast(a)); } catch (const std::bad_cast& e) { return BaseVersion::operator>(a); } } -} // namespace JavaRuntime +} // namespace Java diff --git a/launcher/java/JavaRuntime.h b/launcher/java/JavaMetadata.h similarity index 84% rename from launcher/java/JavaRuntime.h rename to launcher/java/JavaMetadata.h index 654ba030a..dd3ae865c 100644 --- a/launcher/java/JavaRuntime.h +++ b/launcher/java/JavaMetadata.h @@ -26,11 +26,11 @@ #include "BaseVersion.h" #include "java/JavaVersion.h" -namespace JavaRuntime { +namespace Java { enum class DownloadType { Manifest, Archive }; -class Meta : public BaseVersion { +class Metadata : public BaseVersion { public: virtual QString descriptor() override { return version.toString(); } @@ -40,9 +40,9 @@ class Meta : public BaseVersion { virtual bool operator<(BaseVersion& a) override; virtual bool operator>(BaseVersion& a) override; - bool operator<(const Meta& rhs); - bool operator==(const Meta& rhs); - bool operator>(const Meta& rhs); + bool operator<(const Metadata& rhs); + bool operator==(const Metadata& rhs); + bool operator>(const Metadata& rhs); QString m_name; QString vendor; @@ -55,10 +55,10 @@ class Meta : public BaseVersion { QString packageType; JavaVersion version; }; -using MetaPtr = std::shared_ptr; +using MetadataPtr = std::shared_ptr; DownloadType parseDownloadType(QString javaDownload); QString downloadTypeToString(DownloadType javaDownload); -MetaPtr parseJavaMeta(const QJsonObject& libObj); +MetadataPtr parseJavaMeta(const QJsonObject& libObj); -} // namespace JavaRuntime \ No newline at end of file +} // namespace Java \ No newline at end of file diff --git a/launcher/java/download/ArchiveJavaDownloader.cpp b/launcher/java/download/ArchiveDownloadTask.cpp similarity index 82% rename from launcher/java/download/ArchiveJavaDownloader.cpp rename to launcher/java/download/ArchiveDownloadTask.cpp index cb642357a..847f3f364 100644 --- a/launcher/java/download/ArchiveJavaDownloader.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "java/download/ArchiveJavaDownloader.h" +#include "java/download/ArchiveDownloadTask.h" #include #include #include "MMCZip.h" @@ -25,11 +25,12 @@ #include "net/NetJob.h" #include "tasks/Task.h" -ArchiveJavaDownloader::ArchiveJavaDownloader(QUrl url, QString final_path, QString checksumType, QString checksumHash) +namespace Java { +ArchiveDownloadTask::ArchiveDownloadTask(QUrl url, QString final_path, QString checksumType, QString checksumHash) : m_url(url), m_final_path(final_path), m_checksum_type(checksumType), m_checksum_hash(checksumHash) {} -void ArchiveJavaDownloader::executeTask() +void ArchiveDownloadTask::executeTask() { // JRE found ! download the zip setStatus(tr("Downloading Java")); @@ -49,8 +50,8 @@ void ArchiveJavaDownloader::executeTask() auto fullPath = entry->getFullPath(); connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); - connect(download.get(), &NetJob::progress, this, &ArchiveJavaDownloader::progress); - connect(download.get(), &NetJob::failed, this, &ArchiveJavaDownloader::emitFailed); + connect(download.get(), &NetJob::progress, this, &ArchiveDownloadTask::progress); + connect(download.get(), &NetJob::failed, this, &ArchiveDownloadTask::emitFailed); connect(this, &Task::aborted, download.get(), &NetJob::abort); connect(download.get(), &NetJob::succeeded, [this, fullPath] { // This should do all of the extracting and creating folders @@ -59,7 +60,7 @@ void ArchiveJavaDownloader::executeTask() download->start(); } -void ArchiveJavaDownloader::extractJava(QString input) +void ArchiveDownloadTask::extractJava(QString input) { setStatus(tr("Extracting java")); auto zip = std::make_shared(input); @@ -79,14 +80,14 @@ void ArchiveJavaDownloader::extractJava(QString input) connect(this, &Task::aborted, zipTask.get(), &Task::abort); connect(zipTask.get(), &Task::finished, [zipTask, this] { disconnect(this, &Task::aborted, zipTask.get(), &Task::abort); }); - connect(zipTask.get(), &Task::succeeded, this, &ArchiveJavaDownloader::emitSucceeded); - connect(zipTask.get(), &Task::aborted, this, &ArchiveJavaDownloader::emitAborted); + connect(zipTask.get(), &Task::succeeded, this, &ArchiveDownloadTask::emitSucceeded); + connect(zipTask.get(), &Task::aborted, this, &ArchiveDownloadTask::emitAborted); connect(zipTask.get(), &Task::failed, this, [this, progressStep](QString reason) { progressStep->state = TaskStepState::Failed; stepProgress(*progressStep); emitFailed(reason); }); - connect(zipTask.get(), &Task::stepProgress, this, &ArchiveJavaDownloader::propagateStepProgress); + connect(zipTask.get(), &Task::stepProgress, this, &ArchiveDownloadTask::propagateStepProgress); connect(zipTask.get(), &Task::progress, this, [this, progressStep](qint64 current, qint64 total) { progressStep->update(current, total); @@ -97,4 +98,5 @@ void ArchiveJavaDownloader::extractJava(QString input) stepProgress(*progressStep); }); zipTask->start(); -} \ No newline at end of file +} +} // namespace Java \ No newline at end of file diff --git a/launcher/java/download/ArchiveJavaDownloader.h b/launcher/java/download/ArchiveDownloadTask.h similarity index 82% rename from launcher/java/download/ArchiveJavaDownloader.h rename to launcher/java/download/ArchiveDownloadTask.h index 230f62b4d..88c0223d5 100644 --- a/launcher/java/download/ArchiveJavaDownloader.h +++ b/launcher/java/download/ArchiveDownloadTask.h @@ -21,11 +21,12 @@ #include #include "tasks/Task.h" -class ArchiveJavaDownloader : public Task { +namespace Java { +class ArchiveDownloadTask : public Task { Q_OBJECT public: - ArchiveJavaDownloader(QUrl url, QString final_path, QString checksumType = "", QString checksumHash = ""); - virtual ~ArchiveJavaDownloader() = default; + ArchiveDownloadTask(QUrl url, QString final_path, QString checksumType = "", QString checksumHash = ""); + virtual ~ArchiveDownloadTask() = default; [[nodiscard]] bool canAbort() const override { return true; } void executeTask() override; @@ -38,6 +39,5 @@ class ArchiveJavaDownloader : public Task { QString m_final_path; QString m_checksum_type; QString m_checksum_hash; - - Task::Ptr m_current_task; -}; \ No newline at end of file +}; +} // namespace Java \ No newline at end of file diff --git a/launcher/java/download/ManifestJavaDownloader.cpp b/launcher/java/download/ManifestDownloadTask.cpp similarity index 87% rename from launcher/java/download/ManifestJavaDownloader.cpp rename to launcher/java/download/ManifestDownloadTask.cpp index c0b7942a7..1a3071530 100644 --- a/launcher/java/download/ManifestJavaDownloader.cpp +++ b/launcher/java/download/ManifestDownloadTask.cpp @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "java/download/ManifestJavaDownloader.h" +#include "java/download/ManifestDownloadTask.h" #include "Application.h" #include "FileSystem.h" @@ -30,11 +30,12 @@ struct File { bool isExec; }; -ManifestJavaDownloader::ManifestJavaDownloader(QUrl url, QString final_path, QString checksumType, QString checksumHash) +namespace Java { +ManifestDownloadTask::ManifestDownloadTask(QUrl url, QString final_path, QString checksumType, QString checksumHash) : m_url(url), m_final_path(final_path), m_checksum_type(checksumType), m_checksum_hash(checksumHash) {} -void ManifestJavaDownloader::executeTask() +void ManifestDownloadTask::executeTask() { setStatus(tr("Downloading Java")); auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); @@ -51,8 +52,8 @@ void ManifestJavaDownloader::executeTask() download->addNetAction(action); connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); - connect(download.get(), &NetJob::progress, this, &ManifestJavaDownloader::progress); - connect(download.get(), &NetJob::failed, this, &ManifestJavaDownloader::emitFailed); + connect(download.get(), &NetJob::progress, this, &ManifestDownloadTask::progress); + connect(download.get(), &NetJob::failed, this, &ManifestDownloadTask::emitFailed); connect(this, &Task::aborted, download.get(), &NetJob::abort); connect(download.get(), &NetJob::succeeded, [files, this] { @@ -69,7 +70,7 @@ void ManifestJavaDownloader::executeTask() download->start(); } -void ManifestJavaDownloader::downloadJava(const QJsonDocument& doc) +void ManifestDownloadTask::downloadJava(const QJsonDocument& doc) { // valid json doc, begin making jre spot FS::ensureFolderPathExists(m_final_path); @@ -116,10 +117,11 @@ void ManifestJavaDownloader::downloadJava(const QJsonDocument& doc) disconnect(this, &Task::aborted, elementDownload, &NetJob::abort); elementDownload->deleteLater(); }); - connect(elementDownload, &NetJob::progress, this, &ManifestJavaDownloader::progress); - connect(elementDownload, &NetJob::failed, this, &ManifestJavaDownloader::emitFailed); + connect(elementDownload, &NetJob::progress, this, &ManifestDownloadTask::progress); + connect(elementDownload, &NetJob::failed, this, &ManifestDownloadTask::emitFailed); connect(this, &Task::aborted, elementDownload, &NetJob::abort); connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); elementDownload->start(); -} \ No newline at end of file +} +} // namespace Java \ No newline at end of file diff --git a/launcher/java/download/ManifestJavaDownloader.h b/launcher/java/download/ManifestDownloadTask.h similarity index 82% rename from launcher/java/download/ManifestJavaDownloader.h rename to launcher/java/download/ManifestDownloadTask.h index d7114f4bd..dcfee4d4d 100644 --- a/launcher/java/download/ManifestJavaDownloader.h +++ b/launcher/java/download/ManifestDownloadTask.h @@ -21,11 +21,13 @@ #include #include "tasks/Task.h" -class ManifestJavaDownloader : public Task { +namespace Java { + +class ManifestDownloadTask : public Task { Q_OBJECT public: - ManifestJavaDownloader(QUrl url, QString final_path, QString checksumType = "", QString checksumHash = ""); - virtual ~ManifestJavaDownloader() = default; + ManifestDownloadTask(QUrl url, QString final_path, QString checksumType = "", QString checksumHash = ""); + virtual ~ManifestDownloadTask() = default; [[nodiscard]] bool canAbort() const override { return true; } void executeTask() override; @@ -38,6 +40,5 @@ class ManifestJavaDownloader : public Task { QString m_final_path; QString m_checksum_type; QString m_checksum_hash; - - Task::Ptr m_current_task; -}; \ No newline at end of file +}; +} // namespace Java \ No newline at end of file diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 7b7ae1fa3..76b914b6a 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -101,10 +101,14 @@ QVariant VersionList::data(const QModelIndex& index, int role) const BaseVersionList::RoleList VersionList::providesRoles() const { - return { VersionPointerRole, VersionRole, VersionIdRole, ParentVersionRole, TypeRole, UidRole, - TimeRole, RequiresRole, SortRole, RecommendedRole, LatestRole, VersionPtrRole }; + return m_provided_roles; } +void VersionList::setProvidedRoles(RoleList roles) +{ + m_provided_roles = roles; +}; + QHash VersionList::roleNames() const { QHash roles = BaseVersionList::roleNames(); diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index 2c5624701..0890caf60 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -47,6 +47,8 @@ class VersionList : public BaseVersionList, public BaseEntity { RoleList providesRoles() const override; QHash roleNames() const override; + void setProvidedRoles(RoleList roles); + QString localFilename() const override; QString uid() const { return m_uid; } @@ -79,6 +81,9 @@ class VersionList : public BaseVersionList, public BaseEntity { Version::Ptr m_recommended; + RoleList m_provided_roles = { VersionPointerRole, VersionRole, VersionIdRole, ParentVersionRole, TypeRole, UidRole, + TimeRole, RequiresRole, SortRole, RecommendedRole, LatestRole, VersionPtrRole }; + void setupAddedVersion(int row, const Version::Ptr& version); }; } // namespace Meta diff --git a/launcher/minecraft/OneSixVersionFormat.cpp b/launcher/minecraft/OneSixVersionFormat.cpp index 5f3b4f2a2..56e9c8ca2 100644 --- a/launcher/minecraft/OneSixVersionFormat.cpp +++ b/launcher/minecraft/OneSixVersionFormat.cpp @@ -37,7 +37,7 @@ #include #include #include -#include "java/JavaRuntime.h" +#include "java/JavaMetadata.h" #include "minecraft/Agent.h" #include "minecraft/ParseUtils.h" @@ -261,9 +261,9 @@ VersionFilePtr OneSixVersionFormat::versionFileFromJson(const QJsonDocument& doc auto runtimes = requireObject(root, "runtimes"); out->runtimes = {}; for (auto key : runtimes.keys()) { - QList list; + QList list; for (auto runtime : ensureArray(runtimes, key)) { - list.append(JavaRuntime::parseJavaMeta(ensureObject(runtime))); + list.append(Java::parseJavaMeta(ensureObject(runtime))); } out->runtimes[key] = list; } diff --git a/launcher/minecraft/VersionFile.h b/launcher/minecraft/VersionFile.h index 297c19709..a9c1473d2 100644 --- a/launcher/minecraft/VersionFile.h +++ b/launcher/minecraft/VersionFile.h @@ -47,7 +47,7 @@ #include "Agent.h" #include "Library.h" #include "ProblemProvider.h" -#include "java/JavaRuntime.h" +#include "java/JavaMetadata.h" #include "minecraft/Rule.h" class PackProfile; @@ -155,7 +155,7 @@ class VersionFile : public ProblemContainer { /// is volatile -- may be removed as soon as it is no longer needed by something else bool m_volatile = false; - QHash> runtimes; + QHash> runtimes; public: // Mojang: DEPRECATED list of 'downloads' - client jar, server jar, windows server exe, maybe more. diff --git a/launcher/ui/java/JavaDownload.cpp b/launcher/ui/java/JavaDownload.cpp deleted file mode 100644 index bae61a060..000000000 --- a/launcher/ui/java/JavaDownload.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (c) 2024 Trial97 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "JavaDownload.h" - -#include - -#include - -#include "Application.h" -#include "FileSystem.h" -#include "QObjectPtr.h" -#include "SysInfo.h" - -#include "java/JavaRuntime.h" -#include "java/download/ArchiveJavaDownloader.h" -#include "java/download/ManifestJavaDownloader.h" - -#include "meta/Index.h" -#include "meta/Version.h" - -#include "ui/dialogs/ProgressDialog.h" -#include "ui/java/ListModel.h" -#include "ui_JavaDownload.h" - -JavaDownload::JavaDownload(QWidget* parent) : QDialog(parent), ui(new Ui::JavaDownload) -{ - ui->setupUi(this); - ui->widget->initialize(new Java::JavaBaseVersionList("net.minecraft.java")); - ui->widget->selectCurrent(); - connect(ui->widget, &VersionSelectWidget::selectedVersionChanged, this, &JavaDownload::setSelectedVersion); - auto reset = ui->buttonBox->button(QDialogButtonBox::Reset); - connect(reset, &QPushButton::clicked, this, &JavaDownload::refresh); -} - -JavaDownload::~JavaDownload() -{ - delete ui; -} - -void JavaDownload::setSelectedVersion(BaseVersion::Ptr version) -{ - auto dcast = std::dynamic_pointer_cast(version); - if (!dcast) { - return; - } - ui->widget_2->initialize(new Java::InstallList(dcast, this)); - ui->widget_2->selectCurrent(); -} - -void JavaDownload::accept() -{ - auto meta = std::dynamic_pointer_cast(ui->widget_2->selectedVersion()); - if (!meta) { - return; - } - Task::Ptr task; - auto final_path = FS::PathCombine(APPLICATION->dataRoot(), "java", meta->m_name); - switch (meta->downloadType) { - case JavaRuntime::DownloadType::Manifest: - task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); - break; - case JavaRuntime::DownloadType::Archive: - task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); - break; - } - ProgressDialog pg(this); - pg.execWithTask(task.get()); - QDialog::accept(); -} - -void JavaDownload::refresh() -{ - ui->widget->loadList(); -} diff --git a/launcher/ui/java/JavaDownloader.cpp b/launcher/ui/java/JavaDownloader.cpp new file mode 100644 index 000000000..9121988da --- /dev/null +++ b/launcher/ui/java/JavaDownloader.cpp @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "JavaDownloader.h" + +#include + +#include + +#include "Application.h" +#include "BaseVersionList.h" +#include "FileSystem.h" +#include "QObjectPtr.h" +#include "SysInfo.h" + +#include "java/JavaMetadata.h" +#include "java/download/ArchiveDownloadTask.h" +#include "java/download/ManifestDownloadTask.h" + +#include "meta/Index.h" +#include "meta/Version.h" + +#include "meta/VersionList.h" +#include "ui/dialogs/ProgressDialog.h" +#include "ui/java/VersionList.h" +#include "ui_JavaDownloader.h" + +namespace Java { + +Downloader::Downloader(QWidget* parent) : QDialog(parent), ui(new Ui::JavaDownloader) +{ + ui->setupUi(this); + auto versionList = new Meta::VersionList("net.minecraft.java", this); + versionList->setProvidedRoles({ BaseVersionList::VersionRole, BaseVersionList::RecommendedRole, BaseVersionList::VersionPointerRole }); + ui->majorVersionSelect->initialize(versionList); + ui->majorVersionSelect->selectCurrent(); + ui->majorVersionSelect->setEmptyString(tr("No java versions are currently available in the meta")); + ui->majorVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + + ui->javaVersionSelect->setEmptyString(tr("No java versions are currently available for your OS.")); + ui->javaVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + + ui->buttonBox->button(QDialogButtonBox::Retry)->setText(tr("Refresh")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Download")); + + connect(ui->majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &Downloader::setSelectedVersion); + auto reset = ui->buttonBox->button(QDialogButtonBox::Reset); + connect(reset, &QPushButton::clicked, this, &Downloader::refresh); +} + +Downloader::~Downloader() +{ + delete ui; +} + +void Downloader::setSelectedVersion(BaseVersion::Ptr version) +{ + auto dcast = std::dynamic_pointer_cast(version); + if (!dcast) { + return; + } + ui->javaVersionSelect->initialize(new Java::VersionList(dcast, this)); + ui->javaVersionSelect->selectCurrent(); +} + +void Downloader::accept() +{ + auto meta = std::dynamic_pointer_cast(ui->javaVersionSelect->selectedVersion()); + if (!meta) { + return; + } + Task::Ptr task; + auto final_path = FS::PathCombine(APPLICATION->dataRoot(), "java", meta->m_name); + switch (meta->downloadType) { + case Java::DownloadType::Manifest: + task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); + break; + case Java::DownloadType::Archive: + task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); + break; + } + auto deletePath = [final_path] { FS::deletePath(final_path); }; + connect(task.get(), &Task::failed, this, deletePath); + connect(task.get(), &Task::aborted, this, deletePath); + ProgressDialog pg(this); + pg.execWithTask(task.get()); + QDialog::accept(); +} + +void Downloader::refresh() +{ + ui->majorVersionSelect->loadList(); +} +} // namespace Java diff --git a/launcher/ui/java/JavaDownload.h b/launcher/ui/java/JavaDownloader.h similarity index 84% rename from launcher/ui/java/JavaDownload.h rename to launcher/ui/java/JavaDownloader.h index de0916ae5..b8bdde41a 100644 --- a/launcher/ui/java/JavaDownload.h +++ b/launcher/ui/java/JavaDownloader.h @@ -22,15 +22,17 @@ #include "BaseVersion.h" namespace Ui { -class JavaDownload; +class JavaDownloader; } -class JavaDownload : public QDialog { +namespace Java { + +class Downloader : public QDialog { Q_OBJECT public: - explicit JavaDownload(QWidget* parent = 0); - ~JavaDownload(); + explicit Downloader(QWidget* parent = 0); + ~Downloader(); void accept(); @@ -41,5 +43,6 @@ class JavaDownload : public QDialog { void setSelectedVersion(BaseVersion::Ptr version); private: - Ui::JavaDownload* ui; + Ui::JavaDownloader* ui; }; +} // namespace Java diff --git a/launcher/ui/java/JavaDownload.ui b/launcher/ui/java/JavaDownloader.ui similarity index 86% rename from launcher/ui/java/JavaDownload.ui rename to launcher/ui/java/JavaDownloader.ui index bbc638e9b..0eeabb26d 100644 --- a/launcher/ui/java/JavaDownload.ui +++ b/launcher/ui/java/JavaDownloader.ui @@ -1,7 +1,7 @@ - JavaDownload - + JavaDownloader + 0 @@ -23,7 +23,7 @@ - + @@ -35,7 +35,7 @@
- +
@@ -67,7 +67,7 @@ buttonBox accepted() - JavaDownload + JavaDownloader accept() @@ -83,7 +83,7 @@ buttonBox rejected() - JavaDownload + JavaDownloader reject() diff --git a/launcher/ui/java/ListModel.cpp b/launcher/ui/java/VersionList.cpp similarity index 76% rename from launcher/ui/java/ListModel.cpp rename to launcher/ui/java/VersionList.cpp index 11cd01130..31353f2f7 100644 --- a/launcher/ui/java/ListModel.cpp +++ b/launcher/ui/java/VersionList.cpp @@ -16,46 +16,46 @@ * along with this program. If not, see . */ -#include "ListModel.h" +#include "VersionList.h" #include #include "BaseVersionList.h" #include "SysInfo.h" -#include "java/JavaRuntime.h" +#include "java/JavaMetadata.h" namespace Java { -InstallList::InstallList(Meta::Version::Ptr version, QObject* parent) : BaseVersionList(parent), m_version(version) +VersionList::VersionList(Meta::Version::Ptr version, QObject* parent) : BaseVersionList(parent), m_version(version) { if (version->isLoaded()) sortVersions(); } -Task::Ptr InstallList::getLoadTask() +Task::Ptr VersionList::getLoadTask() { m_version->load(Net::Mode::Online); auto task = m_version->getCurrentTask(); - connect(task.get(), &Task::finished, this, &InstallList::sortVersions); + connect(task.get(), &Task::finished, this, &VersionList::sortVersions); return task; } -const BaseVersion::Ptr InstallList::at(int i) const +const BaseVersion::Ptr VersionList::at(int i) const { return m_vlist.at(i); } -bool InstallList::isLoaded() +bool VersionList::isLoaded() { return m_version->isLoaded(); } -int InstallList::count() const +int VersionList::count() const { return m_vlist.count(); } -QVariant InstallList::data(const QModelIndex& index, int role) const +QVariant VersionList::data(const QModelIndex& index, int role) const { if (!index.isValid()) return QVariant(); @@ -75,28 +75,28 @@ QVariant InstallList::data(const QModelIndex& index, int role) const return version->version.toString(); case RecommendedRole: return version->recommended; - case AliasRole: + case JavaNameRole: return version->name(); - case ArchitectureRole: + case CPUArchitectureRole: return version->vendor; default: return QVariant(); } } -BaseVersionList::RoleList InstallList::providesRoles() const +BaseVersionList::RoleList VersionList::providesRoles() const { - return { VersionPointerRole, VersionIdRole, VersionRole, RecommendedRole, AliasRole, ArchitectureRole }; + return { VersionPointerRole, VersionIdRole, VersionRole, RecommendedRole, JavaNameRole, CPUArchitectureRole }; } bool sortJavas(BaseVersion::Ptr left, BaseVersion::Ptr right) { - auto rleft = std::dynamic_pointer_cast(right); - auto rright = std::dynamic_pointer_cast(left); + auto rleft = std::dynamic_pointer_cast(right); + auto rright = std::dynamic_pointer_cast(left); return (*rleft) > (*rright); } -void InstallList::sortVersions() +void VersionList::sortVersions() { QString versionStr = SysInfo::getSupportedJavaArchitecture(); beginResetModel(); diff --git a/launcher/ui/java/ListModel.h b/launcher/ui/java/VersionList.h similarity index 71% rename from launcher/ui/java/ListModel.h rename to launcher/ui/java/VersionList.h index a157e0e8d..d334ed564 100644 --- a/launcher/ui/java/ListModel.h +++ b/launcher/ui/java/VersionList.h @@ -18,23 +18,17 @@ #pragma once -#include "java/JavaRuntime.h" -#include "meta/VersionList.h" +#include "BaseVersionList.h" +#include "java/JavaMetadata.h" +#include "meta/Version.h" namespace Java { -class JavaBaseVersionList : public Meta::VersionList { - Q_OBJECT - public: - explicit JavaBaseVersionList(const QString& uid, QObject* parent = nullptr) : VersionList(uid, parent) {} - BaseVersionList::RoleList providesRoles() const { return { VersionRole, RecommendedRole, VersionPointerRole }; } -}; - -class InstallList : public BaseVersionList { +class VersionList : public BaseVersionList { Q_OBJECT public: - explicit InstallList(Meta::Version::Ptr m_version, QObject* parent = 0); + explicit VersionList(Meta::Version::Ptr m_version, QObject* parent = 0); Task::Ptr getLoadTask() override; bool isLoaded() override; @@ -50,7 +44,7 @@ class InstallList : public BaseVersionList { protected: Meta::Version::Ptr m_version; - QList m_vlist; + QList m_vlist; }; } // namespace Java diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 09c951a3c..9b21aad72 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -36,7 +36,7 @@ #include "JavaPage.h" #include "JavaCommon.h" -#include "ui/java/JavaDownload.h" +#include "ui/java/JavaDownloader.h" #include "ui_JavaPage.h" #include @@ -169,7 +169,7 @@ void JavaPage::on_javaTestBtn_clicked() void JavaPage::on_javaDownloadBtn_clicked() { - auto jdialog = new JavaDownload(this); + auto jdialog = new Java::Downloader(this); jdialog->exec(); } diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index df380bfb3..b962406d1 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -36,7 +36,7 @@ */ #include "InstanceSettingsPage.h" -#include "ui/java/JavaDownload.h" +#include "ui/java/JavaDownloader.h" #include "ui_InstanceSettingsPage.h" #include @@ -387,7 +387,7 @@ void InstanceSettingsPage::loadSettings() void InstanceSettingsPage::on_javaDownloadBtn_clicked() { - auto jdialog = new JavaDownload(this); + auto jdialog = new Java::Downloader(this); jdialog->exec(); } diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index d6fbf00a3..3f4fe08ea 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -19,7 +19,7 @@ #include "java/JavaUtils.h" #include "ui/dialogs/CustomMessageBox.h" -#include "ui/java/JavaDownload.h" +#include "ui/java/JavaDownloader.h" #include "ui/widgets/VersionSelectWidget.h" #include "Application.h" @@ -274,7 +274,7 @@ void JavaSettingsWidget::on_javaBrowseBtn_clicked() } void JavaSettingsWidget::on_javaDownloadBtn_clicked() { - auto jdialog = new JavaDownload(this); + auto jdialog = new Java::Downloader(this); jdialog->exec(); } void JavaSettingsWidget::on_javaStatusBtn_clicked() From 0384e652fb42ea18526a168a2370f8431cdcbc0f Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 2 Feb 2024 22:42:42 +0200 Subject: [PATCH 042/616] Finished up the download dialog Signed-off-by: Trial97 --- launcher/BaseVersionList.cpp | 1 + launcher/BaseVersionList.h | 1 + launcher/VersionProxyModel.cpp | 9 +++++++++ launcher/VersionProxyModel.h | 2 +- launcher/ui/java/VersionList.cpp | 11 +++++++++-- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/launcher/BaseVersionList.cpp b/launcher/BaseVersionList.cpp index afee8388a..1456a17bd 100644 --- a/launcher/BaseVersionList.cpp +++ b/launcher/BaseVersionList.cpp @@ -112,5 +112,6 @@ QHash BaseVersionList::roleNames() const roles.insert(PathRole, "path"); roles.insert(JavaNameRole, "javaName"); roles.insert(CPUArchitectureRole, "architecture"); + roles.insert(JavaVendorRole, "javaVendor"); return roles; } diff --git a/launcher/BaseVersionList.h b/launcher/BaseVersionList.h index bc37e9e53..7517c71b4 100644 --- a/launcher/BaseVersionList.h +++ b/launcher/BaseVersionList.h @@ -50,6 +50,7 @@ class BaseVersionList : public QAbstractListModel { PathRole, JavaNameRole, CPUArchitectureRole, + JavaVendorRole, SortRole }; using RoleList = QList; diff --git a/launcher/VersionProxyModel.cpp b/launcher/VersionProxyModel.cpp index 070e952a4..ed4c0767d 100644 --- a/launcher/VersionProxyModel.cpp +++ b/launcher/VersionProxyModel.cpp @@ -116,6 +116,8 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, return tr("Type"); case CPUArchitecture: return tr("Architecture"); + case JavaVendor: + return tr("Vendor"); case Path: return tr("Path"); case JavaName: @@ -135,6 +137,8 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, return tr("The version's type"); case CPUArchitecture: return tr("CPU Architecture"); + case JavaVendor: + return tr("Java vendor"); case Path: return tr("Filesystem path to this version"); case JavaName: @@ -171,6 +175,8 @@ QVariant VersionProxyModel::data(const QModelIndex& index, int role) const return sourceModel()->data(parentIndex, BaseVersionList::TypeRole); case CPUArchitecture: return sourceModel()->data(parentIndex, BaseVersionList::CPUArchitectureRole); + case JavaVendor: + return sourceModel()->data(parentIndex, BaseVersionList::JavaVendorRole); case Path: return sourceModel()->data(parentIndex, BaseVersionList::PathRole); case JavaName: @@ -317,6 +323,9 @@ void VersionProxyModel::setSourceModel(QAbstractItemModel* replacingRaw) if (roles.contains(BaseVersionList::CPUArchitectureRole)) { m_columns.push_back(CPUArchitecture); } + if (roles.contains(BaseVersionList::JavaVendorRole)) { + m_columns.push_back(JavaVendor); + } if (roles.contains(BaseVersionList::PathRole)) { m_columns.push_back(Path); } diff --git a/launcher/VersionProxyModel.h b/launcher/VersionProxyModel.h index cb55b7f14..5a1017bee 100644 --- a/launcher/VersionProxyModel.h +++ b/launcher/VersionProxyModel.h @@ -9,7 +9,7 @@ class VersionFilterModel; class VersionProxyModel : public QAbstractProxyModel { Q_OBJECT public: - enum Column { Name, ParentVersion, Branch, Type, CPUArchitecture, Path, Time, JavaName }; + enum Column { Name, ParentVersion, Branch, Type, CPUArchitecture, Path, Time, JavaName, JavaVendor }; using FilterMap = QHash>; public: diff --git a/launcher/ui/java/VersionList.cpp b/launcher/ui/java/VersionList.cpp index 31353f2f7..7c5668d20 100644 --- a/launcher/ui/java/VersionList.cpp +++ b/launcher/ui/java/VersionList.cpp @@ -23,6 +23,7 @@ #include "BaseVersionList.h" #include "SysInfo.h" #include "java/JavaMetadata.h" +#include "meta/VersionList.h" namespace Java { @@ -77,8 +78,12 @@ QVariant VersionList::data(const QModelIndex& index, int role) const return version->recommended; case JavaNameRole: return version->name(); - case CPUArchitectureRole: + case JavaVendorRole: return version->vendor; + case TypeRole: + return version->packageType; + case Meta::VersionList::TimeRole: + return version->releaseTime; default: return QVariant(); } @@ -86,7 +91,8 @@ QVariant VersionList::data(const QModelIndex& index, int role) const BaseVersionList::RoleList VersionList::providesRoles() const { - return { VersionPointerRole, VersionIdRole, VersionRole, RecommendedRole, JavaNameRole, CPUArchitectureRole }; + return { VersionPointerRole, VersionIdRole, VersionRole, RecommendedRole, + JavaNameRole, JavaVendorRole, TypeRole, Meta::VersionList::TimeRole }; } bool sortJavas(BaseVersion::Ptr left, BaseVersion::Ptr right) @@ -106,6 +112,7 @@ void VersionList::sortVersions() std::sort(m_vlist.begin(), m_vlist.end(), sortJavas); } else { m_vlist = {}; + qWarning() << "Your operating system is not yet supported: " << SysInfo::currentSystem() << " " << SysInfo::useQTForArch(); } endResetModel(); } From 82b15268bc8566be4b320c24b41113f8f25c2204 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 3 Feb 2024 00:11:05 +0200 Subject: [PATCH 043/616] preparing java autodownload Signed-off-by: Trial97 --- launcher/java/JavaVersion.h | 10 +++++----- launcher/minecraft/LaunchProfile.cpp | 9 +++++++++ launcher/minecraft/LaunchProfile.h | 4 ++++ launcher/minecraft/VersionFile.cpp | 1 + launcher/ui/java/JavaDownloader.cpp | 6 +++--- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/launcher/java/JavaVersion.h b/launcher/java/JavaVersion.h index 92c743bfb..dfb4770da 100644 --- a/launcher/java/JavaVersion.h +++ b/launcher/java/JavaVersion.h @@ -30,11 +30,11 @@ class JavaVersion { QString toString() const; - int major() { return m_major; } - int minor() { return m_minor; } - int security() { return m_security; } - QString build() { return m_prerelease; } - QString name() { return m_name; } + int major() const { return m_major; } + int minor() const { return m_minor; } + int security() const { return m_security; } + QString build() const { return m_prerelease; } + QString name() const { return m_name; } private: QString m_string; diff --git a/launcher/minecraft/LaunchProfile.cpp b/launcher/minecraft/LaunchProfile.cpp index cf819b411..77072472c 100644 --- a/launcher/minecraft/LaunchProfile.cpp +++ b/launcher/minecraft/LaunchProfile.cpp @@ -164,6 +164,10 @@ void LaunchProfile::applyCompatibleJavaMajors(QList& javaMajor) { m_compatibleJavaMajors.append(javaMajor); } +void LaunchProfile::applyCompatibleJavaName(QString javaName) +{ + m_compatibleJavaName = javaName; +} void LaunchProfile::applyLibrary(LibraryPtr library, const RuntimeContext& runtimeContext) { @@ -334,6 +338,11 @@ const QList& LaunchProfile::getCompatibleJavaMajors() const return m_compatibleJavaMajors; } +const QString LaunchProfile::getCompatibleJavaName() const +{ + return m_compatibleJavaName; +} + void LaunchProfile::getLibraryFiles(const RuntimeContext& runtimeContext, QStringList& jars, QStringList& nativeJars, diff --git a/launcher/minecraft/LaunchProfile.h b/launcher/minecraft/LaunchProfile.h index 12b312383..f1be6fee0 100644 --- a/launcher/minecraft/LaunchProfile.h +++ b/launcher/minecraft/LaunchProfile.h @@ -59,6 +59,7 @@ class LaunchProfile : public ProblemProvider { void applyMavenFile(LibraryPtr library, const RuntimeContext& runtimeContext); void applyAgent(AgentPtr agent, const RuntimeContext& runtimeContext); void applyCompatibleJavaMajors(QList& javaMajor); + void applyCompatibleJavaName(QString javaName); void applyMainJar(LibraryPtr jar); void applyProblemSeverity(ProblemSeverity severity); /// clear the profile @@ -80,6 +81,7 @@ class LaunchProfile : public ProblemProvider { const QList& getMavenFiles() const; const QList& getAgents() const; const QList& getCompatibleJavaMajors() const; + const QString getCompatibleJavaName() const; const LibraryPtr getMainJar() const; void getLibraryFiles(const RuntimeContext& runtimeContext, QStringList& jars, @@ -150,5 +152,7 @@ class LaunchProfile : public ProblemProvider { /// compatible java major versions QList m_compatibleJavaMajors; + QString m_compatibleJavaName; + ProblemSeverity m_problemSeverity = ProblemSeverity::None; }; diff --git a/launcher/minecraft/VersionFile.cpp b/launcher/minecraft/VersionFile.cpp index 6632bb8bf..8ee61128f 100644 --- a/launcher/minecraft/VersionFile.cpp +++ b/launcher/minecraft/VersionFile.cpp @@ -73,6 +73,7 @@ void VersionFile::applyTo(LaunchProfile* profile, const RuntimeContext& runtimeC profile->applyMods(mods); profile->applyTraits(traits); profile->applyCompatibleJavaMajors(compatibleJavaMajors); + profile->applyCompatibleJavaName(compatibleJavaName); for (auto library : libraries) { profile->applyLibrary(library, runtimeContext); diff --git a/launcher/ui/java/JavaDownloader.cpp b/launcher/ui/java/JavaDownloader.cpp index 9121988da..3552f0ef5 100644 --- a/launcher/ui/java/JavaDownloader.cpp +++ b/launcher/ui/java/JavaDownloader.cpp @@ -45,9 +45,9 @@ namespace Java { Downloader::Downloader(QWidget* parent) : QDialog(parent), ui(new Ui::JavaDownloader) { ui->setupUi(this); - auto versionList = new Meta::VersionList("net.minecraft.java", this); + auto versionList = APPLICATION->metadataIndex()->get("net.minecraft.java"); versionList->setProvidedRoles({ BaseVersionList::VersionRole, BaseVersionList::RecommendedRole, BaseVersionList::VersionPointerRole }); - ui->majorVersionSelect->initialize(versionList); + ui->majorVersionSelect->initialize(versionList.get()); ui->majorVersionSelect->selectCurrent(); ui->majorVersionSelect->setEmptyString(tr("No java versions are currently available in the meta")); ui->majorVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); @@ -85,7 +85,7 @@ void Downloader::accept() return; } Task::Ptr task; - auto final_path = FS::PathCombine(APPLICATION->dataRoot(), "java", meta->m_name); + auto final_path = FS::PathCombine(APPLICATION->dataRoot(), "java", meta->vendor, meta->m_name); switch (meta->downloadType) { case Java::DownloadType::Manifest: task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); From ba990e075bc9bea8b03857a643005f6fe9301a34 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 8 Feb 2024 19:45:46 +0200 Subject: [PATCH 044/616] Added JavaPath function Signed-off-by: Trial97 --- launcher/Application.cpp | 7 ++++--- launcher/Application.h | 3 +++ launcher/java/JavaUtils.cpp | 28 +++++++++++++++++++++++++++- launcher/java/JavaUtils.h | 1 + launcher/ui/java/JavaDownloader.cpp | 2 +- 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 679de711e..20da46187 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -48,7 +48,6 @@ #include "net/PasteUpload.h" #include "pathmatcher/MultiMatcher.h" #include "pathmatcher/SimplePrefixMatcher.h" -#include "settings/INIFile.h" #include "ui/InstanceWindow.h" #include "ui/MainWindow.h" @@ -106,8 +105,6 @@ #include "icons/IconList.h" #include "net/HttpMetaCache.h" -#include "java/JavaUtils.h" - #include "updater/ExternalUpdater.h" #include "tools/JProfiler.h" @@ -1833,3 +1830,7 @@ QUrl Application::normalizeImportUrl(QString const& url) return QUrl::fromUserInput(url); } } +const QString Application::javaPath() +{ + return FS::PathCombine(m_dataPath, "java"); +} diff --git a/launcher/Application.h b/launcher/Application.h index 85bf2dff4..ba65edd82 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -162,6 +162,9 @@ class Application : public QApplication { /// the data path the application is using const QString& dataRoot() { return m_dataPath; } + /// the java installed path the application is using + const QString javaPath(); + bool isPortable() { return m_portable; } const Capabilities capabilities() { return m_capabilities; } diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index 67f1fd3a7..ff5ba5efe 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -337,6 +337,7 @@ QList JavaUtils::FindJavaPaths() } candidates.append(getMinecraftJavaBundle()); + candidates.append(getPrismJavaBundle()); candidates = addJavasFromEnv(candidates); candidates.removeDuplicates(); return candidates; @@ -363,6 +364,7 @@ QList JavaUtils::FindJavaPaths() javas.append(systemLibraryJVMDir.absolutePath() + "/" + java + "/Contents/Commands/java"); } javas.append(getMinecraftJavaBundle()); + javas.append(getPrismJavaBundle()); javas = addJavasFromEnv(javas); javas.removeDuplicates(); return javas; @@ -393,7 +395,6 @@ QList JavaUtils::FindJavaPaths() scanJavaDir(snap + dirPath); } }; - scanJavaDir(FS::PathCombine(APPLICATION->dataRoot(), "java")); // oracle RPMs scanJavaDirs("/usr/java"); // general locations used by distro packaging @@ -416,6 +417,7 @@ QList JavaUtils::FindJavaPaths() scanJavaDirs(FS::PathCombine(home, ".sdkman/candidates/java")); javas.append(getMinecraftJavaBundle()); + javas.append(getPrismJavaBundle()); javas = addJavasFromEnv(javas); javas.removeDuplicates(); return javas; @@ -429,6 +431,8 @@ QList JavaUtils::FindJavaPaths() javas.append(this->GetDefaultJava()->path); javas.append(getMinecraftJavaBundle()); + javas.append(getPrismJavaBundle()); + javas.removeDuplicates(); return addJavasFromEnv(javas); } #endif @@ -484,3 +488,25 @@ QStringList getMinecraftJavaBundle() } return javas; } + +QStringList getPrismJavaBundle() +{ + QList javas; + QDir dir(APPLICATION->javaPath()); + if (!dir.exists()) + return javas; + + QString executable = "java"; +#if defined(Q_OS_WIN32) + executable += "w.exe"; +#endif + + auto entries = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + for (auto& entry : entries) { + QString prefix; + prefix = entry.canonicalFilePath(); + javas.append(FS::PathCombine(prefix, "jre", "bin", executable)); + javas.append(FS::PathCombine(prefix, "bin", executable)); + } + return javas; +} diff --git a/launcher/java/JavaUtils.h b/launcher/java/JavaUtils.h index 0beb8c67a..aa5315a19 100644 --- a/launcher/java/JavaUtils.h +++ b/launcher/java/JavaUtils.h @@ -26,6 +26,7 @@ QString stripVariableEntries(QString name, QString target, QString remove); QProcessEnvironment CleanEnviroment(); QStringList getMinecraftJavaBundle(); +QStringList getPrismJavaBundle(); class JavaUtils : public QObject { Q_OBJECT diff --git a/launcher/ui/java/JavaDownloader.cpp b/launcher/ui/java/JavaDownloader.cpp index 3552f0ef5..4495210c3 100644 --- a/launcher/ui/java/JavaDownloader.cpp +++ b/launcher/ui/java/JavaDownloader.cpp @@ -85,7 +85,7 @@ void Downloader::accept() return; } Task::Ptr task; - auto final_path = FS::PathCombine(APPLICATION->dataRoot(), "java", meta->vendor, meta->m_name); + auto final_path = FS::PathCombine(APPLICATION->javaPath(), meta->m_name); switch (meta->downloadType) { case Java::DownloadType::Manifest: task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); From 3d29da916ded28e320eda2654ba42f529e682019 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 8 Feb 2024 20:15:19 +0200 Subject: [PATCH 045/616] Made Java path configurable Signed-off-by: Trial97 --- launcher/Application.cpp | 3 +- launcher/ui/pages/global/LauncherPage.cpp | 12 +++ launcher/ui/pages/global/LauncherPage.h | 1 + launcher/ui/pages/global/LauncherPage.ui | 107 +++++++++++++--------- 4 files changed, 77 insertions(+), 46 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 20da46187..cc4fc6b1c 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -586,6 +586,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_settings->registerSetting("IconsDir", "icons"); m_settings->registerSetting("DownloadsDir", QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)); m_settings->registerSetting("DownloadsDirWatchRecursive", false); + m_settings->registerSetting("JavaDir", "java"); // Editors m_settings->registerSetting("JsonEditor", QString()); @@ -1832,5 +1833,5 @@ QUrl Application::normalizeImportUrl(QString const& url) } const QString Application::javaPath() { - return FS::PathCombine(m_dataPath, "java"); + return m_settings->get("JavaDir").toString(); } diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index 78c44380a..99a80d98c 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -173,6 +173,16 @@ void LauncherPage::on_downloadsDirBrowseBtn_clicked() } } +void LauncherPage::on_javaDirBrowseBtn_clicked() +{ + QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Java Folder"), ui->javaDirTextBox->text()); + + if (!raw_dir.isEmpty() && QDir(raw_dir).exists()) { + QString cooked_dir = FS::NormalizePath(raw_dir); + ui->javaDirTextBox->setText(cooked_dir); + } +} + void LauncherPage::on_metadataDisableBtn_clicked() { ui->metadataWarningLabel->setHidden(!ui->metadataDisableBtn->isChecked()); @@ -208,6 +218,7 @@ void LauncherPage::applySettings() s->set("CentralModsDir", ui->modsDirTextBox->text()); s->set("IconsDir", ui->iconsDirTextBox->text()); s->set("DownloadsDir", ui->downloadsDirTextBox->text()); + s->set("JavaDir", ui->javaDirTextBox->text()); s->set("DownloadsDirWatchRecursive", ui->downloadsDirWatchRecursiveCheckBox->isChecked()); auto sortMode = (InstSortMode)ui->sortingModeGroup->checkedId(); @@ -269,6 +280,7 @@ void LauncherPage::loadSettings() ui->modsDirTextBox->setText(s->get("CentralModsDir").toString()); ui->iconsDirTextBox->setText(s->get("IconsDir").toString()); ui->downloadsDirTextBox->setText(s->get("DownloadsDir").toString()); + ui->javaDirTextBox->setText(s->get("JavaDir").toString()); ui->downloadsDirWatchRecursiveCheckBox->setChecked(s->get("DownloadsDirWatchRecursive").toBool()); QString sortMode = s->get("InstSortMode").toString(); diff --git a/launcher/ui/pages/global/LauncherPage.h b/launcher/ui/pages/global/LauncherPage.h index e733224d2..32945626f 100644 --- a/launcher/ui/pages/global/LauncherPage.h +++ b/launcher/ui/pages/global/LauncherPage.h @@ -74,6 +74,7 @@ class LauncherPage : public QWidget, public BasePage { void on_modsDirBrowseBtn_clicked(); void on_iconsDirBrowseBtn_clicked(); void on_downloadsDirBrowseBtn_clicked(); + void on_javaDirBrowseBtn_clicked(); void on_metadataDisableBtn_clicked(); /*! diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui index 18b52e1b8..81acb0a17 100644 --- a/launcher/ui/pages/global/LauncherPage.ui +++ b/launcher/ui/pages/global/LauncherPage.ui @@ -7,7 +7,7 @@ 0 0 511 - 629 + 654 @@ -67,13 +67,20 @@ Folders - - + + - &Downloads: + Browse - - downloadsDirTextBox + + + + + + When enabled, in addition to the downloads folder, its sub folders will also be searched when looking for resources (e.g. when looking for blocked mods on CurseForge). + + + Check downloads folder recursively @@ -87,25 +94,52 @@ - - - - - - - - - - + Browse + + + + + + + Browse + + + + + + + + + + + + + &Icons: + + + iconsDirTextBox + + + + + + + &Downloads: + + + downloadsDirTextBox + + + @@ -123,40 +157,23 @@ - - + + + + Java: + + + + + + + + Browse - - - - Browse - - - - - - - &Icons: - - - iconsDirTextBox - - - - - - - When enabled, in addition to the downloads folder, its sub folders will also be searched when looking for resources (e.g. when looking for blocked mods on CurseForge). - - - Check downloads folder recursively - - -
From b3fc07d44478aa7fc841c88fe9160c462b05577a Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 8 Feb 2024 21:47:59 +0200 Subject: [PATCH 046/616] Added extra java search paths Signed-off-by: Trial97 --- launcher/Application.cpp | 1 + launcher/java/JavaUtils.cpp | 27 ++++++++--- launcher/ui/pages/global/JavaPage.cpp | 29 ++++++++++- launcher/ui/pages/global/JavaPage.h | 5 +- launcher/ui/pages/global/JavaPage.ui | 69 +++++++++++++++++++++++++-- 5 files changed, 119 insertions(+), 12 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index cc4fc6b1c..d9abccfdc 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -629,6 +629,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_settings->registerSetting("JvmArgs", ""); m_settings->registerSetting("IgnoreJavaCompatibility", false); m_settings->registerSetting("IgnoreJavaWizard", false); + m_settings->registerSetting("JavaExtraSearchPaths", QStringList()); // Legacy settings m_settings->registerSetting("OnlineFixes", false); diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index ff5ba5efe..cd9593980 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -492,21 +492,34 @@ QStringList getMinecraftJavaBundle() QStringList getPrismJavaBundle() { QList javas; - QDir dir(APPLICATION->javaPath()); - if (!dir.exists()) - return javas; QString executable = "java"; #if defined(Q_OS_WIN32) executable += "w.exe"; #endif - auto entries = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); - for (auto& entry : entries) { - QString prefix; - prefix = entry.canonicalFilePath(); + auto scanDir = [&](QString prefix) { javas.append(FS::PathCombine(prefix, "jre", "bin", executable)); javas.append(FS::PathCombine(prefix, "bin", executable)); + javas.append(FS::PathCombine(prefix, executable)); + }; + auto scanJavaDir = [&](const QString& dirPath) { + QDir dir(dirPath); + if (!dir.exists()) + return; + auto entries = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + for (auto& entry : entries) { + scanDir(entry.canonicalFilePath()); + } + }; + + scanJavaDir(APPLICATION->javaPath()); + + auto extra_paths = APPLICATION->settings()->get("JavaExtraSearchPaths").toStringList(); + for (auto& entry : extra_paths) { + scanDir(entry); + scanJavaDir(entry); } + return javas; } diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 9b21aad72..6d278983d 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include "ui/dialogs/VersionSelectDialog.h" @@ -57,7 +58,6 @@ JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage) { ui->setupUi(this); - ui->tabWidget->tabBar()->hide(); loadSettings(); updateThresholds(); @@ -95,6 +95,7 @@ void JavaPage::applySettings() s->set("JvmArgs", ui->jvmArgsTextBox->toPlainText().replace("\n", " ")); s->set("IgnoreJavaCompatibility", ui->skipCompatibilityCheckbox->isChecked()); s->set("IgnoreJavaWizard", ui->skipJavaWizardCheckbox->isChecked()); + s->set("JavaExtraSearchPaths", m_extra_paths->stringList()); JavaCommon::checkJVMArgs(s->get("JvmArgs").toString(), this->parentWidget()); } void JavaPage::loadSettings() @@ -117,6 +118,8 @@ void JavaPage::loadSettings() ui->jvmArgsTextBox->setPlainText(s->get("JvmArgs").toString()); ui->skipCompatibilityCheckbox->setChecked(s->get("IgnoreJavaCompatibility").toBool()); ui->skipJavaWizardCheckbox->setChecked(s->get("IgnoreJavaWizard").toBool()); + m_extra_paths = new QStringListModel(s->get("JavaExtraSearchPaths").toStringList()); + ui->extraJavaPathsList->setModel(m_extra_paths); } void JavaPage::on_javaDetectBtn_clicked() @@ -217,3 +220,27 @@ void JavaPage::updateThresholds() ui->labelMaxMemIcon->setPixmap(pix); } } + +void JavaPage::on_addExtraPathButton_clicked() +{ + QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Add Extra Java Folder")); + + if (!raw_dir.isEmpty() && QDir(raw_dir).exists()) { + QString cooked_dir = FS::NormalizePath(raw_dir); + auto currentList = m_extra_paths->stringList(); + if (!currentList.contains(cooked_dir)) { + currentList << cooked_dir; + m_extra_paths->setStringList(currentList); + } + } + APPLICATION->settings()->set("JavaExtraSearchPaths", m_extra_paths->stringList()); +} + +void JavaPage::on_removeExtraPathButton_clicked() +{ + auto indexes = ui->extraJavaPathsList->selectionModel()->selectedIndexes(); + if (indexes.size()) { + m_extra_paths->removeRow(indexes.first().row()); + } + APPLICATION->settings()->set("JavaExtraSearchPaths", m_extra_paths->stringList()); +} diff --git a/launcher/ui/pages/global/JavaPage.h b/launcher/ui/pages/global/JavaPage.h index 2bbfdf6bf..d1315db64 100644 --- a/launcher/ui/pages/global/JavaPage.h +++ b/launcher/ui/pages/global/JavaPage.h @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include "JavaCommon.h" #include "ui/pages/BasePage.h" @@ -73,10 +73,13 @@ class JavaPage : public QWidget, public BasePage { void on_javaTestBtn_clicked(); void on_javaBrowseBtn_clicked(); void on_javaDownloadBtn_clicked(); + void on_addExtraPathButton_clicked(); + void on_removeExtraPathButton_clicked(); void on_maxMemSpinBox_valueChanged(int i); void checkerFinished(); private: Ui::JavaPage* ui; unique_qobject_ptr checker; + QStringListModel* m_extra_paths; }; diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index 382c183c9..d57e2e548 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -32,11 +32,11 @@ - 0 + 1 - + - Tab 1 + General @@ -312,6 +312,69 @@ + + + Management + + + + + + Java extra paths + + + + + + + + + + + Add + + + + + + + Remove + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + +
From 379f1a70e99a9a629c3cb174a1ad596fcb79a3cb Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 8 Feb 2024 22:37:57 +0200 Subject: [PATCH 047/616] Leave headers alone Signed-off-by: Trial97 --- launcher/Application.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index d9abccfdc..498427856 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -48,6 +48,7 @@ #include "net/PasteUpload.h" #include "pathmatcher/MultiMatcher.h" #include "pathmatcher/SimplePrefixMatcher.h" +#include "settings/INIFile.h" #include "ui/InstanceWindow.h" #include "ui/MainWindow.h" @@ -105,6 +106,8 @@ #include "icons/IconList.h" #include "net/HttpMetaCache.h" +#include "java/JavaUtils.h" + #include "updater/ExternalUpdater.h" #include "tools/JProfiler.h" From 0a3303bcbdabbc2e5e1338dabfb3b8cf518d29e4 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 9 Feb 2024 21:07:12 +0200 Subject: [PATCH 048/616] Added button to add extra java path to the Java Wizzard Signed-off-by: Trial97 --- launcher/ui/dialogs/VersionSelectDialog.h | 4 ---- launcher/ui/widgets/JavaSettingsWidget.cpp | 27 ++++++++++++++++++++-- launcher/ui/widgets/JavaSettingsWidget.h | 5 +++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/launcher/ui/dialogs/VersionSelectDialog.h b/launcher/ui/dialogs/VersionSelectDialog.h index 0ccd45e74..17efc1b93 100644 --- a/launcher/ui/dialogs/VersionSelectDialog.h +++ b/launcher/ui/dialogs/VersionSelectDialog.h @@ -26,10 +26,6 @@ class QDialogButtonBox; class VersionSelectWidget; class QPushButton; -namespace Ui { -class VersionSelectDialog; -} - class VersionProxyModel; class VersionSelectDialog : public QDialog { diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 3f4fe08ea..bb57e5da7 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -42,6 +42,7 @@ JavaSettingsWidget::JavaSettingsWidget(QWidget* parent) : QWidget(parent) connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaSettingsWidget::javaPathEdited); connect(m_javaStatusBtn, &QToolButton::clicked, this, &JavaSettingsWidget::on_javaStatusBtn_clicked); connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaDownloadBtn_clicked); + connect(m_addJavaPathBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_addJavaPathBtn_clicked); } void JavaSettingsWidget::setupUi() @@ -124,9 +125,16 @@ void JavaSettingsWidget::setupUi() m_verticalLayout->addWidget(m_memoryGroupBox); - m_javaDownloadBtn = new QPushButton(tr("Download Java"), this); + m_horizontalBtnLayout = new QHBoxLayout(); + m_horizontalBtnLayout->setObjectName(QStringLiteral("horizontalBtnLayout")); - m_verticalLayout->addWidget(m_javaDownloadBtn); + m_javaDownloadBtn = new QPushButton(tr("Download Java"), this); + m_horizontalBtnLayout->addWidget(m_javaDownloadBtn); + + m_addJavaPathBtn = new QPushButton(tr("Add extra Java path"), this); + m_horizontalBtnLayout->addWidget(m_addJavaPathBtn); + + m_verticalLayout->addLayout(m_horizontalBtnLayout); retranslate(); } @@ -437,3 +445,18 @@ void JavaSettingsWidget::updateThresholds() m_labelMaxMemIcon->setPixmap(pix); } } + +void JavaSettingsWidget::on_addJavaPathBtn_clicked() +{ + QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Add Extra Java Folder")); + + auto currentList = APPLICATION->settings()->get("JavaExtraSearchPaths").toStringList(); + if (!raw_dir.isEmpty() && QDir(raw_dir).exists()) { + QString cooked_dir = FS::NormalizePath(raw_dir); + if (!currentList.contains(cooked_dir)) { + currentList << cooked_dir; + } + } + APPLICATION->settings()->set("JavaExtraSearchPaths", currentList); + refresh(); +} diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index b7db955a4..385a9256a 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -25,7 +25,7 @@ class JavaSettingsWidget : public QWidget { public: explicit JavaSettingsWidget(QWidget* parent); - virtual ~JavaSettingsWidget(){}; + virtual ~JavaSettingsWidget() = default; enum class JavaStatus { NotSet, Pending, Good, DoesNotExist, DoesNotStart, ReturnedInvalidData } javaStatus = JavaStatus::NotSet; @@ -51,6 +51,7 @@ class JavaSettingsWidget : public QWidget { void on_javaBrowseBtn_clicked(); void on_javaStatusBtn_clicked(); void on_javaDownloadBtn_clicked(); + void on_addJavaPathBtn_clicked(); void checkFinished(const JavaChecker::Result& result); protected: /* methods */ @@ -78,7 +79,9 @@ class JavaSettingsWidget : public QWidget { QLabel* m_labelPermGen = nullptr; QSpinBox* m_permGenSpinBox = nullptr; + QHBoxLayout* m_horizontalBtnLayout = nullptr; QPushButton* m_javaDownloadBtn = nullptr; + QPushButton* m_addJavaPathBtn = nullptr; QIcon goodIcon; QIcon yellowIcon; QIcon badIcon; From 27d662e64241a75eee963048a669398a5083f7ed Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 9 Feb 2024 22:47:39 +0200 Subject: [PATCH 049/616] Added management for downloaded javas from prism Signed-off-by: Trial97 --- launcher/java/JavaInstallList.cpp | 10 +++-- launcher/java/JavaInstallList.h | 6 ++- launcher/java/JavaUtils.cpp | 31 ++++++++++++++ launcher/java/JavaUtils.h | 1 + launcher/ui/pages/global/JavaPage.cpp | 40 ++++++++++++++++++ launcher/ui/pages/global/JavaPage.h | 2 + launcher/ui/pages/global/JavaPage.ui | 60 ++++++++++++++++++++++++++- 7 files changed, 143 insertions(+), 7 deletions(-) diff --git a/launcher/java/JavaInstallList.cpp b/launcher/java/JavaInstallList.cpp index d99201f24..4172ba2cf 100644 --- a/launcher/java/JavaInstallList.cpp +++ b/launcher/java/JavaInstallList.cpp @@ -46,7 +46,9 @@ #include "java/JavaUtils.h" #include "tasks/ConcurrentTask.h" -JavaInstallList::JavaInstallList(QObject* parent) : BaseVersionList(parent) {} +JavaInstallList::JavaInstallList(QObject* parent, bool onlyManagedVersions) + : BaseVersionList(parent), m_only_managed_versions(onlyManagedVersions) +{} Task::Ptr JavaInstallList::getLoadTask() { @@ -66,7 +68,7 @@ void JavaInstallList::load() { if (m_status != Status::InProgress) { m_status = Status::InProgress; - m_load_task.reset(new JavaListLoadTask(this)); + m_load_task.reset(new JavaListLoadTask(this, m_only_managed_versions)); m_load_task->start(); } } @@ -148,7 +150,7 @@ void JavaInstallList::sortVersions() endResetModel(); } -JavaListLoadTask::JavaListLoadTask(JavaInstallList* vlist) : Task() +JavaListLoadTask::JavaListLoadTask(JavaInstallList* vlist, bool onlyManagedVersions) : Task(), m_only_managed_versions(onlyManagedVersions) { m_list = vlist; m_current_recommended = NULL; @@ -159,7 +161,7 @@ void JavaListLoadTask::executeTask() setStatus(tr("Detecting Java installations...")); JavaUtils ju; - QList candidate_paths = ju.FindJavaPaths(); + QList candidate_paths = m_only_managed_versions ? getPrismJavaBundle() : ju.FindJavaPaths(); ConcurrentTask::Ptr job(new ConcurrentTask(this, "Java detection", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); m_job.reset(job); diff --git a/launcher/java/JavaInstallList.h b/launcher/java/JavaInstallList.h index 08f0b310d..c68c2a3be 100644 --- a/launcher/java/JavaInstallList.h +++ b/launcher/java/JavaInstallList.h @@ -33,7 +33,7 @@ class JavaInstallList : public BaseVersionList { enum class Status { NotDone, InProgress, Done }; public: - explicit JavaInstallList(QObject* parent = 0); + explicit JavaInstallList(QObject* parent = 0, bool onlyManagedVersions = false); Task::Ptr getLoadTask() override; bool isLoaded() override; @@ -55,13 +55,14 @@ class JavaInstallList : public BaseVersionList { Status m_status = Status::NotDone; shared_qobject_ptr m_load_task; QList m_vlist; + bool m_only_managed_versions; }; class JavaListLoadTask : public Task { Q_OBJECT public: - explicit JavaListLoadTask(JavaInstallList* vlist); + explicit JavaListLoadTask(JavaInstallList* vlist, bool onlyManagedVersions = false); virtual ~JavaListLoadTask() = default; protected: @@ -74,4 +75,5 @@ class JavaListLoadTask : public Task { JavaInstallList* m_list; JavaInstall* m_current_recommended; QList m_results; + bool m_only_managed_versions; }; diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index cd9593980..1d254e405 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -338,6 +338,7 @@ QList JavaUtils::FindJavaPaths() candidates.append(getMinecraftJavaBundle()); candidates.append(getPrismJavaBundle()); + candidates.append(getPrismExtraJavaPaths()); candidates = addJavasFromEnv(candidates); candidates.removeDuplicates(); return candidates; @@ -365,6 +366,7 @@ QList JavaUtils::FindJavaPaths() } javas.append(getMinecraftJavaBundle()); javas.append(getPrismJavaBundle()); + javas.append(getPrismExtraJavaPaths()); javas = addJavasFromEnv(javas); javas.removeDuplicates(); return javas; @@ -418,6 +420,7 @@ QList JavaUtils::FindJavaPaths() javas.append(getMinecraftJavaBundle()); javas.append(getPrismJavaBundle()); + javas.append(getPrismExtraJavaPaths()); javas = addJavasFromEnv(javas); javas.removeDuplicates(); return javas; @@ -432,6 +435,7 @@ QList JavaUtils::FindJavaPaths() javas.append(getMinecraftJavaBundle()); javas.append(getPrismJavaBundle()); + javas.append(getPrismExtraJavaPaths()); javas.removeDuplicates(); return addJavasFromEnv(javas); } @@ -515,6 +519,33 @@ QStringList getPrismJavaBundle() scanJavaDir(APPLICATION->javaPath()); + return javas; +} + +QStringList getPrismExtraJavaPaths() +{ + QList javas; + + QString executable = "java"; +#if defined(Q_OS_WIN32) + executable += "w.exe"; +#endif + + auto scanDir = [&](QString prefix) { + javas.append(FS::PathCombine(prefix, "jre", "bin", executable)); + javas.append(FS::PathCombine(prefix, "bin", executable)); + javas.append(FS::PathCombine(prefix, executable)); + }; + auto scanJavaDir = [&](const QString& dirPath) { + QDir dir(dirPath); + if (!dir.exists()) + return; + auto entries = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + for (auto& entry : entries) { + scanDir(entry.canonicalFilePath()); + } + }; + auto extra_paths = APPLICATION->settings()->get("JavaExtraSearchPaths").toStringList(); for (auto& entry : extra_paths) { scanDir(entry); diff --git a/launcher/java/JavaUtils.h b/launcher/java/JavaUtils.h index aa5315a19..66e439834 100644 --- a/launcher/java/JavaUtils.h +++ b/launcher/java/JavaUtils.h @@ -27,6 +27,7 @@ QString stripVariableEntries(QString name, QString target, QString remove); QProcessEnvironment CleanEnviroment(); QStringList getMinecraftJavaBundle(); QStringList getPrismJavaBundle(); +QStringList getPrismExtraJavaPaths(); class JavaUtils : public QObject { Q_OBJECT diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 6d278983d..7d7530e35 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -36,6 +36,8 @@ #include "JavaPage.h" #include "JavaCommon.h" +#include "java/JavaInstall.h" +#include "ui/dialogs/CustomMessageBox.h" #include "ui/java/JavaDownloader.h" #include "ui_JavaPage.h" @@ -59,6 +61,11 @@ JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage) { ui->setupUi(this); + ui->managedJavaList->initialize(new JavaInstallList(this, true)); + ui->managedJavaList->selectCurrent(); + ui->managedJavaList->setEmptyString(tr("No java versions are currently available in the meta")); + ui->managedJavaList->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + loadSettings(); updateThresholds(); } @@ -244,3 +251,36 @@ void JavaPage::on_removeExtraPathButton_clicked() } APPLICATION->settings()->set("JavaExtraSearchPaths", m_extra_paths->stringList()); } + +void JavaPage::on_downloadJavaButton_clicked() +{ + on_javaDownloadBtn_clicked(); +} + +void JavaPage::on_removeJavaButton_clicked() +{ + auto version = ui->managedJavaList->selectedVersion(); + auto dcast = std::dynamic_pointer_cast(version); + if (!dcast) { + return; + } + QDir dir(APPLICATION->javaPath()); + + auto entries = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + for (auto& entry : entries) { + if (dcast->path.startsWith(entry.canonicalFilePath())) { + auto response = CustomMessageBox::selectable(this, tr("Confirm Deletion"), + tr("You are about to remove \"%1\" java version.\n" + "Are you sure?") + .arg(entry.fileName()), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); + + if (response == QMessageBox::Yes) { + FS::deletePath(entry.canonicalFilePath()); + ui->managedJavaList->loadList(); + } + break; + } + } +} diff --git a/launcher/ui/pages/global/JavaPage.h b/launcher/ui/pages/global/JavaPage.h index d1315db64..03d14b824 100644 --- a/launcher/ui/pages/global/JavaPage.h +++ b/launcher/ui/pages/global/JavaPage.h @@ -75,6 +75,8 @@ class JavaPage : public QWidget, public BasePage { void on_javaDownloadBtn_clicked(); void on_addExtraPathButton_clicked(); void on_removeExtraPathButton_clicked(); + void on_downloadJavaButton_clicked(); + void on_removeJavaButton_clicked(); void on_maxMemSpinBox_valueChanged(int i); void checkerFinished(); diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index d57e2e548..a518b0b14 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -32,7 +32,7 @@ - 1 + 0 @@ -317,6 +317,56 @@ Management + + + + Downloaded Java Versions + + + + + + + 0 + 0 + + + + + + + + + + Download + + + + + + + Remove + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + @@ -379,6 +429,14 @@ + + + VersionSelectWidget + QWidget +
ui/widgets/VersionSelectWidget.h
+ 1 +
+
minMemSpinBox maxMemSpinBox From c0fb053ccc966045df42e8b218a994cfcfdef986 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 9 Feb 2024 23:14:49 +0200 Subject: [PATCH 050/616] Added warning for x86 java Signed-off-by: Trial97 --- launcher/java/JavaInstall.h | 1 + launcher/java/JavaInstallList.cpp | 1 + launcher/ui/pages/global/JavaPage.cpp | 8 ++++++++ launcher/ui/pages/instance/InstanceSettingsPage.cpp | 10 ++++++++++ launcher/ui/widgets/JavaSettingsWidget.cpp | 4 ++++ 5 files changed, 24 insertions(+) diff --git a/launcher/java/JavaInstall.h b/launcher/java/JavaInstall.h index 8c2743a00..6890264f3 100644 --- a/launcher/java/JavaInstall.h +++ b/launcher/java/JavaInstall.h @@ -40,6 +40,7 @@ struct JavaInstall : public BaseVersion { QString arch; QString path; bool recommended = false; + bool is_64bit = false; }; using JavaInstallPtr = std::shared_ptr; diff --git a/launcher/java/JavaInstallList.cpp b/launcher/java/JavaInstallList.cpp index 4172ba2cf..569fda306 100644 --- a/launcher/java/JavaInstallList.cpp +++ b/launcher/java/JavaInstallList.cpp @@ -193,6 +193,7 @@ void JavaListLoadTask::javaCheckerFinished() javaVersion->id = result.javaVersion; javaVersion->arch = result.realPlatform; javaVersion->path = result.path; + javaVersion->is_64bit = result.is_64bit; candidates.append(javaVersion); qDebug() << " " << javaVersion->id.toString() << javaVersion->arch << javaVersion->path; diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 7d7530e35..9b2aa7637 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -145,6 +145,14 @@ void JavaPage::on_javaDetectBtn_clicked() if (vselect.result() == QDialog::Accepted && vselect.selectedVersion()) { java = std::dynamic_pointer_cast(vselect.selectedVersion()); ui->javaPathTextBox->setText(java->path); + if (!java->is_64bit && APPLICATION->settings()->get("MaxMemAlloc").toInt() > 2048) { + CustomMessageBox::selectable(this, tr("Confirm Selection"), + tr("You selected an x86 java version.\n" + "This means that will not support more than 2Gb(2048Mb) of ram.\n" + "Please make sure that the maximum memory value is lower."), + QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok) + ->exec(); + } } } diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index b962406d1..926e48952 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -36,6 +36,7 @@ */ #include "InstanceSettingsPage.h" +#include "ui/dialogs/CustomMessageBox.h" #include "ui/java/JavaDownloader.h" #include "ui_InstanceSettingsPage.h" @@ -412,6 +413,15 @@ void InstanceSettingsPage::on_javaDetectBtn_clicked() ui->labelPermGen->setVisible(visible); ui->labelPermgenNote->setVisible(visible); m_settings->set("PermGenVisible", visible); + + if (!java->is_64bit && m_settings->get("MaxMemAlloc").toInt() > 2048) { + CustomMessageBox::selectable(this, tr("Confirm Selection"), + tr("You selected an x86 java version.\n" + "This means that will not support more than 2Gb(2048Mb) of ram.\n" + "Please make sure that the maximum memory value is lower."), + QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok) + ->exec(); + } } } diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index bb57e5da7..507c632d5 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -433,6 +433,10 @@ void JavaSettingsWidget::updateThresholds() } else if (observedMaxMemory < observedMinMemory) { iconName = "status-yellow"; m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value")); + } else if (observedMaxMemory > 2048 && m_result.is_64bit) { + iconName = "status-bad"; + m_labelMaxMemIcon->setToolTip( + tr("Your maximum memory allocation exceeds selected java posible memory(due to x86 applicatiion limitations).")); } else { iconName = "status-good"; m_labelMaxMemIcon->setToolTip(""); From 2941307581114c435a2950df59e8ddc2c3c7c0c4 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 16 Feb 2024 23:42:39 +0200 Subject: [PATCH 051/616] Added basic java auto-detect and auto-download Signed-off-by: Trial97 --- launcher/Application.cpp | 2 + launcher/CMakeLists.txt | 2 + launcher/minecraft/MinecraftInstance.cpp | 12 +- launcher/minecraft/launch/AutoInstallJava.cpp | 192 ++++++++++++++++++ launcher/minecraft/launch/AutoInstallJava.h | 67 ++++++ .../minecraft/launch/VerifyJavaInstall.cpp | 45 +--- launcher/ui/pages/global/JavaPage.cpp | 4 + launcher/ui/pages/global/JavaPage.ui | 66 +++--- 8 files changed, 325 insertions(+), 65 deletions(-) create mode 100644 launcher/minecraft/launch/AutoInstallJava.cpp create mode 100644 launcher/minecraft/launch/AutoInstallJava.h diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 498427856..6b7333972 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -633,6 +633,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_settings->registerSetting("IgnoreJavaCompatibility", false); m_settings->registerSetting("IgnoreJavaWizard", false); m_settings->registerSetting("JavaExtraSearchPaths", QStringList()); + m_settings->registerSetting("AutomaticJavaSwitch", false); + m_settings->registerSetting("AutomaticJavaDownload", false); // Legacy settings m_settings->registerSetting("OnlineFixes", false); diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index c7945d1b8..fcc3c2f3a 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -281,6 +281,8 @@ set(MINECRAFT_SOURCES minecraft/launch/ScanModFolders.h minecraft/launch/VerifyJavaInstall.cpp minecraft/launch/VerifyJavaInstall.h + minecraft/launch/AutoInstallJava.cpp + minecraft/launch/AutoInstallJava.h minecraft/GradleSpecifier.h minecraft/MinecraftInstance.cpp diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 4229f73eb..00ce405aa 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -38,6 +38,8 @@ #include "MinecraftInstance.h" #include "Application.h" #include "BuildConfig.h" +#include "QObjectPtr.h" +#include "minecraft/launch/AutoInstallJava.h" #include "minecraft/launch/CreateGameFolders.h" #include "minecraft/launch/ExtractNatives.h" #include "minecraft/launch/PrintInstanceInfo.h" @@ -1041,11 +1043,6 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt process->appendStep(makeShared(pptr, "Minecraft folder is:\n" + gameRoot() + "\n\n", MessageLevel::Launcher)); } - // check java - { - process->appendStep(makeShared(pptr)); - } - // create the .minecraft folder and server-resource-packs (workaround for Minecraft bug MCL-3732) { process->appendStep(makeShared(pptr)); @@ -1105,6 +1102,11 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt { process->appendStep(makeShared(pptr)); } + // check java + { + process->appendStep(makeShared(pptr)); + process->appendStep(makeShared(pptr)); + } // verify that minimum Java requirements are met { diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp new file mode 100644 index 000000000..0d3740c93 --- /dev/null +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (C) 2022 Sefa Eyeoglu + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "AutoInstallJava.h" +#include +#include +#include + +#include "Application.h" +#include "FileSystem.h" +#include "MessageLevel.h" +#include "SysInfo.h" +#include "java/JavaInstall.h" +#include "java/JavaInstallList.h" +#include "java/JavaVersion.h" +#include "java/download/ArchiveDownloadTask.h" +#include "java/download/ManifestDownloadTask.h" +#include "meta/Index.h" +#include "minecraft/MinecraftInstance.h" +#include "minecraft/PackProfile.h" +#include "net/Mode.h" + +AutoInstallJava::AutoInstallJava(LaunchTask* parent) + : LaunchStep(parent) + , m_instance(std::dynamic_pointer_cast(m_parent->instance())) + , m_supported_arch(SysInfo::getSupportedJavaArchitecture()){}; + +void AutoInstallJava::executeTask() +{ + auto settings = m_instance->settings(); + if (!APPLICATION->settings()->get("AutomaticJavaSwitch").toBool() || + (settings->get("OverrideJava").toBool() && settings->get("OverrideJavaLocation").toBool())) { + emitSucceeded(); + return; + } + auto packProfile = m_instance->getPackProfile(); + if (!APPLICATION->settings()->get("AutomaticJavaDownload").toBool()) { + auto javas = APPLICATION->javalist().get(); + m_current_task = javas->getLoadTask(); + connect(m_current_task.get(), &Task::finished, this, [this, javas, packProfile] { + for (auto i = 0; i < javas->count(); i++) { + auto java = std::dynamic_pointer_cast(javas->at(i)); + if (java && packProfile->getProfile()->getCompatibleJavaMajors().contains(java->id.major())) { + setJavaPath(java->path); + return; + } + } + emit logLine(tr("No comptatible java version was found. Using the default one."), MessageLevel::Warning); + emitSucceeded(); + }); + return; + } + auto wantedJavaName = packProfile->getProfile()->getCompatibleJavaName(); + QDir javaDir(APPLICATION->javaPath()); + auto wantedJavaPath = javaDir.absoluteFilePath(wantedJavaName); + if (QFileInfo::exists(wantedJavaPath)) { + setJavaPathFromPartial(); + return; + } + auto versionList = APPLICATION->metadataIndex()->get("net.minecraft.java"); + m_current_task = versionList->getLoadTask(); + connect(m_current_task.get(), &Task::succeeded, this, &AutoInstallJava::tryNextMajorJava); + connect(m_current_task.get(), &Task::failed, this, &AutoInstallJava::emitFailed); +} + +void AutoInstallJava::setJavaPath(QString path) +{ + auto settings = m_instance->settings(); + settings->set("OverrideJava", true); + settings->set("OverrideJavaLocation", true); + settings->set("JavaPath", path); + emit logLine(tr("Compatible java found at: %1.").arg(path), MessageLevel::Info); + emitSucceeded(); +} + +void AutoInstallJava::setJavaPathFromPartial() +{ + QString executable = "java"; +#if defined(Q_OS_WIN32) + executable += "w.exe"; +#endif + auto packProfile = m_instance->getPackProfile(); + auto javaName = packProfile->getProfile()->getCompatibleJavaName(); + QDir javaDir(APPLICATION->javaPath()); + // just checking if the executable is there should suffice + // but if needed this can be achieved through refreshing the javalist + // and retrieving the path that contains the java name + auto relativeBinary = FS::PathCombine(javaName, "bin", executable); + auto finalPath = javaDir.absoluteFilePath(relativeBinary); + if (QFileInfo::exists(finalPath)) { + setJavaPath(finalPath); + } else { + emit logLine(tr("No comptatible java version was found. Using the default one."), MessageLevel::Warning); + emitSucceeded(); + } + return; +} + +void AutoInstallJava::downloadJava(Meta::Version::Ptr version, QString javaName) +{ + auto runtimes = version->data()->runtimes; + if (runtimes.contains(m_supported_arch)) { + for (auto java : runtimes.value(m_supported_arch)) { + if (java->name() == javaName) { + Task::Ptr task; + QDir javaDir(APPLICATION->javaPath()); + auto final_path = javaDir.absoluteFilePath(java->m_name); + switch (java->downloadType) { + case Java::DownloadType::Manifest: + task = makeShared(java->url, final_path, java->checksumType, java->checksumHash); + break; + case Java::DownloadType::Archive: + task = makeShared(java->url, final_path, java->checksumType, java->checksumHash); + break; + } + QEventLoop loop; + auto deletePath = [final_path] { FS::deletePath(final_path); }; + connect(task.get(), &Task::failed, this, [this, deletePath](QString reason) { + deletePath(); + emitFailed(reason); + }); + connect(this, &Task::aborted, this, [task, deletePath] { + task->abort(); + deletePath(); + }); + connect(task.get(), &Task::succeeded, this, &AutoInstallJava::setJavaPathFromPartial); + task->start(); + return; + } + } + } + tryNextMajorJava(); +} + +void AutoInstallJava::tryNextMajorJava() +{ + if (!isRunning()) + return; + auto versionList = APPLICATION->metadataIndex()->get("net.minecraft.java"); + auto packProfile = m_instance->getPackProfile(); + auto wantedJavaName = packProfile->getProfile()->getCompatibleJavaName(); + auto majorJavaVersions = packProfile->getProfile()->getCompatibleJavaMajors(); + if (m_majorJavaVersionIndex >= majorJavaVersions.length()) { + emit logLine(tr("No comptatible java version was found. Using the default one."), MessageLevel::Warning); + emitSucceeded(); + return; + } + auto majorJavaVersion = majorJavaVersions[m_majorJavaVersionIndex]; + m_majorJavaVersionIndex++; + + auto javaMajor = versionList->getVersion(QString("java%1").arg(majorJavaVersion)); + javaMajor->load(Net::Mode::Online); + auto task = javaMajor->getCurrentTask(); + if (javaMajor->isLoaded() || !task) { + downloadJava(javaMajor, wantedJavaName); + } else { + connect(task.get(), &Task::succeeded, this, [this, javaMajor, wantedJavaName] { downloadJava(javaMajor, wantedJavaName); }); + connect(task.get(), &Task::failed, this, &AutoInstallJava::tryNextMajorJava); + } +} diff --git a/launcher/minecraft/launch/AutoInstallJava.h b/launcher/minecraft/launch/AutoInstallJava.h new file mode 100644 index 000000000..4dcd3796a --- /dev/null +++ b/launcher/minecraft/launch/AutoInstallJava.h @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (C) 2022 Sefa Eyeoglu + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include "java/JavaMetadata.h" +#include "meta/Version.h" +#include "minecraft/MinecraftInstance.h" +#include "tasks/Task.h" + +class AutoInstallJava : public LaunchStep { + Q_OBJECT + + public: + explicit AutoInstallJava(LaunchTask* parent); + ~AutoInstallJava() override = default; + + void executeTask() override; + bool canAbort() const override { return m_current_task ? m_current_task->canAbort() : false; } + + protected: + void setJavaPath(QString path); + void setJavaPathFromPartial(); + void downloadJava(Meta::Version::Ptr version, QString javaName); + void tryNextMajorJava(); + + private: + MinecraftInstancePtr m_instance; + Task::Ptr m_current_task; + + qsizetype m_majorJavaVersionIndex = 0; + const QString m_supported_arch; +}; diff --git a/launcher/minecraft/launch/VerifyJavaInstall.cpp b/launcher/minecraft/launch/VerifyJavaInstall.cpp index 218811290..279545fed 100644 --- a/launcher/minecraft/launch/VerifyJavaInstall.cpp +++ b/launcher/minecraft/launch/VerifyJavaInstall.cpp @@ -50,7 +50,6 @@ void VerifyJavaInstall::executeTask() auto settings = instance->settings(); auto storedVersion = settings->get("JavaVersion").toString(); auto ignoreCompatibility = settings->get("IgnoreJavaCompatibility").toBool(); - auto automaticJavaSwitch = settings->get("AutomaticJavaSwitch").toBool(); auto compatibleMajors = packProfile->getProfile()->getCompatibleJavaMajors(); @@ -67,38 +66,16 @@ void VerifyJavaInstall::executeTask() return; } - auto logFail = [this, &javaVersion, compatibleMajors] { - emit logLine(tr("This instance is not compatible with Java version %1.\n" - "Please switch to one of the following Java versions for this instance:") - .arg(javaVersion.major()), - MessageLevel::Error); - for (auto major : compatibleMajors) { - emit logLine(tr("Java version %1").arg(major), MessageLevel::Error); - } - emit logLine(tr("Go to instance Java settings to change your Java version or disable the Java compatibility check if you know what " - "you're doing."), - MessageLevel::Error); - - emitFailed(QString("Incompatible Java major version")); - }; - - if (automaticJavaSwitch || true) { - settings->set("OverrideJava", true); - auto javas = APPLICATION->javalist().get(); - auto task = javas->getLoadTask(); - connect(task.get(), &Task::finished, this, [this, javas, compatibleMajors, settings, &logFail] { - for (auto i = 0; i < javas->count(); i++) { - auto java = std::dynamic_pointer_cast(javas->at(i)); - if (java && compatibleMajors.contains(java->id.major())) { - settings->set("OverrideJavaLocation", true); - settings->set("JavaPath", java->path); - emitSucceeded(); - return; - } - } - logFail(); - }); - } else { - logFail(); + emit logLine(tr("This instance is not compatible with Java version %1.\n" + "Please switch to one of the following Java versions for this instance:") + .arg(javaVersion.major()), + MessageLevel::Error); + for (auto major : compatibleMajors) { + emit logLine(tr("Java version %1").arg(major), MessageLevel::Error); } + emit logLine(tr("Go to instance Java settings to change your Java version or disable the Java compatibility check if you know what " + "you're doing."), + MessageLevel::Error); + + emitFailed(QString("Incompatible Java major version")); } diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 9b2aa7637..496cb69a7 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -102,6 +102,8 @@ void JavaPage::applySettings() s->set("JvmArgs", ui->jvmArgsTextBox->toPlainText().replace("\n", " ")); s->set("IgnoreJavaCompatibility", ui->skipCompatibilityCheckbox->isChecked()); s->set("IgnoreJavaWizard", ui->skipJavaWizardCheckbox->isChecked()); + s->set("AutomaticJavaSwitch", ui->autodetectJavaCheckBox->isChecked()); + s->set("AutomaticJavaDownload", ui->autodownloadCheckBox->isChecked()); s->set("JavaExtraSearchPaths", m_extra_paths->stringList()); JavaCommon::checkJVMArgs(s->get("JvmArgs").toString(), this->parentWidget()); } @@ -125,6 +127,8 @@ void JavaPage::loadSettings() ui->jvmArgsTextBox->setPlainText(s->get("JvmArgs").toString()); ui->skipCompatibilityCheckbox->setChecked(s->get("IgnoreJavaCompatibility").toBool()); ui->skipJavaWizardCheckbox->setChecked(s->get("IgnoreJavaWizard").toBool()); + ui->autodetectJavaCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool()); + ui->autodownloadCheckBox->setChecked(s->get("AutomaticJavaDownload").toBool()); m_extra_paths = new QStringListModel(s->get("JavaExtraSearchPaths").toStringList()); ui->extraJavaPathsList->setModel(m_extra_paths); } diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index a518b0b14..d135adc9a 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -160,25 +160,6 @@ Java Runtime - - - - true - - - - 0 - 0 - - - - - 16777215 - 100 - - - - @@ -232,7 +213,7 @@
- + @@ -248,6 +229,42 @@ + + + + If enabled, the launcher will not prompt you to choose a Java version if one isn't found. + + + Skip Java &Wizard + + + + + + + true + + + + 0 + 0 + + + + + 16777215 + 100 + + + + + + + + Autodetect Java version + + + @@ -284,13 +301,10 @@ - - - - If enabled, the launcher will not prompt you to choose a Java version if one isn't found. - + + - Skip Java &Wizard + Autodownload Mojang Java From ea2adf909dfe10c0adaf53ef2fabbd94ee7ae8cd Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 17 Feb 2024 11:14:32 +0200 Subject: [PATCH 052/616] Added progeess dialog to autodownload java Signed-off-by: Trial97 --- .../java/download/ArchiveDownloadTask.cpp | 5 +- .../java/download/ManifestDownloadTask.cpp | 10 +++- launcher/minecraft/launch/AutoInstallJava.cpp | 59 ++++++++++++++----- launcher/minecraft/launch/AutoInstallJava.h | 1 + 4 files changed, 56 insertions(+), 19 deletions(-) diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index 847f3f364..9f8dc0543 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -50,9 +50,12 @@ void ArchiveDownloadTask::executeTask() auto fullPath = entry->getFullPath(); connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); - connect(download.get(), &NetJob::progress, this, &ArchiveDownloadTask::progress); connect(download.get(), &NetJob::failed, this, &ArchiveDownloadTask::emitFailed); connect(this, &Task::aborted, download.get(), &NetJob::abort); + connect(download.get(), &Task::progress, this, &ArchiveDownloadTask::setProgress); + connect(download.get(), &Task::stepProgress, this, &ArchiveDownloadTask::propagateStepProgress); + connect(download.get(), &Task::status, this, &ArchiveDownloadTask::setStatus); + connect(download.get(), &Task::details, this, &ArchiveDownloadTask::setDetails); connect(download.get(), &NetJob::succeeded, [this, fullPath] { // This should do all of the extracting and creating folders extractJava(fullPath); diff --git a/launcher/java/download/ManifestDownloadTask.cpp b/launcher/java/download/ManifestDownloadTask.cpp index 1a3071530..0c2eee0c8 100644 --- a/launcher/java/download/ManifestDownloadTask.cpp +++ b/launcher/java/download/ManifestDownloadTask.cpp @@ -52,9 +52,12 @@ void ManifestDownloadTask::executeTask() download->addNetAction(action); connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); - connect(download.get(), &NetJob::progress, this, &ManifestDownloadTask::progress); connect(download.get(), &NetJob::failed, this, &ManifestDownloadTask::emitFailed); connect(this, &Task::aborted, download.get(), &NetJob::abort); + connect(download.get(), &Task::progress, this, &ManifestDownloadTask::setProgress); + connect(download.get(), &Task::stepProgress, this, &ManifestDownloadTask::propagateStepProgress); + connect(download.get(), &Task::status, this, &ManifestDownloadTask::setStatus); + connect(download.get(), &Task::details, this, &ManifestDownloadTask::setDetails); connect(download.get(), &NetJob::succeeded, [files, this] { QJsonParseError parse_error{}; @@ -117,8 +120,11 @@ void ManifestDownloadTask::downloadJava(const QJsonDocument& doc) disconnect(this, &Task::aborted, elementDownload, &NetJob::abort); elementDownload->deleteLater(); }); - connect(elementDownload, &NetJob::progress, this, &ManifestDownloadTask::progress); connect(elementDownload, &NetJob::failed, this, &ManifestDownloadTask::emitFailed); + connect(elementDownload, &Task::progress, this, &ManifestDownloadTask::setProgress); + connect(elementDownload, &Task::stepProgress, this, &ManifestDownloadTask::propagateStepProgress); + connect(elementDownload, &Task::status, this, &ManifestDownloadTask::setStatus); + connect(elementDownload, &Task::details, this, &ManifestDownloadTask::setDetails); connect(this, &Task::aborted, elementDownload, &NetJob::abort); connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 0d3740c93..d93276432 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -34,8 +34,8 @@ */ #include "AutoInstallJava.h" -#include -#include +#include +#include #include #include "Application.h" @@ -61,7 +61,8 @@ void AutoInstallJava::executeTask() { auto settings = m_instance->settings(); if (!APPLICATION->settings()->get("AutomaticJavaSwitch").toBool() || - (settings->get("OverrideJava").toBool() && settings->get("OverrideJavaLocation").toBool())) { + (settings->get("OverrideJava").toBool() && settings->get("OverrideJavaLocation").toBool() && + QFileInfo::exists(settings->get("JavaPath").toString()))) { emitSucceeded(); return; } @@ -80,6 +81,11 @@ void AutoInstallJava::executeTask() emit logLine(tr("No comptatible java version was found. Using the default one."), MessageLevel::Warning); emitSucceeded(); }); + connect(m_current_task.get(), &Task::progress, this, &AutoInstallJava::setProgress); + connect(m_current_task.get(), &Task::stepProgress, this, &AutoInstallJava::propagateStepProgress); + connect(m_current_task.get(), &Task::status, this, &AutoInstallJava::setStatus); + connect(m_current_task.get(), &Task::details, this, &AutoInstallJava::setDetails); + emit progressReportingRequest(); return; } auto wantedJavaName = packProfile->getProfile()->getCompatibleJavaName(); @@ -93,6 +99,11 @@ void AutoInstallJava::executeTask() m_current_task = versionList->getLoadTask(); connect(m_current_task.get(), &Task::succeeded, this, &AutoInstallJava::tryNextMajorJava); connect(m_current_task.get(), &Task::failed, this, &AutoInstallJava::emitFailed); + connect(m_current_task.get(), &Task::progress, this, &AutoInstallJava::setProgress); + connect(m_current_task.get(), &Task::stepProgress, this, &AutoInstallJava::propagateStepProgress); + connect(m_current_task.get(), &Task::status, this, &AutoInstallJava::setStatus); + connect(m_current_task.get(), &Task::details, this, &AutoInstallJava::setDetails); + emit progressReportingRequest(); } void AutoInstallJava::setJavaPath(QString path) @@ -134,29 +145,34 @@ void AutoInstallJava::downloadJava(Meta::Version::Ptr version, QString javaName) if (runtimes.contains(m_supported_arch)) { for (auto java : runtimes.value(m_supported_arch)) { if (java->name() == javaName) { - Task::Ptr task; QDir javaDir(APPLICATION->javaPath()); auto final_path = javaDir.absoluteFilePath(java->m_name); switch (java->downloadType) { case Java::DownloadType::Manifest: - task = makeShared(java->url, final_path, java->checksumType, java->checksumHash); + m_current_task = + makeShared(java->url, final_path, java->checksumType, java->checksumHash); break; case Java::DownloadType::Archive: - task = makeShared(java->url, final_path, java->checksumType, java->checksumHash); + m_current_task = + makeShared(java->url, final_path, java->checksumType, java->checksumHash); break; } - QEventLoop loop; auto deletePath = [final_path] { FS::deletePath(final_path); }; - connect(task.get(), &Task::failed, this, [this, deletePath](QString reason) { + connect(m_current_task.get(), &Task::failed, this, [this, deletePath](QString reason) { deletePath(); emitFailed(reason); }); - connect(this, &Task::aborted, this, [task, deletePath] { - task->abort(); + connect(this, &Task::aborted, this, [this, deletePath] { + m_current_task->abort(); deletePath(); }); - connect(task.get(), &Task::succeeded, this, &AutoInstallJava::setJavaPathFromPartial); - task->start(); + connect(m_current_task.get(), &Task::succeeded, this, &AutoInstallJava::setJavaPathFromPartial); + connect(m_current_task.get(), &Task::failed, this, &AutoInstallJava::tryNextMajorJava); + connect(m_current_task.get(), &Task::progress, this, &AutoInstallJava::setProgress); + connect(m_current_task.get(), &Task::stepProgress, this, &AutoInstallJava::propagateStepProgress); + connect(m_current_task.get(), &Task::status, this, &AutoInstallJava::setStatus); + connect(m_current_task.get(), &Task::details, this, &AutoInstallJava::setDetails); + m_current_task->start(); return; } } @@ -182,11 +198,22 @@ void AutoInstallJava::tryNextMajorJava() auto javaMajor = versionList->getVersion(QString("java%1").arg(majorJavaVersion)); javaMajor->load(Net::Mode::Online); - auto task = javaMajor->getCurrentTask(); - if (javaMajor->isLoaded() || !task) { + m_current_task = javaMajor->getCurrentTask(); + if (javaMajor->isLoaded() || !m_current_task) { downloadJava(javaMajor, wantedJavaName); } else { - connect(task.get(), &Task::succeeded, this, [this, javaMajor, wantedJavaName] { downloadJava(javaMajor, wantedJavaName); }); - connect(task.get(), &Task::failed, this, &AutoInstallJava::tryNextMajorJava); + connect(m_current_task.get(), &Task::succeeded, this, + [this, javaMajor, wantedJavaName] { downloadJava(javaMajor, wantedJavaName); }); + connect(m_current_task.get(), &Task::failed, this, &AutoInstallJava::tryNextMajorJava); + connect(m_current_task.get(), &Task::progress, this, &AutoInstallJava::setProgress); + connect(m_current_task.get(), &Task::stepProgress, this, &AutoInstallJava::propagateStepProgress); + connect(m_current_task.get(), &Task::status, this, &AutoInstallJava::setStatus); + connect(m_current_task.get(), &Task::details, this, &AutoInstallJava::setDetails); } } +bool AutoInstallJava::abort() +{ + if (m_current_task && m_current_task->canAbort()) + return m_current_task->abort(); + return true; +} diff --git a/launcher/minecraft/launch/AutoInstallJava.h b/launcher/minecraft/launch/AutoInstallJava.h index 4dcd3796a..45d0f870e 100644 --- a/launcher/minecraft/launch/AutoInstallJava.h +++ b/launcher/minecraft/launch/AutoInstallJava.h @@ -51,6 +51,7 @@ class AutoInstallJava : public LaunchStep { void executeTask() override; bool canAbort() const override { return m_current_task ? m_current_task->canAbort() : false; } + bool abort() override; protected: void setJavaPath(QString path); From 5232b3cd89ce70722865bc1ad6d96d8f52db1789 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 17 Feb 2024 12:17:00 +0200 Subject: [PATCH 053/616] Added some logs and fixed natives extraction Signed-off-by: Trial97 --- launcher/minecraft/MinecraftInstance.cpp | 11 ++++++----- launcher/minecraft/launch/AutoInstallJava.cpp | 5 ++++- launcher/minecraft/launch/VerifyJavaInstall.cpp | 11 +++++++++++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 00ce405aa..cfc65428c 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -1078,6 +1078,12 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt process->appendStep(makeShared(pptr, Net::Mode::Offline)); } + // check java + { + process->appendStep(makeShared(pptr)); + process->appendStep(makeShared(pptr)); + } + // if there are any jar mods { process->appendStep(makeShared(pptr)); @@ -1102,11 +1108,6 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt { process->appendStep(makeShared(pptr)); } - // check java - { - process->appendStep(makeShared(pptr)); - process->appendStep(makeShared(pptr)); - } // verify that minimum Java requirements are met { diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index d93276432..7905689da 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -68,12 +68,15 @@ void AutoInstallJava::executeTask() } auto packProfile = m_instance->getPackProfile(); if (!APPLICATION->settings()->get("AutomaticJavaDownload").toBool()) { - auto javas = APPLICATION->javalist().get(); + auto javas = APPLICATION->javalist(); m_current_task = javas->getLoadTask(); connect(m_current_task.get(), &Task::finished, this, [this, javas, packProfile] { for (auto i = 0; i < javas->count(); i++) { auto java = std::dynamic_pointer_cast(javas->at(i)); if (java && packProfile->getProfile()->getCompatibleJavaMajors().contains(java->id.major())) { + if (!java->is_64bit) { + emit logLine(tr("The automatic Java mechanism detected a x32 java."), MessageLevel::Info); + } setJavaPath(java->path); return; } diff --git a/launcher/minecraft/launch/VerifyJavaInstall.cpp b/launcher/minecraft/launch/VerifyJavaInstall.cpp index 279545fed..536384f12 100644 --- a/launcher/minecraft/launch/VerifyJavaInstall.cpp +++ b/launcher/minecraft/launch/VerifyJavaInstall.cpp @@ -37,6 +37,7 @@ #include #include "Application.h" +#include "MessageLevel.h" #include "java/JavaInstall.h" #include "java/JavaInstallList.h" #include "java/JavaVersion.h" @@ -50,6 +51,16 @@ void VerifyJavaInstall::executeTask() auto settings = instance->settings(); auto storedVersion = settings->get("JavaVersion").toString(); auto ignoreCompatibility = settings->get("IgnoreJavaCompatibility").toBool(); + auto javaArchitecture = settings->get("JavaArchitecture").toString(); + auto maxMemAlloc = settings->get("MaxMemAlloc").toInt(); + + emit logLine(tr("Java architecture is x%1.").arg(javaArchitecture), MessageLevel::Info); + if (javaArchitecture == "32" && maxMemAlloc > 2048) { + emit logLine(tr("Max memory allocation exceeds the supported value.\n" + "The selected java is 32 bit and doesn't support more than 2GB of ram.\n" + "The instance may not start due to this."), + MessageLevel::Error); + } auto compatibleMajors = packProfile->getProfile()->getCompatibleJavaMajors(); From a7dad96a701100ab583b4c9ca00a7c9b979fcf84 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 18 Feb 2024 09:32:31 +0200 Subject: [PATCH 054/616] Added refresh button on managed java list Signed-off-by: Trial97 --- launcher/ui/pages/global/JavaPage.cpp | 4 ++++ launcher/ui/pages/global/JavaPage.h | 1 + launcher/ui/pages/global/JavaPage.ui | 7 +++++++ 3 files changed, 12 insertions(+) diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 496cb69a7..e967204c8 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -296,3 +296,7 @@ void JavaPage::on_removeJavaButton_clicked() } } } +void JavaPage::on_refreshJavaButton_clicked() +{ + ui->managedJavaList->loadList(); +} diff --git a/launcher/ui/pages/global/JavaPage.h b/launcher/ui/pages/global/JavaPage.h index 03d14b824..1a521e2db 100644 --- a/launcher/ui/pages/global/JavaPage.h +++ b/launcher/ui/pages/global/JavaPage.h @@ -77,6 +77,7 @@ class JavaPage : public QWidget, public BasePage { void on_removeExtraPathButton_clicked(); void on_downloadJavaButton_clicked(); void on_removeJavaButton_clicked(); + void on_refreshJavaButton_clicked(); void on_maxMemSpinBox_valueChanged(int i); void checkerFinished(); diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index d135adc9a..80be81fb4 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -376,6 +376,13 @@ + + + + Refresh + + + From 4c76f7afe0a1ea015d7c0eac7a1a6b1c8a1a760a Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 18 Feb 2024 09:46:44 +0200 Subject: [PATCH 055/616] Made auto java checkbox dependent Signed-off-by: Trial97 --- launcher/ui/pages/global/JavaPage.cpp | 8 +++++++- launcher/ui/pages/global/JavaPage.ui | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index e967204c8..0e97211d9 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -41,6 +41,7 @@ #include "ui/java/JavaDownloader.h" #include "ui_JavaPage.h" +#include #include #include #include @@ -65,6 +66,11 @@ JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage) ui->managedJavaList->selectCurrent(); ui->managedJavaList->setEmptyString(tr("No java versions are currently available in the meta")); ui->managedJavaList->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + connect(ui->autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] { + ui->autodownloadCheckBox->setEnabled(ui->autodetectJavaCheckBox->isChecked()); + if (!ui->autodetectJavaCheckBox->isChecked()) + ui->autodownloadCheckBox->setChecked(false); + }); loadSettings(); updateThresholds(); @@ -128,7 +134,7 @@ void JavaPage::loadSettings() ui->skipCompatibilityCheckbox->setChecked(s->get("IgnoreJavaCompatibility").toBool()); ui->skipJavaWizardCheckbox->setChecked(s->get("IgnoreJavaWizard").toBool()); ui->autodetectJavaCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool()); - ui->autodownloadCheckBox->setChecked(s->get("AutomaticJavaDownload").toBool()); + ui->autodownloadCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool() && s->get("AutomaticJavaDownload").toBool()); m_extra_paths = new QStringListModel(s->get("JavaExtraSearchPaths").toStringList()); ui->extraJavaPathsList->setModel(m_extra_paths); } diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index 80be81fb4..43843017c 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -303,6 +303,9 @@ + + false + Autodownload Mojang Java From 2f489d1aec120274b3e98187bf8326c8990bca12 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 18 Feb 2024 11:34:54 +0200 Subject: [PATCH 056/616] Added auto java options to the java wizzard page Signed-off-by: Trial97 --- launcher/ui/setupwizard/JavaWizardPage.cpp | 2 ++ launcher/ui/widgets/JavaSettingsWidget.cpp | 38 ++++++++++++++++++++++ launcher/ui/widgets/JavaSettingsWidget.h | 8 +++++ 3 files changed, 48 insertions(+) diff --git a/launcher/ui/setupwizard/JavaWizardPage.cpp b/launcher/ui/setupwizard/JavaWizardPage.cpp index abe4860da..d537580fc 100644 --- a/launcher/ui/setupwizard/JavaWizardPage.cpp +++ b/launcher/ui/setupwizard/JavaWizardPage.cpp @@ -57,6 +57,8 @@ bool JavaWizardPage::validatePage() { auto settings = APPLICATION->settings(); auto result = m_java_widget->validate(); + settings->set("AutomaticJavaSwitch", m_java_widget->autodetectJava()); + settings->set("AutomaticJavaDownload", m_java_widget->autodownloadJava()); switch (result) { default: case JavaSettingsWidget::ValidationStatus::Bad: { diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 507c632d5..c15f7bf42 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -136,6 +136,26 @@ void JavaSettingsWidget::setupUi() m_verticalLayout->addLayout(m_horizontalBtnLayout); + m_autoJavaGroupBox = new QGroupBox(this); + m_autoJavaGroupBox->setObjectName(QStringLiteral("autoJavaGroupBox")); + m_veriticalJavaLayout = new QVBoxLayout(m_autoJavaGroupBox); + m_veriticalJavaLayout->setObjectName(QStringLiteral("veriticalJavaLayout")); + + m_autodetectJavaCheckBox = new QCheckBox(m_autoJavaGroupBox); + m_autodetectJavaCheckBox->setObjectName("autodetectJavaCheckBox"); + m_veriticalJavaLayout->addWidget(m_autodetectJavaCheckBox); + + m_autodownloadCheckBox = new QCheckBox(m_autoJavaGroupBox); + m_autodownloadCheckBox->setObjectName("autodownloadCheckBox"); + m_autodownloadCheckBox->setEnabled(false); + m_veriticalJavaLayout->addWidget(m_autodownloadCheckBox); + connect(m_autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] { + m_autodownloadCheckBox->setEnabled(m_autodetectJavaCheckBox->isChecked()); + if (!m_autodetectJavaCheckBox->isChecked()) + m_autodownloadCheckBox->setChecked(false); + }); + m_verticalLayout->addWidget(m_autoJavaGroupBox); + retranslate(); } @@ -153,6 +173,9 @@ void JavaSettingsWidget::initialize() m_maxMemSpinBox->setValue(observedMaxMemory); m_permGenSpinBox->setValue(observedPermGenMemory); updateThresholds(); + + m_autodetectJavaCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool()); + m_autodownloadCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool() && s->get("AutomaticJavaDownload").toBool()); } void JavaSettingsWidget::refresh() @@ -280,11 +303,13 @@ void JavaSettingsWidget::on_javaBrowseBtn_clicked() m_javaPathTextBox->setText(cooked_path); checkJavaPath(cooked_path); } + void JavaSettingsWidget::on_javaDownloadBtn_clicked() { auto jdialog = new Java::Downloader(this); jdialog->exec(); } + void JavaSettingsWidget::on_javaStatusBtn_clicked() { QString text; @@ -418,6 +443,9 @@ void JavaSettingsWidget::retranslate() m_minMemSpinBox->setToolTip(tr("The amount of memory Minecraft is started with.")); m_permGenSpinBox->setToolTip(tr("The amount of memory available to store loaded Java classes.")); m_javaBrowseBtn->setText(tr("Browse")); + m_autodownloadCheckBox->setText(tr("Autodownload Mojang Java")); + m_autodetectJavaCheckBox->setText(tr("Autodetect Java version")); + m_autoJavaGroupBox->setTitle(tr("Autodetect Java")); } void JavaSettingsWidget::updateThresholds() @@ -464,3 +492,13 @@ void JavaSettingsWidget::on_addJavaPathBtn_clicked() APPLICATION->settings()->set("JavaExtraSearchPaths", currentList); refresh(); } + +bool JavaSettingsWidget::autodownloadJava() const +{ + return m_autodetectJavaCheckBox->isChecked(); +} + +bool JavaSettingsWidget::autodetectJava() const +{ + return m_autodownloadCheckBox->isChecked(); +} diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index 385a9256a..205b83d8c 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -4,6 +4,7 @@ #include #include #include +#include #include class QLineEdit; @@ -41,6 +42,8 @@ class JavaSettingsWidget : public QWidget { int minHeapSize() const; int maxHeapSize() const; QString javaPath() const; + bool autodetectJava() const; + bool autodownloadJava() const; void updateThresholds(); @@ -86,6 +89,11 @@ class JavaSettingsWidget : public QWidget { QIcon yellowIcon; QIcon badIcon; + QGroupBox* m_autoJavaGroupBox = nullptr; + QVBoxLayout* m_veriticalJavaLayout = nullptr; + QCheckBox* m_autodetectJavaCheckBox = nullptr; + QCheckBox* m_autodownloadCheckBox = nullptr; + unsigned int observedMinMemory = 0; unsigned int observedMaxMemory = 0; unsigned int observedPermGenMemory = 0; From 4aafa98852ec1f89cc765def26ab9e4174b8af3b Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 18 Feb 2024 12:58:34 +0200 Subject: [PATCH 057/616] Improved the message boxes for java wizzard Signed-off-by: Trial97 --- launcher/ui/widgets/JavaSettingsWidget.cpp | 71 ++++++++++++++++++---- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index c15f7bf42..66278abb0 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -11,6 +12,7 @@ #include +#include "DesktopServices.h" #include "FileSystem.h" #include "JavaCommon.h" #include "java/JavaChecker.h" @@ -174,8 +176,19 @@ void JavaSettingsWidget::initialize() m_permGenSpinBox->setValue(observedPermGenMemory); updateThresholds(); - m_autodetectJavaCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool()); - m_autodownloadCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool() && s->get("AutomaticJavaDownload").toBool()); + auto button = CustomMessageBox::selectable(this, tr("Auto Java Download"), + tr("%1 has now the ability to auto downloand the correct java for each minecraft version.\n" + "Do you want to enable java auto-download?\n") + .arg(BuildConfig.LAUNCHER_DISPLAYNAME), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) + ->exec(); + if (button == QMessageBox::Yes) { + m_autodetectJavaCheckBox->setChecked(true); + m_autodownloadCheckBox->setChecked(true); + } else { + m_autodetectJavaCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool()); + m_autodownloadCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool() && s->get("AutomaticJavaDownload").toBool()); + } } void JavaSettingsWidget::refresh() @@ -192,20 +205,52 @@ JavaSettingsWidget::ValidationStatus JavaSettingsWidget::validate() switch (javaStatus) { default: case JavaStatus::NotSet: + /* fallthrough */ case JavaStatus::DoesNotExist: + /* fallthrough */ case JavaStatus::DoesNotStart: + /* fallthrough */ case JavaStatus::ReturnedInvalidData: { - int button = CustomMessageBox::selectable(this, tr("No Java version selected"), - tr("You didn't select a Java version or selected something that doesn't work.\n" - "%1 will not be able to start Minecraft.\n" - "Do you wish to proceed without any Java?" - "\n\n" - "You can change the Java version in the settings later.\n") - .arg(BuildConfig.LAUNCHER_DISPLAYNAME), - QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton) - ->exec(); - if (button == QMessageBox::No) { - return ValidationStatus::Bad; + if (!m_autodownloadCheckBox->isChecked()) { // the java will not be autodownloaded + int button = QMessageBox::No; + if (m_result.mojangPlatform == "32" && maxHeapSize() > 2048) { + button = CustomMessageBox::selectable( + this, tr("Java x32 detected"), + tr("You selected a 32 bit java, but allocated more than 2048MiB as maximum memory.\n" + "%1 will not be able to start Minecraft.\n" + "Do you wish to proceed?" + "\n\n" + "You can change the Java version in the settings later.\n") + .arg(BuildConfig.LAUNCHER_DISPLAYNAME), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No | QMessageBox::Help, QMessageBox::NoButton) + ->exec(); + + } else { + button = CustomMessageBox::selectable(this, tr("No Java version selected"), + tr("You didn't select a Java version or selected something that doesn't work.\n" + "%1 will not be able to start Minecraft.\n" + "Do you wish to proceed without any Java?" + "\n\n" + "You can change the Java version in the settings later.\n") + .arg(BuildConfig.LAUNCHER_DISPLAYNAME), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No | QMessageBox::Help, + QMessageBox::NoButton) + ->exec(); + } + switch (button) { + case QMessageBox::Yes: + return ValidationStatus::JavaBad; + case QMessageBox::Help: + DesktopServices::openUrl(QUrl(BuildConfig.HELP_URL.arg("java-wizzard"))); + /* fallthrough */ + case QMessageBox::No: + /* fallthrough */ + default: + return ValidationStatus::Bad; + } + if (button == QMessageBox::No) { + return ValidationStatus::Bad; + } } return ValidationStatus::JavaBad; } break; From b4f3a969b3fd2f96675d25e3c8726c76395b3d7e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 18 Feb 2024 14:30:38 +0200 Subject: [PATCH 058/616] Updated strings that are displayed to user Signed-off-by: Trial97 --- launcher/MMCZip.cpp | 2 +- launcher/MMCZip.h | 2 +- launcher/java/JavaInstall.cpp | 2 +- launcher/java/JavaInstall.h | 2 +- launcher/java/JavaMetadata.cpp | 2 +- launcher/java/JavaMetadata.h | 2 +- launcher/java/download/ArchiveDownloadTask.cpp | 2 +- launcher/java/download/ArchiveDownloadTask.h | 2 +- launcher/java/download/ManifestDownloadTask.cpp | 2 +- launcher/java/download/ManifestDownloadTask.h | 2 +- launcher/minecraft/launch/AutoInstallJava.cpp | 10 +++++----- launcher/minecraft/launch/AutoInstallJava.h | 2 +- launcher/minecraft/launch/VerifyJavaInstall.cpp | 2 +- launcher/ui/java/JavaDownloader.cpp | 2 +- launcher/ui/pages/global/JavaPage.cpp | 2 +- launcher/ui/pages/global/JavaPage.ui | 2 +- launcher/ui/pages/instance/InstanceSettingsPage.cpp | 2 +- launcher/ui/pages/instance/InstanceSettingsPage.ui | 3 --- launcher/ui/widgets/JavaSettingsWidget.cpp | 6 +++--- 19 files changed, 24 insertions(+), 27 deletions(-) diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index 9e26c5eda..8273acbb6 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -2,7 +2,7 @@ /* * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu - * Copyright (c) 2023 Trial97 + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/MMCZip.h b/launcher/MMCZip.h index db6a7421a..e2987badd 100644 --- a/launcher/MMCZip.h +++ b/launcher/MMCZip.h @@ -2,7 +2,7 @@ /* * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu - * Copyright (c) 2023 Trial97 + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/java/JavaInstall.cpp b/launcher/java/JavaInstall.cpp index cfa471402..8e97e0e14 100644 --- a/launcher/java/JavaInstall.cpp +++ b/launcher/java/JavaInstall.cpp @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/java/JavaInstall.h b/launcher/java/JavaInstall.h index 6890264f3..7d8d392fa 100644 --- a/launcher/java/JavaInstall.h +++ b/launcher/java/JavaInstall.h @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/java/JavaMetadata.cpp b/launcher/java/JavaMetadata.cpp index b261122dc..b73c54fe6 100644 --- a/launcher/java/JavaMetadata.cpp +++ b/launcher/java/JavaMetadata.cpp @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/java/JavaMetadata.h b/launcher/java/JavaMetadata.h index dd3ae865c..640a412f1 100644 --- a/launcher/java/JavaMetadata.h +++ b/launcher/java/JavaMetadata.h @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index 9f8dc0543..e3db77d2c 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/java/download/ArchiveDownloadTask.h b/launcher/java/download/ArchiveDownloadTask.h index 88c0223d5..c656567fe 100644 --- a/launcher/java/download/ArchiveDownloadTask.h +++ b/launcher/java/download/ArchiveDownloadTask.h @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/java/download/ManifestDownloadTask.cpp b/launcher/java/download/ManifestDownloadTask.cpp index 0c2eee0c8..ba5ff2cc0 100644 --- a/launcher/java/download/ManifestDownloadTask.cpp +++ b/launcher/java/download/ManifestDownloadTask.cpp @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/java/download/ManifestDownloadTask.h b/launcher/java/download/ManifestDownloadTask.h index dcfee4d4d..f0eaf95a6 100644 --- a/launcher/java/download/ManifestDownloadTask.h +++ b/launcher/java/download/ManifestDownloadTask.h @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher - * Copyright (c) 2023 Trial97 + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 7905689da..ab68910a7 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher - * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -75,13 +75,13 @@ void AutoInstallJava::executeTask() auto java = std::dynamic_pointer_cast(javas->at(i)); if (java && packProfile->getProfile()->getCompatibleJavaMajors().contains(java->id.major())) { if (!java->is_64bit) { - emit logLine(tr("The automatic Java mechanism detected a x32 java."), MessageLevel::Info); + emit logLine(tr("The automatic Java mechanism detected an x32 java."), MessageLevel::Info); } setJavaPath(java->path); return; } } - emit logLine(tr("No comptatible java version was found. Using the default one."), MessageLevel::Warning); + emit logLine(tr("No compatible java version was found. Using the default one."), MessageLevel::Warning); emitSucceeded(); }); connect(m_current_task.get(), &Task::progress, this, &AutoInstallJava::setProgress); @@ -136,7 +136,7 @@ void AutoInstallJava::setJavaPathFromPartial() if (QFileInfo::exists(finalPath)) { setJavaPath(finalPath); } else { - emit logLine(tr("No comptatible java version was found. Using the default one."), MessageLevel::Warning); + emit logLine(tr("No compatible java version was found. Using the default one."), MessageLevel::Warning); emitSucceeded(); } return; @@ -192,7 +192,7 @@ void AutoInstallJava::tryNextMajorJava() auto wantedJavaName = packProfile->getProfile()->getCompatibleJavaName(); auto majorJavaVersions = packProfile->getProfile()->getCompatibleJavaMajors(); if (m_majorJavaVersionIndex >= majorJavaVersions.length()) { - emit logLine(tr("No comptatible java version was found. Using the default one."), MessageLevel::Warning); + emit logLine(tr("No compatible java version was found. Using the default one."), MessageLevel::Warning); emitSucceeded(); return; } diff --git a/launcher/minecraft/launch/AutoInstallJava.h b/launcher/minecraft/launch/AutoInstallJava.h index 45d0f870e..7e4efc50c 100644 --- a/launcher/minecraft/launch/AutoInstallJava.h +++ b/launcher/minecraft/launch/AutoInstallJava.h @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher - * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (c) 2023-2024 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/minecraft/launch/VerifyJavaInstall.cpp b/launcher/minecraft/launch/VerifyJavaInstall.cpp index 536384f12..f26b850eb 100644 --- a/launcher/minecraft/launch/VerifyJavaInstall.cpp +++ b/launcher/minecraft/launch/VerifyJavaInstall.cpp @@ -57,7 +57,7 @@ void VerifyJavaInstall::executeTask() emit logLine(tr("Java architecture is x%1.").arg(javaArchitecture), MessageLevel::Info); if (javaArchitecture == "32" && maxMemAlloc > 2048) { emit logLine(tr("Max memory allocation exceeds the supported value.\n" - "The selected java is 32 bit and doesn't support more than 2GB of ram.\n" + "The selected java is 32-bit and doesn't support more than 2048MiB of RAM.\n" "The instance may not start due to this."), MessageLevel::Error); } diff --git a/launcher/ui/java/JavaDownloader.cpp b/launcher/ui/java/JavaDownloader.cpp index 4495210c3..7417a4ea8 100644 --- a/launcher/ui/java/JavaDownloader.cpp +++ b/launcher/ui/java/JavaDownloader.cpp @@ -49,7 +49,7 @@ Downloader::Downloader(QWidget* parent) : QDialog(parent), ui(new Ui::JavaDownlo versionList->setProvidedRoles({ BaseVersionList::VersionRole, BaseVersionList::RecommendedRole, BaseVersionList::VersionPointerRole }); ui->majorVersionSelect->initialize(versionList.get()); ui->majorVersionSelect->selectCurrent(); - ui->majorVersionSelect->setEmptyString(tr("No java versions are currently available in the meta")); + ui->majorVersionSelect->setEmptyString(tr("No java versions are currently available in the meta.")); ui->majorVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); ui->javaVersionSelect->setEmptyString(tr("No java versions are currently available for your OS.")); diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 0e97211d9..524165e62 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -158,7 +158,7 @@ void JavaPage::on_javaDetectBtn_clicked() if (!java->is_64bit && APPLICATION->settings()->get("MaxMemAlloc").toInt() > 2048) { CustomMessageBox::selectable(this, tr("Confirm Selection"), tr("You selected an x86 java version.\n" - "This means that will not support more than 2Gb(2048Mb) of ram.\n" + "This means that will not support more than 2048MiB of RAM.\n" "Please make sure that the maximum memory value is lower."), QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok) ->exec(); diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index 43843017c..3f763f8d2 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -307,7 +307,7 @@ false - Autodownload Mojang Java + Auto-download Mojang Java diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index 926e48952..8a63aab22 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -417,7 +417,7 @@ void InstanceSettingsPage::on_javaDetectBtn_clicked() if (!java->is_64bit && m_settings->get("MaxMemAlloc").toInt() > 2048) { CustomMessageBox::selectable(this, tr("Confirm Selection"), tr("You selected an x86 java version.\n" - "This means that will not support more than 2Gb(2048Mb) of ram.\n" + "This means that will not support more than 2048MiB of RAM.\n" "Please make sure that the maximum memory value is lower."), QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok) ->exec(); diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.ui b/launcher/ui/pages/instance/InstanceSettingsPage.ui index 7762ca8a7..94464064e 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.ui +++ b/launcher/ui/pages/instance/InstanceSettingsPage.ui @@ -617,9 +617,6 @@ Enable online fixes (experimental) - - Disable Quilt Loader Beacon - diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 66278abb0..91fd6ff03 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -216,7 +216,7 @@ JavaSettingsWidget::ValidationStatus JavaSettingsWidget::validate() if (m_result.mojangPlatform == "32" && maxHeapSize() > 2048) { button = CustomMessageBox::selectable( this, tr("Java x32 detected"), - tr("You selected a 32 bit java, but allocated more than 2048MiB as maximum memory.\n" + tr("You selected an 32-bit java, but allocated more than 2048MiB as maximum memory.\n" "%1 will not be able to start Minecraft.\n" "Do you wish to proceed?" "\n\n" @@ -488,7 +488,7 @@ void JavaSettingsWidget::retranslate() m_minMemSpinBox->setToolTip(tr("The amount of memory Minecraft is started with.")); m_permGenSpinBox->setToolTip(tr("The amount of memory available to store loaded Java classes.")); m_javaBrowseBtn->setText(tr("Browse")); - m_autodownloadCheckBox->setText(tr("Autodownload Mojang Java")); + m_autodownloadCheckBox->setText(tr("Auto-download Mojang Java")); m_autodetectJavaCheckBox->setText(tr("Autodetect Java version")); m_autoJavaGroupBox->setTitle(tr("Autodetect Java")); } @@ -509,7 +509,7 @@ void JavaSettingsWidget::updateThresholds() } else if (observedMaxMemory > 2048 && m_result.is_64bit) { iconName = "status-bad"; m_labelMaxMemIcon->setToolTip( - tr("Your maximum memory allocation exceeds selected java posible memory(due to x86 applicatiion limitations).")); + tr("Your maximum memory allocation exceeds selected java possible memory(due to x86 application limitations).")); } else { iconName = "status-good"; m_labelMaxMemIcon->setToolTip(""); From 038d3e4596586718ca6982c68a17c36723561a42 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 18 Feb 2024 16:49:10 +0200 Subject: [PATCH 059/616] Fixed asan complains Signed-off-by: Trial97 --- launcher/java/download/ArchiveDownloadTask.cpp | 5 ++++- launcher/java/download/ManifestDownloadTask.cpp | 5 ++++- launcher/ui/pages/global/JavaPage.cpp | 3 ++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index e3db77d2c..34f60260e 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -49,7 +49,10 @@ void ArchiveDownloadTask::executeTask() download->addNetAction(action); auto fullPath = entry->getFullPath(); - connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); + connect(download.get(), &NetJob::finished, [download, this] { + disconnect(this, &Task::aborted, download.get(), &NetJob::abort); + download->deleteLater(); + }); connect(download.get(), &NetJob::failed, this, &ArchiveDownloadTask::emitFailed); connect(this, &Task::aborted, download.get(), &NetJob::abort); connect(download.get(), &Task::progress, this, &ArchiveDownloadTask::setProgress); diff --git a/launcher/java/download/ManifestDownloadTask.cpp b/launcher/java/download/ManifestDownloadTask.cpp index ba5ff2cc0..5551c75d5 100644 --- a/launcher/java/download/ManifestDownloadTask.cpp +++ b/launcher/java/download/ManifestDownloadTask.cpp @@ -51,7 +51,10 @@ void ManifestDownloadTask::executeTask() } download->addNetAction(action); - connect(download.get(), &NetJob::finished, [download, this] { disconnect(this, &Task::aborted, download.get(), &NetJob::abort); }); + connect(download.get(), &NetJob::finished, [download, this] { + disconnect(this, &Task::aborted, download.get(), &NetJob::abort); + download->deleteLater(); + }); connect(download.get(), &NetJob::failed, this, &ManifestDownloadTask::emitFailed); connect(this, &Task::aborted, download.get(), &NetJob::abort); connect(download.get(), &Task::progress, this, &ManifestDownloadTask::setProgress); diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 524165e62..deb085f93 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -135,7 +135,7 @@ void JavaPage::loadSettings() ui->skipJavaWizardCheckbox->setChecked(s->get("IgnoreJavaWizard").toBool()); ui->autodetectJavaCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool()); ui->autodownloadCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool() && s->get("AutomaticJavaDownload").toBool()); - m_extra_paths = new QStringListModel(s->get("JavaExtraSearchPaths").toStringList()); + m_extra_paths = new QStringListModel(s->get("JavaExtraSearchPaths").toStringList(), this); ui->extraJavaPathsList->setModel(m_extra_paths); } @@ -199,6 +199,7 @@ void JavaPage::on_javaDownloadBtn_clicked() { auto jdialog = new Java::Downloader(this); jdialog->exec(); + ui->managedJavaList->loadList(); } void JavaPage::on_maxMemSpinBox_valueChanged([[maybe_unused]] int i) From 889f604a415fd01150868090a1d47b7c408104d5 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 18 Feb 2024 21:38:31 +0200 Subject: [PATCH 060/616] Removed JavaExtraSearchPaths Signed-off-by: Trial97 --- launcher/Application.cpp | 1 - launcher/java/JavaUtils.cpp | 37 ------------------- launcher/java/JavaUtils.h | 1 - launcher/ui/pages/global/JavaPage.cpp | 27 -------------- launcher/ui/pages/global/JavaPage.h | 3 -- launcher/ui/pages/global/JavaPage.ui | 43 ---------------------- launcher/ui/widgets/JavaSettingsWidget.cpp | 19 ---------- launcher/ui/widgets/JavaSettingsWidget.h | 2 - 8 files changed, 133 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 6b7333972..31950a813 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -632,7 +632,6 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_settings->registerSetting("JvmArgs", ""); m_settings->registerSetting("IgnoreJavaCompatibility", false); m_settings->registerSetting("IgnoreJavaWizard", false); - m_settings->registerSetting("JavaExtraSearchPaths", QStringList()); m_settings->registerSetting("AutomaticJavaSwitch", false); m_settings->registerSetting("AutomaticJavaDownload", false); diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index 1d254e405..57e381e1d 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -338,7 +338,6 @@ QList JavaUtils::FindJavaPaths() candidates.append(getMinecraftJavaBundle()); candidates.append(getPrismJavaBundle()); - candidates.append(getPrismExtraJavaPaths()); candidates = addJavasFromEnv(candidates); candidates.removeDuplicates(); return candidates; @@ -366,7 +365,6 @@ QList JavaUtils::FindJavaPaths() } javas.append(getMinecraftJavaBundle()); javas.append(getPrismJavaBundle()); - javas.append(getPrismExtraJavaPaths()); javas = addJavasFromEnv(javas); javas.removeDuplicates(); return javas; @@ -420,7 +418,6 @@ QList JavaUtils::FindJavaPaths() javas.append(getMinecraftJavaBundle()); javas.append(getPrismJavaBundle()); - javas.append(getPrismExtraJavaPaths()); javas = addJavasFromEnv(javas); javas.removeDuplicates(); return javas; @@ -435,7 +432,6 @@ QList JavaUtils::FindJavaPaths() javas.append(getMinecraftJavaBundle()); javas.append(getPrismJavaBundle()); - javas.append(getPrismExtraJavaPaths()); javas.removeDuplicates(); return addJavasFromEnv(javas); } @@ -521,36 +517,3 @@ QStringList getPrismJavaBundle() return javas; } - -QStringList getPrismExtraJavaPaths() -{ - QList javas; - - QString executable = "java"; -#if defined(Q_OS_WIN32) - executable += "w.exe"; -#endif - - auto scanDir = [&](QString prefix) { - javas.append(FS::PathCombine(prefix, "jre", "bin", executable)); - javas.append(FS::PathCombine(prefix, "bin", executable)); - javas.append(FS::PathCombine(prefix, executable)); - }; - auto scanJavaDir = [&](const QString& dirPath) { - QDir dir(dirPath); - if (!dir.exists()) - return; - auto entries = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); - for (auto& entry : entries) { - scanDir(entry.canonicalFilePath()); - } - }; - - auto extra_paths = APPLICATION->settings()->get("JavaExtraSearchPaths").toStringList(); - for (auto& entry : extra_paths) { - scanDir(entry); - scanJavaDir(entry); - } - - return javas; -} diff --git a/launcher/java/JavaUtils.h b/launcher/java/JavaUtils.h index 66e439834..aa5315a19 100644 --- a/launcher/java/JavaUtils.h +++ b/launcher/java/JavaUtils.h @@ -27,7 +27,6 @@ QString stripVariableEntries(QString name, QString target, QString remove); QProcessEnvironment CleanEnviroment(); QStringList getMinecraftJavaBundle(); QStringList getPrismJavaBundle(); -QStringList getPrismExtraJavaPaths(); class JavaUtils : public QObject { Q_OBJECT diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index deb085f93..cb2a8b90b 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -110,7 +110,6 @@ void JavaPage::applySettings() s->set("IgnoreJavaWizard", ui->skipJavaWizardCheckbox->isChecked()); s->set("AutomaticJavaSwitch", ui->autodetectJavaCheckBox->isChecked()); s->set("AutomaticJavaDownload", ui->autodownloadCheckBox->isChecked()); - s->set("JavaExtraSearchPaths", m_extra_paths->stringList()); JavaCommon::checkJVMArgs(s->get("JvmArgs").toString(), this->parentWidget()); } void JavaPage::loadSettings() @@ -135,8 +134,6 @@ void JavaPage::loadSettings() ui->skipJavaWizardCheckbox->setChecked(s->get("IgnoreJavaWizard").toBool()); ui->autodetectJavaCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool()); ui->autodownloadCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool() && s->get("AutomaticJavaDownload").toBool()); - m_extra_paths = new QStringListModel(s->get("JavaExtraSearchPaths").toStringList(), this); - ui->extraJavaPathsList->setModel(m_extra_paths); } void JavaPage::on_javaDetectBtn_clicked() @@ -247,30 +244,6 @@ void JavaPage::updateThresholds() } } -void JavaPage::on_addExtraPathButton_clicked() -{ - QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Add Extra Java Folder")); - - if (!raw_dir.isEmpty() && QDir(raw_dir).exists()) { - QString cooked_dir = FS::NormalizePath(raw_dir); - auto currentList = m_extra_paths->stringList(); - if (!currentList.contains(cooked_dir)) { - currentList << cooked_dir; - m_extra_paths->setStringList(currentList); - } - } - APPLICATION->settings()->set("JavaExtraSearchPaths", m_extra_paths->stringList()); -} - -void JavaPage::on_removeExtraPathButton_clicked() -{ - auto indexes = ui->extraJavaPathsList->selectionModel()->selectedIndexes(); - if (indexes.size()) { - m_extra_paths->removeRow(indexes.first().row()); - } - APPLICATION->settings()->set("JavaExtraSearchPaths", m_extra_paths->stringList()); -} - void JavaPage::on_downloadJavaButton_clicked() { on_javaDownloadBtn_clicked(); diff --git a/launcher/ui/pages/global/JavaPage.h b/launcher/ui/pages/global/JavaPage.h index 1a521e2db..48e557740 100644 --- a/launcher/ui/pages/global/JavaPage.h +++ b/launcher/ui/pages/global/JavaPage.h @@ -73,8 +73,6 @@ class JavaPage : public QWidget, public BasePage { void on_javaTestBtn_clicked(); void on_javaBrowseBtn_clicked(); void on_javaDownloadBtn_clicked(); - void on_addExtraPathButton_clicked(); - void on_removeExtraPathButton_clicked(); void on_downloadJavaButton_clicked(); void on_removeJavaButton_clicked(); void on_refreshJavaButton_clicked(); @@ -84,5 +82,4 @@ class JavaPage : public QWidget, public BasePage { private: Ui::JavaPage* ui; unique_qobject_ptr checker; - QStringListModel* m_extra_paths; }; diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index 3f763f8d2..dc1668ee3 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -391,49 +391,6 @@ - - - - Java extra paths - - - - - - - - - - - Add - - - - - - - Remove - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 91fd6ff03..4b5819288 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -44,7 +44,6 @@ JavaSettingsWidget::JavaSettingsWidget(QWidget* parent) : QWidget(parent) connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaSettingsWidget::javaPathEdited); connect(m_javaStatusBtn, &QToolButton::clicked, this, &JavaSettingsWidget::on_javaStatusBtn_clicked); connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaDownloadBtn_clicked); - connect(m_addJavaPathBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_addJavaPathBtn_clicked); } void JavaSettingsWidget::setupUi() @@ -133,9 +132,6 @@ void JavaSettingsWidget::setupUi() m_javaDownloadBtn = new QPushButton(tr("Download Java"), this); m_horizontalBtnLayout->addWidget(m_javaDownloadBtn); - m_addJavaPathBtn = new QPushButton(tr("Add extra Java path"), this); - m_horizontalBtnLayout->addWidget(m_addJavaPathBtn); - m_verticalLayout->addLayout(m_horizontalBtnLayout); m_autoJavaGroupBox = new QGroupBox(this); @@ -523,21 +519,6 @@ void JavaSettingsWidget::updateThresholds() } } -void JavaSettingsWidget::on_addJavaPathBtn_clicked() -{ - QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Add Extra Java Folder")); - - auto currentList = APPLICATION->settings()->get("JavaExtraSearchPaths").toStringList(); - if (!raw_dir.isEmpty() && QDir(raw_dir).exists()) { - QString cooked_dir = FS::NormalizePath(raw_dir); - if (!currentList.contains(cooked_dir)) { - currentList << cooked_dir; - } - } - APPLICATION->settings()->set("JavaExtraSearchPaths", currentList); - refresh(); -} - bool JavaSettingsWidget::autodownloadJava() const { return m_autodetectJavaCheckBox->isChecked(); diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index 205b83d8c..c8b6953df 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -54,7 +54,6 @@ class JavaSettingsWidget : public QWidget { void on_javaBrowseBtn_clicked(); void on_javaStatusBtn_clicked(); void on_javaDownloadBtn_clicked(); - void on_addJavaPathBtn_clicked(); void checkFinished(const JavaChecker::Result& result); protected: /* methods */ @@ -84,7 +83,6 @@ class JavaSettingsWidget : public QWidget { QHBoxLayout* m_horizontalBtnLayout = nullptr; QPushButton* m_javaDownloadBtn = nullptr; - QPushButton* m_addJavaPathBtn = nullptr; QIcon goodIcon; QIcon yellowIcon; QIcon badIcon; From 1c96ae58077cae7a8d5b8f851d5ede385811f6ea Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 18 Feb 2024 22:32:54 +0200 Subject: [PATCH 061/616] Fixed java refresh button Signed-off-by: Trial97 --- launcher/ui/java/JavaDownloader.cpp | 3 ++- launcher/ui/java/JavaDownloader.ui | 10 +++++----- launcher/ui/java/VersionList.cpp | 4 +++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/launcher/ui/java/JavaDownloader.cpp b/launcher/ui/java/JavaDownloader.cpp index 7417a4ea8..24918dd76 100644 --- a/launcher/ui/java/JavaDownloader.cpp +++ b/launcher/ui/java/JavaDownloader.cpp @@ -55,7 +55,7 @@ Downloader::Downloader(QWidget* parent) : QDialog(parent), ui(new Ui::JavaDownlo ui->javaVersionSelect->setEmptyString(tr("No java versions are currently available for your OS.")); ui->javaVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); - ui->buttonBox->button(QDialogButtonBox::Retry)->setText(tr("Refresh")); + ui->buttonBox->button(QDialogButtonBox::Reset)->setText(tr("Refresh")); ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Download")); connect(ui->majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &Downloader::setSelectedVersion); @@ -98,6 +98,7 @@ void Downloader::accept() connect(task.get(), &Task::failed, this, deletePath); connect(task.get(), &Task::aborted, this, deletePath); ProgressDialog pg(this); + pg.setSkipButton(true, tr("Abort")); pg.execWithTask(task.get()); QDialog::accept(); } diff --git a/launcher/ui/java/JavaDownloader.ui b/launcher/ui/java/JavaDownloader.ui index 0eeabb26d..3f6a8adc6 100644 --- a/launcher/ui/java/JavaDownloader.ui +++ b/launcher/ui/java/JavaDownloader.ui @@ -48,7 +48,7 @@ Qt::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Retry + QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset @@ -71,8 +71,8 @@ accept() - 248 - 254 + 257 + 583 157 @@ -87,8 +87,8 @@ reject() - 316 - 260 + 325 + 583 286 diff --git a/launcher/ui/java/VersionList.cpp b/launcher/ui/java/VersionList.cpp index 7c5668d20..4bf04224a 100644 --- a/launcher/ui/java/VersionList.cpp +++ b/launcher/ui/java/VersionList.cpp @@ -104,10 +104,12 @@ bool sortJavas(BaseVersion::Ptr left, BaseVersion::Ptr right) void VersionList::sortVersions() { + if (!m_version || !m_version->data()) + return; QString versionStr = SysInfo::getSupportedJavaArchitecture(); beginResetModel(); auto runtimes = m_version->data()->runtimes; - if (!versionStr.isEmpty() && runtimes.contains(versionStr)) { + if (!versionStr.isEmpty() && !runtimes.isEmpty() && runtimes.contains(versionStr)) { m_vlist = runtimes.value(versionStr); std::sort(m_vlist.begin(), m_vlist.end(), sortJavas); } else { From da96172b0b8835df8591368e96d20464a3a4eb41 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 26 Feb 2024 22:00:40 +0200 Subject: [PATCH 062/616] Apply suggestions from code review Co-authored-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Signed-off-by: Alexandru Ionut Tripon --- launcher/ui/java/VersionList.cpp | 2 +- launcher/ui/pages/global/JavaPage.cpp | 2 +- launcher/ui/pages/instance/InstanceSettingsPage.cpp | 2 +- launcher/ui/widgets/JavaSettingsWidget.cpp | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/launcher/ui/java/VersionList.cpp b/launcher/ui/java/VersionList.cpp index 4bf04224a..dc454f264 100644 --- a/launcher/ui/java/VersionList.cpp +++ b/launcher/ui/java/VersionList.cpp @@ -114,7 +114,7 @@ void VersionList::sortVersions() std::sort(m_vlist.begin(), m_vlist.end(), sortJavas); } else { m_vlist = {}; - qWarning() << "Your operating system is not yet supported: " << SysInfo::currentSystem() << " " << SysInfo::useQTForArch(); + qWarning() << "No Java versions found for your operating system." << SysInfo::currentSystem() << " " << SysInfo::useQTForArch(); } endResetModel(); } diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index cb2a8b90b..95d5f581e 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -154,7 +154,7 @@ void JavaPage::on_javaDetectBtn_clicked() ui->javaPathTextBox->setText(java->path); if (!java->is_64bit && APPLICATION->settings()->get("MaxMemAlloc").toInt() > 2048) { CustomMessageBox::selectable(this, tr("Confirm Selection"), - tr("You selected an x86 java version.\n" + tr("You selected a 32 bit java version.\n" "This means that will not support more than 2048MiB of RAM.\n" "Please make sure that the maximum memory value is lower."), QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok) diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index 8a63aab22..50cffc9a7 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -416,7 +416,7 @@ void InstanceSettingsPage::on_javaDetectBtn_clicked() if (!java->is_64bit && m_settings->get("MaxMemAlloc").toInt() > 2048) { CustomMessageBox::selectable(this, tr("Confirm Selection"), - tr("You selected an x86 java version.\n" + tr("You selected a 32 bit java version.\n" "This means that will not support more than 2048MiB of RAM.\n" "Please make sure that the maximum memory value is lower."), QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok) diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 4b5819288..f8031687b 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -173,8 +173,8 @@ void JavaSettingsWidget::initialize() updateThresholds(); auto button = CustomMessageBox::selectable(this, tr("Auto Java Download"), - tr("%1 has now the ability to auto downloand the correct java for each minecraft version.\n" - "Do you want to enable java auto-download?\n") + tr("%1 can automatically download the correct Java version for each version of Minecraft..\n" + "Do you want to enable Java auto-download?\n") .arg(BuildConfig.LAUNCHER_DISPLAYNAME), QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) ->exec(); @@ -505,7 +505,7 @@ void JavaSettingsWidget::updateThresholds() } else if (observedMaxMemory > 2048 && m_result.is_64bit) { iconName = "status-bad"; m_labelMaxMemIcon->setToolTip( - tr("Your maximum memory allocation exceeds selected java possible memory(due to x86 application limitations).")); + tr("Because you're using 32 bit Java, you're exceeding the maximum possible allocation.")); } else { iconName = "status-good"; m_labelMaxMemIcon->setToolTip(""); From 24fd07861b797fb845217c04b9ad5267edcc4470 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 26 Feb 2024 22:25:14 +0200 Subject: [PATCH 063/616] format code Signed-off-by: Trial97 --- launcher/ui/widgets/JavaSettingsWidget.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index f8031687b..29357bdab 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -504,8 +504,7 @@ void JavaSettingsWidget::updateThresholds() m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value")); } else if (observedMaxMemory > 2048 && m_result.is_64bit) { iconName = "status-bad"; - m_labelMaxMemIcon->setToolTip( - tr("Because you're using 32 bit Java, you're exceeding the maximum possible allocation.")); + m_labelMaxMemIcon->setToolTip(tr("Because you're using 32 bit Java, you're exceeding the maximum possible allocation.")); } else { iconName = "status-good"; m_labelMaxMemIcon->setToolTip(""); From 27780cc7aeee5fd1a5bd535d721c642491cca192 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 6 Mar 2024 14:56:04 +0000 Subject: [PATCH 064/616] Add update UI for all resource types Signed-off-by: TheKodeToad --- launcher/LaunchController.cpp | 2 +- launcher/minecraft/mod/ResourceFolderModel.h | 2 +- .../minecraft/mod/ResourcePackFolderModel.cpp | 5 +- .../minecraft/mod/ShaderPackFolderModel.h | 2 + launcher/modplatform/ResourceAPI.h | 2 +- launcher/modplatform/packwiz/Packwiz.cpp | 28 ++-- launcher/modplatform/packwiz/Packwiz.h | 2 +- launcher/ui/dialogs/ResourceUpdateDialog.cpp | 16 +- launcher/ui/dialogs/ResourceUpdateDialog.h | 4 +- .../pages/instance/ExternalResourcesPage.ui | 50 +++--- launcher/ui/pages/instance/ModFolderPage.cpp | 153 ++++++------------ launcher/ui/pages/instance/ModFolderPage.h | 7 +- .../ui/pages/instance/ResourcePackPage.cpp | 128 ++++++++++++++- launcher/ui/pages/instance/ResourcePackPage.h | 9 +- launcher/ui/pages/instance/ShaderPackPage.cpp | 130 ++++++++++++++- launcher/ui/pages/instance/ShaderPackPage.h | 7 +- .../ui/pages/instance/TexturePackPage.cpp | 128 ++++++++++++++- launcher/ui/pages/instance/TexturePackPage.h | 7 +- 18 files changed, 498 insertions(+), 184 deletions(-) diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index a30f99439..ff8558ce7 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -316,7 +316,7 @@ void LaunchController::launchInstance() online_mode = "online"; // Prepend Server Status - QStringList servers = { "authserver.mojang.com", "session.minecraft.net", "textures.minecraft.net", "api.mojang.com" }; + QStringList servers = { "session.minecraft.net", "textures.minecraft.net", "api.mojang.com" }; QString resolved_servers = ""; QHostInfo host_info; diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index 3de3c5476..e65c69b25 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -255,7 +255,7 @@ class ResourceFolderModel : public QAbstractListModel { protected: // Represents the relationship between a column's index (represented by the list index), and it's sorting key. // As such, the order in with they appear is very important! - QList m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::DATE }; + QList m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::DATE, SortType::PROVIDER }; QStringList m_column_names = { "Enable", "Name", "Last Modified", "Provider" }; QStringList m_column_names_translated = { tr("Enable"), tr("Name"), tr("Last Modified"), tr("Provider") }; QList m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive }; diff --git a/launcher/minecraft/mod/ResourcePackFolderModel.cpp b/launcher/minecraft/mod/ResourcePackFolderModel.cpp index b777dbafd..ccbf80367 100644 --- a/launcher/minecraft/mod/ResourcePackFolderModel.cpp +++ b/launcher/minecraft/mod/ResourcePackFolderModel.cpp @@ -51,8 +51,9 @@ ResourcePackFolderModel::ResourcePackFolderModel(const QDir& dir, BaseInstance* : ResourceFolderModel(dir, instance, is_indexed, create_dir, parent) { m_column_names = QStringList({ "Enable", "Image", "Name", "Pack Format", "Last Modified", "Provider" }); - m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Pack Format"), tr("Last Modified"), tr("Provider") }); - m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::PACK_FORMAT, SortType::DATE }; + m_column_names_translated = + QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Pack Format"), tr("Last Modified"), tr("Provider") }); + m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::PACK_FORMAT, SortType::DATE, SortType::PROVIDER }; m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive, QHeaderView::Interactive }; m_columnsHideable = { false, true, false, true, true, true }; diff --git a/launcher/minecraft/mod/ShaderPackFolderModel.h b/launcher/minecraft/mod/ShaderPackFolderModel.h index c63def238..cd01f6226 100644 --- a/launcher/minecraft/mod/ShaderPackFolderModel.h +++ b/launcher/minecraft/mod/ShaderPackFolderModel.h @@ -20,4 +20,6 @@ class ShaderPackFolderModel : public ResourceFolderModel { { return new LocalShaderPackParseTask(m_next_resolution_ticket, static_cast(resource)); } + + RESOURCE_HELPERS(ShaderPack); }; diff --git a/launcher/modplatform/ResourceAPI.h b/launcher/modplatform/ResourceAPI.h index 2c7bec5d4..7b787c6a0 100644 --- a/launcher/modplatform/ResourceAPI.h +++ b/launcher/modplatform/ResourceAPI.h @@ -83,7 +83,7 @@ class ResourceAPI { struct VersionSearchArgs { ModPlatform::IndexedPack pack; - std::optional > mcVersions; + std::optional> mcVersions; std::optional loaders; VersionSearchArgs(VersionSearchArgs const&) = default; diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index c609e78fc..6e1f507fd 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -110,11 +110,14 @@ auto V1::createModFormat([[maybe_unused]] const QDir& index_dir, mod.hash = mod_version.hash; mod.provider = mod_pack.provider; - mod.version_number = mod_version.version_number; mod.file_id = mod_version.fileId; mod.project_id = mod_pack.addonId; mod.side = stringToSide(mod_pack.side); + mod.version_number = mod_version.version_number; + if (mod.version_number.isNull()) // on CurseForge, there is only a version name - not a versio + mod.version_number = mod_version.version; + return mod; } @@ -164,10 +167,9 @@ void V1::updateModIndex(const QDir& index_dir, Mod& mod) qCritical() << QString("Did not write file %1 because missing information!").arg(normalized_fname); return; } - update = toml::table{ - { "file-id", mod.file_id.toInt() }, - { "project-id", mod.project_id.toInt() }, - }; + update = toml::table{ { "file-id", mod.file_id.toInt() }, + { "project-id", mod.project_id.toInt() }, + { "x-prismlauncher-version-number", mod.version_number.toStdString() } }; break; case (ModPlatform::ResourceProvider::MODRINTH): if (mod.mod_id().toString().isEmpty() || mod.version().toString().isEmpty()) { @@ -177,6 +179,7 @@ void V1::updateModIndex(const QDir& index_dir, Mod& mod) update = toml::table{ { "mod-id", mod.mod_id().toString().toStdString() }, { "version", mod.version().toString().toStdString() }, + { "x-prismlauncher-version-number", mod.version_number.toStdString() }, }; break; } @@ -199,8 +202,7 @@ void V1::updateModIndex(const QDir& index_dir, Mod& mod) { "hash-format", mod.hash_format.toStdString() }, { "hash", mod.hash.toStdString() }, } }, - { "update", toml::table{ { ModPlatform::ProviderCapabilities::name(mod.provider), update }, - { "x-prismlauncher-version-number", mod.version_number.toStdString() } } } }; + { "update", toml::table{ { ModPlatform::ProviderCapabilities::name(mod.provider), update } } } }; std::stringstream ss; ss << tbl; in_stream << QString::fromStdString(ss.str()); @@ -295,23 +297,23 @@ auto V1::getIndexForMod(const QDir& index_dir, QString slug) -> Mod { // [update] info using Provider = ModPlatform::ResourceProvider; - auto update_table = table["update"].as_table(); - if (!update_table) { + auto update_table = table["update"]; + if (!update_table || !update_table.is_table()) { qCritical() << QString("No [update] section found on mod metadata!"); return {}; } - mod.version_number = stringEntry(*update_table, "x-prismlauncher-version-number"); - toml::table* mod_provider_table = nullptr; - if ((mod_provider_table = (*update_table)[ModPlatform::ProviderCapabilities::name(Provider::FLAME)].as_table())) { + if ((mod_provider_table = update_table[ModPlatform::ProviderCapabilities::name(Provider::FLAME)].as_table())) { mod.provider = Provider::FLAME; mod.file_id = intEntry(*mod_provider_table, "file-id"); mod.project_id = intEntry(*mod_provider_table, "project-id"); - } else if ((mod_provider_table = (*update_table)[ModPlatform::ProviderCapabilities::name(Provider::MODRINTH)].as_table())) { + mod.version_number = stringEntry(*mod_provider_table, "x-prismlauncher-version-number"); + } else if ((mod_provider_table = update_table[ModPlatform::ProviderCapabilities::name(Provider::MODRINTH)].as_table())) { mod.provider = Provider::MODRINTH; mod.mod_id() = stringEntry(*mod_provider_table, "mod-id"); mod.version() = stringEntry(*mod_provider_table, "version"); + mod.version_number = stringEntry(*mod_provider_table, "x-prismlauncher-version-number"); } else { qCritical() << QString("No mod provider on mod metadata!"); return {}; diff --git a/launcher/modplatform/packwiz/Packwiz.h b/launcher/modplatform/packwiz/Packwiz.h index 07bb4248d..19ef22dd8 100644 --- a/launcher/modplatform/packwiz/Packwiz.h +++ b/launcher/modplatform/packwiz/Packwiz.h @@ -52,9 +52,9 @@ class V1 { // [update] ModPlatform::ResourceProvider provider{}; - QString version_number{}; QVariant file_id{}; QVariant project_id{}; + QString version_number{}; public: // This is a totally heuristic, but should work for now. diff --git a/launcher/ui/dialogs/ResourceUpdateDialog.cpp b/launcher/ui/dialogs/ResourceUpdateDialog.cpp index 459ba7f23..6426c2bfd 100644 --- a/launcher/ui/dialogs/ResourceUpdateDialog.cpp +++ b/launcher/ui/dialogs/ResourceUpdateDialog.cpp @@ -38,7 +38,8 @@ ResourceUpdateDialog::ResourceUpdateDialog(QWidget* parent, BaseInstance* instance, const std::shared_ptr resource_model, QList& search_for, - bool includeDeps) + bool include_deps, + bool filter_loaders) : ReviewMessageBox(parent, tr("Confirm mods to update"), "") , m_parent(parent) , m_resource_model(resource_model) @@ -46,7 +47,8 @@ ResourceUpdateDialog::ResourceUpdateDialog(QWidget* parent, , m_second_try_metadata( new ConcurrentTask(nullptr, "Second Metadata Search", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())) , m_instance(instance) - , m_include_deps(includeDeps) + , m_include_deps(include_deps) + , m_filter_loaders(filter_loaders) { ReviewMessageBox::setGeometry(0, 0, 800, 600); @@ -85,7 +87,7 @@ void ResourceUpdateDialog::checkCandidates() } auto versions = mcVersions(m_instance); - auto loaders = mcLoaders(m_instance); + auto loaders = m_filter_loaders ? mcLoaders(m_instance) : std::optional(); SequentialTask check_task(m_parent, tr("Checking for updates")); @@ -224,10 +226,10 @@ void ResourceUpdateDialog::checkCandidates() if (dep->pack->provider == ModPlatform::ResourceProvider::FLAME) changelog = api.getModFileChangelog(dep->version.addonId.toInt(), dep->version.fileId.toInt()); auto download_task = makeShared(dep->pack, dep->version, m_resource_model); - CheckUpdateTask::Update updatable = { - dep->pack->name, dep->version.hash, tr("Not installed"), dep->version.version, dep->version.version_type, - changelog, dep->pack->provider, download_task - }; + CheckUpdateTask::Update updatable = { dep->pack->name, dep->version.hash, + tr("Not installed"), dep->version.version, + dep->version.version_type, changelog, + dep->pack->provider, download_task }; appendResource(updatable, getRequiredBy.value(dep->version.addonId.toString())); m_tasks.insert(updatable.name, updatable.download); diff --git a/launcher/ui/dialogs/ResourceUpdateDialog.h b/launcher/ui/dialogs/ResourceUpdateDialog.h index 31aab8f5d..de1d845d2 100644 --- a/launcher/ui/dialogs/ResourceUpdateDialog.h +++ b/launcher/ui/dialogs/ResourceUpdateDialog.h @@ -20,7 +20,8 @@ class ResourceUpdateDialog final : public ReviewMessageBox { BaseInstance* instance, std::shared_ptr resource_model, QList& search_for, - bool includeDeps); + bool include_deps, + bool filter_loaders); void checkCandidates(); @@ -63,4 +64,5 @@ class ResourceUpdateDialog final : public ReviewMessageBox { bool m_no_updates = false; bool m_aborted = false; bool m_include_deps = false; + bool m_filter_loaders = false; }; diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.ui b/launcher/ui/pages/instance/ExternalResourcesPage.ui index ff08e12d2..2b4a47b9d 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.ui +++ b/launcher/ui/pages/instance/ExternalResourcesPage.ui @@ -70,15 +70,15 @@ - - true - Actions Qt::ToolButtonTextOnly + + true + RightToolBarArea @@ -95,10 +95,10 @@ - &Add + &Add File - Add + Add a locally downloaded file. @@ -106,7 +106,7 @@ &Remove - Remove selected item + Remove all selected items. @@ -114,7 +114,7 @@ &Enable - Enable selected item + Enable all selected items. @@ -122,7 +122,7 @@ &Disable - Disable selected item + Disable all selected items. @@ -137,6 +137,9 @@ View &Folder + + Open the folder in the system file manager. + @@ -146,18 +149,7 @@ &Download - Download a new resource - - - - - false - - - Visit mod's page - - - Go to mods home page + Download resources from online mod platforms. @@ -168,7 +160,23 @@ Check for &Updates - Try to check or update all selected resources (all resources if none are selected) + Try to check or update all selected resources (all resources if none are selected). + + + + + Reset Update Metadata + + + QAction::NoRole + + + + + Verify Dependencies + + + QAction::NoRole diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index e513cb1fa..5b10a38df 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -68,88 +68,37 @@ #include "tasks/ConcurrentTask.h" #include "ui/dialogs/ProgressDialog.h" -ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr mods, QWidget* parent) - : ExternalResourcesPage(inst, mods, parent), m_model(mods) +ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr model, QWidget* parent) + : ExternalResourcesPage(inst, model, parent), m_model(model) { - // This is structured like that so that these changes - // do not affect the Resource pack and Shader pack tabs - { - ui->actionDownloadItem->setText(tr("Download mods")); - ui->actionDownloadItem->setToolTip(tr("Download mods from online mod platforms")); - ui->actionDownloadItem->setEnabled(true); - ui->actionAddItem->setText(tr("Add file")); - ui->actionAddItem->setToolTip(tr("Add a locally downloaded file")); + ui->actionDownloadItem->setText(tr("Download Mods")); + ui->actionDownloadItem->setToolTip(tr("Download mods from online mod platforms")); + ui->actionDownloadItem->setEnabled(true); + ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionDownloadItem); - ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionDownloadItem); + connect(ui->actionDownloadItem, &QAction::triggered, this, &ModFolderPage::downloadMods); - connect(ui->actionDownloadItem, &QAction::triggered, this, &ModFolderPage::installMods); + ui->actionUpdateItem->setToolTip(tr("Try to check or update all selected mods (all mods if none are selected)")); + connect(ui->actionUpdateItem, &QAction::triggered, this, &ModFolderPage::updateMods); + ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionUpdateItem); - // update menu - auto updateMenu = ui->actionUpdateItem->menu(); - if (updateMenu) { - updateMenu->clear(); - } else { - updateMenu = new QMenu(this); - } + auto updateMenu = new QMenu(this); - auto update = updateMenu->addAction(tr("Check for Updates")); - update->setToolTip(tr("Try to check or update all selected mods (all mods if none are selected)")); - connect(update, &QAction::triggered, this, &ModFolderPage::updateMods); + auto update = updateMenu->addAction(tr("Check for Updates")); + connect(update, &QAction::triggered, this, &ModFolderPage::updateMods); - auto updateWithDeps = updateMenu->addAction(tr("Verify Dependencies")); - updateWithDeps->setToolTip( - tr("Try to update and check for missing dependencies all selected mods (all mods if none are selected)")); - connect(updateWithDeps, &QAction::triggered, this, [this] { updateMods(true); }); + updateMenu->addAction(ui->actionVerifyItemDependencies); + connect(ui->actionVerifyItemDependencies, &QAction::triggered, this, [this] { updateMods(true); }); - auto depsDisabled = APPLICATION->settings()->getSetting("ModDependenciesDisabled"); - updateWithDeps->setVisible(!depsDisabled->get().toBool()); - connect(depsDisabled.get(), &Setting::SettingChanged, this, - [updateWithDeps](const Setting& setting, QVariant value) { updateWithDeps->setVisible(!value.toBool()); }); + auto depsDisabled = APPLICATION->settings()->getSetting("ModDependenciesDisabled"); + ui->actionVerifyItemDependencies->setVisible(!depsDisabled->get().toBool()); + connect(depsDisabled.get(), &Setting::SettingChanged, this, + [this](const Setting& setting, const QVariant& value) { ui->actionVerifyItemDependencies->setVisible(!value.toBool()); }); - auto actionRemoveItemMetadata = updateMenu->addAction(tr("Reset update metadata")); - actionRemoveItemMetadata->setToolTip(tr("Remove mod's metadata")); - connect(actionRemoveItemMetadata, &QAction::triggered, this, &ModFolderPage::deleteModMetadata); - actionRemoveItemMetadata->setEnabled(false); + updateMenu->addAction(ui->actionResetItemMetadata); + connect(ui->actionResetItemMetadata, &QAction::triggered, this, &ModFolderPage::deleteModMetadata); - ui->actionUpdateItem->setMenu(updateMenu); - - ui->actionUpdateItem->setToolTip(tr("Try to check or update all selected mods (all mods if none are selected)")); - connect(ui->actionUpdateItem, &QAction::triggered, this, &ModFolderPage::updateMods); - ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionUpdateItem); - - ui->actionVisitItemPage->setToolTip(tr("Go to mod's home page")); - ui->actionsToolbar->addAction(ui->actionVisitItemPage); - connect(ui->actionVisitItemPage, &QAction::triggered, this, &ModFolderPage::visitModPages); - - auto check_allow_update = [this] { return ui->treeView->selectionModel()->hasSelection() || !m_model->empty(); }; - - connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, - [this, check_allow_update, actionRemoveItemMetadata] { - ui->actionUpdateItem->setEnabled(check_allow_update()); - - auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); - auto mods_list = m_model->selectedMods(selection); - auto selected = std::count_if(mods_list.cbegin(), mods_list.cend(), - [](Mod* v) { return v->metadata() != nullptr || v->homeurl().size() != 0; }); - if (selected <= 1) { - ui->actionVisitItemPage->setText(tr("Visit mod's page")); - ui->actionVisitItemPage->setToolTip(tr("Go to mod's home page")); - - } else { - ui->actionVisitItemPage->setText(tr("Visit mods' pages")); - ui->actionVisitItemPage->setToolTip(tr("Go to the pages of the selected mods")); - } - ui->actionVisitItemPage->setEnabled(selected != 0); - actionRemoveItemMetadata->setEnabled(selected != 0); - }); - - auto updateButtons = [this, check_allow_update] { ui->actionUpdateItem->setEnabled(check_allow_update()); }; - connect(mods.get(), &ModFolderModel::rowsInserted, this, updateButtons); - - connect(mods.get(), &ModFolderModel::rowsRemoved, this, updateButtons); - - connect(mods.get(), &ModFolderModel::updateFinished, this, updateButtons); - } + ui->actionUpdateItem->setMenu(updateMenu); } bool ModFolderPage::shouldDisplay() const @@ -182,7 +131,7 @@ void ModFolderPage::removeItems(const QItemSelection& selection) m_model->deleteResources(selection.indexes()); } -void ModFolderPage::installMods() +void ModFolderPage::downloadMods() { if (m_instance->typeName() != "Minecraft") return; // this is a null instance or a legacy instance @@ -195,7 +144,7 @@ void ModFolderPage::installMods() ResourceDownload::ModDownloadDialog mdownload(this, m_model, m_instance); if (mdownload.exec()) { - auto tasks = new ConcurrentTask(this, "Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask(this, tr("Download Mods"), APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -257,7 +206,7 @@ void ModFolderPage::updateMods(bool includeDeps) if (use_all) mods_list = m_model->allResources(); - ResourceUpdateDialog update_dialog(this, m_instance, m_model, mods_list, includeDeps); + ResourceUpdateDialog update_dialog(this, m_instance, m_model, mods_list, includeDeps, true); update_dialog.checkCandidates(); if (update_dialog.aborted()) { @@ -307,6 +256,27 @@ void ModFolderPage::updateMods(bool includeDeps) } } +void ModFolderPage::deleteModMetadata() +{ + auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); + auto selectionCount = m_model->selectedMods(selection).length(); + if (selectionCount == 0) + return; + if (selectionCount > 1) { + auto response = CustomMessageBox::selectable(this, tr("Confirm Removal"), + tr("You are about to remove the metadata for %1 mods.\n" + "Are you sure?") + .arg(selectionCount), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); + + if (response != QMessageBox::Yes) + return; + } + + m_model->deleteMetadata(selection); +} + CoreModFolderPage::CoreModFolderPage(BaseInstance* inst, std::shared_ptr mods, QWidget* parent) : ModFolderPage(inst, mods, parent) {} @@ -340,34 +310,3 @@ bool NilModFolderPage::shouldDisplay() const { return m_model->dir().exists(); } - -void ModFolderPage::visitModPages() -{ - auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); - for (auto mod : m_model->selectedMods(selection)) { - auto url = mod->metaurl(); - if (!url.isEmpty()) - DesktopServices::openUrl(url); - } -} - -void ModFolderPage::deleteModMetadata() -{ - auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); - auto selectionCount = m_model->selectedMods(selection).length(); - if (selectionCount == 0) - return; - if (selectionCount > 1) { - auto response = CustomMessageBox::selectable(this, tr("Confirm Removal"), - tr("You are about to remove the metadata for %1 mods.\n" - "Are you sure?") - .arg(selectionCount), - QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) - ->exec(); - - if (response != QMessageBox::Yes) - return; - } - - m_model->deleteMetadata(selection); -} diff --git a/launcher/ui/pages/instance/ModFolderPage.h b/launcher/ui/pages/instance/ModFolderPage.h index 4672350c6..455db33cb 100644 --- a/launcher/ui/pages/instance/ModFolderPage.h +++ b/launcher/ui/pages/instance/ModFolderPage.h @@ -44,7 +44,7 @@ class ModFolderPage : public ExternalResourcesPage { Q_OBJECT public: - explicit ModFolderPage(BaseInstance* inst, std::shared_ptr mods, QWidget* parent = nullptr); + explicit ModFolderPage(BaseInstance* inst, std::shared_ptr model, QWidget* parent = nullptr); virtual ~ModFolderPage() = default; void setFilter(const QString& filter) { m_fileSelectionFilter = filter; } @@ -61,11 +61,10 @@ class ModFolderPage : public ExternalResourcesPage { private slots: void removeItems(const QItemSelection& selection) override; - void deleteModMetadata(); - void installMods(); + void downloadMods(); void updateMods(bool includeDeps = false); - void visitModPages(); + void deleteModMetadata(); protected: std::shared_ptr m_model; diff --git a/launcher/ui/pages/instance/ResourcePackPage.cpp b/launcher/ui/pages/instance/ResourcePackPage.cpp index 85be64256..e51ebafac 100644 --- a/launcher/ui/pages/instance/ResourcePackPage.cpp +++ b/launcher/ui/pages/instance/ResourcePackPage.cpp @@ -42,17 +42,31 @@ #include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/ProgressDialog.h" #include "ui/dialogs/ResourceDownloadDialog.h" +#include "ui/dialogs/ResourceUpdateDialog.h" ResourcePackPage::ResourcePackPage(MinecraftInstance* instance, std::shared_ptr model, QWidget* parent) - : ExternalResourcesPage(instance, model, parent) + : ExternalResourcesPage(instance, model, parent), m_model(model) { - ui->actionDownloadItem->setText(tr("Download packs")); - ui->actionDownloadItem->setToolTip(tr("Download resource packs from online platforms")); + ui->actionDownloadItem->setText(tr("Download Packs")); + ui->actionDownloadItem->setToolTip(tr("Download resource packs from online mod platforms")); ui->actionDownloadItem->setEnabled(true); - connect(ui->actionDownloadItem, &QAction::triggered, this, &ResourcePackPage::downloadRPs); ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionDownloadItem); - ui->actionViewConfigs->setVisible(false); + connect(ui->actionDownloadItem, &QAction::triggered, this, &ResourcePackPage::downloadResourcePacks); + + ui->actionUpdateItem->setToolTip(tr("Try to check or update all selected resource packs (all resource packs if none are selected)")); + connect(ui->actionUpdateItem, &QAction::triggered, this, &ResourcePackPage::updateResourcePacks); + ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionUpdateItem); + + auto updateMenu = new QMenu(this); + + auto update = updateMenu->addAction(ui->actionUpdateItem->text()); + connect(update, &QAction::triggered, this, &ResourcePackPage::updateResourcePacks); + + updateMenu->addAction(ui->actionResetItemMetadata); + connect(ui->actionResetItemMetadata, &QAction::triggered, this, &ResourcePackPage::deleteResourcePackMetadata); + + ui->actionUpdateItem->setMenu(updateMenu); } bool ResourcePackPage::onSelectionChanged(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) @@ -65,12 +79,12 @@ bool ResourcePackPage::onSelectionChanged(const QModelIndex& current, [[maybe_un return true; } -void ResourcePackPage::downloadRPs() +void ResourcePackPage::downloadResourcePacks() { if (m_instance->typeName() != "Minecraft") return; // this is a null instance or a legacy instance - ResourceDownload::ResourcePackDownloadDialog mdownload(this, std::static_pointer_cast(m_model), m_instance); + ResourceDownload::ResourcePackDownloadDialog mdownload(this, m_model, m_instance); if (mdownload.exec()) { auto tasks = new ConcurrentTask(this, "Download Resource Pack", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); @@ -101,3 +115,103 @@ void ResourcePackPage::downloadRPs() m_model->update(); } } + +void ResourcePackPage::updateResourcePacks() +{ + if (m_instance->typeName() != "Minecraft") + return; // this is a null instance or a legacy instance + + auto profile = static_cast(m_instance)->getPackProfile(); + if (APPLICATION->settings()->get("ModMetadataDisabled").toBool()) { + QMessageBox::critical(this, tr("Error"), tr("Resource pack updates are unavailable when metadata is disabled!")); + return; + } + if (m_instance != nullptr && m_instance->isRunning()) { + auto response = + CustomMessageBox::selectable(this, tr("Confirm Update"), + tr("Updating resource packs while the game is running may cause pack duplication and game crashes.\n" + "The old files may not be deleted as they are in use.\n" + "Are you sure you want to do this?"), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); + + if (response != QMessageBox::Yes) + return; + } + auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); + + auto mods_list = m_model->selectedResources(selection); + bool use_all = mods_list.empty(); + if (use_all) + mods_list = m_model->allResources(); + + ResourceUpdateDialog update_dialog(this, m_instance, m_model, mods_list, false, false); + update_dialog.checkCandidates(); + + if (update_dialog.aborted()) { + CustomMessageBox::selectable(this, tr("Aborted"), tr("The resource pack updater was aborted!"), QMessageBox::Warning)->show(); + return; + } + if (update_dialog.noUpdates()) { + QString message{ tr("'%1' is up-to-date! :)").arg(mods_list.front()->name()) }; + if (mods_list.size() > 1) { + if (use_all) { + message = tr("All resource packs are up-to-date! :)"); + } else { + message = tr("All selected resource packs are up-to-date! :)"); + } + } + CustomMessageBox::selectable(this, tr("Update checker"), message)->exec(); + return; + } + + if (update_dialog.exec()) { + auto tasks = new ConcurrentTask(this, "Download Resource Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + connect(tasks, &Task::failed, [this, tasks](QString reason) { + CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::aborted, [this, tasks]() { + CustomMessageBox::selectable(this, tr("Aborted"), tr("Download stopped by user."), QMessageBox::Information)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::succeeded, [this, tasks]() { + QStringList warnings = tasks->warnings(); + if (warnings.count()) { + CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show(); + } + tasks->deleteLater(); + }); + + for (auto task : update_dialog.getTasks()) { + tasks->addTask(task); + } + + ProgressDialog loadDialog(this); + loadDialog.setSkipButton(true, tr("Abort")); + loadDialog.execWithTask(tasks); + + m_model->update(); + } +} + +void ResourcePackPage::deleteResourcePackMetadata() +{ + auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); + auto selectionCount = m_model->selectedResourcePacks(selection).length(); + if (selectionCount == 0) + return; + if (selectionCount > 1) { + auto response = CustomMessageBox::selectable(this, tr("Confirm Removal"), + tr("You are about to remove the metadata for %1 resource packs.\n" + "Are you sure?") + .arg(selectionCount), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); + + if (response != QMessageBox::Yes) + return; + } + + m_model->deleteMetadata(selection); +} diff --git a/launcher/ui/pages/instance/ResourcePackPage.h b/launcher/ui/pages/instance/ResourcePackPage.h index cb84ca96d..c2d36cea1 100644 --- a/launcher/ui/pages/instance/ResourcePackPage.h +++ b/launcher/ui/pages/instance/ResourcePackPage.h @@ -59,5 +59,12 @@ class ResourcePackPage : public ExternalResourcesPage { public slots: bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous) override; - void downloadRPs(); + + private slots: + void downloadResourcePacks(); + void updateResourcePacks(); + void deleteResourcePackMetadata(); + + protected: + std::shared_ptr m_model; }; diff --git a/launcher/ui/pages/instance/ShaderPackPage.cpp b/launcher/ui/pages/instance/ShaderPackPage.cpp index 40366a1be..768d7c710 100644 --- a/launcher/ui/pages/instance/ShaderPackPage.cpp +++ b/launcher/ui/pages/instance/ShaderPackPage.cpp @@ -45,27 +45,41 @@ #include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/ProgressDialog.h" #include "ui/dialogs/ResourceDownloadDialog.h" +#include "ui/dialogs/ResourceUpdateDialog.h" ShaderPackPage::ShaderPackPage(MinecraftInstance* instance, std::shared_ptr model, QWidget* parent) - : ExternalResourcesPage(instance, model, parent) + : ExternalResourcesPage(instance, model, parent), m_model(model) { - ui->actionDownloadItem->setText(tr("Download shaders")); - ui->actionDownloadItem->setToolTip(tr("Download shaders from online platforms")); + ui->actionDownloadItem->setText(tr("Download Packs")); + ui->actionDownloadItem->setToolTip(tr("Download shader packs from online mod platforms")); ui->actionDownloadItem->setEnabled(true); - connect(ui->actionDownloadItem, &QAction::triggered, this, &ShaderPackPage::downloadShaders); ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionDownloadItem); - ui->actionViewConfigs->setVisible(false); + connect(ui->actionDownloadItem, &QAction::triggered, this, &ShaderPackPage::downloadShaderPack); + + ui->actionUpdateItem->setToolTip(tr("Try to check or update all selected shader packs (all shader packs if none are selected)")); + connect(ui->actionUpdateItem, &QAction::triggered, this, &ShaderPackPage::updateShaderPacks); + ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionUpdateItem); + + auto updateMenu = new QMenu(this); + + auto update = updateMenu->addAction(ui->actionUpdateItem->text()); + connect(update, &QAction::triggered, this, &ShaderPackPage::updateShaderPacks); + + updateMenu->addAction(ui->actionResetItemMetadata); + connect(ui->actionResetItemMetadata, &QAction::triggered, this, &ShaderPackPage::deleteShaderPackMetadata); + + ui->actionUpdateItem->setMenu(updateMenu); } -void ShaderPackPage::downloadShaders() +void ShaderPackPage::downloadShaderPack() { if (m_instance->typeName() != "Minecraft") return; // this is a null instance or a legacy instance - ResourceDownload::ShaderPackDownloadDialog mdownload(this, std::static_pointer_cast(m_model), m_instance); + ResourceDownload::ShaderPackDownloadDialog mdownload(this, m_model, m_instance); if (mdownload.exec()) { - auto tasks = new ConcurrentTask(this, "Download Shaders", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask(this, "Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -93,3 +107,103 @@ void ShaderPackPage::downloadShaders() m_model->update(); } } + +void ShaderPackPage::updateShaderPacks() +{ + if (m_instance->typeName() != "Minecraft") + return; // this is a null instance or a legacy instance + + auto profile = static_cast(m_instance)->getPackProfile(); + if (APPLICATION->settings()->get("ModMetadataDisabled").toBool()) { + QMessageBox::critical(this, tr("Error"), tr("Shader pack updates are unavailable when metadata is disabled!")); + return; + } + if (m_instance != nullptr && m_instance->isRunning()) { + auto response = + CustomMessageBox::selectable(this, tr("Confirm Update"), + tr("Updating shader packs while the game is running may pack duplication and game crashes.\n" + "The old files may not be deleted as they are in use.\n" + "Are you sure you want to do this?"), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); + + if (response != QMessageBox::Yes) + return; + } + auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); + + auto mods_list = m_model->selectedResources(selection); + bool use_all = mods_list.empty(); + if (use_all) + mods_list = m_model->allResources(); + + ResourceUpdateDialog update_dialog(this, m_instance, m_model, mods_list, false, false); + update_dialog.checkCandidates(); + + if (update_dialog.aborted()) { + CustomMessageBox::selectable(this, tr("Aborted"), tr("The shader pack updater was aborted!"), QMessageBox::Warning)->show(); + return; + } + if (update_dialog.noUpdates()) { + QString message{ tr("'%1' is up-to-date! :)").arg(mods_list.front()->name()) }; + if (mods_list.size() > 1) { + if (use_all) { + message = tr("All shader packs are up-to-date! :)"); + } else { + message = tr("All selected shader packs are up-to-date! :)"); + } + } + CustomMessageBox::selectable(this, tr("Update checker"), message)->exec(); + return; + } + + if (update_dialog.exec()) { + auto tasks = new ConcurrentTask(this, "Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + connect(tasks, &Task::failed, [this, tasks](QString reason) { + CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::aborted, [this, tasks]() { + CustomMessageBox::selectable(this, tr("Aborted"), tr("Download stopped by user."), QMessageBox::Information)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::succeeded, [this, tasks]() { + QStringList warnings = tasks->warnings(); + if (warnings.count()) { + CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show(); + } + tasks->deleteLater(); + }); + + for (auto task : update_dialog.getTasks()) { + tasks->addTask(task); + } + + ProgressDialog loadDialog(this); + loadDialog.setSkipButton(true, tr("Abort")); + loadDialog.execWithTask(tasks); + + m_model->update(); + } +} + +void ShaderPackPage::deleteShaderPackMetadata() +{ + auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); + auto selectionCount = m_model->selectedShaderPacks(selection).length(); + if (selectionCount == 0) + return; + if (selectionCount > 1) { + auto response = CustomMessageBox::selectable(this, tr("Confirm Removal"), + tr("You are about to remove the metadata for %1 shader packs.\n" + "Are you sure?") + .arg(selectionCount), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); + + if (response != QMessageBox::Yes) + return; + } + + m_model->deleteMetadata(selection); +} diff --git a/launcher/ui/pages/instance/ShaderPackPage.h b/launcher/ui/pages/instance/ShaderPackPage.h index 7c43a3756..fadffe82d 100644 --- a/launcher/ui/pages/instance/ShaderPackPage.h +++ b/launcher/ui/pages/instance/ShaderPackPage.h @@ -53,5 +53,10 @@ class ShaderPackPage : public ExternalResourcesPage { bool shouldDisplay() const override { return true; } public slots: - void downloadShaders(); + void downloadShaderPack(); + void updateShaderPacks(); + void deleteShaderPackMetadata(); + + private: + std::shared_ptr m_model; }; diff --git a/launcher/ui/pages/instance/TexturePackPage.cpp b/launcher/ui/pages/instance/TexturePackPage.cpp index 7c8d7e061..75f8410bc 100644 --- a/launcher/ui/pages/instance/TexturePackPage.cpp +++ b/launcher/ui/pages/instance/TexturePackPage.cpp @@ -44,17 +44,31 @@ #include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/ProgressDialog.h" #include "ui/dialogs/ResourceDownloadDialog.h" +#include "ui/dialogs/ResourceUpdateDialog.h" TexturePackPage::TexturePackPage(MinecraftInstance* instance, std::shared_ptr model, QWidget* parent) - : ExternalResourcesPage(instance, model, parent) + : ExternalResourcesPage(instance, model, parent), m_model(model) { - ui->actionDownloadItem->setText(tr("Download packs")); - ui->actionDownloadItem->setToolTip(tr("Download texture packs from online platforms")); + ui->actionDownloadItem->setText(tr("Download Packs")); + ui->actionDownloadItem->setToolTip(tr("Download texture packs from online mod platforms")); ui->actionDownloadItem->setEnabled(true); - connect(ui->actionDownloadItem, &QAction::triggered, this, &TexturePackPage::downloadTPs); ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionDownloadItem); - ui->actionViewConfigs->setVisible(false); + connect(ui->actionDownloadItem, &QAction::triggered, this, &TexturePackPage::downloadTexturePacks); + + ui->actionUpdateItem->setToolTip(tr("Try to check or update all selected texture packs (all texture packs if none are selected)")); + connect(ui->actionUpdateItem, &QAction::triggered, this, &TexturePackPage::updateTexturePacks); + ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionUpdateItem); + + auto updateMenu = new QMenu(this); + + auto update = updateMenu->addAction(ui->actionUpdateItem->text()); + connect(update, &QAction::triggered, this, &TexturePackPage::updateTexturePacks); + + updateMenu->addAction(ui->actionResetItemMetadata); + connect(ui->actionResetItemMetadata, &QAction::triggered, this, &TexturePackPage::deleteTexturePackMetadata); + + ui->actionUpdateItem->setMenu(updateMenu); } bool TexturePackPage::onSelectionChanged(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) @@ -67,12 +81,12 @@ bool TexturePackPage::onSelectionChanged(const QModelIndex& current, [[maybe_unu return true; } -void TexturePackPage::downloadTPs() +void TexturePackPage::downloadTexturePacks() { if (m_instance->typeName() != "Minecraft") return; // this is a null instance or a legacy instance - ResourceDownload::TexturePackDownloadDialog mdownload(this, std::static_pointer_cast(m_model), m_instance); + ResourceDownload::TexturePackDownloadDialog mdownload(this, m_model, m_instance); if (mdownload.exec()) { auto tasks = new ConcurrentTask(this, "Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); @@ -103,3 +117,103 @@ void TexturePackPage::downloadTPs() m_model->update(); } } + +void TexturePackPage::updateTexturePacks() +{ + if (m_instance->typeName() != "Minecraft") + return; // this is a null instance or a legacy instance + + auto profile = static_cast(m_instance)->getPackProfile(); + if (APPLICATION->settings()->get("ModMetadataDisabled").toBool()) { + QMessageBox::critical(this, tr("Error"), tr("Texture pack updates are unavailable when metadata is disabled!")); + return; + } + if (m_instance != nullptr && m_instance->isRunning()) { + auto response = + CustomMessageBox::selectable(this, tr("Confirm Update"), + tr("Updating texture packs while the game is running may cause pack duplication and game crashes.\n" + "The old files may not be deleted as they are in use.\n" + "Are you sure you want to do this?"), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); + + if (response != QMessageBox::Yes) + return; + } + auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); + + auto mods_list = m_model->selectedResources(selection); + bool use_all = mods_list.empty(); + if (use_all) + mods_list = m_model->allResources(); + + ResourceUpdateDialog update_dialog(this, m_instance, m_model, mods_list, false, false); + update_dialog.checkCandidates(); + + if (update_dialog.aborted()) { + CustomMessageBox::selectable(this, tr("Aborted"), tr("The texture pack updater was aborted!"), QMessageBox::Warning)->show(); + return; + } + if (update_dialog.noUpdates()) { + QString message{ tr("'%1' is up-to-date! :)").arg(mods_list.front()->name()) }; + if (mods_list.size() > 1) { + if (use_all) { + message = tr("All texture packs are up-to-date! :)"); + } else { + message = tr("All selected texture packs are up-to-date! :)"); + } + } + CustomMessageBox::selectable(this, tr("Update checker"), message)->exec(); + return; + } + + if (update_dialog.exec()) { + auto tasks = new ConcurrentTask(this, "Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + connect(tasks, &Task::failed, [this, tasks](QString reason) { + CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::aborted, [this, tasks]() { + CustomMessageBox::selectable(this, tr("Aborted"), tr("Download stopped by user."), QMessageBox::Information)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::succeeded, [this, tasks]() { + QStringList warnings = tasks->warnings(); + if (warnings.count()) { + CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show(); + } + tasks->deleteLater(); + }); + + for (auto task : update_dialog.getTasks()) { + tasks->addTask(task); + } + + ProgressDialog loadDialog(this); + loadDialog.setSkipButton(true, tr("Abort")); + loadDialog.execWithTask(tasks); + + m_model->update(); + } +} + +void TexturePackPage::deleteTexturePackMetadata() +{ + auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); + auto selectionCount = m_model->selectedTexturePacks(selection).length(); + if (selectionCount == 0) + return; + if (selectionCount > 1) { + auto response = CustomMessageBox::selectable(this, tr("Confirm Removal"), + tr("You are about to remove the metadata for %1 texture packs.\n" + "Are you sure?") + .arg(selectionCount), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); + + if (response != QMessageBox::Yes) + return; + } + + m_model->deleteMetadata(selection); +} diff --git a/launcher/ui/pages/instance/TexturePackPage.h b/launcher/ui/pages/instance/TexturePackPage.h index 9c4f24b70..e42613568 100644 --- a/launcher/ui/pages/instance/TexturePackPage.h +++ b/launcher/ui/pages/instance/TexturePackPage.h @@ -56,5 +56,10 @@ class TexturePackPage : public ExternalResourcesPage { public slots: bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous) override; - void downloadTPs(); + void downloadTexturePacks(); + void updateTexturePacks(); + void deleteTexturePackMetadata(); + + private: + std::shared_ptr m_model; }; From 9120848278f8709525b574e92a4e602c593e1f4c Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 6 Mar 2024 19:33:14 +0200 Subject: [PATCH 065/616] Made java downloader as a build option Signed-off-by: Trial97 --- CMakeLists.txt | 3 +++ buildconfig/BuildConfig.cpp.in | 4 +++ buildconfig/BuildConfig.h | 1 + launcher/CMakeLists.txt | 4 +++ launcher/ui/pages/global/JavaPage.cpp | 25 +++++++++++------- .../pages/instance/InstanceSettingsPage.cpp | 2 ++ launcher/ui/widgets/JavaSettingsWidget.cpp | 26 +++++++++++-------- 7 files changed, 45 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6cceb2599..9b7104478 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -219,6 +219,9 @@ set(Launcher_SUBREDDIT_URL "https://prismlauncher.org/reddit" CACHE STRING "URL set(Launcher_FORCE_BUNDLED_LIBS OFF CACHE BOOL "Prevent using system libraries, if they are available as submodules") set(Launcher_QT_VERSION_MAJOR "6" CACHE STRING "Major Qt version to build against") +# Java downloader +option(ENABLE_JAVA_DOWNLOADER "Build the java downloader feature" ON) + # Native libraries if(UNIX AND APPLE) set(Launcher_GLFW_LIBRARY_NAME "libglfw.dylib" CACHE STRING "Name of native glfw library") diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index b40cacb0f..cdf3cbffc 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -81,6 +81,10 @@ Config::Config() UPDATER_ENABLED = true; } +#if ENABLE_JAVA_DOWNLOADER + JAVA_DOWNLOADER_ENABLED = true; +#endif + GIT_COMMIT = "@Launcher_GIT_COMMIT@"; GIT_TAG = "@Launcher_GIT_TAG@"; GIT_REFSPEC = "@Launcher_GIT_REFSPEC@"; diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index 77b6eef54..e3beb8dbe 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -67,6 +67,7 @@ class Config { QString VERSION_CHANNEL; bool UPDATER_ENABLED = false; + bool JAVA_DOWNLOADER_ENABLED = false; /// A short string identifying this build's platform or distribution. QString BUILD_PLATFORM; diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index fcc3c2f3a..f620388dc 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -1320,6 +1320,10 @@ if(DEFINED Launcher_APP_BINARY_DEFS) target_compile_definitions(Launcher_logic PRIVATE ${Launcher_APP_BINARY_DEFS}) endif() +if(ENABLE_JAVA_DOWNLOADER) + target_compile_definitions(Launcher_logic PUBLIC ENABLE_JAVA_DOWNLOADER) +endif() + install(TARGETS ${Launcher_Name} BUNDLE DESTINATION "." COMPONENT Runtime LIBRARY DESTINATION ${LIBRARY_DEST_DIR} COMPONENT Runtime diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 95d5f581e..0276daed5 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -35,6 +35,7 @@ */ #include "JavaPage.h" +#include "BuildConfig.h" #include "JavaCommon.h" #include "java/JavaInstall.h" #include "ui/dialogs/CustomMessageBox.h" @@ -62,15 +63,21 @@ JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage) { ui->setupUi(this); - ui->managedJavaList->initialize(new JavaInstallList(this, true)); - ui->managedJavaList->selectCurrent(); - ui->managedJavaList->setEmptyString(tr("No java versions are currently available in the meta")); - ui->managedJavaList->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); - connect(ui->autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] { - ui->autodownloadCheckBox->setEnabled(ui->autodetectJavaCheckBox->isChecked()); - if (!ui->autodetectJavaCheckBox->isChecked()) - ui->autodownloadCheckBox->setChecked(false); - }); + if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { + ui->managedJavaList->initialize(new JavaInstallList(this, true)); + ui->managedJavaList->selectCurrent(); + ui->managedJavaList->setEmptyString(tr("No java versions are currently available in the meta")); + ui->managedJavaList->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + connect(ui->autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] { + ui->autodownloadCheckBox->setEnabled(ui->autodetectJavaCheckBox->isChecked()); + if (!ui->autodetectJavaCheckBox->isChecked()) + ui->autodownloadCheckBox->setChecked(false); + }); + } else { + ui->autodownloadCheckBox->setHidden(true); + ui->javaDownloadBtn->setHidden(true); + ui->tabWidget->tabBar()->hide(); + } loadSettings(); updateThresholds(); diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index 50cffc9a7..f2a723b81 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -64,6 +64,8 @@ InstanceSettingsPage::InstanceSettingsPage(BaseInstance* inst, QWidget* parent) m_settings = inst->settings(); ui->setupUi(this); + ui->javaDownloadBtn->setHidden(!BuildConfig.JAVA_DOWNLOADER_ENABLED); + connect(ui->openGlobalJavaSettingsButton, &QCommandLinkButton::clicked, this, &InstanceSettingsPage::globalSettingsButtonClicked); connect(APPLICATION, &Application::globalSettingsAboutToOpen, this, &InstanceSettingsPage::applySettings); connect(APPLICATION, &Application::globalSettingsClosed, this, &InstanceSettingsPage::loadSettings); diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 29357bdab..866d4c182 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -129,8 +129,10 @@ void JavaSettingsWidget::setupUi() m_horizontalBtnLayout = new QHBoxLayout(); m_horizontalBtnLayout->setObjectName(QStringLiteral("horizontalBtnLayout")); - m_javaDownloadBtn = new QPushButton(tr("Download Java"), this); - m_horizontalBtnLayout->addWidget(m_javaDownloadBtn); + if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { + m_javaDownloadBtn = new QPushButton(tr("Download Java"), this); + m_horizontalBtnLayout->addWidget(m_javaDownloadBtn); + } m_verticalLayout->addLayout(m_horizontalBtnLayout); @@ -143,15 +145,17 @@ void JavaSettingsWidget::setupUi() m_autodetectJavaCheckBox->setObjectName("autodetectJavaCheckBox"); m_veriticalJavaLayout->addWidget(m_autodetectJavaCheckBox); - m_autodownloadCheckBox = new QCheckBox(m_autoJavaGroupBox); - m_autodownloadCheckBox->setObjectName("autodownloadCheckBox"); - m_autodownloadCheckBox->setEnabled(false); - m_veriticalJavaLayout->addWidget(m_autodownloadCheckBox); - connect(m_autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] { - m_autodownloadCheckBox->setEnabled(m_autodetectJavaCheckBox->isChecked()); - if (!m_autodetectJavaCheckBox->isChecked()) - m_autodownloadCheckBox->setChecked(false); - }); + if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { + m_autodownloadCheckBox = new QCheckBox(m_autoJavaGroupBox); + m_autodownloadCheckBox->setObjectName("autodownloadCheckBox"); + m_autodownloadCheckBox->setEnabled(false); + m_veriticalJavaLayout->addWidget(m_autodownloadCheckBox); + connect(m_autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] { + m_autodownloadCheckBox->setEnabled(m_autodetectJavaCheckBox->isChecked()); + if (!m_autodetectJavaCheckBox->isChecked()) + m_autodownloadCheckBox->setChecked(false); + }); + } m_verticalLayout->addWidget(m_autoJavaGroupBox); retranslate(); From ef4e5eb3cf726e3b59f202d6eceee6f53450743e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 18 Mar 2024 19:15:36 +0200 Subject: [PATCH 066/616] fixed java build option Signed-off-by: Trial97 --- buildconfig/BuildConfig.cpp.in | 5 ++--- launcher/CMakeLists.txt | 4 ---- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index cdf3cbffc..a2b5c2187 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -81,9 +81,8 @@ Config::Config() UPDATER_ENABLED = true; } -#if ENABLE_JAVA_DOWNLOADER - JAVA_DOWNLOADER_ENABLED = true; -#endif + #cmakedefine01 ENABLE_JAVA_DOWNLOADER + JAVA_DOWNLOADER_ENABLED = ENABLE_JAVA_DOWNLOADER; GIT_COMMIT = "@Launcher_GIT_COMMIT@"; GIT_TAG = "@Launcher_GIT_TAG@"; diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index f620388dc..fcc3c2f3a 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -1320,10 +1320,6 @@ if(DEFINED Launcher_APP_BINARY_DEFS) target_compile_definitions(Launcher_logic PRIVATE ${Launcher_APP_BINARY_DEFS}) endif() -if(ENABLE_JAVA_DOWNLOADER) - target_compile_definitions(Launcher_logic PUBLIC ENABLE_JAVA_DOWNLOADER) -endif() - install(TARGETS ${Launcher_Name} BUNDLE DESTINATION "." COMPONENT Runtime LIBRARY DESTINATION ${LIBRARY_DEST_DIR} COMPONENT Runtime From 09c2c6793b52639f86f2edead268b51ad4b5fffc Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 20 Mar 2024 00:15:02 +0200 Subject: [PATCH 067/616] Improve UI Signed-off-by: Trial97 --- launcher/BaseVersionList.cpp | 1 - launcher/BaseVersionList.h | 1 - launcher/CMakeLists.txt | 5 +- launcher/VersionProxyModel.cpp | 9 - launcher/VersionProxyModel.h | 2 +- launcher/java/JavaMetadata.cpp | 2 +- launcher/java/JavaMetadata.h | 2 +- launcher/minecraft/OneSixVersionFormat.cpp | 9 +- launcher/minecraft/VersionFile.h | 2 +- launcher/minecraft/launch/AutoInstallJava.cpp | 60 +++-- launcher/ui/java/InstallJavaDialog.cpp | 234 ++++++++++++++++++ .../{JavaDownloader.h => InstallJavaDialog.h} | 28 +-- launcher/ui/java/JavaDownloader.cpp | 110 -------- launcher/ui/java/JavaDownloader.ui | 100 -------- launcher/ui/java/VersionList.cpp | 14 +- launcher/ui/pages/global/JavaPage.cpp | 4 +- .../pages/instance/InstanceSettingsPage.cpp | 4 +- launcher/ui/widgets/JavaSettingsWidget.cpp | 4 +- 18 files changed, 295 insertions(+), 296 deletions(-) create mode 100644 launcher/ui/java/InstallJavaDialog.cpp rename launcher/ui/java/{JavaDownloader.h => InstallJavaDialog.h} (63%) delete mode 100644 launcher/ui/java/JavaDownloader.cpp delete mode 100644 launcher/ui/java/JavaDownloader.ui diff --git a/launcher/BaseVersionList.cpp b/launcher/BaseVersionList.cpp index 1456a17bd..afee8388a 100644 --- a/launcher/BaseVersionList.cpp +++ b/launcher/BaseVersionList.cpp @@ -112,6 +112,5 @@ QHash BaseVersionList::roleNames() const roles.insert(PathRole, "path"); roles.insert(JavaNameRole, "javaName"); roles.insert(CPUArchitectureRole, "architecture"); - roles.insert(JavaVendorRole, "javaVendor"); return roles; } diff --git a/launcher/BaseVersionList.h b/launcher/BaseVersionList.h index 7517c71b4..bc37e9e53 100644 --- a/launcher/BaseVersionList.h +++ b/launcher/BaseVersionList.h @@ -50,7 +50,6 @@ class BaseVersionList : public QAbstractListModel { PathRole, JavaNameRole, CPUArchitectureRole, - JavaVendorRole, SortRole }; using RoleList = QList; diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index fcc3c2f3a..dd493682e 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -440,8 +440,8 @@ set(JAVA_SOURCES java/download/ManifestDownloadTask.cpp java/download/ManifestDownloadTask.h - ui/java/JavaDownloader.h - ui/java/JavaDownloader.cpp + ui/java/InstallJavaDialog.h + ui/java/InstallJavaDialog.cpp ui/java/VersionList.h ui/java/VersionList.cpp ) @@ -1194,7 +1194,6 @@ qt_wrap_ui(LAUNCHER_UI ui/dialogs/ScrollMessageBox.ui ui/dialogs/BlockedModsDialog.ui ui/dialogs/ChooseProviderDialog.ui - ui/java/JavaDownloader.ui ) qt_wrap_ui(PRISM_UPDATE_UI diff --git a/launcher/VersionProxyModel.cpp b/launcher/VersionProxyModel.cpp index ed4c0767d..070e952a4 100644 --- a/launcher/VersionProxyModel.cpp +++ b/launcher/VersionProxyModel.cpp @@ -116,8 +116,6 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, return tr("Type"); case CPUArchitecture: return tr("Architecture"); - case JavaVendor: - return tr("Vendor"); case Path: return tr("Path"); case JavaName: @@ -137,8 +135,6 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, return tr("The version's type"); case CPUArchitecture: return tr("CPU Architecture"); - case JavaVendor: - return tr("Java vendor"); case Path: return tr("Filesystem path to this version"); case JavaName: @@ -175,8 +171,6 @@ QVariant VersionProxyModel::data(const QModelIndex& index, int role) const return sourceModel()->data(parentIndex, BaseVersionList::TypeRole); case CPUArchitecture: return sourceModel()->data(parentIndex, BaseVersionList::CPUArchitectureRole); - case JavaVendor: - return sourceModel()->data(parentIndex, BaseVersionList::JavaVendorRole); case Path: return sourceModel()->data(parentIndex, BaseVersionList::PathRole); case JavaName: @@ -323,9 +317,6 @@ void VersionProxyModel::setSourceModel(QAbstractItemModel* replacingRaw) if (roles.contains(BaseVersionList::CPUArchitectureRole)) { m_columns.push_back(CPUArchitecture); } - if (roles.contains(BaseVersionList::JavaVendorRole)) { - m_columns.push_back(JavaVendor); - } if (roles.contains(BaseVersionList::PathRole)) { m_columns.push_back(Path); } diff --git a/launcher/VersionProxyModel.h b/launcher/VersionProxyModel.h index 5a1017bee..cb55b7f14 100644 --- a/launcher/VersionProxyModel.h +++ b/launcher/VersionProxyModel.h @@ -9,7 +9,7 @@ class VersionFilterModel; class VersionProxyModel : public QAbstractProxyModel { Q_OBJECT public: - enum Column { Name, ParentVersion, Branch, Type, CPUArchitecture, Path, Time, JavaName, JavaVendor }; + enum Column { Name, ParentVersion, Branch, Type, CPUArchitecture, Path, Time, JavaName }; using FilterMap = QHash>; public: diff --git a/launcher/java/JavaMetadata.cpp b/launcher/java/JavaMetadata.cpp index b73c54fe6..e721947a7 100644 --- a/launcher/java/JavaMetadata.cpp +++ b/launcher/java/JavaMetadata.cpp @@ -52,9 +52,9 @@ MetadataPtr parseJavaMeta(const QJsonObject& in) meta->vendor = Json::ensureString(in, "vendor", ""); meta->url = Json::ensureString(in, "url", ""); meta->releaseTime = timeFromS3Time(Json::ensureString(in, "releaseTime", "")); - meta->recommended = Json::ensureBoolean(in, "recommended", false); meta->downloadType = parseDownloadType(Json::ensureString(in, "downloadType", "")); meta->packageType = Json::ensureString(in, "packageType", ""); + meta->runtimeOS = Json::ensureString(in, "runtimeOS", "unknown"); if (in.contains("checksum")) { auto obj = Json::requireObject(in, "checksum"); diff --git a/launcher/java/JavaMetadata.h b/launcher/java/JavaMetadata.h index 640a412f1..5281f2e27 100644 --- a/launcher/java/JavaMetadata.h +++ b/launcher/java/JavaMetadata.h @@ -50,10 +50,10 @@ class Metadata : public BaseVersion { QDateTime releaseTime; QString checksumType; QString checksumHash; - bool recommended; DownloadType downloadType; QString packageType; JavaVersion version; + QString runtimeOS; }; using MetadataPtr = std::shared_ptr; diff --git a/launcher/minecraft/OneSixVersionFormat.cpp b/launcher/minecraft/OneSixVersionFormat.cpp index 56e9c8ca2..bd587beb2 100644 --- a/launcher/minecraft/OneSixVersionFormat.cpp +++ b/launcher/minecraft/OneSixVersionFormat.cpp @@ -258,14 +258,9 @@ VersionFilePtr OneSixVersionFormat::versionFileFromJson(const QJsonDocument& doc } if (root.contains("runtimes")) { - auto runtimes = requireObject(root, "runtimes"); out->runtimes = {}; - for (auto key : runtimes.keys()) { - QList list; - for (auto runtime : ensureArray(runtimes, key)) { - list.append(Java::parseJavaMeta(ensureObject(runtime))); - } - out->runtimes[key] = list; + for (auto runtime : ensureArray(root, "runtimes")) { + out->runtimes.append(Java::parseJavaMeta(ensureObject(runtime))); } } diff --git a/launcher/minecraft/VersionFile.h b/launcher/minecraft/VersionFile.h index a9c1473d2..85ac55426 100644 --- a/launcher/minecraft/VersionFile.h +++ b/launcher/minecraft/VersionFile.h @@ -155,7 +155,7 @@ class VersionFile : public ProblemContainer { /// is volatile -- may be removed as soon as it is no longer needed by something else bool m_volatile = false; - QHash> runtimes; + QList runtimes; public: // Mojang: DEPRECATED list of 'downloads' - client jar, server jar, windows server exe, maybe more. diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index ab68910a7..3ae6ffa88 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -145,39 +145,35 @@ void AutoInstallJava::setJavaPathFromPartial() void AutoInstallJava::downloadJava(Meta::Version::Ptr version, QString javaName) { auto runtimes = version->data()->runtimes; - if (runtimes.contains(m_supported_arch)) { - for (auto java : runtimes.value(m_supported_arch)) { - if (java->name() == javaName) { - QDir javaDir(APPLICATION->javaPath()); - auto final_path = javaDir.absoluteFilePath(java->m_name); - switch (java->downloadType) { - case Java::DownloadType::Manifest: - m_current_task = - makeShared(java->url, final_path, java->checksumType, java->checksumHash); - break; - case Java::DownloadType::Archive: - m_current_task = - makeShared(java->url, final_path, java->checksumType, java->checksumHash); - break; - } - auto deletePath = [final_path] { FS::deletePath(final_path); }; - connect(m_current_task.get(), &Task::failed, this, [this, deletePath](QString reason) { - deletePath(); - emitFailed(reason); - }); - connect(this, &Task::aborted, this, [this, deletePath] { - m_current_task->abort(); - deletePath(); - }); - connect(m_current_task.get(), &Task::succeeded, this, &AutoInstallJava::setJavaPathFromPartial); - connect(m_current_task.get(), &Task::failed, this, &AutoInstallJava::tryNextMajorJava); - connect(m_current_task.get(), &Task::progress, this, &AutoInstallJava::setProgress); - connect(m_current_task.get(), &Task::stepProgress, this, &AutoInstallJava::propagateStepProgress); - connect(m_current_task.get(), &Task::status, this, &AutoInstallJava::setStatus); - connect(m_current_task.get(), &Task::details, this, &AutoInstallJava::setDetails); - m_current_task->start(); - return; + for (auto java : runtimes) { + if (java->runtimeOS == m_supported_arch && java->name() == javaName) { + QDir javaDir(APPLICATION->javaPath()); + auto final_path = javaDir.absoluteFilePath(java->m_name); + switch (java->downloadType) { + case Java::DownloadType::Manifest: + m_current_task = makeShared(java->url, final_path, java->checksumType, java->checksumHash); + break; + case Java::DownloadType::Archive: + m_current_task = makeShared(java->url, final_path, java->checksumType, java->checksumHash); + break; } + auto deletePath = [final_path] { FS::deletePath(final_path); }; + connect(m_current_task.get(), &Task::failed, this, [this, deletePath](QString reason) { + deletePath(); + emitFailed(reason); + }); + connect(this, &Task::aborted, this, [this, deletePath] { + m_current_task->abort(); + deletePath(); + }); + connect(m_current_task.get(), &Task::succeeded, this, &AutoInstallJava::setJavaPathFromPartial); + connect(m_current_task.get(), &Task::failed, this, &AutoInstallJava::tryNextMajorJava); + connect(m_current_task.get(), &Task::progress, this, &AutoInstallJava::setProgress); + connect(m_current_task.get(), &Task::stepProgress, this, &AutoInstallJava::propagateStepProgress); + connect(m_current_task.get(), &Task::status, this, &AutoInstallJava::setStatus); + connect(m_current_task.get(), &Task::details, this, &AutoInstallJava::setDetails); + m_current_task->start(); + return; } } tryNextMajorJava(); diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp new file mode 100644 index 000000000..054e5cece --- /dev/null +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "InstallJavaDialog.h" + +#include +#include +#include +#include + +#include "Application.h" +#include "FileSystem.h" +#include "java/download/ArchiveDownloadTask.h" +#include "java/download/ManifestDownloadTask.h" +#include "meta/Index.h" +#include "meta/VersionList.h" +#include "ui/dialogs/ProgressDialog.h" +#include "ui/java/VersionList.h" +#include "ui/widgets/PageContainer.h" +#include "ui/widgets/VersionSelectWidget.h" + +class InstallLoaderPage : public QWidget, public BasePage { + public: + Q_OBJECT + public: + explicit InstallLoaderPage(const QString& id, const QString& iconName, const QString& name, QWidget* parent = nullptr) + : QWidget(parent), uid(id), iconName(iconName), name(name) + { + setObjectName(QStringLiteral("VersionSelectWidget")); + horizontalLayout = new QHBoxLayout(this); + horizontalLayout->setObjectName(QStringLiteral("horizontalLayout")); + horizontalLayout->setContentsMargins(0, 0, 0, 0); + + majorVersionSelect = new VersionSelectWidget(this); + majorVersionSelect->selectCurrent(); + majorVersionSelect->setEmptyString(tr("No java versions are currently available in the meta.")); + majorVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + horizontalLayout->addWidget(majorVersionSelect, 1); + + javaVersionSelect = new VersionSelectWidget(this); + javaVersionSelect->setEmptyString(tr("No java versions are currently available for your OS.")); + javaVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + horizontalLayout->addWidget(javaVersionSelect, 4); + connect(majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallLoaderPage::setSelectedVersion); + connect(javaVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallLoaderPage::selectedVersionChanged); + + QMetaObject::connectSlotsByName(this); + } + ~InstallLoaderPage() + { + delete horizontalLayout; + delete majorVersionSelect; + delete javaVersionSelect; + } + + //! loads the list if needed. + void initialize(Meta::VersionList::Ptr vlist) + { + vlist->setProvidedRoles({ BaseVersionList::VersionRole, BaseVersionList::RecommendedRole, BaseVersionList::VersionPointerRole }); + majorVersionSelect->initialize(vlist.get()); + } + + void setSelectedVersion(BaseVersion::Ptr version) + { + auto dcast = std::dynamic_pointer_cast(version); + if (!dcast) { + return; + } + javaVersionSelect->initialize(new Java::VersionList(dcast, this)); + javaVersionSelect->selectCurrent(); + } + + QString id() const override { return uid; } + QString displayName() const override { return name; } + QIcon icon() const override { return APPLICATION->getThemedIcon(iconName); } + + void openedImpl() override + { + if (loaded) + return; + + const auto versions = APPLICATION->metadataIndex()->get(uid); + if (!versions) + return; + + initialize(versions); + loaded = true; + } + + void setParentContainer(BasePageContainer* container) override + { + auto dialog = dynamic_cast(dynamic_cast(container)->parent()); + connect(javaVersionSelect->view(), &QAbstractItemView::doubleClicked, dialog, &QDialog::accept); + } + + BaseVersion::Ptr selectedVersion() const { return javaVersionSelect->selectedVersion(); } + void selectSearch() { javaVersionSelect->selectSearch(); } + void loadList() + { + majorVersionSelect->loadList(); + javaVersionSelect->loadList(); + } + signals: + void selectedVersionChanged(BaseVersion::Ptr version); + + private: + const QString uid; + const QString iconName; + const QString name; + bool loaded = false; + + QHBoxLayout* horizontalLayout = nullptr; + VersionSelectWidget* majorVersionSelect = nullptr; + VersionSelectWidget* javaVersionSelect = nullptr; +}; + +static InstallLoaderPage* pageCast(BasePage* page) +{ + auto result = dynamic_cast(page); + Q_ASSERT(result != nullptr); + return result; +} +namespace Java { + +InstallDialog::InstallDialog(const QString& uid, QWidget* parent) + : QDialog(parent), container(new PageContainer(this, QString(), this)), buttons(new QDialogButtonBox(this)) +{ + auto layout = new QVBoxLayout(this); + + container->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); + layout->addWidget(container); + + auto buttonLayout = new QHBoxLayout(this); + + auto refreshButton = new QPushButton(tr("&Refresh"), this); + connect(refreshButton, &QPushButton::clicked, this, [this] { pageCast(container->selectedPage())->loadList(); }); + buttonLayout->addWidget(refreshButton); + + buttons->setOrientation(Qt::Horizontal); + buttons->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); + buttons->button(QDialogButtonBox::Ok)->setText(tr("Download")); + connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); + buttonLayout->addWidget(buttons); + + layout->addLayout(buttonLayout); + + setWindowTitle(dialogTitle()); + setWindowModality(Qt::WindowModal); + resize(840, 480); + + for (BasePage* page : container->getPages()) { + if (page->id() == uid) + container->selectPage(page->id()); + + connect(pageCast(page), &InstallLoaderPage::selectedVersionChanged, this, [this, page] { + if (page->id() == container->selectedPage()->id()) + validate(container->selectedPage()); + }); + } + connect(container, &PageContainer::selectedPageChanged, this, [this](BasePage* previous, BasePage* current) { validate(current); }); + pageCast(container->selectedPage())->selectSearch(); + validate(container->selectedPage()); +} + +QList InstallDialog::getPages() +{ + return { + // NeoForge + new InstallLoaderPage("net.minecraft.java", "", tr("Mojang")), + // Forge + new InstallLoaderPage("net.adoptium.java", "", tr("Adoptium")), + // Fabric + new InstallLoaderPage("com.azul.java", "", tr("Azul")), + }; +} + +QString InstallDialog::dialogTitle() +{ + return tr("Install Loader"); +} + +void InstallDialog::validate(BasePage* page) +{ + buttons->button(QDialogButtonBox::Ok)->setEnabled(pageCast(page)->selectedVersion() != nullptr); +} + +void InstallDialog::done(int result) +{ + if (result == Accepted) { + auto* page = pageCast(container->selectedPage()); + if (page->selectedVersion()) { + auto meta = std::dynamic_pointer_cast(page->selectedVersion()); + if (meta) { + Task::Ptr task; + auto final_path = FS::PathCombine(APPLICATION->javaPath(), meta->m_name); + switch (meta->downloadType) { + case Java::DownloadType::Manifest: + task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); + break; + case Java::DownloadType::Archive: + task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); + break; + } + auto deletePath = [final_path] { FS::deletePath(final_path); }; + connect(task.get(), &Task::failed, this, deletePath); + connect(task.get(), &Task::aborted, this, deletePath); + ProgressDialog pg(this); + pg.setSkipButton(true, tr("Abort")); + pg.execWithTask(task.get()); + } + } + } + + QDialog::done(result); +} +} // namespace Java + +#include "InstallJavaDialog.moc" \ No newline at end of file diff --git a/launcher/ui/java/JavaDownloader.h b/launcher/ui/java/InstallJavaDialog.h similarity index 63% rename from launcher/ui/java/JavaDownloader.h rename to launcher/ui/java/InstallJavaDialog.h index b8bdde41a..e228adf21 100644 --- a/launcher/ui/java/JavaDownloader.h +++ b/launcher/ui/java/InstallJavaDialog.h @@ -19,30 +19,28 @@ #pragma once #include -#include "BaseVersion.h" +#include "ui/pages/BasePageProvider.h" -namespace Ui { -class JavaDownloader; -} +class MinecraftInstance; +class PageContainer; +class PackProfile; +class QDialogButtonBox; namespace Java { - -class Downloader : public QDialog { +class InstallDialog final : public QDialog, protected BasePageProvider { Q_OBJECT public: - explicit Downloader(QWidget* parent = 0); - ~Downloader(); + explicit InstallDialog(const QString& uid = QString(), QWidget* parent = nullptr); - void accept(); + QList getPages() override; + QString dialogTitle() override; - public slots: - void refresh(); - - protected slots: - void setSelectedVersion(BaseVersion::Ptr version); + void validate(BasePage* page); + void done(int result) override; private: - Ui::JavaDownloader* ui; + PageContainer* container; + QDialogButtonBox* buttons; }; } // namespace Java diff --git a/launcher/ui/java/JavaDownloader.cpp b/launcher/ui/java/JavaDownloader.cpp deleted file mode 100644 index 24918dd76..000000000 --- a/launcher/ui/java/JavaDownloader.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (c) 2024 Trial97 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "JavaDownloader.h" - -#include - -#include - -#include "Application.h" -#include "BaseVersionList.h" -#include "FileSystem.h" -#include "QObjectPtr.h" -#include "SysInfo.h" - -#include "java/JavaMetadata.h" -#include "java/download/ArchiveDownloadTask.h" -#include "java/download/ManifestDownloadTask.h" - -#include "meta/Index.h" -#include "meta/Version.h" - -#include "meta/VersionList.h" -#include "ui/dialogs/ProgressDialog.h" -#include "ui/java/VersionList.h" -#include "ui_JavaDownloader.h" - -namespace Java { - -Downloader::Downloader(QWidget* parent) : QDialog(parent), ui(new Ui::JavaDownloader) -{ - ui->setupUi(this); - auto versionList = APPLICATION->metadataIndex()->get("net.minecraft.java"); - versionList->setProvidedRoles({ BaseVersionList::VersionRole, BaseVersionList::RecommendedRole, BaseVersionList::VersionPointerRole }); - ui->majorVersionSelect->initialize(versionList.get()); - ui->majorVersionSelect->selectCurrent(); - ui->majorVersionSelect->setEmptyString(tr("No java versions are currently available in the meta.")); - ui->majorVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); - - ui->javaVersionSelect->setEmptyString(tr("No java versions are currently available for your OS.")); - ui->javaVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); - - ui->buttonBox->button(QDialogButtonBox::Reset)->setText(tr("Refresh")); - ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Download")); - - connect(ui->majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &Downloader::setSelectedVersion); - auto reset = ui->buttonBox->button(QDialogButtonBox::Reset); - connect(reset, &QPushButton::clicked, this, &Downloader::refresh); -} - -Downloader::~Downloader() -{ - delete ui; -} - -void Downloader::setSelectedVersion(BaseVersion::Ptr version) -{ - auto dcast = std::dynamic_pointer_cast(version); - if (!dcast) { - return; - } - ui->javaVersionSelect->initialize(new Java::VersionList(dcast, this)); - ui->javaVersionSelect->selectCurrent(); -} - -void Downloader::accept() -{ - auto meta = std::dynamic_pointer_cast(ui->javaVersionSelect->selectedVersion()); - if (!meta) { - return; - } - Task::Ptr task; - auto final_path = FS::PathCombine(APPLICATION->javaPath(), meta->m_name); - switch (meta->downloadType) { - case Java::DownloadType::Manifest: - task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); - break; - case Java::DownloadType::Archive: - task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); - break; - } - auto deletePath = [final_path] { FS::deletePath(final_path); }; - connect(task.get(), &Task::failed, this, deletePath); - connect(task.get(), &Task::aborted, this, deletePath); - ProgressDialog pg(this); - pg.setSkipButton(true, tr("Abort")); - pg.execWithTask(task.get()); - QDialog::accept(); -} - -void Downloader::refresh() -{ - ui->majorVersionSelect->loadList(); -} -} // namespace Java diff --git a/launcher/ui/java/JavaDownloader.ui b/launcher/ui/java/JavaDownloader.ui deleted file mode 100644 index 3f6a8adc6..000000000 --- a/launcher/ui/java/JavaDownloader.ui +++ /dev/null @@ -1,100 +0,0 @@ - - - JavaDownloader - - - - 0 - 0 - 821 - 593 - - - - Dialog - - - - - - - - Major - - - - - - - - - - - - Runtime - - - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset - - - - - - - - VersionSelectWidget - QWidget -
ui/widgets/VersionSelectWidget.h
- 1 -
-
- - - - buttonBox - accepted() - JavaDownloader - accept() - - - 257 - 583 - - - 157 - 274 - - - - - buttonBox - rejected() - JavaDownloader - reject() - - - 325 - 583 - - - 286 - 274 - - - - -
diff --git a/launcher/ui/java/VersionList.cpp b/launcher/ui/java/VersionList.cpp index dc454f264..78448ddaf 100644 --- a/launcher/ui/java/VersionList.cpp +++ b/launcher/ui/java/VersionList.cpp @@ -75,11 +75,9 @@ QVariant VersionList::data(const QModelIndex& index, int role) const case VersionRole: return version->version.toString(); case RecommendedRole: - return version->recommended; + return false; // do not recommend any version case JavaNameRole: return version->name(); - case JavaVendorRole: - return version->vendor; case TypeRole: return version->packageType; case Meta::VersionList::TimeRole: @@ -91,8 +89,7 @@ QVariant VersionList::data(const QModelIndex& index, int role) const BaseVersionList::RoleList VersionList::providesRoles() const { - return { VersionPointerRole, VersionIdRole, VersionRole, RecommendedRole, - JavaNameRole, JavaVendorRole, TypeRole, Meta::VersionList::TimeRole }; + return { VersionPointerRole, VersionIdRole, VersionRole, RecommendedRole, JavaNameRole, TypeRole, Meta::VersionList::TimeRole }; } bool sortJavas(BaseVersion::Ptr left, BaseVersion::Ptr right) @@ -109,11 +106,12 @@ void VersionList::sortVersions() QString versionStr = SysInfo::getSupportedJavaArchitecture(); beginResetModel(); auto runtimes = m_version->data()->runtimes; - if (!versionStr.isEmpty() && !runtimes.isEmpty() && runtimes.contains(versionStr)) { - m_vlist = runtimes.value(versionStr); + m_vlist = {}; + if (!versionStr.isEmpty() && !runtimes.isEmpty()) { + std::copy_if(runtimes.begin(), runtimes.end(), std::back_inserter(m_vlist), + [versionStr](Java::MetadataPtr val) { return val->runtimeOS == versionStr; }); std::sort(m_vlist.begin(), m_vlist.end(), sortJavas); } else { - m_vlist = {}; qWarning() << "No Java versions found for your operating system." << SysInfo::currentSystem() << " " << SysInfo::useQTForArch(); } endResetModel(); diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 0276daed5..41a666cf2 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -39,7 +39,7 @@ #include "JavaCommon.h" #include "java/JavaInstall.h" #include "ui/dialogs/CustomMessageBox.h" -#include "ui/java/JavaDownloader.h" +#include "ui/java/InstallJavaDialog.h" #include "ui_JavaPage.h" #include @@ -201,7 +201,7 @@ void JavaPage::on_javaTestBtn_clicked() void JavaPage::on_javaDownloadBtn_clicked() { - auto jdialog = new Java::Downloader(this); + auto jdialog = new Java::InstallDialog({}, this); jdialog->exec(); ui->managedJavaList->loadList(); } diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index 0b731e64f..c248a47f7 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -37,7 +37,7 @@ #include "InstanceSettingsPage.h" #include "ui/dialogs/CustomMessageBox.h" -#include "ui/java/JavaDownloader.h" +#include "ui/java/InstallJavaDialog.h" #include "ui_InstanceSettingsPage.h" #include @@ -394,7 +394,7 @@ void InstanceSettingsPage::loadSettings() void InstanceSettingsPage::on_javaDownloadBtn_clicked() { - auto jdialog = new Java::Downloader(this); + auto jdialog = new Java::InstallDialog({}, this); jdialog->exec(); } diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 866d4c182..e2e498067 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -21,7 +21,7 @@ #include "java/JavaUtils.h" #include "ui/dialogs/CustomMessageBox.h" -#include "ui/java/JavaDownloader.h" +#include "ui/java/InstallJavaDialog.h" #include "ui/widgets/VersionSelectWidget.h" #include "Application.h" @@ -351,7 +351,7 @@ void JavaSettingsWidget::on_javaBrowseBtn_clicked() void JavaSettingsWidget::on_javaDownloadBtn_clicked() { - auto jdialog = new Java::Downloader(this); + auto jdialog = new Java::InstallDialog({}, this); jdialog->exec(); } From 5f8269f5e1ac41b29ed386e1a675e972c8d5624e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 20 Mar 2024 00:29:46 +0200 Subject: [PATCH 068/616] Small class rename Signed-off-by: Trial97 --- launcher/ui/java/InstallJavaDialog.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index 054e5cece..40616aafe 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -34,11 +34,11 @@ #include "ui/widgets/PageContainer.h" #include "ui/widgets/VersionSelectWidget.h" -class InstallLoaderPage : public QWidget, public BasePage { +class InstallJavaPage : public QWidget, public BasePage { public: Q_OBJECT public: - explicit InstallLoaderPage(const QString& id, const QString& iconName, const QString& name, QWidget* parent = nullptr) + explicit InstallJavaPage(const QString& id, const QString& iconName, const QString& name, QWidget* parent = nullptr) : QWidget(parent), uid(id), iconName(iconName), name(name) { setObjectName(QStringLiteral("VersionSelectWidget")); @@ -56,12 +56,12 @@ class InstallLoaderPage : public QWidget, public BasePage { javaVersionSelect->setEmptyString(tr("No java versions are currently available for your OS.")); javaVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); horizontalLayout->addWidget(javaVersionSelect, 4); - connect(majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallLoaderPage::setSelectedVersion); - connect(javaVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallLoaderPage::selectedVersionChanged); + connect(majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallJavaPage::setSelectedVersion); + connect(javaVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallJavaPage::selectedVersionChanged); QMetaObject::connectSlotsByName(this); } - ~InstallLoaderPage() + ~InstallJavaPage() { delete horizontalLayout; delete majorVersionSelect; @@ -129,9 +129,9 @@ class InstallLoaderPage : public QWidget, public BasePage { VersionSelectWidget* javaVersionSelect = nullptr; }; -static InstallLoaderPage* pageCast(BasePage* page) +static InstallJavaPage* pageCast(BasePage* page) { - auto result = dynamic_cast(page); + auto result = dynamic_cast(page); Q_ASSERT(result != nullptr); return result; } @@ -168,7 +168,7 @@ InstallDialog::InstallDialog(const QString& uid, QWidget* parent) if (page->id() == uid) container->selectPage(page->id()); - connect(pageCast(page), &InstallLoaderPage::selectedVersionChanged, this, [this, page] { + connect(pageCast(page), &InstallJavaPage::selectedVersionChanged, this, [this, page] { if (page->id() == container->selectedPage()->id()) validate(container->selectedPage()); }); @@ -182,11 +182,11 @@ QList InstallDialog::getPages() { return { // NeoForge - new InstallLoaderPage("net.minecraft.java", "", tr("Mojang")), + new InstallJavaPage("net.minecraft.java", "", tr("Mojang")), // Forge - new InstallLoaderPage("net.adoptium.java", "", tr("Adoptium")), + new InstallJavaPage("net.adoptium.java", "", tr("Adoptium")), // Fabric - new InstallLoaderPage("com.azul.java", "", tr("Azul")), + new InstallJavaPage("com.azul.java", "", tr("Azul")), }; } From 703470e57d615b1bb1998a253865c8fe7fadcccd Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 20 Mar 2024 08:24:40 +0200 Subject: [PATCH 069/616] Hopefully fix codeql Signed-off-by: Trial97 --- launcher/ui/java/InstallJavaDialog.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/java/InstallJavaDialog.h b/launcher/ui/java/InstallJavaDialog.h index e228adf21..c98c1deae 100644 --- a/launcher/ui/java/InstallJavaDialog.h +++ b/launcher/ui/java/InstallJavaDialog.h @@ -27,7 +27,7 @@ class PackProfile; class QDialogButtonBox; namespace Java { -class InstallDialog final : public QDialog, protected BasePageProvider { +class InstallDialog final : public QDialog, public BasePageProvider { Q_OBJECT public: From 1c809f0fb1ef477d0315a7d1af174852b3b831e8 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 20 Mar 2024 17:39:10 +0200 Subject: [PATCH 070/616] Added more logs for auto java install Signed-off-by: Trial97 --- launcher/minecraft/launch/AutoInstallJava.cpp | 19 ++++++++++++++++++- launcher/ui/java/InstallJavaDialog.cpp | 1 + launcher/ui/java/InstallJavaDialog.h | 2 +- launcher/ui/pages/global/JavaPage.cpp | 5 ++--- launcher/ui/pages/global/JavaPage.ui | 8 -------- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 3ae6ffa88..1dc91003f 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -91,7 +91,21 @@ void AutoInstallJava::executeTask() emit progressReportingRequest(); return; } + if (m_supported_arch.isEmpty()) { + emit logLine(tr("Your system(%1 %2) is not compatible with auto java download. Using the default java path.") + .arg(SysInfo::currentSystem(), SysInfo::useQTForArch()), + MessageLevel::Warning); + emitSucceeded(); + return; + } auto wantedJavaName = packProfile->getProfile()->getCompatibleJavaName(); + if (wantedJavaName.isEmpty()) { + emit logLine(tr("Your meta informtation is old or doesn't have the information necesary to determine what java should be used. " + "Using the default java path."), + MessageLevel::Warning); + emitSucceeded(); + return; + } QDir javaDir(APPLICATION->javaPath()); auto wantedJavaPath = javaDir.absoluteFilePath(wantedJavaName); if (QFileInfo::exists(wantedJavaPath)) { @@ -136,7 +150,8 @@ void AutoInstallJava::setJavaPathFromPartial() if (QFileInfo::exists(finalPath)) { setJavaPath(finalPath); } else { - emit logLine(tr("No compatible java version was found. Using the default one."), MessageLevel::Warning); + emit logLine(tr("No compatible java version was found(the binary file doesn't exists). Using the default one."), + MessageLevel::Warning); emitSucceeded(); } return; @@ -188,6 +203,8 @@ void AutoInstallJava::tryNextMajorJava() auto wantedJavaName = packProfile->getProfile()->getCompatibleJavaName(); auto majorJavaVersions = packProfile->getProfile()->getCompatibleJavaMajors(); if (m_majorJavaVersionIndex >= majorJavaVersions.length()) { + emit logLine(tr("No Java versions found for your operating system: %1 %2").arg(SysInfo::currentSystem(), SysInfo::useQTForArch()), + MessageLevel::Warning); emit logLine(tr("No compatible java version was found. Using the default one."), MessageLevel::Warning); emitSucceeded(); return; diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index 40616aafe..874fc9133 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -72,6 +72,7 @@ class InstallJavaPage : public QWidget, public BasePage { void initialize(Meta::VersionList::Ptr vlist) { vlist->setProvidedRoles({ BaseVersionList::VersionRole, BaseVersionList::RecommendedRole, BaseVersionList::VersionPointerRole }); + vlist->sort(1); majorVersionSelect->initialize(vlist.get()); } diff --git a/launcher/ui/java/InstallJavaDialog.h b/launcher/ui/java/InstallJavaDialog.h index c98c1deae..525e750aa 100644 --- a/launcher/ui/java/InstallJavaDialog.h +++ b/launcher/ui/java/InstallJavaDialog.h @@ -27,7 +27,7 @@ class PackProfile; class QDialogButtonBox; namespace Java { -class InstallDialog final : public QDialog, public BasePageProvider { +class InstallDialog final : public QDialog, private BasePageProvider { Q_OBJECT public: diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 41a666cf2..6d8b95c24 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -66,8 +66,8 @@ JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage) if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { ui->managedJavaList->initialize(new JavaInstallList(this, true)); ui->managedJavaList->selectCurrent(); - ui->managedJavaList->setEmptyString(tr("No java versions are currently available in the meta")); - ui->managedJavaList->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + ui->managedJavaList->setEmptyString(tr("No managed java versions are installed")); + ui->managedJavaList->setEmptyErrorString(tr("Couldn't load the managed java list!")); connect(ui->autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] { ui->autodownloadCheckBox->setEnabled(ui->autodetectJavaCheckBox->isChecked()); if (!ui->autodetectJavaCheckBox->isChecked()) @@ -75,7 +75,6 @@ JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage) }); } else { ui->autodownloadCheckBox->setHidden(true); - ui->javaDownloadBtn->setHidden(true); ui->tabWidget->tabBar()->hide(); } diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index dc1668ee3..c8f62e075 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -178,13 +178,6 @@ - - - - Download Java - - - @@ -424,7 +417,6 @@ permGenSpinBox javaPathTextBox javaBrowseBtn - javaDownloadBtn javaDetectBtn javaTestBtn skipCompatibilityCheckbox From ab7fc2e46cd1ebe3d29436c8939de57d681a24a2 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 21 Mar 2024 00:42:04 +0200 Subject: [PATCH 071/616] Fixed archive java download Signed-off-by: Trial97 --- launcher/MMCZip.cpp | 4 ++++ launcher/java/download/ArchiveDownloadTask.cpp | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index 265eb8b7a..33f5f88fc 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -510,6 +510,10 @@ bool ExportToZipTask::abort() void ExtractZipTask::executeTask() { + if (!m_input->isOpen() && !m_input->open(QuaZip::mdUnzip)) { + emitFailed(tr("Unable to open supplied zip file.")); + return; + } m_zip_future = QtConcurrent::run(QThreadPool::globalInstance(), [this]() { return extractZip(); }); connect(&m_zip_watcher, &QFutureWatcher::finished, this, &ExtractZipTask::finish); m_zip_watcher.setFuture(m_zip_future); diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index 34f60260e..d62d4d8e2 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -35,7 +35,7 @@ void ArchiveDownloadTask::executeTask() // JRE found ! download the zip setStatus(tr("Downloading Java")); - MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("java", m_url.toLocalFile()); + MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("java", m_url.fileName()); auto download = makeShared(QString("JRE::DownloadJava"), APPLICATION->network()); auto action = Net::Download::makeCached(m_url, entry); @@ -70,12 +70,16 @@ void ArchiveDownloadTask::extractJava(QString input) { setStatus(tr("Extracting java")); auto zip = std::make_shared(input); + if (!zip->open(QuaZip::mdUnzip)) { + emitFailed(tr("Unable to open supplied zip file.")); + return; + } auto files = zip->getFileNameList(); if (files.isEmpty()) { emitFailed("Empty archive"); return; } - auto zipTask = makeShared(input, m_final_path, files[0]); + auto zipTask = makeShared(zip, m_final_path, files[0]); auto progressStep = std::make_shared(); connect(zipTask.get(), &Task::finished, this, [this, progressStep] { From 1a6dfd04d66edb667f2ceb6646620b219dc17daf Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 21 Mar 2024 19:46:57 +0200 Subject: [PATCH 072/616] Made tar.gz parser Signed-off-by: Trial97 --- launcher/Application.cpp | 1 + launcher/BaseVersionList.cpp | 9 + launcher/BaseVersionList.h | 1 + launcher/CMakeLists.txt | 2 + launcher/FileSystem.cpp | 3 + launcher/Untar.cpp | 262 ++++++++++++++++++ launcher/Untar.h | 46 +++ launcher/VersionProxyModel.cpp | 9 + launcher/VersionProxyModel.h | 2 +- .../java/download/ArchiveDownloadTask.cpp | 23 ++ launcher/meta/VersionList.cpp | 7 + .../minecraft/launch/VerifyJavaInstall.cpp | 1 - launcher/ui/java/InstallJavaDialog.cpp | 12 +- launcher/ui/java/VersionList.cpp | 7 + launcher/ui/widgets/JavaSettingsWidget.cpp | 2 +- 15 files changed, 381 insertions(+), 6 deletions(-) create mode 100644 launcher/Untar.cpp create mode 100644 launcher/Untar.h diff --git a/launcher/Application.cpp b/launcher/Application.cpp index b0929a0ae..f7fa3aedd 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -869,6 +869,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_metacache->addBase("translations", QDir("translations").absolutePath()); m_metacache->addBase("icons", QDir("cache/icons").absolutePath()); m_metacache->addBase("meta", QDir("meta").absolutePath()); + m_metacache->addBase("java", QDir("cache/java").absolutePath()); m_metacache->Load(); qDebug() << "<> Cache initialized."; } diff --git a/launcher/BaseVersionList.cpp b/launcher/BaseVersionList.cpp index afee8388a..22077c962 100644 --- a/launcher/BaseVersionList.cpp +++ b/launcher/BaseVersionList.cpp @@ -78,6 +78,14 @@ QVariant BaseVersionList::data(const QModelIndex& index, int role) const case TypeRole: return version->typeString(); + case JavaMajorRole: { + auto major = version->name(); + if (major.startsWith("java")) { + major = "Java " + major.mid(4); + } + return major; + } + default: return QVariant(); } @@ -112,5 +120,6 @@ QHash BaseVersionList::roleNames() const roles.insert(PathRole, "path"); roles.insert(JavaNameRole, "javaName"); roles.insert(CPUArchitectureRole, "architecture"); + roles.insert(JavaMajorRole, "javaMajor"); return roles; } diff --git a/launcher/BaseVersionList.h b/launcher/BaseVersionList.h index bc37e9e53..673d13562 100644 --- a/launcher/BaseVersionList.h +++ b/launcher/BaseVersionList.h @@ -49,6 +49,7 @@ class BaseVersionList : public QAbstractListModel { BranchRole, PathRole, JavaNameRole, + JavaMajorRole, CPUArchitectureRole, SortRole }; diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index dd493682e..4f8ab598e 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -24,6 +24,8 @@ set(CORE_SOURCES NullInstance.h MMCZip.h MMCZip.cpp + Untar.h + Untar.cpp StringUtils.h StringUtils.cpp QVariantUtils.h diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index f9be91a2a..8320dfe40 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -276,6 +276,9 @@ bool ensureFolderPathExists(const QFileInfo folderPath) { QDir dir; QString ensuredPath = folderPath.filePath(); + if (folderPath.exists()) + return true; + bool success = dir.mkpath(ensuredPath); return success; } diff --git a/launcher/Untar.cpp b/launcher/Untar.cpp new file mode 100644 index 000000000..521c504a6 --- /dev/null +++ b/launcher/Untar.cpp @@ -0,0 +1,262 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023-2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "Untar.h" +#include +#include +#include +#include +#include +#include +#include +#include "FileSystem.h" + +// adaptation of the: +// - https://github.com/madler/zlib/blob/develop/contrib/untgz/untgz.c +// - https://en.wikipedia.org/wiki/Tar_(computing) +// - https://github.com/euroelessar/cutereader/blob/master/karchive/src/ktar.cpp + +#define BLOCKSIZE 512 +#define SHORTNAMESIZE 100 + +enum class TypeFlag : char { + Regular = '0', // regular file + ARegular = 0, // regular file + Link = '1', // link + Symlink = '2', // reserved + Character = '3', // character special + Block = '4', // block special + Directory = '5', // directory + FIFO = '6', // FIFO special + Contiguous = '7', // reserved + // Posix stuff + GlobalPosixHeader = 'g', + ExtendedPosixHeader = 'x', + // 'A'– 'Z' Vendor specific extensions(POSIX .1 - 1988) + // GNU + GNULongLink = 'K', /* long link name */ + GNULongName = 'L', /* long file name */ +}; + +struct Header { /* byte offset */ + char name[100]; /* 0 */ + char mode[8]; /* 100 */ + char uid[8]; /* 108 */ + char gid[8]; /* 116 */ + char size[12]; /* 124 */ + char mtime[12]; /* 136 */ + char chksum[8]; /* 148 */ + TypeFlag typeflag; /* 156 */ + char linkname[100]; /* 157 */ + char magic[6]; /* 257 */ + char version[2]; /* 263 */ + char uname[32]; /* 265 */ + char gname[32]; /* 297 */ + char devmajor[8]; /* 329 */ + char devminor[8]; /* 337 */ + char prefix[155]; /* 345 */ + /* 500 */ +}; + +union Buffer { + char buffer[BLOCKSIZE]; + struct Header header; +}; + +bool readLonglink(QIODevice* in, Buffer buffer, QByteArray& longlink) +{ + qint64 n = 0; + qint64 size = strtoll(buffer.header.size, NULL, 8); + size--; // ignore trailing null + if (errno == ERANGE) { + qCritical() << "The filename size can't be read"; + return false; + } + if (size < 0) { + qCritical() << "The filename size is negative"; + return false; + } + longlink.resize(size + (BLOCKSIZE - size % BLOCKSIZE)); // make the size divisible by BLOCKSIZE + for (qint64 offset = 0; offset < longlink.size(); offset += BLOCKSIZE) { + n = in->read(longlink.data() + offset, BLOCKSIZE); + if (n != BLOCKSIZE) { + qCritical() << "The expected blocksize was not respected for the name"; + return false; + } + } + longlink.truncate(qstrlen(longlink.constData())); + return true; +} + +bool Tar::extract(QIODevice* in, QString dst) +{ + Buffer buffer; + QString name, symlink, firstFolderName; + bool doNotReset = false; + while (true) { + auto n = in->read(buffer.buffer, BLOCKSIZE); + if (n != BLOCKSIZE) { // allways expect complete blocks + qCritical() << "The expected blocksize was not respected"; + return false; + } + if (buffer.header.name[0] == 0) { // end of archive + return true; + } + int mode = strtol(buffer.header.mode, NULL, 8) | QFile::ReadUser | QFile::WriteUser; // hack to ensure write and read permisions + if (errno == ERANGE) { + qCritical() << "The file mode can't be read"; + return false; + } + // there are names that are exactly 100 bytes long + // and neither longlink nor \0 terminated (bug:101472) + if (name.isEmpty()) { + name = QFile::decodeName(QByteArray(buffer.header.name, qstrnlen(buffer.header.name, 100))); + if (!firstFolderName.isEmpty() && name.startsWith(firstFolderName)) { + name = name.mid(firstFolderName.size()); + } + } + if (symlink.isEmpty()) + symlink = QFile::decodeName(QByteArray(buffer.header.linkname, qstrnlen(buffer.header.linkname, 100))); + switch (buffer.header.typeflag) { + case TypeFlag::Regular: + /* fallthrough */ + case TypeFlag::ARegular: { + auto fileName = FS::PathCombine(dst, name); + if (!FS::ensureFilePathExists(fileName)) { + qCritical() << "Can't ensure the file path to exist: " << fileName; + return false; + } + QFile out(fileName); + if (!out.open(QFile::WriteOnly, QFile::Permission(mode))) { + qCritical() << "Can't open file:" << fileName; + return false; + } + qint64 size = strtoll(buffer.header.size, NULL, 8); + if (errno == ERANGE) { + qCritical() << "The file size can't be read"; + return false; + } + while (size > 0) { + QByteArray tmp(BLOCKSIZE, 0); + n = in->read(tmp.data(), BLOCKSIZE); + if (n != BLOCKSIZE) { + qCritical() << "The expected blocksize was not respected when reading file"; + return false; + } + tmp.truncate(qMin(BLOCKSIZE, size)); + out.write(tmp); + size -= BLOCKSIZE; + } + QFile::setPermissions(fileName, QFile::Permissions(mode)); + break; + } + case TypeFlag::Directory: { + if (firstFolderName.isEmpty()) { + firstFolderName = name; + break; + } + auto folderPath = FS::PathCombine(dst, name); + if (!FS::ensureFolderPathExists(folderPath)) { + qCritical() << "Can't ensure that folder exists: " << folderPath; + return false; + } + break; + } + case TypeFlag::GNULongLink: { + doNotReset = true; + QByteArray longlink; + if (readLonglink(in, buffer, longlink)) { + symlink = QFile::decodeName(longlink.constData()); + } else { + qCritical() << "Failed to read long link"; + return false; + } + break; + } + case TypeFlag::GNULongName: { + doNotReset = true; + QByteArray longlink; + if (readLonglink(in, buffer, longlink)) { + name = QFile::decodeName(longlink.constData()); + } else { + qCritical() << "Failed to read long name"; + return false; + } + break; + } + case TypeFlag::Link: + /* fallthrough */ + case TypeFlag::Symlink: { + auto fileName = FS::PathCombine(dst, name); + if (!FS::create_link(FS::PathCombine(QFileInfo(fileName).path(), symlink), fileName)()) { // do not use symlinks + qCritical() << "Can't create link for:" << fileName << " to:" << FS::PathCombine(QFileInfo(fileName).path(), symlink); + return false; + } + FS::ensureFilePathExists(fileName); + QFile::setPermissions(fileName, QFile::Permissions(mode)); + break; + } + case TypeFlag::Character: + /* fallthrough */ + case TypeFlag::Block: + /* fallthrough */ + case TypeFlag::FIFO: + /* fallthrough */ + case TypeFlag::Contiguous: + /* fallthrough */ + case TypeFlag::GlobalPosixHeader: + /* fallthrough */ + case TypeFlag::ExtendedPosixHeader: + /* fallthrough */ + default: + break; + } + if (!doNotReset) { + name.truncate(0); + symlink.truncate(0); + } + doNotReset = false; + } + return true; +} + +bool GZTar::extract(QString src, QString dst) +{ + QuaGzipFile a(src); + if (!a.open(QIODevice::ReadOnly)) { + qCritical() << "Can't open tar file:" << src; + return false; + } + return Tar::extract(&a, dst); +} \ No newline at end of file diff --git a/launcher/Untar.h b/launcher/Untar.h new file mode 100644 index 000000000..54010e085 --- /dev/null +++ b/launcher/Untar.h @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023-2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once +#include + +// this is a hack used for the java downloader (feel free to remove it in favor of a library) +// both extract functions will extract the first folder inside dest(disregarding the prefix) +namespace Tar { +bool extract(QIODevice* in, QString dst); +}; + +namespace GZTar { +bool extract(QString src, QString dst); +}; \ No newline at end of file diff --git a/launcher/VersionProxyModel.cpp b/launcher/VersionProxyModel.cpp index 070e952a4..62cf4c221 100644 --- a/launcher/VersionProxyModel.cpp +++ b/launcher/VersionProxyModel.cpp @@ -120,6 +120,8 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, return tr("Path"); case JavaName: return tr("Java Name"); + case JavaMajor: + return tr("Major"); case Time: return tr("Released"); } @@ -139,6 +141,8 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, return tr("Filesystem path to this version"); case JavaName: return tr("The alternative name of the java version"); + case JavaMajor: + return tr("The java major version"); case Time: return tr("Release date of this version"); } @@ -175,6 +179,8 @@ QVariant VersionProxyModel::data(const QModelIndex& index, int role) const return sourceModel()->data(parentIndex, BaseVersionList::PathRole); case JavaName: return sourceModel()->data(parentIndex, BaseVersionList::JavaNameRole); + case JavaMajor: + return sourceModel()->data(parentIndex, BaseVersionList::JavaMajorRole); case Time: return sourceModel()->data(parentIndex, Meta::VersionList::TimeRole).toDate(); default: @@ -323,6 +329,9 @@ void VersionProxyModel::setSourceModel(QAbstractItemModel* replacingRaw) if (roles.contains(BaseVersionList::JavaNameRole)) { m_columns.push_back(JavaName); } + if (roles.contains(BaseVersionList::JavaMajorRole)) { + m_columns.push_back(JavaMajor); + } if (roles.contains(Meta::VersionList::TimeRole)) { m_columns.push_back(Time); } diff --git a/launcher/VersionProxyModel.h b/launcher/VersionProxyModel.h index cb55b7f14..8aea25795 100644 --- a/launcher/VersionProxyModel.h +++ b/launcher/VersionProxyModel.h @@ -9,7 +9,7 @@ class VersionFilterModel; class VersionProxyModel : public QAbstractProxyModel { Q_OBJECT public: - enum Column { Name, ParentVersion, Branch, Type, CPUArchitecture, Path, Time, JavaName }; + enum Column { Name, ParentVersion, Branch, Type, CPUArchitecture, Path, Time, JavaName, JavaMajor }; using FilterMap = QHash>; public: diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index d62d4d8e2..358860610 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -21,6 +21,7 @@ #include "MMCZip.h" #include "Application.h" +#include "Untar.h" #include "net/ChecksumValidator.h" #include "net/NetJob.h" #include "tasks/Task.h" @@ -69,6 +70,28 @@ void ArchiveDownloadTask::executeTask() void ArchiveDownloadTask::extractJava(QString input) { setStatus(tr("Extracting java")); + if (input.endsWith("tar")) { + setStatus(tr("Extracting java(the progress will not be reported for tar)")); + QFile in(input); + if (!in.open(QFile::ReadOnly)) { + emitFailed(tr("Unable to open supplied tar file.")); + return; + } + if (!Tar::extract(&in, QDir(m_final_path).absolutePath())) { + emitFailed(tr("Unable to extract supplied tar file.")); + return; + } + emitSucceeded(); + return; + } else if (input.endsWith("tar.gz") || input.endsWith("taz") || input.endsWith("tgz")) { + setStatus(tr("Extracting java(the progress will not be reported for tar)")); + if (!GZTar::extract(input, QDir(m_final_path).absolutePath())) { + emitFailed(tr("Unable to extract supplied tar file.")); + return; + } + emitSucceeded(); + return; + } auto zip = std::make_shared(input); if (!zip->open(QuaZip::mdUnzip)) { emitFailed(tr("Unable to open supplied zip file.")); diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 76b914b6a..66412d6a4 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -92,6 +92,13 @@ QVariant VersionList::data(const QModelIndex& index, int role) const return QVariant::fromValue(version); case RecommendedRole: return version->isRecommended(); + case JavaMajorRole: { + auto major = version->version(); + if (major.startsWith("java")) { + major = "Java " + major.mid(4); + } + return major; + } // FIXME: this should be determined in whatever view/proxy is used... // case LatestRole: return version == getLatestStable(); default: diff --git a/launcher/minecraft/launch/VerifyJavaInstall.cpp b/launcher/minecraft/launch/VerifyJavaInstall.cpp index f26b850eb..5f8b35b02 100644 --- a/launcher/minecraft/launch/VerifyJavaInstall.cpp +++ b/launcher/minecraft/launch/VerifyJavaInstall.cpp @@ -54,7 +54,6 @@ void VerifyJavaInstall::executeTask() auto javaArchitecture = settings->get("JavaArchitecture").toString(); auto maxMemAlloc = settings->get("MaxMemAlloc").toInt(); - emit logLine(tr("Java architecture is x%1.").arg(javaArchitecture), MessageLevel::Info); if (javaArchitecture == "32" && maxMemAlloc > 2048) { emit logLine(tr("Max memory allocation exceeds the supported value.\n" "The selected java is 32-bit and doesn't support more than 2048MiB of RAM.\n" diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index 874fc9133..78de3e20a 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -19,16 +19,19 @@ #include "InstallJavaDialog.h" #include +#include #include #include #include #include "Application.h" +#include "BaseVersionList.h" #include "FileSystem.h" #include "java/download/ArchiveDownloadTask.h" #include "java/download/ManifestDownloadTask.h" #include "meta/Index.h" #include "meta/VersionList.h" +#include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/ProgressDialog.h" #include "ui/java/VersionList.h" #include "ui/widgets/PageContainer.h" @@ -71,8 +74,7 @@ class InstallJavaPage : public QWidget, public BasePage { //! loads the list if needed. void initialize(Meta::VersionList::Ptr vlist) { - vlist->setProvidedRoles({ BaseVersionList::VersionRole, BaseVersionList::RecommendedRole, BaseVersionList::VersionPointerRole }); - vlist->sort(1); + vlist->setProvidedRoles({ BaseVersionList::JavaMajorRole, BaseVersionList::RecommendedRole, BaseVersionList::VersionPointerRole }); majorVersionSelect->initialize(vlist.get()); } @@ -219,7 +221,11 @@ void InstallDialog::done(int result) break; } auto deletePath = [final_path] { FS::deletePath(final_path); }; - connect(task.get(), &Task::failed, this, deletePath); + connect(task.get(), &Task::failed, this, [this, &deletePath](QString reason) { + QString error = QString("Java download failed: %1").arg(reason); + CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)->show(); + deletePath(); + }); connect(task.get(), &Task::aborted, this, deletePath); ProgressDialog pg(this); pg.setSkipButton(true, tr("Abort")); diff --git a/launcher/ui/java/VersionList.cpp b/launcher/ui/java/VersionList.cpp index 78448ddaf..5e385604d 100644 --- a/launcher/ui/java/VersionList.cpp +++ b/launcher/ui/java/VersionList.cpp @@ -78,6 +78,13 @@ QVariant VersionList::data(const QModelIndex& index, int role) const return false; // do not recommend any version case JavaNameRole: return version->name(); + case JavaMajorRole: { + auto major = version->version.toString(); + if (major.startsWith("java")) { + major = "Java " + major.mid(4); + } + return major; + } case TypeRole: return version->packageType; case Meta::VersionList::TimeRole: diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index e2e498067..1645f2b5f 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -180,7 +180,7 @@ void JavaSettingsWidget::initialize() tr("%1 can automatically download the correct Java version for each version of Minecraft..\n" "Do you want to enable Java auto-download?\n") .arg(BuildConfig.LAUNCHER_DISPLAYNAME), - QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) + QMessageBox::Question, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) ->exec(); if (button == QMessageBox::Yes) { m_autodetectJavaCheckBox->setChecked(true); From 3046822272ee97a831667db1c8a222eb304c259e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 21 Mar 2024 19:53:52 +0200 Subject: [PATCH 073/616] Fixed buid Signed-off-by: Trial97 --- launcher/Untar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/Untar.cpp b/launcher/Untar.cpp index 521c504a6..b2f05038c 100644 --- a/launcher/Untar.cpp +++ b/launcher/Untar.cpp @@ -158,10 +158,11 @@ bool Tar::extract(QIODevice* in, QString dst) return false; } QFile out(fileName); - if (!out.open(QFile::WriteOnly, QFile::Permission(mode))) { + if (!out.open(QFile::WriteOnly)) { qCritical() << "Can't open file:" << fileName; return false; } + out.setPermissions(QFile::Permissions(mode)); qint64 size = strtoll(buffer.header.size, NULL, 8); if (errno == ERANGE) { qCritical() << "The file size can't be read"; @@ -178,7 +179,6 @@ bool Tar::extract(QIODevice* in, QString dst) out.write(tmp); size -= BLOCKSIZE; } - QFile::setPermissions(fileName, QFile::Permissions(mode)); break; } case TypeFlag::Directory: { From a7029a9e53cd3d9a2371cd26c257beb898251667 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 21 Mar 2024 20:01:40 +0200 Subject: [PATCH 074/616] Fixed qMin Signed-off-by: Trial97 --- launcher/Untar.cpp | 2 +- launcher/Untar.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/launcher/Untar.cpp b/launcher/Untar.cpp index b2f05038c..bae6c5d17 100644 --- a/launcher/Untar.cpp +++ b/launcher/Untar.cpp @@ -175,7 +175,7 @@ bool Tar::extract(QIODevice* in, QString dst) qCritical() << "The expected blocksize was not respected when reading file"; return false; } - tmp.truncate(qMin(BLOCKSIZE, size)); + tmp.truncate(qMin(qint64(BLOCKSIZE), size)); out.write(tmp); size -= BLOCKSIZE; } diff --git a/launcher/Untar.h b/launcher/Untar.h index 54010e085..50e3a16e3 100644 --- a/launcher/Untar.h +++ b/launcher/Untar.h @@ -39,8 +39,8 @@ // both extract functions will extract the first folder inside dest(disregarding the prefix) namespace Tar { bool extract(QIODevice* in, QString dst); -}; +} namespace GZTar { bool extract(QString src, QString dst); -}; \ No newline at end of file +} \ No newline at end of file From 0b87e4c03b55c96966255eb8440b0c4e7b182c63 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 22 Mar 2024 12:29:15 +0200 Subject: [PATCH 075/616] Fiexed codeql warning Signed-off-by: Trial97 --- launcher/Untar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/Untar.cpp b/launcher/Untar.cpp index bae6c5d17..1d11dfd60 100644 --- a/launcher/Untar.cpp +++ b/launcher/Untar.cpp @@ -94,7 +94,7 @@ union Buffer { struct Header header; }; -bool readLonglink(QIODevice* in, Buffer buffer, QByteArray& longlink) +bool readLonglink(QIODevice* in, Buffer& buffer, QByteArray& longlink) { qint64 n = 0; qint64 size = strtoll(buffer.header.size, NULL, 8); From c0754b80a2b8612ce2874888c0f40b41b2eac765 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 22 Mar 2024 22:17:58 +0200 Subject: [PATCH 076/616] Add resize to last column Signed-off-by: Trial97 --- launcher/ui/pages/global/JavaPage.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 6d8b95c24..fda4f8705 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -65,6 +65,7 @@ JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage) if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { ui->managedJavaList->initialize(new JavaInstallList(this, true)); + ui->managedJavaList->setResizeOn(2); ui->managedJavaList->selectCurrent(); ui->managedJavaList->setEmptyString(tr("No managed java versions are installed")); ui->managedJavaList->setEmptyErrorString(tr("Couldn't load the managed java list!")); From 93f6315b16de3b2170d0263d7befcac5dcfaa01d Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Wed, 27 Mar 2024 19:34:04 +0200 Subject: [PATCH 077/616] Update CMakeLists.txt Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- CMakeLists.txt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 40ccff595..f4298aedb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -220,7 +220,17 @@ set(Launcher_FORCE_BUNDLED_LIBS OFF CACHE BOOL "Prevent using system libraries, set(Launcher_QT_VERSION_MAJOR "6" CACHE STRING "Major Qt version to build against") # Java downloader -option(ENABLE_JAVA_DOWNLOADER "Build the java downloader feature" ON) +set(ENABLE_JAVA_DOWNLOADER_DEFAULT ON) + +# Although we recommend enabling this, we cannot guarantee binary compatibility on +# differing Linux/BSD/etc distributions. Downstream packagers should be explicitly opt-ing into this +# feature if they know it will work with their distribution. +if(UNIX AND NOT APPLE) + set(ENABLE_JAVA_DOWNLOADER_DEFAULT OFF) +endif() + +# Java downloader +option(ENABLE_JAVA_DOWNLOADER "Build the java downloader feature" ${ENABLE_JAVA_DOWNLOADER_DEFAULT}) # Native libraries if(UNIX AND APPLE) From 45028ddc6142b019d28dadd31b8c87433adea312 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 28 Mar 2024 14:58:05 +0200 Subject: [PATCH 078/616] Added java downloader to CI build Signed-off-by: Trial97 --- .github/workflows/build.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9cb737df6..500aca5cb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -274,23 +274,23 @@ jobs: - name: Configure CMake (macOS) if: runner.os == 'macOS' && matrix.qt_ver == 6 run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -G Ninja - name: Configure CMake (macOS-Legacy) if: runner.os == 'macOS' && matrix.qt_ver == 5 run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -G Ninja - name: Configure CMake (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' shell: msys2 {0} run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=6 -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=6 -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} -G Ninja - name: Configure CMake (Windows MSVC) if: runner.os == 'Windows' && matrix.msystem == '' run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=official -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" -A${{ matrix.architecture}} -DLauncher_FORCE_BUNDLED_LIBS=ON -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" -A${{ matrix.architecture}} -DLauncher_FORCE_BUNDLED_LIBS=ON -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} # https://github.com/ccache/ccache/wiki/MS-Visual-Studio (I coudn't figure out the compiler prefix) if ("${{ env.CCACHE_VAR }}") { @@ -305,7 +305,7 @@ jobs: - name: Configure CMake (Linux) if: runner.os == 'Linux' run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DLauncher_BUILD_ARTIFACT=Linux-Qt${{ matrix.qt_ver }} -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DLauncher_BUILD_ARTIFACT=Linux-Qt${{ matrix.qt_ver }} -G Ninja ## # BUILD From 81874f22f74e3d254e16c3054abb28881b50d01a Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 29 Mar 2024 00:10:59 +0200 Subject: [PATCH 079/616] Fixed tar extract Signed-off-by: Trial97 --- launcher/Untar.cpp | 96 +++++++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 49 deletions(-) diff --git a/launcher/Untar.cpp b/launcher/Untar.cpp index 1d11dfd60..f1963e7aa 100644 --- a/launcher/Untar.cpp +++ b/launcher/Untar.cpp @@ -33,13 +33,11 @@ * limitations under the License. */ #include "Untar.h" -#include -#include #include #include +#include #include #include -#include #include "FileSystem.h" // adaptation of the: @@ -69,40 +67,30 @@ enum class TypeFlag : char { GNULongName = 'L', /* long file name */ }; -struct Header { /* byte offset */ - char name[100]; /* 0 */ - char mode[8]; /* 100 */ - char uid[8]; /* 108 */ - char gid[8]; /* 116 */ - char size[12]; /* 124 */ - char mtime[12]; /* 136 */ - char chksum[8]; /* 148 */ - TypeFlag typeflag; /* 156 */ - char linkname[100]; /* 157 */ - char magic[6]; /* 257 */ - char version[2]; /* 263 */ - char uname[32]; /* 265 */ - char gname[32]; /* 297 */ - char devmajor[8]; /* 329 */ - char devminor[8]; /* 337 */ - char prefix[155]; /* 345 */ - /* 500 */ -}; +// struct Header { /* byte offset */ +// char name[100]; /* 0 */ +// char mode[8]; /* 100 */ +// char uid[8]; /* 108 */ +// char gid[8]; /* 116 */ +// char size[12]; /* 124 */ +// char mtime[12]; /* 136 */ +// char chksum[8]; /* 148 */ +// TypeFlag typeflag; /* 156 */ +// char linkname[100]; /* 157 */ +// char magic[6]; /* 257 */ +// char version[2]; /* 263 */ +// char uname[32]; /* 265 */ +// char gname[32]; /* 297 */ +// char devmajor[8]; /* 329 */ +// char devminor[8]; /* 337 */ +// char prefix[155]; /* 345 */ +// /* 500 */ +// }; -union Buffer { - char buffer[BLOCKSIZE]; - struct Header header; -}; - -bool readLonglink(QIODevice* in, Buffer& buffer, QByteArray& longlink) +bool readLonglink(QIODevice* in, qint64 size, QByteArray& longlink) { qint64 n = 0; - qint64 size = strtoll(buffer.header.size, NULL, 8); size--; // ignore trailing null - if (errno == ERANGE) { - qCritical() << "The filename size can't be read"; - return false; - } if (size < 0) { qCritical() << "The filename size is negative"; return false; @@ -119,36 +107,51 @@ bool readLonglink(QIODevice* in, Buffer& buffer, QByteArray& longlink) return true; } +int getOctal(char* buffer, int maxlenght, bool* ok) +{ + return QByteArray(buffer, qstrnlen(buffer, maxlenght)).toInt(ok, 8); +} + +QString decodeName(char* name) +{ + return QFile::decodeName(QByteArray(name, qstrnlen(name, 100))); +} bool Tar::extract(QIODevice* in, QString dst) { - Buffer buffer; + char buffer[BLOCKSIZE]; QString name, symlink, firstFolderName; - bool doNotReset = false; + bool doNotReset = false, ok; while (true) { - auto n = in->read(buffer.buffer, BLOCKSIZE); + auto n = in->read(buffer, BLOCKSIZE); if (n != BLOCKSIZE) { // allways expect complete blocks qCritical() << "The expected blocksize was not respected"; return false; } - if (buffer.header.name[0] == 0) { // end of archive + if (buffer[0] == 0) { // end of archive return true; } - int mode = strtol(buffer.header.mode, NULL, 8) | QFile::ReadUser | QFile::WriteUser; // hack to ensure write and read permisions - if (errno == ERANGE) { + int mode = getOctal(buffer + 100, 8, &ok) | QFile::ReadUser | QFile::WriteUser; // hack to ensure write and read permisions + if (!ok) { qCritical() << "The file mode can't be read"; return false; } // there are names that are exactly 100 bytes long // and neither longlink nor \0 terminated (bug:101472) + if (name.isEmpty()) { - name = QFile::decodeName(QByteArray(buffer.header.name, qstrnlen(buffer.header.name, 100))); + name = decodeName(buffer); if (!firstFolderName.isEmpty() && name.startsWith(firstFolderName)) { name = name.mid(firstFolderName.size()); } } if (symlink.isEmpty()) - symlink = QFile::decodeName(QByteArray(buffer.header.linkname, qstrnlen(buffer.header.linkname, 100))); - switch (buffer.header.typeflag) { + symlink = decodeName(buffer); + qint64 size = getOctal(buffer + 124, 12, &ok); + if (!ok) { + qCritical() << "The file size can't be read"; + return false; + } + switch (TypeFlag(buffer[156])) { case TypeFlag::Regular: /* fallthrough */ case TypeFlag::ARegular: { @@ -163,11 +166,6 @@ bool Tar::extract(QIODevice* in, QString dst) return false; } out.setPermissions(QFile::Permissions(mode)); - qint64 size = strtoll(buffer.header.size, NULL, 8); - if (errno == ERANGE) { - qCritical() << "The file size can't be read"; - return false; - } while (size > 0) { QByteArray tmp(BLOCKSIZE, 0); n = in->read(tmp.data(), BLOCKSIZE); @@ -196,7 +194,7 @@ bool Tar::extract(QIODevice* in, QString dst) case TypeFlag::GNULongLink: { doNotReset = true; QByteArray longlink; - if (readLonglink(in, buffer, longlink)) { + if (readLonglink(in, size, longlink)) { symlink = QFile::decodeName(longlink.constData()); } else { qCritical() << "Failed to read long link"; @@ -207,7 +205,7 @@ bool Tar::extract(QIODevice* in, QString dst) case TypeFlag::GNULongName: { doNotReset = true; QByteArray longlink; - if (readLonglink(in, buffer, longlink)) { + if (readLonglink(in, size, longlink)) { name = QFile::decodeName(longlink.constData()); } else { qCritical() << "Failed to read long name"; From 803e26a4018d788178032b653fd06d1b8970b3a4 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 26 Apr 2024 01:40:18 +0100 Subject: [PATCH 080/616] Make actions more consistent Signed-off-by: TheKodeToad --- .../pages/instance/ExternalResourcesPage.cpp | 34 +++++++++++++------ .../ui/pages/instance/ExternalResourcesPage.h | 5 ++- .../pages/instance/ExternalResourcesPage.ui | 11 +++++- launcher/ui/pages/instance/ModFolderPage.cpp | 4 +-- launcher/ui/pages/instance/ModFolderPage.h | 2 +- .../ui/pages/instance/ResourcePackPage.cpp | 21 ++++++------ launcher/ui/pages/instance/ResourcePackPage.h | 2 +- .../ui/pages/instance/TexturePackPage.cpp | 21 ++++++------ launcher/ui/pages/instance/TexturePackPage.h | 2 +- 9 files changed, 59 insertions(+), 43 deletions(-) diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index 2068fa6b1..a3b58f4df 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -81,15 +81,28 @@ ExternalResourcesPage::ExternalResourcesPage(BaseInstance* instance, std::shared connect(ui->treeView, &ModListView::activated, this, &ExternalResourcesPage::itemActivated); auto selection_model = ui->treeView->selectionModel(); - connect(selection_model, &QItemSelectionModel::currentChanged, this, &ExternalResourcesPage::current); + + connect(selection_model, &QItemSelectionModel::currentChanged, this, [this](const QModelIndex& current, const QModelIndex& previous) { + if (!current.isValid()) { + ui->frame->clear(); + return; + } + + updateFrame(current, previous); + }); + auto updateExtra = [this]() { if (updateExtraInfo) updateExtraInfo(id(), extraHeaderInfoString()); }; + connect(selection_model, &QItemSelectionModel::selectionChanged, this, updateExtra); connect(model.get(), &ResourceFolderModel::updateFinished, this, updateExtra); - connect(ui->filterEdit, &QLineEdit::textChanged, this, &ExternalResourcesPage::filterTextChanged); + connect(selection_model, &QItemSelectionModel::selectionChanged, this, [this] { updateActions(); }); + connect(m_model.get(), &ResourceFolderModel::rowsInserted, this, [this] { updateActions(); }); + connect(m_model.get(), &ResourceFolderModel::rowsRemoved, this, [this] { updateActions(); }); + connect(m_model.get(), &ResourceFolderModel::updateFinished, this, [this] { updateActions(); }); auto viewHeader = ui->treeView->header(); viewHeader->setContextMenuPolicy(Qt::CustomContextMenu); @@ -298,23 +311,22 @@ void ExternalResourcesPage::viewFolder() DesktopServices::openPath(m_model->dir().absolutePath(), true); } -bool ExternalResourcesPage::current(const QModelIndex& current, const QModelIndex& previous) +void ExternalResourcesPage::updateActions() { - if (!current.isValid()) { - ui->frame->clear(); - return false; - } - - return onSelectionChanged(current, previous); + const bool hasSelection = ui->treeView->selectionModel()->hasSelection(); + ui->actionUpdateItem->setEnabled(!m_model->empty()); + ui->actionResetItemMetadata->setEnabled(hasSelection); + ui->actionRemoveItem->setEnabled(hasSelection); + ui->actionEnableItem->setEnabled(hasSelection); + ui->actionDisableItem->setEnabled(hasSelection); } -bool ExternalResourcesPage::onSelectionChanged(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) +void ExternalResourcesPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) { auto sourceCurrent = m_filterModel->mapToSource(current); int row = sourceCurrent.row(); Resource const& resource = m_model->at(row); ui->frame->updateWithResource(resource); - return true; } QString ExternalResourcesPage::extraHeaderInfoString() diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.h b/launcher/ui/pages/instance/ExternalResourcesPage.h index d29be0fc3..9bbd13984 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.h +++ b/launcher/ui/pages/instance/ExternalResourcesPage.h @@ -42,9 +42,8 @@ class ExternalResourcesPage : public QMainWindow, public BasePage { QMenu* createPopupMenu() override; public slots: - bool current(const QModelIndex& current, const QModelIndex& previous); - - virtual bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous); + virtual void updateActions(); + virtual void updateFrame(const QModelIndex& current, const QModelIndex& previous); protected slots: void itemActivated(const QModelIndex& index); diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.ui b/launcher/ui/pages/instance/ExternalResourcesPage.ui index 2b4a47b9d..c671efaf8 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.ui +++ b/launcher/ui/pages/instance/ExternalResourcesPage.ui @@ -102,6 +102,9 @@ + + false + &Remove @@ -110,6 +113,9 @@ + + false + &Enable @@ -118,6 +124,9 @@ + + false + &Disable @@ -154,7 +163,7 @@ - true + false Check for &Updates diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 5b10a38df..e647120c2 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -106,14 +106,12 @@ bool ModFolderPage::shouldDisplay() const return true; } -bool ModFolderPage::onSelectionChanged(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) +void ModFolderPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) { auto sourceCurrent = m_filterModel->mapToSource(current); int row = sourceCurrent.row(); const Mod& mod = m_model->at(row); ui->frame->updateWithMod(mod); - - return true; } void ModFolderPage::removeItems(const QItemSelection& selection) diff --git a/launcher/ui/pages/instance/ModFolderPage.h b/launcher/ui/pages/instance/ModFolderPage.h index 455db33cb..4fac80141 100644 --- a/launcher/ui/pages/instance/ModFolderPage.h +++ b/launcher/ui/pages/instance/ModFolderPage.h @@ -57,7 +57,7 @@ class ModFolderPage : public ExternalResourcesPage { virtual bool shouldDisplay() const override; public slots: - bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous) override; + void updateFrame(const QModelIndex& current, const QModelIndex& previous) override; private slots: void removeItems(const QItemSelection& selection) override; diff --git a/launcher/ui/pages/instance/ResourcePackPage.cpp b/launcher/ui/pages/instance/ResourcePackPage.cpp index e51ebafac..d03511ca4 100644 --- a/launcher/ui/pages/instance/ResourcePackPage.cpp +++ b/launcher/ui/pages/instance/ResourcePackPage.cpp @@ -69,14 +69,12 @@ ResourcePackPage::ResourcePackPage(MinecraftInstance* instance, std::shared_ptr< ui->actionUpdateItem->setMenu(updateMenu); } -bool ResourcePackPage::onSelectionChanged(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) +void ResourcePackPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) { auto sourceCurrent = m_filterModel->mapToSource(current); int row = sourceCurrent.row(); auto& rp = static_cast(m_model->at(row)); ui->frame->updateWithResourcePack(rp); - - return true; } void ResourcePackPage::downloadResourcePacks() @@ -127,13 +125,13 @@ void ResourcePackPage::updateResourcePacks() return; } if (m_instance != nullptr && m_instance->isRunning()) { - auto response = - CustomMessageBox::selectable(this, tr("Confirm Update"), - tr("Updating resource packs while the game is running may cause pack duplication and game crashes.\n" - "The old files may not be deleted as they are in use.\n" - "Are you sure you want to do this?"), - QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) - ->exec(); + auto response = CustomMessageBox::selectable( + this, tr("Confirm Update"), + tr("Updating resource packs while the game is running may cause pack duplication and game crashes.\n" + "The old files may not be deleted as they are in use.\n" + "Are you sure you want to do this?"), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); if (response != QMessageBox::Yes) return; @@ -166,7 +164,8 @@ void ResourcePackPage::updateResourcePacks() } if (update_dialog.exec()) { - auto tasks = new ConcurrentTask(this, "Download Resource Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = + new ConcurrentTask(this, "Download Resource Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); diff --git a/launcher/ui/pages/instance/ResourcePackPage.h b/launcher/ui/pages/instance/ResourcePackPage.h index c2d36cea1..e95809cf8 100644 --- a/launcher/ui/pages/instance/ResourcePackPage.h +++ b/launcher/ui/pages/instance/ResourcePackPage.h @@ -58,7 +58,7 @@ class ResourcePackPage : public ExternalResourcesPage { } public slots: - bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous) override; + void updateFrame(const QModelIndex& current, const QModelIndex& previous) override; private slots: void downloadResourcePacks(); diff --git a/launcher/ui/pages/instance/TexturePackPage.cpp b/launcher/ui/pages/instance/TexturePackPage.cpp index 75f8410bc..cdd2b0964 100644 --- a/launcher/ui/pages/instance/TexturePackPage.cpp +++ b/launcher/ui/pages/instance/TexturePackPage.cpp @@ -71,14 +71,12 @@ TexturePackPage::TexturePackPage(MinecraftInstance* instance, std::shared_ptractionUpdateItem->setMenu(updateMenu); } -bool TexturePackPage::onSelectionChanged(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) +void TexturePackPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) { auto sourceCurrent = m_filterModel->mapToSource(current); int row = sourceCurrent.row(); auto& rp = static_cast(m_model->at(row)); ui->frame->updateWithTexturePack(rp); - - return true; } void TexturePackPage::downloadTexturePacks() @@ -129,13 +127,13 @@ void TexturePackPage::updateTexturePacks() return; } if (m_instance != nullptr && m_instance->isRunning()) { - auto response = - CustomMessageBox::selectable(this, tr("Confirm Update"), - tr("Updating texture packs while the game is running may cause pack duplication and game crashes.\n" - "The old files may not be deleted as they are in use.\n" - "Are you sure you want to do this?"), - QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) - ->exec(); + auto response = CustomMessageBox::selectable( + this, tr("Confirm Update"), + tr("Updating texture packs while the game is running may cause pack duplication and game crashes.\n" + "The old files may not be deleted as they are in use.\n" + "Are you sure you want to do this?"), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); if (response != QMessageBox::Yes) return; @@ -168,7 +166,8 @@ void TexturePackPage::updateTexturePacks() } if (update_dialog.exec()) { - auto tasks = new ConcurrentTask(this, "Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = + new ConcurrentTask(this, "Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); diff --git a/launcher/ui/pages/instance/TexturePackPage.h b/launcher/ui/pages/instance/TexturePackPage.h index e42613568..4dc2c16c2 100644 --- a/launcher/ui/pages/instance/TexturePackPage.h +++ b/launcher/ui/pages/instance/TexturePackPage.h @@ -55,7 +55,7 @@ class TexturePackPage : public ExternalResourcesPage { virtual bool shouldDisplay() const override { return m_instance->traits().contains("texturepacks"); } public slots: - bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous) override; + void updateFrame(const QModelIndex& current, const QModelIndex& previous) override; void downloadTexturePacks(); void updateTexturePacks(); void deleteTexturePackMetadata(); From 9ce10231edcf256eb0bcb2a3e78c3c06b156c800 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 26 Apr 2024 01:44:43 +0100 Subject: [PATCH 081/616] Remove redundant event handler Signed-off-by: TheKodeToad --- launcher/ui/pages/instance/ExternalResourcesPage.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index a3b58f4df..1ee473541 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -102,7 +102,6 @@ ExternalResourcesPage::ExternalResourcesPage(BaseInstance* instance, std::shared connect(selection_model, &QItemSelectionModel::selectionChanged, this, [this] { updateActions(); }); connect(m_model.get(), &ResourceFolderModel::rowsInserted, this, [this] { updateActions(); }); connect(m_model.get(), &ResourceFolderModel::rowsRemoved, this, [this] { updateActions(); }); - connect(m_model.get(), &ResourceFolderModel::updateFinished, this, [this] { updateActions(); }); auto viewHeader = ui->treeView->header(); viewHeader->setContextMenuPolicy(Qt::CustomContextMenu); From b23b53d98d5c99353a79355371a7eb7a8537df0c Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 18 May 2024 14:43:58 +0300 Subject: [PATCH 082/616] Add missing header Signed-off-by: Trial97 --- launcher/java/JavaChecker.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/java/JavaChecker.cpp b/launcher/java/JavaChecker.cpp index 678c98cd4..c54a5b04b 100644 --- a/launcher/java/JavaChecker.cpp +++ b/launcher/java/JavaChecker.cpp @@ -41,6 +41,7 @@ #include #include "Commandline.h" +#include "FileSystem.h" #include "java/JavaUtils.h" JavaChecker::JavaChecker(QString path, QString args, int minMem, int maxMem, int permGen, int id, QObject* parent) From abb628edb36a7e3e433dee93a224dbd4329acc24 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 20 May 2024 18:23:43 +0300 Subject: [PATCH 083/616] remove OverrideJava Signed-off-by: Trial97 --- launcher/launch/steps/CheckJava.cpp | 2 +- launcher/minecraft/MinecraftInstance.cpp | 21 +++++++------------ launcher/minecraft/launch/AutoInstallJava.cpp | 4 +--- .../pages/instance/InstanceSettingsPage.cpp | 8 ++----- 4 files changed, 12 insertions(+), 23 deletions(-) diff --git a/launcher/launch/steps/CheckJava.cpp b/launcher/launch/steps/CheckJava.cpp index a8c7305ab..b5b85563a 100644 --- a/launcher/launch/steps/CheckJava.cpp +++ b/launcher/launch/steps/CheckJava.cpp @@ -47,7 +47,7 @@ void CheckJava::executeTask() auto instance = m_parent->instance(); auto settings = instance->settings(); m_javaPath = FS::ResolveExecutable(settings->get("JavaPath").toString()); - bool perInstance = settings->get("OverrideJava").toBool() || settings->get("OverrideJavaLocation").toBool(); + bool perInstance = settings->get("OverrideJavaLocation").toBool(); auto realJavaPath = QStandardPaths::findExecutable(m_javaPath); if (realJavaPath.isEmpty()) { diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 9fa313843..0b0a279a5 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -136,25 +136,20 @@ void MinecraftInstance::loadSpecificSettings() return; // Java Settings - auto javaOverride = m_settings->registerSetting("OverrideJava", false); auto locationOverride = m_settings->registerSetting("OverrideJavaLocation", false); auto argsOverride = m_settings->registerSetting("OverrideJavaArgs", false); - // combinations - auto javaOrLocation = std::make_shared("JavaOrLocationOverride", javaOverride, locationOverride); - auto javaOrArgs = std::make_shared("JavaOrArgsOverride", javaOverride, argsOverride); - if (auto global_settings = globalSettings()) { - m_settings->registerOverride(global_settings->getSetting("JavaPath"), javaOrLocation); - m_settings->registerOverride(global_settings->getSetting("JvmArgs"), javaOrArgs); - m_settings->registerOverride(global_settings->getSetting("IgnoreJavaCompatibility"), javaOrLocation); + m_settings->registerOverride(global_settings->getSetting("JavaPath"), locationOverride); + m_settings->registerOverride(global_settings->getSetting("JvmArgs"), argsOverride); + m_settings->registerOverride(global_settings->getSetting("IgnoreJavaCompatibility"), locationOverride); // special! - m_settings->registerPassthrough(global_settings->getSetting("JavaSignature"), javaOrLocation); - m_settings->registerPassthrough(global_settings->getSetting("JavaArchitecture"), javaOrLocation); - m_settings->registerPassthrough(global_settings->getSetting("JavaRealArchitecture"), javaOrLocation); - m_settings->registerPassthrough(global_settings->getSetting("JavaVersion"), javaOrLocation); - m_settings->registerPassthrough(global_settings->getSetting("JavaVendor"), javaOrLocation); + m_settings->registerPassthrough(global_settings->getSetting("JavaSignature"), locationOverride); + m_settings->registerPassthrough(global_settings->getSetting("JavaArchitecture"), locationOverride); + m_settings->registerPassthrough(global_settings->getSetting("JavaRealArchitecture"), locationOverride); + m_settings->registerPassthrough(global_settings->getSetting("JavaVersion"), locationOverride); + m_settings->registerPassthrough(global_settings->getSetting("JavaVendor"), locationOverride); // Window Size auto windowSetting = m_settings->registerSetting("OverrideWindow", false); diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 1dc91003f..95bfa1dec 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -61,8 +61,7 @@ void AutoInstallJava::executeTask() { auto settings = m_instance->settings(); if (!APPLICATION->settings()->get("AutomaticJavaSwitch").toBool() || - (settings->get("OverrideJava").toBool() && settings->get("OverrideJavaLocation").toBool() && - QFileInfo::exists(settings->get("JavaPath").toString()))) { + (settings->get("OverrideJavaLocation").toBool() && QFileInfo::exists(settings->get("JavaPath").toString()))) { emitSucceeded(); return; } @@ -126,7 +125,6 @@ void AutoInstallJava::executeTask() void AutoInstallJava::setJavaPath(QString path) { auto settings = m_instance->settings(); - settings->set("OverrideJava", true); settings->set("OverrideJavaLocation", true); settings->set("JavaPath", path); emit logLine(tr("Compatible java found at: %1.").arg(path), MessageLevel::Info); diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index c248a47f7..fa52f2c51 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -190,9 +190,6 @@ void InstanceSettingsPage::applySettings() m_settings->reset("JvmArgs"); } - // old generic 'override both' is removed. - m_settings->reset("OverrideJava"); - // Custom Commands bool custcmd = ui->customCommands->checked(); m_settings->set("OverrideCommands", custcmd); @@ -321,9 +318,8 @@ void InstanceSettingsPage::loadSettings() ui->labelPermgenNote->setVisible(permGenVisible); // Java Settings - bool overrideJava = m_settings->get("OverrideJava").toBool(); - bool overrideLocation = m_settings->get("OverrideJavaLocation").toBool() || overrideJava; - bool overrideArgs = m_settings->get("OverrideJavaArgs").toBool() || overrideJava; + bool overrideLocation = m_settings->get("OverrideJavaLocation").toBool(); + bool overrideArgs = m_settings->get("OverrideJavaArgs").toBool(); ui->javaSettingsGroupBox->setChecked(overrideLocation); ui->javaPathTextBox->setText(m_settings->get("JavaPath").toString()); From 0e239dfb2a85c947d656764fa0036965eb040b40 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 20 May 2024 18:24:19 +0300 Subject: [PATCH 084/616] fix crash on first display with java downloader off Signed-off-by: Trial97 --- launcher/ui/setupwizard/JavaWizardPage.cpp | 8 +--- launcher/ui/widgets/JavaSettingsWidget.cpp | 49 ++++++++++++---------- launcher/ui/widgets/JavaSettingsWidget.h | 4 +- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/launcher/ui/setupwizard/JavaWizardPage.cpp b/launcher/ui/setupwizard/JavaWizardPage.cpp index d537580fc..a47cebcaa 100644 --- a/launcher/ui/setupwizard/JavaWizardPage.cpp +++ b/launcher/ui/setupwizard/JavaWizardPage.cpp @@ -12,12 +12,8 @@ #include -#include "FileSystem.h" #include "JavaCommon.h" -#include "java/JavaInstall.h" -#include "java/JavaUtils.h" -#include "ui/dialogs/CustomMessageBox.h" #include "ui/widgets/JavaSettingsWidget.h" #include "ui/widgets/VersionSelectWidget.h" @@ -57,8 +53,8 @@ bool JavaWizardPage::validatePage() { auto settings = APPLICATION->settings(); auto result = m_java_widget->validate(); - settings->set("AutomaticJavaSwitch", m_java_widget->autodetectJava()); - settings->set("AutomaticJavaDownload", m_java_widget->autodownloadJava()); + settings->set("AutomaticJavaSwitch", m_java_widget->autoDetectJava()); + settings->set("AutomaticJavaDownload", m_java_widget->autoDownloadJava()); switch (result) { default: case JavaSettingsWidget::ValidationStatus::Bad: { diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 1645f2b5f..34cd70f35 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -43,7 +43,9 @@ JavaSettingsWidget::JavaSettingsWidget(QWidget* parent) : QWidget(parent) connect(m_javaBrowseBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaBrowseBtn_clicked); connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaSettingsWidget::javaPathEdited); connect(m_javaStatusBtn, &QToolButton::clicked, this, &JavaSettingsWidget::on_javaStatusBtn_clicked); - connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaDownloadBtn_clicked); + if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { + connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaDownloadBtn_clicked); + } } void JavaSettingsWidget::setupUi() @@ -176,18 +178,21 @@ void JavaSettingsWidget::initialize() m_permGenSpinBox->setValue(observedPermGenMemory); updateThresholds(); - auto button = CustomMessageBox::selectable(this, tr("Auto Java Download"), - tr("%1 can automatically download the correct Java version for each version of Minecraft..\n" - "Do you want to enable Java auto-download?\n") - .arg(BuildConfig.LAUNCHER_DISPLAYNAME), - QMessageBox::Question, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) - ->exec(); - if (button == QMessageBox::Yes) { - m_autodetectJavaCheckBox->setChecked(true); - m_autodownloadCheckBox->setChecked(true); - } else { - m_autodetectJavaCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool()); - m_autodownloadCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool() && s->get("AutomaticJavaDownload").toBool()); + if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { + auto button = + CustomMessageBox::selectable(this, tr("Auto Java Download"), + tr("%1 can automatically download the correct Java version for each version of Minecraft..\n" + "Do you want to enable Java auto-download?\n") + .arg(BuildConfig.LAUNCHER_DISPLAYNAME), + QMessageBox::Question, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) + ->exec(); + if (button == QMessageBox::Yes) { + m_autodetectJavaCheckBox->setChecked(true); + m_autodownloadCheckBox->setChecked(true); + } else { + m_autodetectJavaCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool()); + m_autodownloadCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool() && s->get("AutomaticJavaDownload").toBool()); + } } } @@ -211,7 +216,7 @@ JavaSettingsWidget::ValidationStatus JavaSettingsWidget::validate() case JavaStatus::DoesNotStart: /* fallthrough */ case JavaStatus::ReturnedInvalidData: { - if (!m_autodownloadCheckBox->isChecked()) { // the java will not be autodownloaded + if (!(BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked())) { // the java will not be autodownloaded int button = QMessageBox::No; if (m_result.mojangPlatform == "32" && maxHeapSize() > 2048) { button = CustomMessageBox::selectable( @@ -488,7 +493,9 @@ void JavaSettingsWidget::retranslate() m_minMemSpinBox->setToolTip(tr("The amount of memory Minecraft is started with.")); m_permGenSpinBox->setToolTip(tr("The amount of memory available to store loaded Java classes.")); m_javaBrowseBtn->setText(tr("Browse")); - m_autodownloadCheckBox->setText(tr("Auto-download Mojang Java")); + if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { + m_autodownloadCheckBox->setText(tr("Auto-download Mojang Java")); + } m_autodetectJavaCheckBox->setText(tr("Autodetect Java version")); m_autoJavaGroupBox->setTitle(tr("Autodetect Java")); } @@ -522,12 +529,12 @@ void JavaSettingsWidget::updateThresholds() } } -bool JavaSettingsWidget::autodownloadJava() const +bool JavaSettingsWidget::autoDownloadJava() const +{ + return m_autodownloadCheckBox && m_autodownloadCheckBox->isChecked(); +} + +bool JavaSettingsWidget::autoDetectJava() const { return m_autodetectJavaCheckBox->isChecked(); } - -bool JavaSettingsWidget::autodetectJava() const -{ - return m_autodownloadCheckBox->isChecked(); -} diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index c8b6953df..877e60f46 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -42,8 +42,8 @@ class JavaSettingsWidget : public QWidget { int minHeapSize() const; int maxHeapSize() const; QString javaPath() const; - bool autodetectJava() const; - bool autodownloadJava() const; + bool autoDetectJava() const; + bool autoDownloadJava() const; void updateThresholds(); From 7a42fb284a28657106bf189a5ead0b1add38e9c8 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 20 May 2024 18:33:40 +0300 Subject: [PATCH 085/616] reverse java version Signed-off-by: Trial97 --- launcher/ui/java/VersionList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/java/VersionList.cpp b/launcher/ui/java/VersionList.cpp index 5e385604d..6f60a6867 100644 --- a/launcher/ui/java/VersionList.cpp +++ b/launcher/ui/java/VersionList.cpp @@ -103,7 +103,7 @@ bool sortJavas(BaseVersion::Ptr left, BaseVersion::Ptr right) { auto rleft = std::dynamic_pointer_cast(right); auto rright = std::dynamic_pointer_cast(left); - return (*rleft) > (*rright); + return (*rleft) < (*rright); } void VersionList::sortVersions() From f6a7fc215aaacc235842a8f3fd31b81e3e9720c9 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 21 May 2024 08:33:09 +0300 Subject: [PATCH 086/616] update java sorting by taking into consideration release time Signed-off-by: Trial97 --- launcher/java/JavaMetadata.cpp | 7 +++++++ launcher/java/JavaVersion.cpp | 6 ------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/launcher/java/JavaMetadata.cpp b/launcher/java/JavaMetadata.cpp index e721947a7..2272470a8 100644 --- a/launcher/java/JavaMetadata.cpp +++ b/launcher/java/JavaMetadata.cpp @@ -83,6 +83,13 @@ bool Metadata::operator<(const Metadata& rhs) if (id > rhs.version) { return false; } + auto date = releaseTime; + if (date < rhs.releaseTime) { + return true; + } + if (date > rhs.releaseTime) { + return false; + } return StringUtils::naturalCompare(m_name, rhs.m_name, Qt::CaseInsensitive) < 0; } diff --git a/launcher/java/JavaVersion.cpp b/launcher/java/JavaVersion.cpp index 2dc23472e..5e9700012 100644 --- a/launcher/java/JavaVersion.cpp +++ b/launcher/java/JavaVersion.cpp @@ -59,12 +59,6 @@ bool JavaVersion::operator<(const JavaVersion& rhs) auto major = m_major; auto rmajor = rhs.m_major; - // HACK: discourage using java 9 - if (major > 8) - major = -major; - if (rmajor > 8) - rmajor = -rmajor; - if (major < rmajor) return true; if (major > rmajor) From bbf52e35497a596121befb4f7d9225ab99251732 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 16 Jun 2024 01:59:50 +0300 Subject: [PATCH 087/616] renamed dialog and button action Signed-off-by: Trial97 --- launcher/ui/java/InstallJavaDialog.cpp | 12 ++++++++---- launcher/ui/pages/global/JavaPage.cpp | 7 +------ launcher/ui/pages/global/JavaPage.h | 1 - launcher/ui/widgets/JavaSettingsWidget.cpp | 4 ++-- launcher/ui/widgets/JavaSettingsWidget.h | 2 +- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index 78de3e20a..60e3a770c 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -184,18 +184,18 @@ InstallDialog::InstallDialog(const QString& uid, QWidget* parent) QList InstallDialog::getPages() { return { - // NeoForge + // Mojang new InstallJavaPage("net.minecraft.java", "", tr("Mojang")), - // Forge + // Adoptium new InstallJavaPage("net.adoptium.java", "", tr("Adoptium")), - // Fabric + // Azul new InstallJavaPage("com.azul.java", "", tr("Azul")), }; } QString InstallDialog::dialogTitle() { - return tr("Install Loader"); + return tr("Install Java"); } void InstallDialog::validate(BasePage* page) @@ -230,7 +230,11 @@ void InstallDialog::done(int result) ProgressDialog pg(this); pg.setSkipButton(true, tr("Abort")); pg.execWithTask(task.get()); + } else { + return; } + } else { + return; } } diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index fda4f8705..c8bbf6361 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -199,7 +199,7 @@ void JavaPage::on_javaTestBtn_clicked() checker->run(); } -void JavaPage::on_javaDownloadBtn_clicked() +void JavaPage::on_downloadJavaButton_clicked() { auto jdialog = new Java::InstallDialog({}, this); jdialog->exec(); @@ -251,11 +251,6 @@ void JavaPage::updateThresholds() } } -void JavaPage::on_downloadJavaButton_clicked() -{ - on_javaDownloadBtn_clicked(); -} - void JavaPage::on_removeJavaButton_clicked() { auto version = ui->managedJavaList->selectedVersion(); diff --git a/launcher/ui/pages/global/JavaPage.h b/launcher/ui/pages/global/JavaPage.h index 48e557740..0a1c4a6be 100644 --- a/launcher/ui/pages/global/JavaPage.h +++ b/launcher/ui/pages/global/JavaPage.h @@ -72,7 +72,6 @@ class JavaPage : public QWidget, public BasePage { void on_javaDetectBtn_clicked(); void on_javaTestBtn_clicked(); void on_javaBrowseBtn_clicked(); - void on_javaDownloadBtn_clicked(); void on_downloadJavaButton_clicked(); void on_removeJavaButton_clicked(); void on_refreshJavaButton_clicked(); diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 34cd70f35..e16f650fc 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -44,7 +44,7 @@ JavaSettingsWidget::JavaSettingsWidget(QWidget* parent) : QWidget(parent) connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaSettingsWidget::javaPathEdited); connect(m_javaStatusBtn, &QToolButton::clicked, this, &JavaSettingsWidget::on_javaStatusBtn_clicked); if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { - connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaDownloadBtn_clicked); + connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaSettingsWidget::javaDownloadBtn_clicked); } } @@ -354,7 +354,7 @@ void JavaSettingsWidget::on_javaBrowseBtn_clicked() checkJavaPath(cooked_path); } -void JavaSettingsWidget::on_javaDownloadBtn_clicked() +void JavaSettingsWidget::javaDownloadBtn_clicked() { auto jdialog = new Java::InstallDialog({}, this); jdialog->exec(); diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index 877e60f46..622c473fe 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -53,7 +53,7 @@ class JavaSettingsWidget : public QWidget { void javaVersionSelected(BaseVersion::Ptr version); void on_javaBrowseBtn_clicked(); void on_javaStatusBtn_clicked(); - void on_javaDownloadBtn_clicked(); + void javaDownloadBtn_clicked(); void checkFinished(const JavaChecker::Result& result); protected: /* methods */ From 94fd02a34f1146fa84c6ea2516b694f6e3ce3d91 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 16 Jun 2024 14:26:19 +0300 Subject: [PATCH 088/616] fix java download button Signed-off-by: Trial97 --- launcher/ui/java/InstallJavaDialog.cpp | 19 +++++++++---------- launcher/ui/java/InstallJavaDialog.h | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index 60e3a770c..d92402236 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -60,7 +60,8 @@ class InstallJavaPage : public QWidget, public BasePage { javaVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); horizontalLayout->addWidget(javaVersionSelect, 4); connect(majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallJavaPage::setSelectedVersion); - connect(javaVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallJavaPage::selectedVersionChanged); + connect(majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallJavaPage::selectionChanged); + connect(javaVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallJavaPage::selectionChanged); QMetaObject::connectSlotsByName(this); } @@ -119,7 +120,7 @@ class InstallJavaPage : public QWidget, public BasePage { javaVersionSelect->loadList(); } signals: - void selectedVersionChanged(BaseVersion::Ptr version); + void selectionChanged(); private: const QString uid; @@ -171,14 +172,11 @@ InstallDialog::InstallDialog(const QString& uid, QWidget* parent) if (page->id() == uid) container->selectPage(page->id()); - connect(pageCast(page), &InstallJavaPage::selectedVersionChanged, this, [this, page] { - if (page->id() == container->selectedPage()->id()) - validate(container->selectedPage()); - }); + connect(pageCast(page), &InstallJavaPage::selectionChanged, this, [this] { validate(); }); } - connect(container, &PageContainer::selectedPageChanged, this, [this](BasePage* previous, BasePage* current) { validate(current); }); + connect(container, &PageContainer::selectedPageChanged, this, [this] { validate(); }); pageCast(container->selectedPage())->selectSearch(); - validate(container->selectedPage()); + validate(); } QList InstallDialog::getPages() @@ -198,9 +196,10 @@ QString InstallDialog::dialogTitle() return tr("Install Java"); } -void InstallDialog::validate(BasePage* page) +void InstallDialog::validate() { - buttons->button(QDialogButtonBox::Ok)->setEnabled(pageCast(page)->selectedVersion() != nullptr); + buttons->button(QDialogButtonBox::Ok) + ->setEnabled(!!std::dynamic_pointer_cast(pageCast(container->selectedPage())->selectedVersion())); } void InstallDialog::done(int result) diff --git a/launcher/ui/java/InstallJavaDialog.h b/launcher/ui/java/InstallJavaDialog.h index 525e750aa..80d010c1a 100644 --- a/launcher/ui/java/InstallJavaDialog.h +++ b/launcher/ui/java/InstallJavaDialog.h @@ -36,7 +36,7 @@ class InstallDialog final : public QDialog, private BasePageProvider { QList getPages() override; QString dialogTitle() override; - void validate(BasePage* page); + void validate(); void done(int result) override; private: From 8d3e6667cdb51c4018604313629bd57744bca8aa Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 16 Jun 2024 15:09:49 +0300 Subject: [PATCH 089/616] fix java download tasks Signed-off-by: Trial97 --- .../java/download/ArchiveDownloadTask.cpp | 42 +++++++++--------- launcher/java/download/ArchiveDownloadTask.h | 2 + .../java/download/ManifestDownloadTask.cpp | 44 ++++++++++--------- launcher/java/download/ManifestDownloadTask.h | 2 + 4 files changed, 49 insertions(+), 41 deletions(-) diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index 358860610..5aed70ede 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -50,21 +50,17 @@ void ArchiveDownloadTask::executeTask() download->addNetAction(action); auto fullPath = entry->getFullPath(); - connect(download.get(), &NetJob::finished, [download, this] { - disconnect(this, &Task::aborted, download.get(), &NetJob::abort); - download->deleteLater(); - }); - connect(download.get(), &NetJob::failed, this, &ArchiveDownloadTask::emitFailed); - connect(this, &Task::aborted, download.get(), &NetJob::abort); + connect(download.get(), &Task::failed, this, &ArchiveDownloadTask::emitFailed); connect(download.get(), &Task::progress, this, &ArchiveDownloadTask::setProgress); connect(download.get(), &Task::stepProgress, this, &ArchiveDownloadTask::propagateStepProgress); connect(download.get(), &Task::status, this, &ArchiveDownloadTask::setStatus); connect(download.get(), &Task::details, this, &ArchiveDownloadTask::setDetails); - connect(download.get(), &NetJob::succeeded, [this, fullPath] { + connect(download.get(), &Task::succeeded, [this, fullPath] { // This should do all of the extracting and creating folders extractJava(fullPath); }); - download->start(); + m_task = download; + m_task->start(); } void ArchiveDownloadTask::extractJava(QString input) @@ -102,34 +98,40 @@ void ArchiveDownloadTask::extractJava(QString input) emitFailed("Empty archive"); return; } - auto zipTask = makeShared(zip, m_final_path, files[0]); + m_task = makeShared(zip, m_final_path, files[0]); auto progressStep = std::make_shared(); - connect(zipTask.get(), &Task::finished, this, [this, progressStep] { + connect(m_task.get(), &Task::finished, this, [this, progressStep] { progressStep->state = TaskStepState::Succeeded; stepProgress(*progressStep); }); - connect(this, &Task::aborted, zipTask.get(), &Task::abort); - connect(zipTask.get(), &Task::finished, [zipTask, this] { disconnect(this, &Task::aborted, zipTask.get(), &Task::abort); }); - - connect(zipTask.get(), &Task::succeeded, this, &ArchiveDownloadTask::emitSucceeded); - connect(zipTask.get(), &Task::aborted, this, &ArchiveDownloadTask::emitAborted); - connect(zipTask.get(), &Task::failed, this, [this, progressStep](QString reason) { + connect(m_task.get(), &Task::succeeded, this, &ArchiveDownloadTask::emitSucceeded); + connect(m_task.get(), &Task::aborted, this, &ArchiveDownloadTask::emitAborted); + connect(m_task.get(), &Task::failed, this, [this, progressStep](QString reason) { progressStep->state = TaskStepState::Failed; stepProgress(*progressStep); emitFailed(reason); }); - connect(zipTask.get(), &Task::stepProgress, this, &ArchiveDownloadTask::propagateStepProgress); + connect(m_task.get(), &Task::stepProgress, this, &ArchiveDownloadTask::propagateStepProgress); - connect(zipTask.get(), &Task::progress, this, [this, progressStep](qint64 current, qint64 total) { + connect(m_task.get(), &Task::progress, this, [this, progressStep](qint64 current, qint64 total) { progressStep->update(current, total); stepProgress(*progressStep); }); - connect(zipTask.get(), &Task::status, this, [this, progressStep](QString status) { + connect(m_task.get(), &Task::status, this, [this, progressStep](QString status) { progressStep->status = status; stepProgress(*progressStep); }); - zipTask->start(); + m_task->start(); } + +bool ArchiveDownloadTask::abort() +{ + auto aborted = canAbort(); + if (m_task) + aborted = m_task->abort(); + emitAborted(); + return aborted; +}; } // namespace Java \ No newline at end of file diff --git a/launcher/java/download/ArchiveDownloadTask.h b/launcher/java/download/ArchiveDownloadTask.h index c656567fe..1db33763a 100644 --- a/launcher/java/download/ArchiveDownloadTask.h +++ b/launcher/java/download/ArchiveDownloadTask.h @@ -30,6 +30,7 @@ class ArchiveDownloadTask : public Task { [[nodiscard]] bool canAbort() const override { return true; } void executeTask() override; + virtual bool abort() override; private slots: void extractJava(QString input); @@ -39,5 +40,6 @@ class ArchiveDownloadTask : public Task { QString m_final_path; QString m_checksum_type; QString m_checksum_hash; + Task::Ptr m_task; }; } // namespace Java \ No newline at end of file diff --git a/launcher/java/download/ManifestDownloadTask.cpp b/launcher/java/download/ManifestDownloadTask.cpp index 5551c75d5..1fcc6f172 100644 --- a/launcher/java/download/ManifestDownloadTask.cpp +++ b/launcher/java/download/ManifestDownloadTask.cpp @@ -51,18 +51,13 @@ void ManifestDownloadTask::executeTask() } download->addNetAction(action); - connect(download.get(), &NetJob::finished, [download, this] { - disconnect(this, &Task::aborted, download.get(), &NetJob::abort); - download->deleteLater(); - }); - connect(download.get(), &NetJob::failed, this, &ManifestDownloadTask::emitFailed); - connect(this, &Task::aborted, download.get(), &NetJob::abort); + connect(download.get(), &Task::failed, this, &ManifestDownloadTask::emitFailed); connect(download.get(), &Task::progress, this, &ManifestDownloadTask::setProgress); connect(download.get(), &Task::stepProgress, this, &ManifestDownloadTask::propagateStepProgress); connect(download.get(), &Task::status, this, &ManifestDownloadTask::setStatus); connect(download.get(), &Task::details, this, &ManifestDownloadTask::setDetails); - connect(download.get(), &NetJob::succeeded, [files, this] { + connect(download.get(), &Task::succeeded, [files, this] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -73,7 +68,8 @@ void ManifestDownloadTask::executeTask() } downloadJava(doc); }); - download->start(); + m_task = download; + m_task->start(); } void ManifestDownloadTask::downloadJava(const QJsonDocument& doc) @@ -107,7 +103,7 @@ void ManifestDownloadTask::downloadJava(const QJsonDocument& doc) } } } - auto elementDownload = new NetJob("JRE::FileDownload", APPLICATION->network()); + auto elementDownload = makeShared("JRE::FileDownload", APPLICATION->network()); for (const auto& file : toDownload) { auto dl = Net::Download::makeFile(file.url, file.path); if (!file.hash.isEmpty()) { @@ -119,18 +115,24 @@ void ManifestDownloadTask::downloadJava(const QJsonDocument& doc) } elementDownload->addNetAction(dl); } - connect(elementDownload, &NetJob::finished, [elementDownload, this] { - disconnect(this, &Task::aborted, elementDownload, &NetJob::abort); - elementDownload->deleteLater(); - }); - connect(elementDownload, &NetJob::failed, this, &ManifestDownloadTask::emitFailed); - connect(elementDownload, &Task::progress, this, &ManifestDownloadTask::setProgress); - connect(elementDownload, &Task::stepProgress, this, &ManifestDownloadTask::propagateStepProgress); - connect(elementDownload, &Task::status, this, &ManifestDownloadTask::setStatus); - connect(elementDownload, &Task::details, this, &ManifestDownloadTask::setDetails); - connect(this, &Task::aborted, elementDownload, &NetJob::abort); - connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); }); - elementDownload->start(); + connect(elementDownload.get(), &Task::failed, this, &ManifestDownloadTask::emitFailed); + connect(elementDownload.get(), &Task::progress, this, &ManifestDownloadTask::setProgress); + connect(elementDownload.get(), &Task::stepProgress, this, &ManifestDownloadTask::propagateStepProgress); + connect(elementDownload.get(), &Task::status, this, &ManifestDownloadTask::setStatus); + connect(elementDownload.get(), &Task::details, this, &ManifestDownloadTask::setDetails); + + connect(elementDownload.get(), &Task::succeeded, this, &ManifestDownloadTask::emitSucceeded); + m_task = elementDownload; + m_task->start(); } + +bool ManifestDownloadTask::abort() +{ + auto aborted = canAbort(); + if (m_task) + aborted = m_task->abort(); + emitAborted(); + return aborted; +}; } // namespace Java \ No newline at end of file diff --git a/launcher/java/download/ManifestDownloadTask.h b/launcher/java/download/ManifestDownloadTask.h index f0eaf95a6..ae9e0d0ed 100644 --- a/launcher/java/download/ManifestDownloadTask.h +++ b/launcher/java/download/ManifestDownloadTask.h @@ -31,6 +31,7 @@ class ManifestDownloadTask : public Task { [[nodiscard]] bool canAbort() const override { return true; } void executeTask() override; + virtual bool abort() override; private slots: void downloadJava(const QJsonDocument& doc); @@ -40,5 +41,6 @@ class ManifestDownloadTask : public Task { QString m_final_path; QString m_checksum_type; QString m_checksum_hash; + Task::Ptr m_task; }; } // namespace Java \ No newline at end of file From 2fb3e12492f7fd70f15fdaa6f8066e7420fdc01f Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 16 Jun 2024 17:54:13 +0300 Subject: [PATCH 090/616] fix auto java install Signed-off-by: Trial97 --- launcher/minecraft/LaunchProfile.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/launcher/minecraft/LaunchProfile.cpp b/launcher/minecraft/LaunchProfile.cpp index 77072472c..468798850 100644 --- a/launcher/minecraft/LaunchProfile.cpp +++ b/launcher/minecraft/LaunchProfile.cpp @@ -166,7 +166,8 @@ void LaunchProfile::applyCompatibleJavaMajors(QList& javaMajor) } void LaunchProfile::applyCompatibleJavaName(QString javaName) { - m_compatibleJavaName = javaName; + if (!javaName.isEmpty()) + m_compatibleJavaName = javaName; } void LaunchProfile::applyLibrary(LibraryPtr library, const RuntimeContext& runtimeContext) From 1a66db78a989603a675e82d9cb30d91a319dff83 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Tue, 25 Jun 2024 15:17:51 +0300 Subject: [PATCH 091/616] Apply text change suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- launcher/java/download/ArchiveDownloadTask.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index 5aed70ede..71e78629b 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -67,7 +67,7 @@ void ArchiveDownloadTask::extractJava(QString input) { setStatus(tr("Extracting java")); if (input.endsWith("tar")) { - setStatus(tr("Extracting java(the progress will not be reported for tar)")); + setStatus(tr("Extracting Java (Progress is not reported for tar archives)")); QFile in(input); if (!in.open(QFile::ReadOnly)) { emitFailed(tr("Unable to open supplied tar file.")); @@ -80,7 +80,7 @@ void ArchiveDownloadTask::extractJava(QString input) emitSucceeded(); return; } else if (input.endsWith("tar.gz") || input.endsWith("taz") || input.endsWith("tgz")) { - setStatus(tr("Extracting java(the progress will not be reported for tar)")); + setStatus(tr("Extracting Java (Progress is not reported for tar archives)")); if (!GZTar::extract(input, QDir(m_final_path).absolutePath())) { emitFailed(tr("Unable to extract supplied tar file.")); return; @@ -95,7 +95,7 @@ void ArchiveDownloadTask::extractJava(QString input) } auto files = zip->getFileNameList(); if (files.isEmpty()) { - emitFailed("Empty archive"); + emitFailed(tr("Empty archive")); return; } m_task = makeShared(zip, m_final_path, files[0]); From 52839774e64e488139ff7d3c8d9cf41ada43f947 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Tue, 25 Jun 2024 15:19:23 +0300 Subject: [PATCH 092/616] Apply suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- launcher/ui/widgets/JavaSettingsWidget.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index e16f650fc..dbd81cdd2 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -180,7 +180,7 @@ void JavaSettingsWidget::initialize() if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { auto button = - CustomMessageBox::selectable(this, tr("Auto Java Download"), + CustomMessageBox::selectable(this, tr("Automatic Java Download"), tr("%1 can automatically download the correct Java version for each version of Minecraft..\n" "Do you want to enable Java auto-download?\n") .arg(BuildConfig.LAUNCHER_DISPLAYNAME), @@ -220,8 +220,8 @@ JavaSettingsWidget::ValidationStatus JavaSettingsWidget::validate() int button = QMessageBox::No; if (m_result.mojangPlatform == "32" && maxHeapSize() > 2048) { button = CustomMessageBox::selectable( - this, tr("Java x32 detected"), - tr("You selected an 32-bit java, but allocated more than 2048MiB as maximum memory.\n" + this, tr("32-bit Java detected"), + tr("You selected a 32-bit installation of Java, but allocated more than 2048MiB as maximum memory.\n" "%1 will not be able to start Minecraft.\n" "Do you wish to proceed?" "\n\n" @@ -232,9 +232,9 @@ JavaSettingsWidget::ValidationStatus JavaSettingsWidget::validate() } else { button = CustomMessageBox::selectable(this, tr("No Java version selected"), - tr("You didn't select a Java version or selected something that doesn't work.\n" + tr("You either didn't select a Java version or selected one that does not work.\n" "%1 will not be able to start Minecraft.\n" - "Do you wish to proceed without any Java?" + "Do you wish to proceed without a functional version of Java?" "\n\n" "You can change the Java version in the settings later.\n") .arg(BuildConfig.LAUNCHER_DISPLAYNAME), @@ -246,7 +246,7 @@ JavaSettingsWidget::ValidationStatus JavaSettingsWidget::validate() case QMessageBox::Yes: return ValidationStatus::JavaBad; case QMessageBox::Help: - DesktopServices::openUrl(QUrl(BuildConfig.HELP_URL.arg("java-wizzard"))); + DesktopServices::openUrl(QUrl(BuildConfig.HELP_URL.arg("java-wizard"))); /* fallthrough */ case QMessageBox::No: /* fallthrough */ @@ -515,7 +515,7 @@ void JavaSettingsWidget::updateThresholds() m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value")); } else if (observedMaxMemory > 2048 && m_result.is_64bit) { iconName = "status-bad"; - m_labelMaxMemIcon->setToolTip(tr("Because you're using 32 bit Java, you're exceeding the maximum possible allocation.")); + m_labelMaxMemIcon->setToolTip(tr("You are exceeding the maximum allocation supported by 32-bit installations of Java.")); } else { iconName = "status-good"; m_labelMaxMemIcon->setToolTip(""); From 4e9e7212a614fe2169ba0a760b765ab944382e53 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Tue, 25 Jun 2024 15:22:30 +0300 Subject: [PATCH 093/616] Apply suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- launcher/minecraft/launch/AutoInstallJava.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 95bfa1dec..98e381f3b 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -74,13 +74,13 @@ void AutoInstallJava::executeTask() auto java = std::dynamic_pointer_cast(javas->at(i)); if (java && packProfile->getProfile()->getCompatibleJavaMajors().contains(java->id.major())) { if (!java->is_64bit) { - emit logLine(tr("The automatic Java mechanism detected an x32 java."), MessageLevel::Info); + emit logLine(tr("The automatic Java mechanism detected a 32-bit installation of Java."), MessageLevel::Info); } setJavaPath(java->path); return; } } - emit logLine(tr("No compatible java version was found. Using the default one."), MessageLevel::Warning); + emit logLine(tr("No compatible Java version was found. Using the default one."), MessageLevel::Warning); emitSucceeded(); }); connect(m_current_task.get(), &Task::progress, this, &AutoInstallJava::setProgress); @@ -91,7 +91,7 @@ void AutoInstallJava::executeTask() return; } if (m_supported_arch.isEmpty()) { - emit logLine(tr("Your system(%1 %2) is not compatible with auto java download. Using the default java path.") + emit logLine(tr("Your system(%1 %2) is not compatible with automatic Java installation. Using the default Java path.") .arg(SysInfo::currentSystem(), SysInfo::useQTForArch()), MessageLevel::Warning); emitSucceeded(); @@ -99,8 +99,8 @@ void AutoInstallJava::executeTask() } auto wantedJavaName = packProfile->getProfile()->getCompatibleJavaName(); if (wantedJavaName.isEmpty()) { - emit logLine(tr("Your meta informtation is old or doesn't have the information necesary to determine what java should be used. " - "Using the default java path."), + emit logLine(tr("Your meta information is out of date or doesn't have the information necessary to determine what installation of Java should be used. " + "Using the default Java path."), MessageLevel::Warning); emitSucceeded(); return; @@ -127,7 +127,7 @@ void AutoInstallJava::setJavaPath(QString path) auto settings = m_instance->settings(); settings->set("OverrideJavaLocation", true); settings->set("JavaPath", path); - emit logLine(tr("Compatible java found at: %1.").arg(path), MessageLevel::Info); + emit logLine(tr("Compatible Java found at: %1.").arg(path), MessageLevel::Info); emitSucceeded(); } @@ -148,7 +148,7 @@ void AutoInstallJava::setJavaPathFromPartial() if (QFileInfo::exists(finalPath)) { setJavaPath(finalPath); } else { - emit logLine(tr("No compatible java version was found(the binary file doesn't exists). Using the default one."), + emit logLine(tr("No compatible Java version was found (the binary file does not exist). Using the default one."), MessageLevel::Warning); emitSucceeded(); } @@ -201,9 +201,9 @@ void AutoInstallJava::tryNextMajorJava() auto wantedJavaName = packProfile->getProfile()->getCompatibleJavaName(); auto majorJavaVersions = packProfile->getProfile()->getCompatibleJavaMajors(); if (m_majorJavaVersionIndex >= majorJavaVersions.length()) { - emit logLine(tr("No Java versions found for your operating system: %1 %2").arg(SysInfo::currentSystem(), SysInfo::useQTForArch()), + emit logLine(tr("No versions of Java were found for your operating system: %1-%2").arg(SysInfo::currentSystem(), SysInfo::useQTForArch()), MessageLevel::Warning); - emit logLine(tr("No compatible java version was found. Using the default one."), MessageLevel::Warning); + emit logLine(tr("No compatible version of Java was found. Using the default one."), MessageLevel::Warning); emitSucceeded(); return; } From 555c4a7c59f4f09810615ecd5152b48a6fa73d51 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Tue, 25 Jun 2024 15:33:11 +0300 Subject: [PATCH 094/616] Apply suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- launcher/java/download/ManifestDownloadTask.cpp | 2 +- launcher/minecraft/launch/VerifyJavaInstall.cpp | 2 +- launcher/ui/pages/global/JavaPage.cpp | 4 ++-- launcher/ui/pages/instance/InstanceSettingsPage.cpp | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/launcher/java/download/ManifestDownloadTask.cpp b/launcher/java/download/ManifestDownloadTask.cpp index 1fcc6f172..836afeaac 100644 --- a/launcher/java/download/ManifestDownloadTask.cpp +++ b/launcher/java/download/ManifestDownloadTask.cpp @@ -61,7 +61,7 @@ void ManifestDownloadTask::executeTask() QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString(); + qWarning() << "Error while parsing JSON response at " << parse_error.offset << ". Reason: " << parse_error.errorString(); qWarning() << *files; emitFailed(parse_error.errorString()); return; diff --git a/launcher/minecraft/launch/VerifyJavaInstall.cpp b/launcher/minecraft/launch/VerifyJavaInstall.cpp index 5f8b35b02..1e7448089 100644 --- a/launcher/minecraft/launch/VerifyJavaInstall.cpp +++ b/launcher/minecraft/launch/VerifyJavaInstall.cpp @@ -56,7 +56,7 @@ void VerifyJavaInstall::executeTask() if (javaArchitecture == "32" && maxMemAlloc > 2048) { emit logLine(tr("Max memory allocation exceeds the supported value.\n" - "The selected java is 32-bit and doesn't support more than 2048MiB of RAM.\n" + "The selected installation of Java is 32-bit and doesn't support more than 2048MiB of RAM.\n" "The instance may not start due to this."), MessageLevel::Error); } diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index c8bbf6361..ad37fa740 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -161,8 +161,8 @@ void JavaPage::on_javaDetectBtn_clicked() ui->javaPathTextBox->setText(java->path); if (!java->is_64bit && APPLICATION->settings()->get("MaxMemAlloc").toInt() > 2048) { CustomMessageBox::selectable(this, tr("Confirm Selection"), - tr("You selected a 32 bit java version.\n" - "This means that will not support more than 2048MiB of RAM.\n" + tr("You selected a 32-bit version of Java.\n" + "This installation does not support more than 2048MiB of RAM.\n" "Please make sure that the maximum memory value is lower."), QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok) ->exec(); diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index fa52f2c51..6e6b1db57 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -418,8 +418,8 @@ void InstanceSettingsPage::on_javaDetectBtn_clicked() if (!java->is_64bit && m_settings->get("MaxMemAlloc").toInt() > 2048) { CustomMessageBox::selectable(this, tr("Confirm Selection"), - tr("You selected a 32 bit java version.\n" - "This means that will not support more than 2048MiB of RAM.\n" + tr("You selected a 32-bit version of Java.\n" + "This installation does not support more than 2048MiB of RAM.\n" "Please make sure that the maximum memory value is lower."), QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok) ->exec(); From 7c38edc93dda3fe4f177cb182314870e314367d8 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 25 Jun 2024 16:10:05 +0300 Subject: [PATCH 095/616] Apply suggestion from code review Signed-off-by: Trial97 --- launcher/java/JavaMetadata.cpp | 10 ++- launcher/java/JavaMetadata.h | 2 +- launcher/java/JavaUtils.cpp | 21 +++--- launcher/java/JavaUtils.h | 1 + .../java/download/ArchiveDownloadTask.cpp | 71 ++++++++++--------- launcher/minecraft/launch/AutoInstallJava.cpp | 20 +++--- launcher/ui/java/InstallJavaDialog.cpp | 6 +- launcher/ui/widgets/JavaSettingsWidget.cpp | 11 +-- 8 files changed, 75 insertions(+), 67 deletions(-) diff --git a/launcher/java/JavaMetadata.cpp b/launcher/java/JavaMetadata.cpp index 2272470a8..2d68f55c8 100644 --- a/launcher/java/JavaMetadata.cpp +++ b/launcher/java/JavaMetadata.cpp @@ -31,8 +31,10 @@ DownloadType parseDownloadType(QString javaDownload) { if (javaDownload == "manifest") return DownloadType::Manifest; - // if (javaDownload == "archive") - return DownloadType::Archive; + else if (javaDownload == "archive") + return DownloadType::Archive; + else + return DownloadType::Unknown; } QString downloadTypeToString(DownloadType javaDownload) { @@ -41,8 +43,10 @@ QString downloadTypeToString(DownloadType javaDownload) return "manifest"; case DownloadType::Archive: return "archive"; + case DownloadType::Unknown: + break; } - return ""; + return "unknown"; } MetadataPtr parseJavaMeta(const QJsonObject& in) { diff --git a/launcher/java/JavaMetadata.h b/launcher/java/JavaMetadata.h index 5281f2e27..77a42fd78 100644 --- a/launcher/java/JavaMetadata.h +++ b/launcher/java/JavaMetadata.h @@ -28,7 +28,7 @@ namespace Java { -enum class DownloadType { Manifest, Archive }; +enum class DownloadType { Manifest, Archive, Unknown }; class Metadata : public BaseVersion { public: diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index 42d3ef6ab..c0f64ad37 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -463,12 +463,10 @@ QString JavaUtils::getJavaCheckPath() QStringList getMinecraftJavaBundle() { - QString executable = "java"; QStringList processpaths; #if defined(Q_OS_OSX) processpaths << FS::PathCombine(QDir::homePath(), FS::PathCombine("Library", "Application Support", "minecraft", "runtime")); #elif defined(Q_OS_WIN32) - executable += "w.exe"; auto appDataPath = QProcessEnvironment::systemEnvironment().value("APPDATA", ""); processpaths << FS::PathCombine(QFileInfo(appDataPath).absoluteFilePath(), ".minecraft", "runtime"); @@ -493,7 +491,7 @@ QStringList getMinecraftJavaBundle() auto binFound = false; for (auto& entry : entries) { if (entry.baseName() == "bin") { - javas.append(FS::PathCombine(entry.canonicalFilePath(), executable)); + javas.append(FS::PathCombine(entry.canonicalFilePath(), JavaUtils::javaExecutable)); binFound = true; break; } @@ -507,19 +505,20 @@ QStringList getMinecraftJavaBundle() return javas; } +#if defined(Q_OS_WIN32) +const QString JavaUtils::javaExecutable = "javaw.exe"; +#else +const QString JavaUtils::javaExecutable = "java"; +#endif + QStringList getPrismJavaBundle() { QList javas; - QString executable = "java"; -#if defined(Q_OS_WIN32) - executable += "w.exe"; -#endif - auto scanDir = [&](QString prefix) { - javas.append(FS::PathCombine(prefix, "jre", "bin", executable)); - javas.append(FS::PathCombine(prefix, "bin", executable)); - javas.append(FS::PathCombine(prefix, executable)); + javas.append(FS::PathCombine(prefix, "jre", "bin", JavaUtils::javaExecutable)); + javas.append(FS::PathCombine(prefix, "bin", JavaUtils::javaExecutable)); + javas.append(FS::PathCombine(prefix, JavaUtils::javaExecutable)); }; auto scanJavaDir = [&](const QString& dirPath) { QDir dir(dirPath); diff --git a/launcher/java/JavaUtils.h b/launcher/java/JavaUtils.h index aa5315a19..eb3a17316 100644 --- a/launcher/java/JavaUtils.h +++ b/launcher/java/JavaUtils.h @@ -42,4 +42,5 @@ class JavaUtils : public QObject { #endif static QString getJavaCheckPath(); + static const QString javaExecutable; }; diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index 71e78629b..af5381dfc 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -87,43 +87,46 @@ void ArchiveDownloadTask::extractJava(QString input) } emitSucceeded(); return; - } - auto zip = std::make_shared(input); - if (!zip->open(QuaZip::mdUnzip)) { - emitFailed(tr("Unable to open supplied zip file.")); - return; - } - auto files = zip->getFileNameList(); - if (files.isEmpty()) { - emitFailed(tr("Empty archive")); - return; - } - m_task = makeShared(zip, m_final_path, files[0]); + } else if (input.endsWith("zip")) { + auto zip = std::make_shared(input); + if (!zip->open(QuaZip::mdUnzip)) { + emitFailed(tr("Unable to open supplied zip file.")); + return; + } + auto files = zip->getFileNameList(); + if (files.isEmpty()) { + emitFailed(tr("No files were found in the supplied zip file,")); + return; + } + m_task = makeShared(zip, m_final_path, files[0]); - auto progressStep = std::make_shared(); - connect(m_task.get(), &Task::finished, this, [this, progressStep] { - progressStep->state = TaskStepState::Succeeded; - stepProgress(*progressStep); - }); + auto progressStep = std::make_shared(); + connect(m_task.get(), &Task::finished, this, [this, progressStep] { + progressStep->state = TaskStepState::Succeeded; + stepProgress(*progressStep); + }); - connect(m_task.get(), &Task::succeeded, this, &ArchiveDownloadTask::emitSucceeded); - connect(m_task.get(), &Task::aborted, this, &ArchiveDownloadTask::emitAborted); - connect(m_task.get(), &Task::failed, this, [this, progressStep](QString reason) { - progressStep->state = TaskStepState::Failed; - stepProgress(*progressStep); - emitFailed(reason); - }); - connect(m_task.get(), &Task::stepProgress, this, &ArchiveDownloadTask::propagateStepProgress); + connect(m_task.get(), &Task::succeeded, this, &ArchiveDownloadTask::emitSucceeded); + connect(m_task.get(), &Task::aborted, this, &ArchiveDownloadTask::emitAborted); + connect(m_task.get(), &Task::failed, this, [this, progressStep](QString reason) { + progressStep->state = TaskStepState::Failed; + stepProgress(*progressStep); + emitFailed(reason); + }); + connect(m_task.get(), &Task::stepProgress, this, &ArchiveDownloadTask::propagateStepProgress); - connect(m_task.get(), &Task::progress, this, [this, progressStep](qint64 current, qint64 total) { - progressStep->update(current, total); - stepProgress(*progressStep); - }); - connect(m_task.get(), &Task::status, this, [this, progressStep](QString status) { - progressStep->status = status; - stepProgress(*progressStep); - }); - m_task->start(); + connect(m_task.get(), &Task::progress, this, [this, progressStep](qint64 current, qint64 total) { + progressStep->update(current, total); + stepProgress(*progressStep); + }); + connect(m_task.get(), &Task::status, this, [this, progressStep](QString status) { + progressStep->status = status; + stepProgress(*progressStep); + }); + m_task->start(); + } + + emitFailed(tr("Could not determine archive type!")); } bool ArchiveDownloadTask::abort() diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 98e381f3b..c77b9b105 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -44,6 +44,7 @@ #include "SysInfo.h" #include "java/JavaInstall.h" #include "java/JavaInstallList.h" +#include "java/JavaUtils.h" #include "java/JavaVersion.h" #include "java/download/ArchiveDownloadTask.h" #include "java/download/ManifestDownloadTask.h" @@ -91,7 +92,7 @@ void AutoInstallJava::executeTask() return; } if (m_supported_arch.isEmpty()) { - emit logLine(tr("Your system(%1 %2) is not compatible with automatic Java installation. Using the default Java path.") + emit logLine(tr("Your system (%1-%2) is not compatible with automatic Java installation. Using the default Java path.") .arg(SysInfo::currentSystem(), SysInfo::useQTForArch()), MessageLevel::Warning); emitSucceeded(); @@ -99,7 +100,8 @@ void AutoInstallJava::executeTask() } auto wantedJavaName = packProfile->getProfile()->getCompatibleJavaName(); if (wantedJavaName.isEmpty()) { - emit logLine(tr("Your meta information is out of date or doesn't have the information necessary to determine what installation of Java should be used. " + emit logLine(tr("Your meta information is out of date or doesn't have the information necessary to determine what installation of " + "Java should be used. " "Using the default Java path."), MessageLevel::Warning); emitSucceeded(); @@ -133,17 +135,13 @@ void AutoInstallJava::setJavaPath(QString path) void AutoInstallJava::setJavaPathFromPartial() { - QString executable = "java"; -#if defined(Q_OS_WIN32) - executable += "w.exe"; -#endif auto packProfile = m_instance->getPackProfile(); auto javaName = packProfile->getProfile()->getCompatibleJavaName(); QDir javaDir(APPLICATION->javaPath()); // just checking if the executable is there should suffice // but if needed this can be achieved through refreshing the javalist // and retrieving the path that contains the java name - auto relativeBinary = FS::PathCombine(javaName, "bin", executable); + auto relativeBinary = FS::PathCombine(javaName, "bin", JavaUtils::javaExecutable); auto finalPath = javaDir.absoluteFilePath(relativeBinary); if (QFileInfo::exists(finalPath)) { setJavaPath(finalPath); @@ -169,6 +167,9 @@ void AutoInstallJava::downloadJava(Meta::Version::Ptr version, QString javaName) case Java::DownloadType::Archive: m_current_task = makeShared(java->url, final_path, java->checksumType, java->checksumHash); break; + case Java::DownloadType::Unknown: + emitFailed(tr("Could not determine Java download type!")); + return; } auto deletePath = [final_path] { FS::deletePath(final_path); }; connect(m_current_task.get(), &Task::failed, this, [this, deletePath](QString reason) { @@ -201,8 +202,9 @@ void AutoInstallJava::tryNextMajorJava() auto wantedJavaName = packProfile->getProfile()->getCompatibleJavaName(); auto majorJavaVersions = packProfile->getProfile()->getCompatibleJavaMajors(); if (m_majorJavaVersionIndex >= majorJavaVersions.length()) { - emit logLine(tr("No versions of Java were found for your operating system: %1-%2").arg(SysInfo::currentSystem(), SysInfo::useQTForArch()), - MessageLevel::Warning); + emit logLine( + tr("No versions of Java were found for your operating system: %1-%2").arg(SysInfo::currentSystem(), SysInfo::useQTForArch()), + MessageLevel::Warning); emit logLine(tr("No compatible version of Java was found. Using the default one."), MessageLevel::Warning); emitSucceeded(); return; diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index d92402236..1a4b4cc58 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -211,6 +211,7 @@ void InstallDialog::done(int result) if (meta) { Task::Ptr task; auto final_path = FS::PathCombine(APPLICATION->javaPath(), meta->m_name); + auto deletePath = [final_path] { FS::deletePath(final_path); }; switch (meta->downloadType) { case Java::DownloadType::Manifest: task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); @@ -218,8 +219,11 @@ void InstallDialog::done(int result) case Java::DownloadType::Archive: task = makeShared(meta->url, final_path, meta->checksumType, meta->checksumHash); break; + case Java::DownloadType::Unknown: + QString error = QString(tr("Could not determine Java download type!")); + CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)->show(); + deletePath(); } - auto deletePath = [final_path] { FS::deletePath(final_path); }; connect(task.get(), &Task::failed, this, [this, &deletePath](QString reason) { QString error = QString("Java download failed: %1").arg(reason); CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)->show(); diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index dbd81cdd2..ec1ed0605 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -339,17 +339,12 @@ void JavaSettingsWidget::javaVersionSelected(BaseVersion::Ptr version) void JavaSettingsWidget::on_javaBrowseBtn_clicked() { - QString filter; -#if defined Q_OS_WIN32 - filter = "Java (javaw.exe)"; -#else - filter = "Java (java)"; -#endif - QString raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable"), QString(), filter); + auto filter = QString("Java (%1)").arg(JavaUtils::javaExecutable); + auto raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable"), QString(), filter); if (raw_path.isEmpty()) { return; } - QString cooked_path = FS::NormalizePath(raw_path); + auto cooked_path = FS::NormalizePath(raw_path); m_javaPathTextBox->setText(cooked_path); checkJavaPath(cooked_path); } From 09d258670aba47a2a0783ee8c443083a89342336 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 28 Jun 2024 19:26:11 +0300 Subject: [PATCH 096/616] create mod meta information when importing curseforge pack Signed-off-by: Trial97 --- .../minecraft/mod/tasks/LocalModUpdateTask.h | 4 +- launcher/modplatform/EnsureMetadataTask.h | 4 +- .../modplatform/flame/FileResolvingTask.cpp | 296 ++++++++++-------- .../modplatform/flame/FileResolvingTask.h | 39 ++- .../flame/FlameInstanceCreationTask.cpp | 77 +++-- .../flame/FlameInstanceCreationTask.h | 2 +- launcher/modplatform/flame/PackManifest.cpp | 32 -- launcher/modplatform/flame/PackManifest.h | 14 +- 8 files changed, 244 insertions(+), 224 deletions(-) diff --git a/launcher/minecraft/mod/tasks/LocalModUpdateTask.h b/launcher/minecraft/mod/tasks/LocalModUpdateTask.h index 080999294..5447083ba 100644 --- a/launcher/minecraft/mod/tasks/LocalModUpdateTask.h +++ b/launcher/minecraft/mod/tasks/LocalModUpdateTask.h @@ -42,6 +42,6 @@ class LocalModUpdateTask : public Task { private: QDir m_index_dir; - ModPlatform::IndexedPack& m_mod; - ModPlatform::IndexedVersion& m_mod_version; + ModPlatform::IndexedPack m_mod; + ModPlatform::IndexedVersion m_mod_version; }; diff --git a/launcher/modplatform/EnsureMetadataTask.h b/launcher/modplatform/EnsureMetadataTask.h index 2f276e5a0..a32a9fce1 100644 --- a/launcher/modplatform/EnsureMetadataTask.h +++ b/launcher/modplatform/EnsureMetadataTask.h @@ -1,14 +1,14 @@ #pragma once #include "ModIndex.h" -#include "net/NetJob.h" #include "modplatform/helpers/HashUtils.h" #include "tasks/ConcurrentTask.h" +#include + class Mod; -class QDir; class EnsureMetadataTask : public Task { Q_OBJECT diff --git a/launcher/modplatform/flame/FileResolvingTask.cpp b/launcher/modplatform/flame/FileResolvingTask.cpp index 8d23896d9..7a6c80f95 100644 --- a/launcher/modplatform/flame/FileResolvingTask.cpp +++ b/launcher/modplatform/flame/FileResolvingTask.cpp @@ -1,86 +1,103 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "FileResolvingTask.h" +#include #include "Json.h" +#include "QObjectPtr.h" #include "modplatform/ModIndex.h" -#include "net/ApiDownload.h" -#include "net/ApiUpload.h" -#include "net/Upload.h" +#include "modplatform/flame/FlameAPI.h" +#include "modplatform/flame/FlameModIndex.h" +#include "modplatform/modrinth/ModrinthAPI.h" #include "modplatform/modrinth/ModrinthPackIndex.h" +#include "net/NetJob.h" +#include "tasks/Task.h" + +static const FlameAPI flameAPI; +static ModrinthAPI modrinthAPI; Flame::FileResolvingTask::FileResolvingTask(const shared_qobject_ptr& network, Flame::Manifest& toProcess) - : m_network(network), m_toProcess(toProcess) + : m_network(network), m_manifest(toProcess) {} bool Flame::FileResolvingTask::abort() { bool aborted = true; - if (m_dljob) - aborted &= m_dljob->abort(); - if (m_checkJob) - aborted &= m_checkJob->abort(); + if (m_task) { + aborted = m_task->abort(); + } return aborted ? Task::abort() : false; } void Flame::FileResolvingTask::executeTask() { - if (m_toProcess.files.isEmpty()) { // no file to resolve so leave it empty and emit success immediately + if (m_manifest.files.isEmpty()) { // no file to resolve so leave it empty and emit success immediately emitSucceeded(); return; } setStatus(tr("Resolving mod IDs...")); setProgress(0, 3); - m_dljob.reset(new NetJob("Mod id resolver", m_network)); - result.reset(new QByteArray()); - // build json data to send - QJsonObject object; + m_result.reset(new QByteArray()); - object["fileIds"] = QJsonArray::fromVariantList( - std::accumulate(m_toProcess.files.begin(), m_toProcess.files.end(), QVariantList(), [](QVariantList& l, const File& s) { - l.push_back(s.fileId); - return l; - })); - QByteArray data = Json::toText(object); - auto dl = Net::ApiUpload::makeByteArray(QUrl("https://api.curseforge.com/v1/mods/files"), result, data); - m_dljob->addNetAction(dl); + QStringList fileIds; + for (auto file : m_manifest.files) { + fileIds.push_back(QString::number(file.fileId)); + } + m_task = flameAPI.getFiles(fileIds, m_result); auto step_progress = std::make_shared(); - connect(m_dljob.get(), &NetJob::finished, this, [this, step_progress]() { + connect(m_task.get(), &Task::finished, this, [this, step_progress]() { step_progress->state = TaskStepState::Succeeded; stepProgress(*step_progress); netJobFinished(); }); - connect(m_dljob.get(), &NetJob::failed, this, [this, step_progress](QString reason) { + connect(m_task.get(), &Task::failed, this, [this, step_progress](QString reason) { step_progress->state = TaskStepState::Failed; stepProgress(*step_progress); emitFailed(reason); }); - connect(m_dljob.get(), &NetJob::stepProgress, this, &FileResolvingTask::propagateStepProgress); - connect(m_dljob.get(), &NetJob::progress, this, [this, step_progress](qint64 current, qint64 total) { + connect(m_task.get(), &Task::stepProgress, this, &FileResolvingTask::propagateStepProgress); + connect(m_task.get(), &Task::progress, this, [this, step_progress](qint64 current, qint64 total) { qDebug() << "Resolve slug progress" << current << total; step_progress->update(current, total); stepProgress(*step_progress); }); - connect(m_dljob.get(), &NetJob::status, this, [this, step_progress](QString status) { + connect(m_task.get(), &Task::status, this, [this, step_progress](QString status) { step_progress->status = status; stepProgress(*step_progress); }); - m_dljob->start(); + m_task->start(); } void Flame::FileResolvingTask::netJobFinished() { setProgress(1, 3); // job to check modrinth for blocked projects - m_checkJob.reset(new NetJob("Modrinth check", m_network)); - blockedProjects = QMap>(); + auto checkJob = makeShared("Modrinth check", m_network); QJsonDocument doc; QJsonArray array; try { - doc = Json::requireDocument(*result); + doc = Json::requireDocument(*m_result); array = Json::requireArray(doc.object()["data"]); } catch (Json::JsonException& e) { qCritical() << "Non-JSON data returned from the CF API"; @@ -91,125 +108,156 @@ void Flame::FileResolvingTask::netJobFinished() return; } + QStringList hashes; for (QJsonValueRef file : array) { - auto fileid = Json::requireInteger(Json::requireObject(file)["id"]); - auto& out = m_toProcess.files[fileid]; try { - out.parseFromObject(Json::requireObject(file)); - } catch ([[maybe_unused]] const JSONValidationError& e) { - qDebug() << "Blocked mod on curseforge" << out.fileName; - auto hash = out.hash; - if (!hash.isEmpty()) { - auto url = QString("https://api.modrinth.com/v2/version_file/%1?algorithm=sha1").arg(hash); - auto output = std::make_shared(); - auto dl = Net::ApiDownload::makeByteArray(QUrl(url), output); - QObject::connect(dl.get(), &Net::ApiDownload::succeeded, [&out]() { out.resolved = true; }); - - m_checkJob->addNetAction(dl); - blockedProjects.insert(&out, output); + auto obj = Json::requireObject(file); + auto version = FlameMod::loadIndexedPackVersion(obj); + auto fileid = version.fileId.toInt(); + m_manifest.files[fileid].version = version; + auto url = QUrl(version.downloadUrl, QUrl::TolerantMode); + if (!url.isValid() && "sha1" == version.hash_type && !version.hash.isEmpty()) { + hashes.push_back(version.hash); } + } catch (Json::JsonException& e) { + qCritical() << "Non-JSON data returned from the CF API"; + qCritical() << e.cause(); + + emitFailed(tr("Invalid data returned from the API.")); + + return; } } + if (hashes.isEmpty()) { + getFlameProjects(); + return; + } + m_result.reset(new QByteArray()); + m_task = modrinthAPI.currentVersions(hashes, "sha1", m_result); auto step_progress = std::make_shared(); - connect(m_checkJob.get(), &NetJob::finished, this, [this, step_progress]() { + connect(m_task.get(), &Task::finished, this, [this, step_progress]() { step_progress->state = TaskStepState::Succeeded; stepProgress(*step_progress); - modrinthCheckFinished(); + QJsonParseError parse_error{}; + QJsonDocument doc = QJsonDocument::fromJson(*m_result, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response from Modrinth::CurrentVersions at " << parse_error.offset + << " reason: " << parse_error.errorString(); + qWarning() << *m_result; + + failed(parse_error.errorString()); + return; + } + + try { + auto entries = Json::requireObject(doc); + for (auto& out : m_manifest.files) { + auto url = QUrl(out.version.downloadUrl, QUrl::TolerantMode); + if (!url.isValid() && "sha1" == out.version.hash_type && !out.version.hash.isEmpty()) { + try { + auto entry = Json::requireObject(entries, out.version.hash); + + auto file = Modrinth::loadIndexedPackVersion(entry); + + // If there's more than one mod loader for this version, we can't know for sure + // which file is relative to each loader, so it's best to not use any one and + // let the user download it manually. + if (!file.loaders || hasSingleModLoaderSelected(file.loaders)) { + out.version.downloadUrl = file.downloadUrl; + qDebug() << "Found alternative on modrinth " << out.version.fileName; + } + } catch (Json::JsonException& e) { + qDebug() << e.cause(); + qDebug() << entries; + } + } + } + } catch (Json::JsonException& e) { + qDebug() << e.cause(); + qDebug() << doc; + } + getFlameProjects(); }); - connect(m_checkJob.get(), &NetJob::failed, this, [this, step_progress](QString reason) { + connect(m_task.get(), &Task::failed, this, [this, step_progress](QString reason) { step_progress->state = TaskStepState::Failed; stepProgress(*step_progress); }); - connect(m_checkJob.get(), &NetJob::stepProgress, this, &FileResolvingTask::propagateStepProgress); - connect(m_checkJob.get(), &NetJob::progress, this, [this, step_progress](qint64 current, qint64 total) { + connect(m_task.get(), &Task::stepProgress, this, &FileResolvingTask::propagateStepProgress); + connect(m_task.get(), &Task::progress, this, [this, step_progress](qint64 current, qint64 total) { qDebug() << "Resolve slug progress" << current << total; step_progress->update(current, total); stepProgress(*step_progress); }); - connect(m_checkJob.get(), &NetJob::status, this, [this, step_progress](QString status) { + connect(m_task.get(), &Task::status, this, [this, step_progress](QString status) { step_progress->status = status; stepProgress(*step_progress); }); - m_checkJob->start(); + m_task->start(); } -void Flame::FileResolvingTask::modrinthCheckFinished() +void Flame::FileResolvingTask::getFlameProjects() { setProgress(2, 3); - qDebug() << "Finished with blocked mods : " << blockedProjects.size(); - - for (auto it = blockedProjects.keyBegin(); it != blockedProjects.keyEnd(); it++) { - auto& out = *it; - auto bytes = blockedProjects[out]; - if (!out->resolved) { - continue; - } - - QJsonDocument doc = QJsonDocument::fromJson(*bytes); - auto obj = doc.object(); - auto file = Modrinth::loadIndexedPackVersion(obj); - - // If there's more than one mod loader for this version, we can't know for sure - // which file is relative to each loader, so it's best to not use any one and - // let the user download it manually. - if (!file.loaders || hasSingleModLoaderSelected(file.loaders)) { - out->url = file.downloadUrl; - qDebug() << "Found alternative on modrinth " << out->fileName; - } else { - out->resolved = false; - } + m_result.reset(new QByteArray()); + QStringList addonIds; + for (auto file : m_manifest.files) { + addonIds.push_back(QString::number(file.projectId)); } - // copy to an output list and filter out projects found on modrinth - auto block = std::make_shared>(); - auto it = blockedProjects.keys(); - std::copy_if(it.begin(), it.end(), std::back_inserter(*block), [](File* f) { return !f->resolved; }); - // Display not found mods early - if (!block->empty()) { - // blocked mods found, we need the slug for displaying.... we need another job :D ! - m_slugJob.reset(new NetJob("Slug Job", m_network)); - int index = 0; - for (auto mod : *block) { - auto projectId = mod->projectId; - auto output = std::make_shared(); - auto url = QString("https://api.curseforge.com/v1/mods/%1").arg(projectId); - auto dl = Net::ApiDownload::makeByteArray(url, output); - qDebug() << "Fetching url slug for file:" << mod->fileName; - QObject::connect(dl.get(), &Net::ApiDownload::succeeded, [block, index, output]() { - auto mod = block->at(index); // use the shared_ptr so it is captured and only freed when we are done - auto json = QJsonDocument::fromJson(*output); - auto base = - Json::requireString(Json::requireObject(Json::requireObject(Json::requireObject(json), "data"), "links"), "websiteUrl"); - auto link = QString("%1/download/%2").arg(base, QString::number(mod->fileId)); - mod->websiteUrl = link; - }); - m_slugJob->addNetAction(dl); - index++; - } - auto step_progress = std::make_shared(); - connect(m_slugJob.get(), &NetJob::succeeded, this, [this, step_progress]() { - step_progress->state = TaskStepState::Succeeded; - stepProgress(*step_progress); - emitSucceeded(); - }); - connect(m_slugJob.get(), &NetJob::failed, this, [this, step_progress](QString reason) { - step_progress->state = TaskStepState::Failed; - stepProgress(*step_progress); - emitFailed(reason); - }); - connect(m_slugJob.get(), &NetJob::stepProgress, this, &FileResolvingTask::propagateStepProgress); - connect(m_slugJob.get(), &NetJob::progress, this, [this, step_progress](qint64 current, qint64 total) { - qDebug() << "Resolve slug progress" << current << total; - step_progress->update(current, total); - stepProgress(*step_progress); - }); - connect(m_slugJob.get(), &NetJob::status, this, [this, step_progress](QString status) { - step_progress->status = status; - stepProgress(*step_progress); - }); - m_slugJob->start(); - } else { + m_task = flameAPI.getProjects(addonIds, m_result); + + auto step_progress = std::make_shared(); + connect(m_task.get(), &Task::succeeded, this, [this, step_progress] { + QJsonParseError parse_error{}; + auto doc = QJsonDocument::fromJson(*m_result, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response from Modrinth projects task at " << parse_error.offset + << " reason: " << parse_error.errorString(); + qWarning() << *m_result; + return; + } + + try { + QJsonArray entries; + entries = Json::requireArray(Json::requireObject(doc), "data"); + + for (auto entry : entries) { + auto entry_obj = Json::requireObject(entry); + auto id = Json::requireInteger(entry_obj, "id"); + auto file = std::find_if(m_manifest.files.begin(), m_manifest.files.end(), + [id](const Flame::File& file) { return file.projectId == id; }); + if (file == m_manifest.files.end()) { + continue; + } + + setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(file->version.fileName)); + FlameMod::loadIndexedPack(file->pack, entry_obj); + } + } catch (Json::JsonException& e) { + qDebug() << e.cause(); + qDebug() << doc; + } + step_progress->state = TaskStepState::Succeeded; + stepProgress(*step_progress); emitSucceeded(); - } + }); + + connect(m_task.get(), &Task::failed, this, [this, step_progress](QString reason) { + step_progress->state = TaskStepState::Failed; + stepProgress(*step_progress); + emitFailed(reason); + }); + connect(m_task.get(), &Task::stepProgress, this, &FileResolvingTask::propagateStepProgress); + connect(m_task.get(), &Task::progress, this, [this, step_progress](qint64 current, qint64 total) { + qDebug() << "Resolve slug progress" << current << total; + step_progress->update(current, total); + stepProgress(*step_progress); + }); + connect(m_task.get(), &Task::status, this, [this, step_progress](QString status) { + step_progress->status = status; + stepProgress(*step_progress); + }); + + m_task->start(); } diff --git a/launcher/modplatform/flame/FileResolvingTask.h b/launcher/modplatform/flame/FileResolvingTask.h index c280827af..edd9fce9a 100644 --- a/launcher/modplatform/flame/FileResolvingTask.h +++ b/launcher/modplatform/flame/FileResolvingTask.h @@ -1,7 +1,25 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #pragma once +#include + #include "PackManifest.h" -#include "net/NetJob.h" #include "tasks/Task.h" namespace Flame { @@ -9,12 +27,12 @@ class FileResolvingTask : public Task { Q_OBJECT public: explicit FileResolvingTask(const shared_qobject_ptr& network, Flame::Manifest& toProcess); - virtual ~FileResolvingTask(){}; + virtual ~FileResolvingTask() = default; bool canAbort() const override { return true; } bool abort() override; - const Flame::Manifest& getResults() const { return m_toProcess; } + const Flame::Manifest& getResults() const { return m_manifest; } protected: virtual void executeTask() override; @@ -22,16 +40,13 @@ class FileResolvingTask : public Task { protected slots: void netJobFinished(); + private: + void getFlameProjects(); + private: /* data */ shared_qobject_ptr m_network; - Flame::Manifest m_toProcess; - std::shared_ptr result; - NetJob::Ptr m_dljob; - NetJob::Ptr m_checkJob; - NetJob::Ptr m_slugJob; - - void modrinthCheckFinished(); - - QMap> blockedProjects; + Flame::Manifest m_manifest; + std::shared_ptr m_result; + Task::Ptr m_task; }; } // namespace Flame diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index a629cc15b..b8c40ee42 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -35,8 +35,11 @@ #include "FlameInstanceCreationTask.h" +#include "QObjectPtr.h" +#include "minecraft/mod/tasks/LocalModUpdateTask.h" #include "modplatform/flame/FileResolvingTask.h" #include "modplatform/flame/FlameAPI.h" +#include "modplatform/flame/FlameModIndex.h" #include "modplatform/flame/PackManifest.h" #include "Application.h" @@ -51,6 +54,7 @@ #include "settings/INISettingsObject.h" +#include "tasks/ConcurrentTask.h" #include "ui/dialogs/BlockedModsDialog.h" #include "ui/dialogs/CustomMessageBox.h" @@ -58,7 +62,6 @@ #include #include "meta/Index.h" -#include "meta/VersionList.h" #include "minecraft/World.h" #include "minecraft/mod/tasks/LocalResourceParse.h" #include "net/ApiDownload.h" @@ -208,8 +211,7 @@ bool FlameCreationTask::updateInstance() Flame::File file; // We don't care about blocked mods, we just need local data to delete the file - file.parseFromObject(entry_obj, false); - + file.version = FlameMod::loadIndexedPackVersion(entry_obj); auto id = Json::requireInteger(entry_obj, "id"); old_files.insert(id, file); } @@ -219,10 +221,10 @@ bool FlameCreationTask::updateInstance() // Delete the files for (auto& file : old_files) { - if (file.fileName.isEmpty() || file.targetFolder.isEmpty()) + if (file.version.fileName.isEmpty() || file.targetFolder.isEmpty()) continue; - QString relative_path(FS::PathCombine(file.targetFolder, file.fileName)); + QString relative_path(FS::PathCombine(file.targetFolder, file.version.fileName)); qDebug() << "Scheduling" << relative_path << "for removal"; m_files_to_remove.append(old_minecraft_dir.absoluteFilePath(relative_path)); } @@ -471,15 +473,15 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) QList blocked_mods; auto anyBlocked = false; for (const auto& result : results.files.values()) { - if (result.fileName.endsWith(".zip")) { - m_ZIP_resources.append(std::make_pair(result.fileName, result.targetFolder)); + if (result.version.fileName.endsWith(".zip")) { + m_ZIP_resources.append(std::make_pair(result.version.fileName, result.targetFolder)); } - if (!result.resolved || result.url.isEmpty()) { + if (result.version.downloadUrl.isEmpty()) { BlockedMod blocked_mod; - blocked_mod.name = result.fileName; - blocked_mod.websiteUrl = result.websiteUrl; - blocked_mod.hash = result.hash; + blocked_mod.name = result.version.fileName; + blocked_mod.websiteUrl = QString("%1/download/%2").arg(result.pack.websiteUrl, QString::number(result.fileId)); + blocked_mod.hash = result.version.hash; blocked_mod.matched = false; blocked_mod.localPath = ""; blocked_mod.targetFolder = result.targetFolder; @@ -521,7 +523,7 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop) QStringList optionalFiles; for (auto& result : results) { if (!result.required) { - optionalFiles << FS::PathCombine(result.targetFolder, result.fileName); + optionalFiles << FS::PathCombine(result.targetFolder, result.version.fileName); } } @@ -537,7 +539,7 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop) selectedOptionalMods = optionalModDialog.getResult(); } for (const auto& result : results) { - auto fileName = result.fileName; + auto fileName = result.version.fileName; fileName = FS::RemoveInvalidPathChars(fileName); auto relpath = FS::PathCombine(result.targetFolder, fileName); @@ -548,36 +550,16 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop) relpath = FS::PathCombine("minecraft", relpath); auto path = FS::PathCombine(m_stagingPath, relpath); - switch (result.type) { - case Flame::File::Type::Folder: { - logWarning(tr("This 'Folder' may need extracting: %1").arg(relpath)); - // fallthrough intentional, we treat these as plain old mods and dump them wherever. - } - /* fallthrough */ - case Flame::File::Type::SingleFile: - case Flame::File::Type::Mod: { - if (!result.url.isEmpty()) { - qDebug() << "Will download" << result.url << "to" << path; - auto dl = Net::ApiDownload::makeFile(result.url, path); - m_files_job->addNetAction(dl); - } - break; - } - case Flame::File::Type::Modpack: - logWarning(tr("Nesting modpacks in modpacks is not implemented, nothing was downloaded: %1").arg(relpath)); - break; - case Flame::File::Type::Cmod2: - case Flame::File::Type::Ctoc: - case Flame::File::Type::Unknown: - logWarning(tr("Unrecognized/unhandled PackageType for: %1").arg(relpath)); - break; + if (!result.version.downloadUrl.isEmpty()) { + qDebug() << "Will download" << result.version.downloadUrl << "to" << path; + auto dl = Net::ApiDownload::makeFile(result.version.downloadUrl, path); + m_files_job->addNetAction(dl); } } - m_mod_id_resolver.reset(); - connect(m_files_job.get(), &NetJob::succeeded, this, [&]() { + connect(m_files_job.get(), &NetJob::finished, this, [this, &loop]() { m_files_job.reset(); - validateZIPResources(); + validateZIPResources(loop); }); connect(m_files_job.get(), &NetJob::failed, [&](QString reason) { m_files_job.reset(); @@ -588,7 +570,6 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop) setProgress(current, total); }); connect(m_files_job.get(), &NetJob::stepProgress, this, &FlameCreationTask::propagateStepProgress); - connect(m_files_job.get(), &NetJob::finished, &loop, &QEventLoop::quit); setStatus(tr("Downloading mods...")); m_files_job->start(); @@ -626,9 +607,10 @@ void FlameCreationTask::copyBlockedMods(QList const& blocked_mods) setAbortable(true); } -void FlameCreationTask::validateZIPResources() +void FlameCreationTask::validateZIPResources(QEventLoop& loop) { qDebug() << "Validating whether resources stored as .zip are in the right place"; + QStringList zipMods; for (auto [fileName, targetFolder] : m_ZIP_resources) { qDebug() << "Checking" << fileName << "..."; auto localPath = FS::PathCombine(m_stagingPath, "minecraft", targetFolder, fileName); @@ -668,6 +650,7 @@ void FlameCreationTask::validateZIPResources() switch (type) { case PackedResourceType::Mod: validatePath(fileName, targetFolder, "mods"); + zipMods.push_back(fileName); break; case PackedResourceType::ResourcePack: validatePath(fileName, targetFolder, "resourcepacks"); @@ -693,4 +676,16 @@ void FlameCreationTask::validateZIPResources() break; } } + auto task = makeShared(this, "CreateModMetadata", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); + auto results = m_mod_id_resolver->getResults().files; + auto folder = FS::PathCombine(m_stagingPath, "minecraft", "mods", ".index"); + for (auto file : results) { + if (file.targetFolder != "mods" || (file.version.fileName.endsWith(".zip") && !zipMods.contains(file.version.fileName))) { + continue; + } + task->addTask(makeShared(folder, file.pack, file.version)); + } + connect(task.get(), &Task::finished, &loop, &QEventLoop::quit); + m_process_update_file_info_job = task; + task->start(); } diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.h b/launcher/modplatform/flame/FlameInstanceCreationTask.h index 02ad48f2e..28ab176c2 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.h +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.h @@ -74,7 +74,7 @@ class FlameCreationTask final : public InstanceCreationTask { void idResolverSucceeded(QEventLoop&); void setupDownloadJob(QEventLoop&); void copyBlockedMods(QList const& blocked_mods); - void validateZIPResources(); + void validateZIPResources(QEventLoop& loop); QString getVersionForLoader(QString uid, QString loaderType, QString version, QString mcVersion); private: diff --git a/launcher/modplatform/flame/PackManifest.cpp b/launcher/modplatform/flame/PackManifest.cpp index 40a523d31..e576a6a84 100644 --- a/launcher/modplatform/flame/PackManifest.cpp +++ b/launcher/modplatform/flame/PackManifest.cpp @@ -68,35 +68,3 @@ void Flame::loadManifest(Flame::Manifest& m, const QString& filepath) } loadManifestV1(m, obj); } - -bool Flame::File::parseFromObject(const QJsonObject& obj, bool throw_on_blocked) -{ - fileName = Json::requireString(obj, "fileName"); - // This is a piece of a Flame project JSON pulled out into the file metadata (here) for convenience - // It is also optional - type = File::Type::SingleFile; - - targetFolder = "mods"; - - // get the hash - hash = QString(); - auto hashes = Json::ensureArray(obj, "hashes"); - for (QJsonValueRef item : hashes) { - auto hobj = Json::requireObject(item); - auto algo = Json::requireInteger(hobj, "algo"); - auto value = Json::requireString(hobj, "value"); - if (algo == 1) { - hash = value; - } - } - - // may throw, if the project is blocked - QString rawUrl = Json::ensureString(obj, "downloadUrl"); - url = QUrl(rawUrl, QUrl::TolerantMode); - if (!url.isValid() && throw_on_blocked) { - throw JSONValidationError(QString("Invalid URL: %1").arg(rawUrl)); - } - - resolved = true; - return true; -} diff --git a/launcher/modplatform/flame/PackManifest.h b/launcher/modplatform/flame/PackManifest.h index 4417c2430..49a0b2d68 100644 --- a/launcher/modplatform/flame/PackManifest.h +++ b/launcher/modplatform/flame/PackManifest.h @@ -40,26 +40,20 @@ #include #include #include +#include "modplatform/ModIndex.h" namespace Flame { struct File { - // NOTE: throws JSONValidationError - bool parseFromObject(const QJsonObject& object, bool throw_on_blocked = true); - int projectId = 0; int fileId = 0; // NOTE: the opposite to 'optional' bool required = true; - QString hash; - // NOTE: only set on blocked files ! Empty otherwise. - QString websiteUrl; + + ModPlatform::IndexedPack pack; + ModPlatform::IndexedVersion version; // our - bool resolved = false; - QString fileName; - QUrl url; QString targetFolder = QStringLiteral("mods"); - enum class Type { Unknown, Folder, Ctoc, SingleFile, Cmod2, Modpack, Mod } type = Type::Mod; }; struct Modloader { From 1021222c955b4b5f7416e91f51c619af118a2bf4 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 28 Jun 2024 20:28:52 +0300 Subject: [PATCH 097/616] create mod meta information when importing modrinth pack Signed-off-by: Trial97 --- launcher/modplatform/EnsureMetadataTask.cpp | 3 + launcher/modplatform/EnsureMetadataTask.h | 1 + .../modrinth/ModrinthInstanceCreationTask.cpp | 67 ++++++++++++++----- .../modrinth/ModrinthInstanceCreationTask.h | 9 +-- 4 files changed, 56 insertions(+), 24 deletions(-) diff --git a/launcher/modplatform/EnsureMetadataTask.cpp b/launcher/modplatform/EnsureMetadataTask.cpp index 43acea1a2..f6f49f38d 100644 --- a/launcher/modplatform/EnsureMetadataTask.cpp +++ b/launcher/modplatform/EnsureMetadataTask.cpp @@ -42,6 +42,9 @@ EnsureMetadataTask::EnsureMetadataTask(QList& mods, QDir dir, ModPlatform: m_hashing_task->addTask(hash_task); } } +EnsureMetadataTask::EnsureMetadataTask(QHash& mods, QDir dir, ModPlatform::ResourceProvider prov) + : Task(nullptr), m_mods(mods), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) +{} Hashing::Hasher::Ptr EnsureMetadataTask::createNewHash(Mod* mod) { diff --git a/launcher/modplatform/EnsureMetadataTask.h b/launcher/modplatform/EnsureMetadataTask.h index a32a9fce1..631b32ae7 100644 --- a/launcher/modplatform/EnsureMetadataTask.h +++ b/launcher/modplatform/EnsureMetadataTask.h @@ -16,6 +16,7 @@ class EnsureMetadataTask : public Task { public: EnsureMetadataTask(Mod*, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH); EnsureMetadataTask(QList&, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH); + EnsureMetadataTask(QHash&, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH); ~EnsureMetadataTask() = default; diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index c0806a638..acbc7376c 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -5,8 +5,12 @@ #include "InstanceList.h" #include "Json.h" +#include "QObjectPtr.h" +#include "minecraft/MinecraftInstance.h" #include "minecraft/PackProfile.h" +#include "minecraft/mod/Mod.h" +#include "modplatform/EnsureMetadataTask.h" #include "modplatform/helpers/OverrideUtils.h" #include "modplatform/modrinth/ModrinthPackManifest.h" @@ -21,6 +25,7 @@ #include #include +#include #include bool ModrinthCreationTask::abort() @@ -29,8 +34,8 @@ bool ModrinthCreationTask::abort() return false; m_abort = true; - if (m_files_job) - m_files_job->abort(); + if (m_task) + m_task->abort(); return Task::abort(); } @@ -234,11 +239,11 @@ bool ModrinthCreationTask::createInstance() instance.setName(name()); instance.saveNow(); - m_files_job.reset(new NetJob(tr("Mod Download Modrinth"), APPLICATION->network())); + auto downloadMods = makeShared(tr("Mod Download Modrinth"), APPLICATION->network()); auto root_modpack_path = FS::PathCombine(m_stagingPath, m_root_path); auto root_modpack_url = QUrl::fromLocalFile(root_modpack_path); - + QHash mods; for (auto file : m_files) { auto fileName = file.path; fileName = FS::RemoveInvalidPathChars(fileName); @@ -249,20 +254,27 @@ bool ModrinthCreationTask::createInstance() .arg(fileName)); return false; } + if (fileName.startsWith("mods/")) { + auto mod = new Mod(file_path); + ModDetails d; + d.mod_id = file_path; + mod->setDetails(d); + mods[file.hash.toHex()] = mod; + } qDebug() << "Will try to download" << file.downloads.front() << "to" << file_path; auto dl = Net::ApiDownload::makeFile(file.downloads.dequeue(), file_path); dl->addValidator(new Net::ChecksumValidator(file.hashAlgorithm, file.hash)); - m_files_job->addNetAction(dl); + downloadMods->addNetAction(dl); if (!file.downloads.empty()) { // FIXME: This really needs to be put into a ConcurrentTask of // MultipleOptionsTask's , once those exist :) auto param = dl.toWeakRef(); - connect(dl.get(), &Task::failed, [this, &file, file_path, param] { + connect(dl.get(), &Task::failed, [&file, file_path, param, downloadMods] { auto ndl = Net::ApiDownload::makeFile(file.downloads.dequeue(), file_path); ndl->addValidator(new Net::ChecksumValidator(file.hashAlgorithm, file.hash)); - m_files_job->addNetAction(ndl); + downloadMods->addNetAction(ndl); if (auto shared = param.lock()) shared->succeeded(); }); @@ -271,23 +283,44 @@ bool ModrinthCreationTask::createInstance() bool ended_well = false; - connect(m_files_job.get(), &NetJob::succeeded, this, [&]() { ended_well = true; }); - connect(m_files_job.get(), &NetJob::failed, [&](const QString& reason) { + connect(downloadMods.get(), &NetJob::succeeded, this, [&]() { ended_well = true; }); + connect(downloadMods.get(), &NetJob::failed, [&](const QString& reason) { ended_well = false; setError(reason); }); - connect(m_files_job.get(), &NetJob::finished, &loop, &QEventLoop::quit); - connect(m_files_job.get(), &NetJob::progress, [&](qint64 current, qint64 total) { + connect(downloadMods.get(), &NetJob::finished, &loop, &QEventLoop::quit); + connect(downloadMods.get(), &NetJob::progress, [&](qint64 current, qint64 total) { setDetails(tr("%1 out of %2 complete").arg(current).arg(total)); setProgress(current, total); }); - connect(m_files_job.get(), &NetJob::stepProgress, this, &ModrinthCreationTask::propagateStepProgress); + connect(downloadMods.get(), &NetJob::stepProgress, this, &ModrinthCreationTask::propagateStepProgress); setStatus(tr("Downloading mods...")); - m_files_job->start(); + downloadMods->start(); + m_task = downloadMods; loop.exec(); + QEventLoop ensureMetaLoop; + QDir folder = FS::PathCombine(m_stagingPath, "minecraft", "mods", ".index"); + auto ensureMetadataTask = makeShared(mods, folder, ModPlatform::ResourceProvider::MODRINTH); + connect(ensureMetadataTask.get(), &Task::succeeded, this, [&]() { ended_well = true; }); + connect(ensureMetadataTask.get(), &Task::finished, &ensureMetaLoop, &QEventLoop::quit); + connect(ensureMetadataTask.get(), &Task::progress, [&](qint64 current, qint64 total) { + setDetails(tr("%1 out of %2 complete").arg(current).arg(total)); + setProgress(current, total); + }); + connect(ensureMetadataTask.get(), &Task::stepProgress, this, &ModrinthCreationTask::propagateStepProgress); + + ensureMetadataTask->start(); + m_task = ensureMetadataTask; + + ensureMetaLoop.exec(); + for (auto m : mods) { + delete m; + } + mods.clear(); + // Update information of the already installed instance, if any. if (m_instance && ended_well) { setAbortable(false); @@ -348,11 +381,11 @@ bool ModrinthCreationTask::parseManifest(const QString& index_path, QJsonObject hashes = Json::requireObject(modInfo, "hashes"); QString hash; QCryptographicHash::Algorithm hashAlgorithm; - hash = Json::ensureString(hashes, "sha1"); - hashAlgorithm = QCryptographicHash::Sha1; + hash = Json::ensureString(hashes, "sha512"); + hashAlgorithm = QCryptographicHash::Sha512; if (hash.isEmpty()) { - hash = Json::ensureString(hashes, "sha512"); - hashAlgorithm = QCryptographicHash::Sha512; + hash = Json::ensureString(hashes, "sha1"); + hashAlgorithm = QCryptographicHash::Sha1; if (hash.isEmpty()) { hash = Json::ensureString(hashes, "sha256"); hashAlgorithm = QCryptographicHash::Sha256; diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h index f07734a58..0879474cf 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h @@ -1,15 +1,10 @@ #pragma once +#include "BaseInstance.h" #include "InstanceCreationTask.h" -#include - -#include "minecraft/MinecraftInstance.h" - #include "modplatform/modrinth/ModrinthPackManifest.h" -#include "net/NetJob.h" - class ModrinthCreationTask final : public InstanceCreationTask { Q_OBJECT @@ -43,7 +38,7 @@ class ModrinthCreationTask final : public InstanceCreationTask { QString m_managed_id, m_managed_version_id, m_managed_name; std::vector m_files; - NetJob::Ptr m_files_job; + Task::Ptr m_task; std::optional m_instance; From 4ad19cded588dba201f3d1cdc2db248694a6101d Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 28 Jun 2024 20:45:54 +0300 Subject: [PATCH 098/616] format Signed-off-by: Trial97 --- launcher/minecraft/launch/AutoInstallJava.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index c77b9b105..eefed9cf5 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -56,7 +56,7 @@ AutoInstallJava::AutoInstallJava(LaunchTask* parent) : LaunchStep(parent) , m_instance(std::dynamic_pointer_cast(m_parent->instance())) - , m_supported_arch(SysInfo::getSupportedJavaArchitecture()){}; + , m_supported_arch(SysInfo::getSupportedJavaArchitecture()) {}; void AutoInstallJava::executeTask() { From ebad11d34f6f95b85eb392cc05ce0beccd7cb962 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 28 Jun 2024 22:04:11 +0300 Subject: [PATCH 099/616] made sure const method is respected Signed-off-by: Trial97 --- launcher/ui/pages/instance/ModFolderPage.cpp | 37 ++++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 4cf4b5bb0..f2feb8c7f 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -323,7 +323,27 @@ void ModFolderPage::updateMods(bool includeDeps) CoreModFolderPage::CoreModFolderPage(BaseInstance* inst, std::shared_ptr mods, QWidget* parent) : ModFolderPage(inst, mods, parent) -{} +{ + auto mcInst = dynamic_cast(m_instance); + if (mcInst) { + auto version = mcInst->getPackProfile(); + if (version && version->getComponent("net.minecraftforge") && version->getComponent("net.minecraft")) { + auto minecraftCmp = version->getComponent("net.minecraft"); + if (!minecraftCmp->m_loaded) { + version->reload(Net::Mode::Offline); + auto update = version->getCurrentTask(); + if (update) { + connect(update.get(), &Task::finished, this, [this] { + if (m_container) { + m_container->refreshContainer(); + } + }); + update->start(); + } + } + } + } +} bool CoreModFolderPage::shouldDisplay() const { @@ -336,20 +356,7 @@ bool CoreModFolderPage::shouldDisplay() const if (!version || !version->getComponent("net.minecraftforge") || !version->getComponent("net.minecraft")) return false; auto minecraftCmp = version->getComponent("net.minecraft"); - if (!minecraftCmp->m_loaded) { - version->reload(Net::Mode::Offline); - auto update = version->getCurrentTask(); - if (update) { - connect(update.get(), &Task::finished, this, [this] { - if (m_container) { - m_container->refreshContainer(); - } - }); - update->start(); - } - return false; - } - return minecraftCmp->getReleaseDateTime() < g_VersionFilterData.legacyCutoffDate; + return minecraftCmp->m_loaded && minecraftCmp->getReleaseDateTime() < g_VersionFilterData.legacyCutoffDate; } return false; } From 44bf0315ada1715145a8ed91b4f573ec7fcc4092 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:55:58 -0700 Subject: [PATCH 100/616] feat(components) recomend the correct lwjgl version for the minecraft version Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/meta/VersionList.cpp | 12 +++++++++++- launcher/meta/VersionList.h | 3 +++ launcher/ui/pages/instance/VersionPage.cpp | 18 ++++++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index f21e4594a..09c83e0b1 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -99,7 +99,7 @@ QVariant VersionList::data(const QModelIndex& index, int role) const case VersionPtrRole: return QVariant::fromValue(version); case RecommendedRole: - return version->isRecommended(); + return version->isRecommended() || m_externalRecommendsVersions.contains(version->version()); // FIXME: this should be determined in whatever view/proxy is used... // case LatestRole: return version == getLatestStable(); default: @@ -179,6 +179,16 @@ void VersionList::parse(const QJsonObject& obj) parseVersionList(obj, this); } +void VersionList::addExternalRecomends(const QVector& recomends) +{ + m_externalRecommendsVersions.append(recomends); +} + +void VersionList::clearExternalRecomends() +{ + m_externalRecommendsVersions.clear(); +} + // FIXME: this is dumb, we have 'recommended' as part of the metadata already... static const Meta::Version::Ptr& getBetterVersion(const Meta::Version::Ptr& a, const Meta::Version::Ptr& b) { diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index 90e0c8e5e..24ff6a1ce 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -68,6 +68,8 @@ class VersionList : public BaseVersionList, public BaseEntity { void merge(const VersionList::Ptr& other); void mergeFromIndex(const VersionList::Ptr& other); void parse(const QJsonObject& obj) override; + void addExternalRecomends(const QVector& recomends); + void clearExternalRecomends(); signals: void nameChanged(const QString& name); @@ -77,6 +79,7 @@ class VersionList : public BaseVersionList, public BaseEntity { private: QVector m_versions; + QStringList m_externalRecommendsVersions; QHash m_lookup; QString m_uid; QString m_name; diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index 807bc5d58..545798499 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -49,8 +49,10 @@ #include #include #include +#include #include "VersionPage.h" +#include "meta/JsonFormat.h" #include "ui/dialogs/InstallLoaderDialog.h" #include "ui_VersionPage.h" @@ -63,11 +65,9 @@ #include "DesktopServices.h" #include "Exception.h" -#include "Version.h" #include "icons/IconList.h" #include "minecraft/PackProfile.h" #include "minecraft/auth/AccountList.h" -#include "minecraft/mod/Mod.h" #include "meta/Index.h" #include "meta/VersionList.h" @@ -370,11 +370,25 @@ void VersionPage::on_actionChange_version_triggered() auto patch = m_profile->getComponent(versionRow); auto name = patch->getName(); auto list = patch->getVersionList(); + list->clearExternalRecomends(); if (!list) { return; } auto uid = list->uid(); + // recommend the correct lwjgl version for the current minecraft version + if (uid == "org.lwjgl" || uid == "org.lwjgl3") { + auto minecraft = m_profile->getComponent("net.minecraft"); + auto lwjglReq = std::find_if(minecraft->m_cachedRequires.cbegin(), minecraft->m_cachedRequires.cend(), + [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); + if (lwjglReq != minecraft->m_cachedRequires.cend()) { + auto lwjglVersion = !lwjglReq->equalsVersion.isEmpty() ? lwjglReq->equalsVersion : lwjglReq->suggests; + if (!lwjglVersion.isEmpty()) { + list->addExternalRecomends({ lwjglVersion }); + } + } + } + VersionSelectDialog vselect(list.get(), tr("Change %1 version").arg(name), this); if (uid == "net.fabricmc.intermediary" || uid == "org.quiltmc.hashed") { vselect.setEmptyString(tr("No intermediary mappings versions are currently available.")); From a791e22853da4c93f006883f78f22a4664f06972 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 20 Jun 2024 19:46:14 -0700 Subject: [PATCH 101/616] fix(instance components): resolve instance componants when changing minecraft version Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/meta/VersionList.cpp | 28 +++++++++++++ launcher/meta/VersionList.h | 2 + launcher/minecraft/Component.cpp | 5 +++ launcher/minecraft/PackProfile.cpp | 65 +++++++++++++++++++++++++++++- launcher/minecraft/PackProfile.h | 4 ++ 5 files changed, 103 insertions(+), 1 deletion(-) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 09c83e0b1..0cd33a2b3 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -16,6 +16,7 @@ #include "VersionList.h" #include +#include #include "Application.h" #include "Index.h" @@ -273,4 +274,31 @@ void VersionList::waitToLoad() task->start(); ev.exec(); } + +Version::Ptr VersionList::getRecommendedForParent(const QString& uid, const QString& version) +{ + auto foundExplicit = std::find_if(m_versions.begin(), m_versions.end(), [uid, version](Version::Ptr ver) -> bool { + auto& reqs = ver->requiredSet(); + auto parentReq = std::find_if(reqs.begin(), reqs.end(), [uid, version](const Require& req) -> bool { + return req.uid == uid && req.equalsVersion == version; + }); + return parentReq != reqs.end() && ver->isRecommended(); + }); + if (foundExplicit != m_versions.end()) { + return *foundExplicit; + } + + Version::Ptr latestCompat = nullptr; + for (auto ver : m_versions) { + auto& reqs = ver->requiredSet(); + auto parentReq = std::find_if(reqs.begin(), reqs.end(), [uid, version](const Require& req) -> bool { + return req.uid == uid && req.equalsVersion == version; + }); + if (parentReq != reqs.end()) { + latestCompat = getBetterVersion(latestCompat, ver); + } + } + return latestCompat; +} + } // namespace Meta diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index 24ff6a1ce..b746d3232 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -43,6 +43,8 @@ class VersionList : public BaseVersionList, public BaseEntity { void sortVersions() override; BaseVersion::Ptr getRecommended() const override; + Version::Ptr getRecommendedForParent(const QString& uid, const QString& version); + QVariant data(const QModelIndex& index, int role) const override; RoleList providesRoles() const override; diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 32a1deb68..f03ffacc0 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -402,3 +402,8 @@ void Component::updateCachedData() emit dataChanged(); } } + +QDebug operator<<(QDebug d, const Component& comp) { + d << "Component(" << comp.m_uid << " : " << comp.m_cachedVersion << ")"; + return d; +} diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 4b17cdf07..b258d8241 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -38,6 +38,8 @@ */ #include +#include +#include #include #include #include @@ -47,10 +49,14 @@ #include #include #include +#include +#include "Application.h" #include "Exception.h" #include "FileSystem.h" #include "Json.h" +#include "meta/Index.h" +#include "meta/JsonFormat.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/OneSixVersionFormat.h" #include "minecraft/ProfileUtils.h" @@ -58,7 +64,6 @@ #include "ComponentUpdateTask.h" #include "PackProfile.h" #include "PackProfile_p.h" -#include "minecraft/mod/Mod.h" #include "modplatform/ModIndex.h" static const QMap modloaderMapping{ { "net.neoforged", ModPlatform::NeoForge }, @@ -956,6 +961,35 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version if (component->revert()) { component->setVersion(version); component->setImportant(important); + component->updateCachedData(); + // remove linked componants to let them reresolve their versions + if (important) { + auto linked = collectTreeLinked(uid); + for (auto comp : linked) { + if (comp->isCustom()) { + continue; + } + if (modloaderMapping.contains(comp->getID())) { + qDebug() << comp->getID() << "is a mod loader, setting new recomended version..."; + auto versionList = APPLICATION->metadataIndex()->get(comp->getID()); + if (versionList) { + auto recomended = versionList->getRecommendedForParent(comp->getID(), version); + if (recomended) { + qDebug() << "Setting updated loader version: " << comp->getID() << " = " << recomended->version(); + setComponentVersion(comp->getID(), recomended->version()); + } else { + qDebug() << "no recomended verison for" << comp->getID(); + } + } else { + qDebug() << "no version list in metadata index for" << comp->getID(); + } + } else { + qDebug() << comp->getID() << ":" << comp->getVersion() << "linked to important component: " << uid + << " | Removing so it re-resolves"; + remove(comp->getID()); + } + } + } return true; } return false; @@ -969,6 +1003,35 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version } } +ComponentContainer PackProfile::collectTreeLinked(const QString& uid) +{ + ComponentContainer linked; + for (auto comp : d->components) { + qDebug() << "scanning" << comp->getID() << "for tree link"; + auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), + [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); + if (dep != comp->m_cachedRequires.cend()) { + qDebug() << comp->getID() << "depends on" << uid; + linked.append(comp); + } + } + auto iter = d->componentIndex.find(uid); + if (iter != d->componentIndex.end()) { + ComponentPtr comp = *iter; + comp->updateCachedData(); + qDebug() << comp->getID() << "has" << comp->m_cachedRequires.size() << "dependencies"; + for (auto dep : comp->m_cachedRequires) { + qDebug() << uid << "depends on" << comp->getID(); + auto found = d->componentIndex.find(dep.uid); + if (found != d->componentIndex.end()) { + qDebug() << comp->getID() << "is present"; + linked.append(*found); + } + } + } + return linked; +} + QString PackProfile::getComponentVersion(const QString& uid) const { const auto iter = d->componentIndex.find(uid); diff --git a/launcher/minecraft/PackProfile.h b/launcher/minecraft/PackProfile.h index e58e9ae9a..f733b3524 100644 --- a/launcher/minecraft/PackProfile.h +++ b/launcher/minecraft/PackProfile.h @@ -48,6 +48,7 @@ #include "Component.h" #include "LaunchProfile.h" +#include "minecraft/PackProfile_p.h" #include "modplatform/ModIndex.h" #include "net/Mode.h" @@ -119,6 +120,9 @@ class PackProfile : public QAbstractListModel { bool setComponentVersion(const QString& uid, const QString& version, bool important = false); + /// collects components that are dependant on or dependencies of the component + ComponentContainer collectTreeLinked(const QString& uid); + bool installEmpty(const QString& uid, const QString& name); QString patchFilePathForUid(const QString& uid) const; From ce280c2d04c8536cc06c012208899430fb6037de Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:55:33 -0700 Subject: [PATCH 102/616] fix misepellings Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/PackProfile.cpp | 15 +++++++-------- launcher/minecraft/PackProfile_p.h | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index b258d8241..bdc80b923 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -961,8 +961,7 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version if (component->revert()) { component->setVersion(version); component->setImportant(important); - component->updateCachedData(); - // remove linked componants to let them reresolve their versions + // remove linked components to let them re-resolve their versions if (important) { auto linked = collectTreeLinked(uid); for (auto comp : linked) { @@ -970,15 +969,15 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version continue; } if (modloaderMapping.contains(comp->getID())) { - qDebug() << comp->getID() << "is a mod loader, setting new recomended version..."; + qDebug() << comp->getID() << "is a mod loader, setting new recommended version..."; auto versionList = APPLICATION->metadataIndex()->get(comp->getID()); if (versionList) { - auto recomended = versionList->getRecommendedForParent(comp->getID(), version); - if (recomended) { - qDebug() << "Setting updated loader version: " << comp->getID() << " = " << recomended->version(); - setComponentVersion(comp->getID(), recomended->version()); + auto recommended = versionList->getRecommendedForParent(comp->getID(), version); + if (recommended) { + qDebug() << "Setting updated loader version: " << comp->getID() << " = " << recommended->version(); + setComponentVersion(comp->getID(), recommended->version()); } else { - qDebug() << "no recomended verison for" << comp->getID(); + qDebug() << "no recommended version for" << comp->getID(); } } else { qDebug() << "no version list in metadata index for" << comp->getID(); diff --git a/launcher/minecraft/PackProfile_p.h b/launcher/minecraft/PackProfile_p.h index 0cd4fb839..4fb3621f0 100644 --- a/launcher/minecraft/PackProfile_p.h +++ b/launcher/minecraft/PackProfile_p.h @@ -3,8 +3,8 @@ #include #include #include -#include #include "Component.h" +#include "tasks/Task.h" class MinecraftInstance; using ComponentContainer = QList; From a94a081b9c1347d65157ae3162d9adb8fee93c6a Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:08:23 -0700 Subject: [PATCH 103/616] add better profile logging properly resolve important dependencies Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/CMakeLists.txt | 27 +++- launcher/meta/VersionList.cpp | 4 + launcher/meta/VersionList.h | 1 + launcher/minecraft/Component.cpp | 12 ++ launcher/minecraft/Component.h | 2 + launcher/minecraft/ComponentUpdateTask.cpp | 61 ++++----- launcher/minecraft/ComponentUpdateTask_p.h | 4 +- launcher/minecraft/Logging.cpp | 25 ++++ launcher/minecraft/Logging.h | 26 ++++ launcher/minecraft/PackProfile.cpp | 136 +++++++++++++-------- launcher/modplatform/ModIndex.h | 2 +- 11 files changed, 215 insertions(+), 85 deletions(-) create mode 100644 launcher/minecraft/Logging.cpp create mode 100644 launcher/minecraft/Logging.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 366719dec..e18a8b950 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -206,6 +206,11 @@ set(ICONS_SOURCES # Support for Minecraft instances and launch set(MINECRAFT_SOURCES + + # Logging + minecraft/Logging.h + minecraft/Logging.cpp + # Minecraft support minecraft/auth/AccountData.cpp minecraft/auth/AccountData.h @@ -650,6 +655,22 @@ ecm_qt_declare_logging_category(CORE_SOURCES EXPORT "${Launcher_Name}" ) +ecm_qt_export_logging_category( + IDENTIFIER instanceProfileC + CATEGORY_NAME "launcher.instance.profile" + DEFAULT_SEVERITY Debug + DESCRIPTION "Profile actions" + EXPORT "${Launcher_Name}" +) + +ecm_qt_export_logging_category( + IDENTIFIER instanceProfileResolveC + CATEGORY_NAME "launcher.instance.profile.resolve" + DEFAULT_SEVERITY Debug + DESCRIPTION "Profile component resolusion actions" + EXPORT "${Launcher_Name}" +) + ecm_qt_export_logging_category( IDENTIFIER taskLogC CATEGORY_NAME "launcher.task" @@ -662,7 +683,7 @@ ecm_qt_export_logging_category( IDENTIFIER taskNetLogC CATEGORY_NAME "launcher.task.net" DEFAULT_SEVERITY Debug - DESCRIPTION "task network action" + DESCRIPTION "Task network action" EXPORT "${Launcher_Name}" ) @@ -670,14 +691,14 @@ ecm_qt_export_logging_category( IDENTIFIER taskDownloadLogC CATEGORY_NAME "launcher.task.net.download" DEFAULT_SEVERITY Debug - DESCRIPTION "task network download actions" + DESCRIPTION "Task network download actions" EXPORT "${Launcher_Name}" ) ecm_qt_export_logging_category( IDENTIFIER taskUploadLogC CATEGORY_NAME "launcher.task.net.upload" DEFAULT_SEVERITY Debug - DESCRIPTION "task network upload actions" + DESCRIPTION "Task network upload actions" EXPORT "${Launcher_Name}" ) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 0cd33a2b3..c133e7d1a 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -287,7 +287,11 @@ Version::Ptr VersionList::getRecommendedForParent(const QString& uid, const QStr if (foundExplicit != m_versions.end()) { return *foundExplicit; } + return nullptr; +} +Version::Ptr VersionList::getLatestForParent(const QString& uid, const QString& version) +{ Version::Ptr latestCompat = nullptr; for (auto ver : m_versions) { auto& reqs = ver->requiredSet(); diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index b746d3232..05ecd91d2 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -44,6 +44,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); QVariant data(const QModelIndex& index, int role) const override; diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index f03ffacc0..175e88d08 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -403,6 +403,18 @@ void Component::updateCachedData() } } +void Component::waitLoadMeta() { + + if (!m_loaded) { + if (!m_metaVersion || !m_metaVersion->isLoaded()) { + // wait for the loaded version from meta + m_metaVersion = APPLICATION->metadataIndex()->getLoadedVersion(m_uid, m_version); + } + m_loaded = true; + updateCachedData(); + } +} + QDebug operator<<(QDebug d, const Component& comp) { d << "Component(" << comp.m_uid << " : " << comp.m_cachedVersion << ")"; return d; diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 8aa6b4743..581a3db95 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -64,6 +64,8 @@ class Component : public QObject, public ProblemProvider { bool revert(); void updateCachedData(); + + void waitLoadMeta(); signals: void dataChanged(); diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 4d205af6c..7bdc11400 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -8,6 +8,7 @@ #include "cassert" #include "meta/Index.h" #include "meta/Version.h" +#include "minecraft/MinecraftInstance.h" #include "minecraft/OneSixVersionFormat.h" #include "minecraft/ProfileUtils.h" #include "net/Mode.h" @@ -15,6 +16,8 @@ #include "Application.h" #include "tasks/Task.h" +#include "minecraft/Logging.h" + /* * This is responsible for loading the components of a component list AND resolving dependency issues between them */ @@ -36,7 +39,7 @@ ComponentUpdateTask::ComponentUpdateTask(Mode mode, Net::Mode netmode, PackProfile* list, QObject* parent) : Task(parent) { d.reset(new ComponentUpdateTaskData); - d->m_list = list; + d->m_profile = list; d->mode = mode; d->netmode = netmode; } @@ -45,7 +48,7 @@ ComponentUpdateTask::~ComponentUpdateTask() {} void ComponentUpdateTask::executeTask() { - qDebug() << "Loading components"; + qCDebug(instanceProfileResolveC) << "Loading components"; loadComponents(); } @@ -63,7 +66,7 @@ LoadResult composeLoadResult(LoadResult a, LoadResult b) static LoadResult loadComponent(ComponentPtr component, Task::Ptr& loadTask, Net::Mode netmode) { if (component->m_loaded) { - qDebug() << component->getName() << "is already loaded"; + qCDebug(instanceProfileResolveC) << component->getName() << "is already loaded"; return LoadResult::LoadedLocal; } @@ -144,7 +147,7 @@ void ComponentUpdateTask::loadComponents() d->remoteLoadSuccessful = true; // load all the components OR their lists... - for (auto component : d->m_list->d->components) { + for (auto component : d->m_profile->d->components) { Task::Ptr loadTask; LoadResult singleResult; RemoteLoadStatus::Type loadType; @@ -175,7 +178,7 @@ void ComponentUpdateTask::loadComponents() } result = composeLoadResult(result, singleResult); if (loadTask) { - qDebug() << "Remote loading is being run for" << component->getName(); + qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" << "Remote loading is being run for" << component->getName(); connect(loadTask.get(), &Task::succeeded, this, [this, taskIndex]() { remoteLoadSucceeded(taskIndex); }); connect(loadTask.get(), &Task::failed, this, [this, taskIndex](const QString& error) { remoteLoadFailed(taskIndex, error); }); connect(loadTask.get(), &Task::aborted, this, [this, taskIndex]() { remoteLoadFailed(taskIndex, tr("Aborted")); }); @@ -270,7 +273,7 @@ static bool gatherRequirementsFromComponents(const ComponentContainer& input, Re output.erase(componenRequireEx); output.insert(result.outcome); } else { - qCritical() << "Conflicting requirements:" << componentRequire.uid << "versions:" << componentRequire.equalsVersion + qCCritical(instanceProfileResolveC) << "Conflicting requirements:" << componentRequire.uid << "versions:" << componentRequire.equalsVersion << ";" << (*found).equalsVersion; } succeeded &= result.ok; @@ -353,22 +356,22 @@ static bool getTrivialComponentChanges(const ComponentIndex& index, const Requir } while (false); switch (decision) { case Decision::Undetermined: - qCritical() << "No decision for" << reqStr; + qCCritical(instanceProfileResolveC) << "No decision for" << reqStr; succeeded = false; break; case Decision::Met: - qDebug() << reqStr << "Is met."; + qCDebug(instanceProfileResolveC) << reqStr << "Is met."; break; case Decision::Missing: - qDebug() << reqStr << "Is missing and should be added at" << req.indexOfFirstDependee; + qCDebug(instanceProfileResolveC) << reqStr << "Is missing and should be added at" << req.indexOfFirstDependee; toAdd.insert(req); break; case Decision::VersionNotSame: - qDebug() << reqStr << "already has different version that can be changed."; + qCDebug(instanceProfileResolveC) << reqStr << "already has different version that can be changed."; toChange.insert(req); break; case Decision::LockedVersionNotSame: - qDebug() << reqStr << "already has different version that cannot be changed."; + qCDebug(instanceProfileResolveC) << reqStr << "already has different version that cannot be changed."; succeeded = false; break; } @@ -381,7 +384,7 @@ static bool getTrivialComponentChanges(const ComponentIndex& index, const Requir // FIXME: throw all this away and use a graph void ComponentUpdateTask::resolveDependencies(bool checkOnly) { - qDebug() << "Resolving dependencies"; + qCDebug(instanceProfileResolveC) << "Resolving dependencies"; /* * this is a naive dependency resolving algorithm. all it does is check for following conditions and react in simple ways: * 1. There are conflicting dependencies on the same uid with different exact version numbers @@ -393,8 +396,8 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) * * NOTE: this is a placeholder and should eventually be replaced with something 'serious' */ - auto& components = d->m_list->d->components; - auto& componentIndex = d->m_list->d->componentIndex; + auto& components = d->m_profile->d->components; + auto& componentIndex = d->m_profile->d->componentIndex; RequireExSet allRequires; QStringList toRemove; @@ -407,10 +410,10 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) } getTrivialRemovals(components, allRequires, toRemove); if (!toRemove.isEmpty()) { - qDebug() << "Removing obsolete components..."; + qCDebug(instanceProfileResolveC) << "Removing obsolete components..."; for (auto& remove : toRemove) { - qDebug() << "Removing" << remove; - d->m_list->remove(remove); + qCDebug(instanceProfileResolveC) << "Removing" << remove; + d->m_profile->remove(remove); } } } while (!toRemove.isEmpty()); @@ -434,14 +437,14 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) if (toAdd.size()) { // add stuff... for (auto& add : toAdd) { - auto component = makeShared(d->m_list, add.uid); + auto component = makeShared(d->m_profile, add.uid); if (!add.equalsVersion.isEmpty()) { // exact version - qDebug() << "Adding" << add.uid << "version" << add.equalsVersion << "at position" << add.indexOfFirstDependee; + qCDebug(instanceProfileResolveC) << "Adding" << add.uid << "version" << add.equalsVersion << "at position" << add.indexOfFirstDependee; component->m_version = add.equalsVersion; } else { // version needs to be decided - qDebug() << "Adding" << add.uid << "at position" << add.indexOfFirstDependee; + qCDebug(instanceProfileResolveC) << "Adding" << add.uid << "at position" << add.indexOfFirstDependee; // ############################################################################################################ // HACK HACK HACK HACK FIXME: this is a placeholder for deciding what version to use. For now, it is hardcoded. if (!add.suggests.isEmpty()) { @@ -464,7 +467,7 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) } component->m_dependencyOnly = true; // FIXME: this should not work directly with the component list - d->m_list->insertComponent(add.indexOfFirstDependee, component); + d->m_profile->insertComponent(add.indexOfFirstDependee, component); componentIndex[add.uid] = component; } recursionNeeded = true; @@ -473,7 +476,7 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) // change a version of something that exists for (auto& change : toChange) { // FIXME: this should not work directly with the component list - qDebug() << "Setting version of " << change.uid << "to" << change.equalsVersion; + qCDebug(instanceProfileResolveC) << "Setting version of " << change.uid << "to" << change.equalsVersion; auto component = componentIndex[change.uid]; component->setVersion(change.equalsVersion); } @@ -490,7 +493,7 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) void ComponentUpdateTask::remoteLoadSucceeded(size_t taskIndex) { if (static_cast(d->remoteLoadStatusList.size()) < taskIndex) { - qWarning() << "Got task index outside of results" << taskIndex; + qCWarning(instanceProfileResolveC) << "Got task index outside of results" << taskIndex; return; } auto& taskSlot = d->remoteLoadStatusList[taskIndex]; @@ -498,16 +501,16 @@ void ComponentUpdateTask::remoteLoadSucceeded(size_t taskIndex) disconnect(taskSlot.task.get(), &Task::failed, this, nullptr); disconnect(taskSlot.task.get(), &Task::aborted, this, nullptr); if (taskSlot.finished) { - qWarning() << "Got multiple results from remote load task" << taskIndex; + qCWarning(instanceProfileResolveC) << "Got multiple results from remote load task" << taskIndex; return; } - qDebug() << "Remote task" << taskIndex << "succeeded"; + qCDebug(instanceProfileResolveC) << "Remote task" << taskIndex << "succeeded"; taskSlot.succeeded = false; taskSlot.finished = true; d->remoteTasksInProgress--; // update the cached data of the component from the downloaded version file. if (taskSlot.type == RemoteLoadStatus::Type::Version) { - auto component = d->m_list->getComponent(taskSlot.PackProfileIndex); + auto component = d->m_profile->getComponent(taskSlot.PackProfileIndex); component->m_loaded = true; component->updateCachedData(); } @@ -517,7 +520,7 @@ void ComponentUpdateTask::remoteLoadSucceeded(size_t taskIndex) void ComponentUpdateTask::remoteLoadFailed(size_t taskIndex, const QString& msg) { if (static_cast(d->remoteLoadStatusList.size()) < taskIndex) { - qWarning() << "Got task index outside of results" << taskIndex; + qCWarning(instanceProfileResolveC) << "Got task index outside of results" << taskIndex; return; } auto& taskSlot = d->remoteLoadStatusList[taskIndex]; @@ -525,10 +528,10 @@ void ComponentUpdateTask::remoteLoadFailed(size_t taskIndex, const QString& msg) disconnect(taskSlot.task.get(), &Task::failed, this, nullptr); disconnect(taskSlot.task.get(), &Task::aborted, this, nullptr); if (taskSlot.finished) { - qWarning() << "Got multiple results from remote load task" << taskIndex; + qCWarning(instanceProfileResolveC) << "Got multiple results from remote load task" << taskIndex; return; } - qDebug() << "Remote task" << taskIndex << "failed: " << msg; + qCDebug(instanceProfileResolveC) << "Remote task" << taskIndex << "failed: " << msg; d->remoteLoadSuccessful = false; taskSlot.succeeded = false; taskSlot.finished = true; diff --git a/launcher/minecraft/ComponentUpdateTask_p.h b/launcher/minecraft/ComponentUpdateTask_p.h index b82553700..2fc0b6d9a 100644 --- a/launcher/minecraft/ComponentUpdateTask_p.h +++ b/launcher/minecraft/ComponentUpdateTask_p.h @@ -6,6 +6,8 @@ #include "net/Mode.h" #include "tasks/Task.h" +#include "minecraft/ComponentUpdateTask.h" + class PackProfile; struct RemoteLoadStatus { @@ -18,7 +20,7 @@ struct RemoteLoadStatus { }; struct ComponentUpdateTaskData { - PackProfile* m_list = nullptr; + PackProfile* m_profile = nullptr; QList remoteLoadStatusList; bool remoteLoadSuccessful = true; size_t remoteTasksInProgress = 0; diff --git a/launcher/minecraft/Logging.cpp b/launcher/minecraft/Logging.cpp new file mode 100644 index 000000000..92596de3e --- /dev/null +++ b/launcher/minecraft/Logging.cpp @@ -0,0 +1,25 @@ + +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (C) 2023 Rachel Powers <508861+Ryex@users.noreply.github.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "minecraft/Logging.h" +#include + +Q_LOGGING_CATEGORY(instanceProfileC, "launcher.instance.profile") +Q_LOGGING_CATEGORY(instanceProfileResolveC, "launcher.instance.profile.resolve") diff --git a/launcher/minecraft/Logging.h b/launcher/minecraft/Logging.h new file mode 100644 index 000000000..00d43f419 --- /dev/null +++ b/launcher/minecraft/Logging.h @@ -0,0 +1,26 @@ + +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (C) 2023 Rachel Powers <508861+Ryex@users.noreply.github.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#include + +Q_DECLARE_LOGGING_CATEGORY(instanceProfileC) +Q_DECLARE_LOGGING_CATEGORY(instanceProfileResolveC) diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index bdc80b923..09a2ac0cb 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -39,7 +39,6 @@ #include #include -#include #include #include #include @@ -66,6 +65,8 @@ #include "PackProfile_p.h" #include "modplatform/ModIndex.h" +#include "minecraft/Logging.h" + static const QMap modloaderMapping{ { "net.neoforged", ModPlatform::NeoForge }, { "net.minecraftforge", ModPlatform::Forge }, { "net.fabricmc.fabric-loader", ModPlatform::Fabric }, @@ -159,16 +160,16 @@ static bool savePackProfile(const QString& filename, const ComponentContainer& c obj.insert("components", orderArray); QSaveFile outFile(filename); if (!outFile.open(QFile::WriteOnly)) { - qCritical() << "Couldn't open" << outFile.fileName() << "for writing:" << outFile.errorString(); + qCCritical(instanceProfileC) << "Couldn't open" << outFile.fileName() << "for writing:" << outFile.errorString(); return false; } auto data = QJsonDocument(obj).toJson(QJsonDocument::Indented); if (outFile.write(data) != data.size()) { - qCritical() << "Couldn't write all the data into" << outFile.fileName() << "because:" << outFile.errorString(); + qCCritical(instanceProfileC) << "Couldn't write all the data into" << outFile.fileName() << "because:" << outFile.errorString(); return false; } if (!outFile.commit()) { - qCritical() << "Couldn't save" << outFile.fileName() << "because:" << outFile.errorString(); + qCCritical(instanceProfileC) << "Couldn't save" << outFile.fileName() << "because:" << outFile.errorString(); } return true; } @@ -181,12 +182,12 @@ static bool loadPackProfile(PackProfile* parent, { QFile componentsFile(filename); if (!componentsFile.exists()) { - qWarning() << "Components file doesn't exist. This should never happen."; + qCWarning(instanceProfileC) << "Components file" << filename << "doesn't exist. This should never happen."; return false; } if (!componentsFile.open(QFile::ReadOnly)) { - qCritical() << "Couldn't open" << componentsFile.fileName() << " for reading:" << componentsFile.errorString(); - qWarning() << "Ignoring overriden order"; + qCCritical(instanceProfileC) << "Couldn't open" << componentsFile.fileName() << " for reading:" << componentsFile.errorString(); + qCWarning(instanceProfileC) << "Ignoring overridden order"; return false; } @@ -194,8 +195,8 @@ static bool loadPackProfile(PackProfile* parent, QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(componentsFile.readAll(), &error); if (error.error != QJsonParseError::NoError) { - qCritical() << "Couldn't parse" << componentsFile.fileName() << ":" << error.errorString(); - qWarning() << "Ignoring overriden order"; + qCCritical(instanceProfileC) << "Couldn't parse" << componentsFile.fileName() << ":" << error.errorString(); + qCWarning(instanceProfileC) << "Ignoring overridden order"; return false; } @@ -213,7 +214,7 @@ static bool loadPackProfile(PackProfile* parent, container.append(componentFromJsonV1(parent, componentJsonPattern, comp_obj)); } } catch ([[maybe_unused]] const JSONValidationError& err) { - qCritical() << "Couldn't parse" << componentsFile.fileName() << ": bad file format"; + qCCritical(instanceProfileC) << "Couldn't parse" << componentsFile.fileName() << ": bad file format"; container.clear(); return false; } @@ -246,12 +247,12 @@ void PackProfile::buildingFromScratch() void PackProfile::scheduleSave() { if (!d->loaded) { - qDebug() << "Component list should never save if it didn't successfully load, instance:" << d->m_instance->name(); + qDebug() << d->m_instance->name() << "|" << "Component list should never save if it didn't successfully load"; return; } if (!d->dirty) { d->dirty = true; - qDebug() << "Component list save is scheduled for" << d->m_instance->name(); + qDebug() << d->m_instance->name() << "|" << "Component list save is scheduled"; } d->m_saveTimer.start(); } @@ -278,7 +279,7 @@ QString PackProfile::patchFilePathForUid(const QString& uid) const void PackProfile::save_internal() { - qDebug() << "Component list save performed now for" << d->m_instance->name(); + qDebug() << d->m_instance->name() << "|" << "Component list save performed now"; auto filename = componentsFilePath(); savePackProfile(filename, d->components); d->dirty = false; @@ -291,7 +292,7 @@ bool PackProfile::load() // load the new component list and swap it with the current one... ComponentContainer newComponents; if (!loadPackProfile(this, filename, patchesPattern(), newComponents)) { - qCritical() << "Failed to load the component config for instance" << d->m_instance->name(); + qCritical() << d->m_instance->name() << "|" << "Failed to load the component config"; return false; } else { // FIXME: actually use fine-grained updates, not this... @@ -304,7 +305,7 @@ bool PackProfile::load() d->componentIndex.clear(); for (auto component : newComponents) { if (d->componentIndex.contains(component->m_uid)) { - qWarning() << "Ignoring duplicate component entry" << component->m_uid; + qWarning() << d->m_instance->name() << "|" << "Ignoring duplicate component entry" << component->m_uid; continue; } connect(component.get(), &Component::dataChanged, this, &PackProfile::componentDataChanged); @@ -352,14 +353,14 @@ void PackProfile::resolve(Net::Mode netmode) void PackProfile::updateSucceeded() { - qDebug() << "Component list update/resolve task succeeded for" << d->m_instance->name(); + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Component list update/resolve task succeeded"; d->m_updateTask.reset(); invalidateLaunchProfile(); } void PackProfile::updateFailed(const QString& error) { - qDebug() << "Component list update/resolve task failed for" << d->m_instance->name() << "Reason:" << error; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Component list update/resolve task failed " << "Reason:" << error; d->m_updateTask.reset(); invalidateLaunchProfile(); } @@ -375,11 +376,11 @@ void PackProfile::insertComponent(size_t index, ComponentPtr component) { auto id = component->getID(); if (id.isEmpty()) { - qWarning() << "Attempt to add a component with empty ID!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Attempt to add a component with empty ID!"; return; } if (d->componentIndex.contains(id)) { - qWarning() << "Attempt to add a component that is already present!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Attempt to add a component that is already present!"; return; } beginInsertRows(QModelIndex(), static_cast(index), static_cast(index)); @@ -394,7 +395,7 @@ void PackProfile::componentDataChanged() { auto objPtr = qobject_cast(sender()); if (!objPtr) { - qWarning() << "PackProfile got dataChanged signal from a non-Component!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "PackProfile got dataChanged signal from a non-Component!"; return; } if (objPtr->getID() == "net.minecraft") { @@ -410,19 +411,20 @@ void PackProfile::componentDataChanged() } index++; } - qWarning() << "PackProfile got dataChanged signal from a Component which does not belong to it!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "PackProfile got dataChanged signal from a Component which does not belong to it!"; } bool PackProfile::remove(const int index) { auto patch = getComponent(index); if (!patch->isRemovable()) { - qWarning() << "Patch" << patch->getID() << "is non-removable"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is non-removable"; return false; } if (!removeComponent_internal(patch)) { - qCritical() << "Patch" << patch->getID() << "could not be removed"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be removed"; return false; } @@ -451,11 +453,11 @@ bool PackProfile::customize(int index) { auto patch = getComponent(index); if (!patch->isCustomizable()) { - qDebug() << "Patch" << patch->getID() << "is not customizable"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is not customizable"; return false; } if (!patch->customize()) { - qCritical() << "Patch" << patch->getID() << "could not be customized"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be customized"; return false; } invalidateLaunchProfile(); @@ -467,11 +469,11 @@ bool PackProfile::revertToBase(int index) { auto patch = getComponent(index); if (!patch->isRevertible()) { - qDebug() << "Patch" << patch->getID() << "is not revertible"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is not revertible"; return false; } if (!patch->revert()) { - qCritical() << "Patch" << patch->getID() << "could not be reverted"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be reverted"; return false; } invalidateLaunchProfile(); @@ -684,7 +686,8 @@ bool PackProfile::installComponents(QStringList selectedFiles) const QString target = FS::PathCombine(patchDir, versionFile->uid + ".json"); if (!QFile::copy(source, target)) { - qWarning() << "Component" << source << "could not be copied to target" << target; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Component" << source << "could not be copied to target" + << target; result = false; continue; } @@ -717,7 +720,8 @@ bool PackProfile::installEmpty(const QString& uid, const QString& name) QString patchFileName = FS::PathCombine(patchDir, uid + ".json"); QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCritical() << "Error opening" << file.fileName() << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() + << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -737,7 +741,8 @@ bool PackProfile::removeComponent_internal(ComponentPtr patch) if (fileName.size()) { QFile patchFile(fileName); if (patchFile.exists() && !patchFile.remove()) { - qCritical() << "File" << fileName << "could not be removed because:" << patchFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "File" << fileName + << "could not be removed because:" << patchFile.errorString(); return false; } } @@ -753,7 +758,8 @@ bool PackProfile::removeComponent_internal(ComponentPtr patch) if (finfo.exists()) { QFile jarModFile(jar[0]); if (!jarModFile.remove()) { - qCritical() << "File" << jar[0] << "could not be removed because:" << jarModFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "File" << jar[0] + << "could not be removed because:" << jarModFile.errorString(); return false; } return true; @@ -810,7 +816,8 @@ bool PackProfile::installJarMods_internal(QStringList filepaths) QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCritical() << "Error opening" << file.fileName() << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() + << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -864,7 +871,8 @@ bool PackProfile::installCustomJar_internal(QString filepath) QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCritical() << "Error opening" << file.fileName() << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() + << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -919,7 +927,8 @@ bool PackProfile::installAgents_internal(QStringList filepaths) QFile patchFile(FS::PathCombine(patchDir, targetId + ".json")); if (!patchFile.open(QFile::WriteOnly)) { - qCritical() << "Error opening" << patchFile.fileName() << "for reading:" << patchFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << patchFile.fileName() + << "for reading:" << patchFile.errorString(); return false; } @@ -941,12 +950,13 @@ std::shared_ptr PackProfile::getProfile() const try { auto profile = std::make_shared(); for (auto file : d->components) { - qDebug() << "Applying" << file->getID() << (file->getProblemSeverity() == ProblemSeverity::Error ? "ERROR" : "GOOD"); + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Applying" << file->getID() + << (file->getProblemSeverity() == ProblemSeverity::Error ? "ERROR" : "GOOD"); file->applyTo(profile.get()); } d->m_profile = profile; } catch (const Exception& error) { - qWarning() << "Couldn't apply profile patches because: " << error.cause(); + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Couldn't apply profile patches because: " << error.cause(); } } return d->m_profile; @@ -959,36 +969,58 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version ComponentPtr component = *iter; // set existing if (component->revert()) { - component->setVersion(version); - component->setImportant(important); // remove linked components to let them re-resolve their versions if (important) { + component->waitLoadMeta(); auto linked = collectTreeLinked(uid); for (auto comp : linked) { if (comp->isCustom()) { continue; } if (modloaderMapping.contains(comp->getID())) { - qDebug() << comp->getID() << "is a mod loader, setting new recommended version..."; + qCDebug(instanceProfileC) + << d->m_instance->name() << "|" << comp->getID() << "is a mod loader, updating it to a compatible version"; + auto versionList = APPLICATION->metadataIndex()->get(comp->getID()); + versionList->waitToLoad(); if (versionList) { - auto recommended = versionList->getRecommendedForParent(comp->getID(), version); + auto recommended = versionList->getRecommendedForParent(uid, version); if (recommended) { - qDebug() << "Setting updated loader version: " << comp->getID() << " = " << recommended->version(); - setComponentVersion(comp->getID(), recommended->version()); + qCDebug(instanceProfileC) + << d->m_instance->name() << "|" << "setting updated loader to recommended version: " << comp->getID() + << " = " << recommended->version(); + comp->setVersion(recommended->version()); } else { - qDebug() << "no recommended version for" << comp->getID(); + auto latest = versionList->getLatestForParent(uid, version); + if (latest) { + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "setting updated loader to latest compatible version: " << comp->getID() + << " = " << latest->version(); + comp->setVersion(latest->version()); + } else { + qCDebug(instanceProfileC) + << d->m_instance->name() << "|" << "no compatible version for" << comp->getID() << "removing"; + remove(comp->getID()); + } } } else { - qDebug() << "no version list in metadata index for" << comp->getID(); + qCDebug(instanceProfileC) + << d->m_instance->name() << "|" << "no version list in metadata index for" << comp->getID(); } } else { - qDebug() << comp->getID() << ":" << comp->getVersion() << "linked to important component: " << uid - << " | Removing so it re-resolves"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << comp->getID() << ":" << comp->getVersion() + << "linked to important component: " << uid << " | Removing so it re-resolves"; remove(comp->getID()); } } } + // set new version + component->setVersion(version); + component->setImportant(important); + + if (important) { + resolve(Net::Mode::Online); + } return true; } return false; @@ -1006,11 +1038,12 @@ ComponentContainer PackProfile::collectTreeLinked(const QString& uid) { ComponentContainer linked; for (auto comp : d->components) { - qDebug() << "scanning" << comp->getID() << "for tree link"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "scanning" << comp->getID() << ":" << comp->getVersion() + << "for tree link"; auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); if (dep != comp->m_cachedRequires.cend()) { - qDebug() << comp->getID() << "depends on" << uid; + qCDebug(instanceProfileResolveC) << comp->getID() << ":" << comp->getVersion() << "depends on" << uid; linked.append(comp); } } @@ -1018,12 +1051,13 @@ ComponentContainer PackProfile::collectTreeLinked(const QString& uid) if (iter != d->componentIndex.end()) { ComponentPtr comp = *iter; comp->updateCachedData(); - qDebug() << comp->getID() << "has" << comp->m_cachedRequires.size() << "dependencies"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << comp->getID() << ":" << comp->getVersion() << "has" + << comp->m_cachedRequires.size() << "dependencies"; for (auto dep : comp->m_cachedRequires) { - qDebug() << uid << "depends on" << comp->getID(); + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << uid << "depends on" << dep.uid; auto found = d->componentIndex.find(dep.uid); if (found != d->componentIndex.end()) { - qDebug() << comp->getID() << "is present"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << (*found)->getID() << "is present"; linked.append(*found); } } diff --git a/launcher/modplatform/ModIndex.h b/launcher/modplatform/ModIndex.h index 91c9898a9..b3f86933f 100644 --- a/launcher/modplatform/ModIndex.h +++ b/launcher/modplatform/ModIndex.h @@ -44,7 +44,7 @@ namespace ProviderCapabilities { const char* name(ResourceProvider); QString readableName(ResourceProvider); QStringList hashType(ResourceProvider); -}; // namespace ProviderCapabilities +} // namespace ProviderCapabilities struct ModpackAuthor { QString name; From cf319649f9c457bba14d097ae9ce4c839be188b2 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:28:42 -0700 Subject: [PATCH 104/616] fix qt5 lwjgl recommend + spelling Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/meta/VersionList.cpp | 6 +++--- launcher/meta/VersionList.h | 4 ++-- launcher/ui/pages/instance/VersionPage.cpp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index c133e7d1a..8bc326839 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -180,12 +180,12 @@ void VersionList::parse(const QJsonObject& obj) parseVersionList(obj, this); } -void VersionList::addExternalRecomends(const QVector& recomends) +void VersionList::addExternalRecommends(const QStringList& recommends) { - m_externalRecommendsVersions.append(recomends); + m_externalRecommendsVersions.append(recommends); } -void VersionList::clearExternalRecomends() +void VersionList::clearExternalRecommends() { m_externalRecommendsVersions.clear(); } diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index 05ecd91d2..2e46a79f0 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -71,8 +71,8 @@ class VersionList : public BaseVersionList, public BaseEntity { void merge(const VersionList::Ptr& other); void mergeFromIndex(const VersionList::Ptr& other); void parse(const QJsonObject& obj) override; - void addExternalRecomends(const QVector& recomends); - void clearExternalRecomends(); + void addExternalRecommends(const QStringList& recommends); + void clearExternalRecommends(); signals: void nameChanged(const QString& name); diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index 545798499..8ae21d2e4 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -370,7 +370,7 @@ void VersionPage::on_actionChange_version_triggered() auto patch = m_profile->getComponent(versionRow); auto name = patch->getName(); auto list = patch->getVersionList(); - list->clearExternalRecomends(); + list->clearExternalRecommends(); if (!list) { return; } @@ -384,7 +384,7 @@ void VersionPage::on_actionChange_version_triggered() if (lwjglReq != minecraft->m_cachedRequires.cend()) { auto lwjglVersion = !lwjglReq->equalsVersion.isEmpty() ? lwjglReq->equalsVersion : lwjglReq->suggests; if (!lwjglVersion.isEmpty()) { - list->addExternalRecomends({ lwjglVersion }); + list->addExternalRecommends({ lwjglVersion }); } } } From 474effe7c74a8d78a6e35cd742e99669353bf19e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 25 Jun 2024 11:13:15 +0300 Subject: [PATCH 105/616] clang-format Signed-off-by: Trial97 --- launcher/meta/VersionList.cpp | 5 +- launcher/meta/VersionList.h | 1 - launcher/minecraft/Component.cpp | 7 +- launcher/minecraft/Component.h | 2 +- launcher/minecraft/ComponentUpdateTask.cpp | 10 +- launcher/minecraft/PackProfile.cpp | 101 ++++++++++++--------- 6 files changed, 74 insertions(+), 52 deletions(-) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 8bc326839..28a42d28d 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -254,8 +254,9 @@ void VersionList::setupAddedVersion(const int row, const Version::Ptr& version) connect(version.get(), &Version::requiresChanged, this, [this, row]() { emit dataChanged(index(row), index(row), QVector() << RequiresRole); }); - connect(version.get(), &Version::timeChanged, this, - [this, row]() { emit dataChanged(index(row), index(row), { TimeRole, SortRole }); }); + connect(version.get(), &Version::timeChanged, this, [this, row]() { + emit dataChanged(index(row), index(row), { TimeRole, SortRole }); + }); connect(version.get(), &Version::typeChanged, this, [this, row]() { emit dataChanged(index(row), index(row), { TypeRole }); }); } diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index 2e46a79f0..eb79e96f1 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -46,7 +46,6 @@ class VersionList : public BaseVersionList, public BaseEntity { Version::Ptr getRecommendedForParent(const QString& uid, const QString& version); Version::Ptr getLatestForParent(const QString& uid, const QString& version); - QVariant data(const QModelIndex& index, int role) const override; RoleList providesRoles() const override; QHash roleNames() const override; diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 175e88d08..6ea9ee60b 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -403,8 +403,8 @@ void Component::updateCachedData() } } -void Component::waitLoadMeta() { - +void Component::waitLoadMeta() +{ if (!m_loaded) { if (!m_metaVersion || !m_metaVersion->isLoaded()) { // wait for the loaded version from meta @@ -415,7 +415,8 @@ void Component::waitLoadMeta() { } } -QDebug operator<<(QDebug d, const Component& comp) { +QDebug operator<<(QDebug d, const Component& comp) +{ d << "Component(" << comp.m_uid << " : " << comp.m_cachedVersion << ")"; return d; } diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 581a3db95..67d79e231 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -64,7 +64,7 @@ class Component : public QObject, public ProblemProvider { bool revert(); void updateCachedData(); - + void waitLoadMeta(); signals: diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 7bdc11400..dc59d2dc9 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -178,7 +178,8 @@ void ComponentUpdateTask::loadComponents() } result = composeLoadResult(result, singleResult); if (loadTask) { - qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" << "Remote loading is being run for" << component->getName(); + qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" + << "Remote loading is being run for" << component->getName(); connect(loadTask.get(), &Task::succeeded, this, [this, taskIndex]() { remoteLoadSucceeded(taskIndex); }); connect(loadTask.get(), &Task::failed, this, [this, taskIndex](const QString& error) { remoteLoadFailed(taskIndex, error); }); connect(loadTask.get(), &Task::aborted, this, [this, taskIndex]() { remoteLoadFailed(taskIndex, tr("Aborted")); }); @@ -273,8 +274,8 @@ static bool gatherRequirementsFromComponents(const ComponentContainer& input, Re output.erase(componenRequireEx); output.insert(result.outcome); } else { - qCCritical(instanceProfileResolveC) << "Conflicting requirements:" << componentRequire.uid << "versions:" << componentRequire.equalsVersion - << ";" << (*found).equalsVersion; + qCCritical(instanceProfileResolveC) << "Conflicting requirements:" << componentRequire.uid + << "versions:" << componentRequire.equalsVersion << ";" << (*found).equalsVersion; } succeeded &= result.ok; } else { @@ -440,7 +441,8 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) auto component = makeShared(d->m_profile, add.uid); if (!add.equalsVersion.isEmpty()) { // exact version - qCDebug(instanceProfileResolveC) << "Adding" << add.uid << "version" << add.equalsVersion << "at position" << add.indexOfFirstDependee; + qCDebug(instanceProfileResolveC) + << "Adding" << add.uid << "version" << add.equalsVersion << "at position" << add.indexOfFirstDependee; component->m_version = add.equalsVersion; } else { // version needs to be decided diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 09a2ac0cb..ce57288f6 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -247,12 +247,14 @@ void PackProfile::buildingFromScratch() void PackProfile::scheduleSave() { if (!d->loaded) { - qDebug() << d->m_instance->name() << "|" << "Component list should never save if it didn't successfully load"; + qDebug() << d->m_instance->name() << "|" + << "Component list should never save if it didn't successfully load"; return; } if (!d->dirty) { d->dirty = true; - qDebug() << d->m_instance->name() << "|" << "Component list save is scheduled"; + qDebug() << d->m_instance->name() << "|" + << "Component list save is scheduled"; } d->m_saveTimer.start(); } @@ -279,7 +281,8 @@ QString PackProfile::patchFilePathForUid(const QString& uid) const void PackProfile::save_internal() { - qDebug() << d->m_instance->name() << "|" << "Component list save performed now"; + qDebug() << d->m_instance->name() << "|" + << "Component list save performed now"; auto filename = componentsFilePath(); savePackProfile(filename, d->components); d->dirty = false; @@ -292,7 +295,8 @@ bool PackProfile::load() // load the new component list and swap it with the current one... ComponentContainer newComponents; if (!loadPackProfile(this, filename, patchesPattern(), newComponents)) { - qCritical() << d->m_instance->name() << "|" << "Failed to load the component config"; + qCritical() << d->m_instance->name() << "|" + << "Failed to load the component config"; return false; } else { // FIXME: actually use fine-grained updates, not this... @@ -305,7 +309,8 @@ bool PackProfile::load() d->componentIndex.clear(); for (auto component : newComponents) { if (d->componentIndex.contains(component->m_uid)) { - qWarning() << d->m_instance->name() << "|" << "Ignoring duplicate component entry" << component->m_uid; + qWarning() << d->m_instance->name() << "|" + << "Ignoring duplicate component entry" << component->m_uid; continue; } connect(component.get(), &Component::dataChanged, this, &PackProfile::componentDataChanged); @@ -353,14 +358,17 @@ void PackProfile::resolve(Net::Mode netmode) void PackProfile::updateSucceeded() { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Component list update/resolve task succeeded"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "Component list update/resolve task succeeded"; d->m_updateTask.reset(); invalidateLaunchProfile(); } void PackProfile::updateFailed(const QString& error) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Component list update/resolve task failed " << "Reason:" << error; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "Component list update/resolve task failed " + << "Reason:" << error; d->m_updateTask.reset(); invalidateLaunchProfile(); } @@ -376,11 +384,13 @@ void PackProfile::insertComponent(size_t index, ComponentPtr component) { auto id = component->getID(); if (id.isEmpty()) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Attempt to add a component with empty ID!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "Attempt to add a component with empty ID!"; return; } if (d->componentIndex.contains(id)) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Attempt to add a component that is already present!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "Attempt to add a component that is already present!"; return; } beginInsertRows(QModelIndex(), static_cast(index), static_cast(index)); @@ -395,7 +405,8 @@ void PackProfile::componentDataChanged() { auto objPtr = qobject_cast(sender()); if (!objPtr) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "PackProfile got dataChanged signal from a non-Component!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "PackProfile got dataChanged signal from a non-Component!"; return; } if (objPtr->getID() == "net.minecraft") { @@ -419,12 +430,14 @@ bool PackProfile::remove(const int index) { auto patch = getComponent(index); if (!patch->isRemovable()) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is non-removable"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "is non-removable"; return false; } if (!removeComponent_internal(patch)) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be removed"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "could not be removed"; return false; } @@ -453,11 +466,13 @@ bool PackProfile::customize(int index) { auto patch = getComponent(index); if (!patch->isCustomizable()) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is not customizable"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "is not customizable"; return false; } if (!patch->customize()) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be customized"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "could not be customized"; return false; } invalidateLaunchProfile(); @@ -469,11 +484,13 @@ bool PackProfile::revertToBase(int index) { auto patch = getComponent(index); if (!patch->isRevertible()) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is not revertible"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "is not revertible"; return false; } if (!patch->revert()) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be reverted"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "could not be reverted"; return false; } invalidateLaunchProfile(); @@ -686,8 +703,8 @@ bool PackProfile::installComponents(QStringList selectedFiles) const QString target = FS::PathCombine(patchDir, versionFile->uid + ".json"); if (!QFile::copy(source, target)) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Component" << source << "could not be copied to target" - << target; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "Component" << source << "could not be copied to target" << target; result = false; continue; } @@ -720,8 +737,8 @@ bool PackProfile::installEmpty(const QString& uid, const QString& name) QString patchFileName = FS::PathCombine(patchDir, uid + ".json"); QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() - << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Error opening" << file.fileName() << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -741,8 +758,8 @@ bool PackProfile::removeComponent_internal(ComponentPtr patch) if (fileName.size()) { QFile patchFile(fileName); if (patchFile.exists() && !patchFile.remove()) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "File" << fileName - << "could not be removed because:" << patchFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "File" << fileName << "could not be removed because:" << patchFile.errorString(); return false; } } @@ -758,8 +775,8 @@ bool PackProfile::removeComponent_internal(ComponentPtr patch) if (finfo.exists()) { QFile jarModFile(jar[0]); if (!jarModFile.remove()) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "File" << jar[0] - << "could not be removed because:" << jarModFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "File" << jar[0] << "could not be removed because:" << jarModFile.errorString(); return false; } return true; @@ -816,8 +833,8 @@ bool PackProfile::installJarMods_internal(QStringList filepaths) QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() - << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Error opening" << file.fileName() << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -871,8 +888,8 @@ bool PackProfile::installCustomJar_internal(QString filepath) QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() - << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Error opening" << file.fileName() << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -927,8 +944,8 @@ bool PackProfile::installAgents_internal(QStringList filepaths) QFile patchFile(FS::PathCombine(patchDir, targetId + ".json")); if (!patchFile.open(QFile::WriteOnly)) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << patchFile.fileName() - << "for reading:" << patchFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Error opening" << patchFile.fileName() << "for reading:" << patchFile.errorString(); return false; } @@ -950,13 +967,15 @@ std::shared_ptr PackProfile::getProfile() const try { auto profile = std::make_shared(); for (auto file : d->components) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Applying" << file->getID() + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "Applying" << file->getID() << (file->getProblemSeverity() == ProblemSeverity::Error ? "ERROR" : "GOOD"); file->applyTo(profile.get()); } d->m_profile = profile; } catch (const Exception& error) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Couldn't apply profile patches because: " << error.cause(); + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "Couldn't apply profile patches because: " << error.cause(); } } return d->m_profile; @@ -986,9 +1005,9 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version if (versionList) { auto recommended = versionList->getRecommendedForParent(uid, version); if (recommended) { - qCDebug(instanceProfileC) - << d->m_instance->name() << "|" << "setting updated loader to recommended version: " << comp->getID() - << " = " << recommended->version(); + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "setting updated loader to recommended version: " << comp->getID() << " = " + << recommended->version(); comp->setVersion(recommended->version()); } else { auto latest = versionList->getLatestForParent(uid, version); @@ -998,14 +1017,14 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version << " = " << latest->version(); comp->setVersion(latest->version()); } else { - qCDebug(instanceProfileC) - << d->m_instance->name() << "|" << "no compatible version for" << comp->getID() << "removing"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "no compatible version for" << comp->getID() << "removing"; remove(comp->getID()); } } } else { - qCDebug(instanceProfileC) - << d->m_instance->name() << "|" << "no version list in metadata index for" << comp->getID(); + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "no version list in metadata index for" << comp->getID(); } } else { qCDebug(instanceProfileC) << d->m_instance->name() << "|" << comp->getID() << ":" << comp->getVersion() @@ -1038,8 +1057,8 @@ ComponentContainer PackProfile::collectTreeLinked(const QString& uid) { ComponentContainer linked; for (auto comp : d->components) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "scanning" << comp->getID() << ":" << comp->getVersion() - << "for tree link"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "scanning" << comp->getID() << ":" << comp->getVersion() << "for tree link"; auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); if (dep != comp->m_cachedRequires.cend()) { From a85d6cb1f2a12efd40b12f5a59fbb56a8d1cc4fd Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:42:25 -0700 Subject: [PATCH 106/616] move resolution into update actions in task. Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/Component.cpp | 37 ++++- launcher/minecraft/Component.h | 33 +++++ launcher/minecraft/ComponentUpdateTask.cpp | 151 +++++++++++++++++++++ launcher/minecraft/ComponentUpdateTask.h | 5 + launcher/minecraft/PackProfile.cpp | 83 +---------- launcher/minecraft/PackProfile.h | 4 - 6 files changed, 231 insertions(+), 82 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 6ea9ee60b..67f26a02e 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -38,6 +38,7 @@ #include #include +#include #include "Application.h" #include "FileSystem.h" @@ -235,7 +236,8 @@ ProblemSeverity Component::getProblemSeverity() const { auto file = getVersionFile(); if (file) { - return file->getProblemSeverity(); + auto severity = file->getProblemSeverity(); + return m_componentProblemSeverity > severity ? m_componentProblemSeverity : severity; } return ProblemSeverity::Error; } @@ -244,11 +246,27 @@ const QList Component::getProblems() const { auto file = getVersionFile(); if (file) { - return file->getProblems(); + auto problems = file->getProblems(); + problems.append(m_componentProblems); + return problems; } return { { ProblemSeverity::Error, QObject::tr("Patch is not loaded yet.") } }; } +void Component::addComponentProblem(ProblemSeverity severity, const QString& description) +{ + if (severity > m_componentProblemSeverity) { + m_componentProblemSeverity = severity; + } + m_componentProblems.append({ severity, description }); +} + +void Component::resetComponentProblems() +{ + m_componentProblems.clear(); + m_componentProblemSeverity = ProblemSeverity::None; +} + void Component::setVersion(const QString& version) { if (version == m_version) { @@ -415,6 +433,21 @@ void Component::waitLoadMeta() } } +void Component::setUpdateAction(UpdateAction action) +{ + m_updateAction = action; +} + +std::optional Component::getUpdateAction() +{ + return m_updateAction; +} + +void Component::clearUpdateAction() +{ + m_updateAction.reset(); +} + QDebug operator<<(QDebug d, const Component& comp) { d << "Component(" << comp.m_uid << " : " << comp.m_cachedVersion << ")"; diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 67d79e231..50c4e02db 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "ProblemProvider.h" #include "QObjectPtr.h" #include "meta/JsonFormat.h" @@ -16,6 +17,26 @@ class VersionList; } // namespace Meta class VersionFile; +struct UpdateActionChangeVerison { + /// version to change to + QString targetVersion; +}; +struct UpdateActionLatestRecommendedCompatable { + /// Parent uid + QString parentUid; + QString parentName; + /// Parent version + QString version; + /// +}; +struct UpdateActionRemove {}; +struct UpdateActionImportantChanged { + QString oldVersion; +}; + +using UpdateAction = + std::variant; + class Component : public QObject, public ProblemProvider { Q_OBJECT public: @@ -58,6 +79,8 @@ class Component : public QObject, public ProblemProvider { const QList getProblems() const override; ProblemSeverity getProblemSeverity() const override; + void addComponentProblem(ProblemSeverity severity, const QString& description); + void resetComponentProblems(); void setVersion(const QString& version); bool customize(); @@ -67,6 +90,11 @@ class Component : public QObject, public ProblemProvider { void waitLoadMeta(); + void setUpdateAction(UpdateAction action); + void clearUpdateAction(); + std::optional getUpdateAction(); + std::optional takeUpdateAction(); + signals: void dataChanged(); @@ -104,6 +132,11 @@ class Component : public QObject, public ProblemProvider { std::shared_ptr m_metaVersion; std::shared_ptr m_file; bool m_loaded = false; + + private: + QList m_componentProblems; + ProblemSeverity m_componentProblemSeverity = ProblemSeverity::None; + std::optional m_updateAction = std::nullopt; }; using ComponentPtr = shared_qobject_ptr; diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index dc59d2dc9..8f19f20c8 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -1,9 +1,11 @@ #include "ComponentUpdateTask.h" +#include #include "Component.h" #include "ComponentUpdateTask_p.h" #include "PackProfile.h" #include "PackProfile_p.h" +#include "ProblemProvider.h" #include "Version.h" #include "cassert" #include "meta/Index.h" @@ -196,6 +198,7 @@ void ComponentUpdateTask::loadComponents() switch (result) { case LoadResult::LoadedLocal: { // Everything got loaded. Advance to dependency resolution. + performUpdateActions(); resolveDependencies(d->mode == Mode::Launch || d->netmode == Net::Mode::Offline); break; } @@ -380,6 +383,42 @@ static bool getTrivialComponentChanges(const ComponentIndex& index, const Requir return succeeded; } +ComponentContainer ComponentUpdateTask::collectTreeLinked(const QString& uid) +{ + ComponentContainer linked; + + auto& components = d->m_profile->d->components; + auto& componentIndex = d->m_profile->d->componentIndex; + auto& instance = d->m_profile->d->m_instance; + for (auto comp : components) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" + << "scanning" << comp->getID() << ":" << comp->getVersion() << "for tree link"; + auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), + [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); + if (dep != comp->m_cachedRequires.cend()) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" << comp->getID() << ":" << comp->getVersion() << "depends on" + << uid; + linked.append(comp); + } + } + auto iter = componentIndex.find(uid); + if (iter != componentIndex.end()) { + ComponentPtr comp = *iter; + comp->updateCachedData(); + qCDebug(instanceProfileResolveC) << instance->name() << "|" << comp->getID() << ":" << comp->getVersion() << "has" + << comp->m_cachedRequires.size() << "dependencies"; + for (auto dep : comp->m_cachedRequires) { + qCDebug(instanceProfileC) << instance->name() << "|" << uid << "depends on" << dep.uid; + auto found = componentIndex.find(dep.uid); + if (found != componentIndex.end()) { + qCDebug(instanceProfileC) << instance->name() << "|" << (*found)->getID() << "is present"; + linked.append(*found); + } + } + } + return linked; +} + // FIXME, TODO: decouple dependency resolution from loading // FIXME: This works directly with the PackProfile internals. It shouldn't! It needs richer data types than PackProfile uses. // FIXME: throw all this away and use a graph @@ -488,10 +527,121 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) if (recursionNeeded) { loadComponents(); } else { + finalizeComponents(); emitSucceeded(); } } +// Variant visitation via lambda +template +struct overload : Ts... { + using Ts::operator()...; +}; +template +overload(Ts...) -> overload; + +void ComponentUpdateTask::performUpdateActions() +{ + auto& components = d->m_profile->d->components; + + bool addedActions; + do { + addedActions = false; + for (auto component : components) { + if (auto action = component->getUpdateAction()) { + auto visitor = overload{ + [&component](const UpdateActionChangeVerison& cv) { + component->setVersion(cv.targetVersion); + component->waitLoadMeta(); + }, + [&component](const UpdateActionLatestRecommendedCompatable lrc) { + auto versionList = APPLICATION->metadataIndex()->get(component->getID()); + versionList->waitToLoad(); + if (versionList) { + auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); + if (recommended) { + component->setVersion(recommended->version()); + component->waitLoadMeta(); + return; + } + + auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); + if (latest) { + component->setVersion(latest->version()); + component->waitLoadMeta(); + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No compatible version of %1 found for %2 %3") + .arg(component->getName(), lrc.parentName, lrc.version)); + } + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No version list in metadata index for %1").arg(component->getID())); + } + }, + [this, &component](const UpdateActionRemove&) { d->m_profile->remove(component->getID()); }, + [this, &component, &addedActions](const UpdateActionImportantChanged&) { + auto linked = collectTreeLinked(component->getID()); + for (auto comp : linked) { + if (comp->isCustom()) { + continue; + } + auto compUid = comp->getID(); + auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), + [compUid](const Meta::Require& req) { return req.uid == compUid; }); + if (parentReq != component->m_cachedRequires.end()) { + auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; + if (!newVersion.isEmpty()) { + comp->setUpdateAction(UpdateAction{ UpdateActionChangeVerison{ newVersion } }); + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + addedActions = true; + } + } + }; + std::visit(visitor, *action); + component->clearUpdateAction(); + } + } + } while (addedActions); +} + +void ComponentUpdateTask::finalizeComponents() +{ + auto& components = d->m_profile->d->components; + auto& componentIndex = d->m_profile->d->componentIndex; + for (auto component : components) { + for (auto req : component->m_cachedRequires) { + auto found = componentIndex.find(req.uid); + if (found == componentIndex.cend()) { + component->addComponentProblem( + ProblemSeverity::Error, + QObject::tr("%1 is missing requirement %2 %3") + .arg(component->getName(), req.uid, req.equalsVersion.isEmpty() ? req.suggests : req.equalsVersion)); + } else { + auto reqComp = *found; + if (!reqComp->getProblems().isEmpty()) { + component->addComponentProblem( + reqComp->getProblemSeverity(), + QObject::tr("%1, a dependency of this component, has reported issues").arg(reqComp->getName())); + } + } + } + } +} + void ComponentUpdateTask::remoteLoadSucceeded(size_t taskIndex) { if (static_cast(d->remoteLoadStatusList.size()) < taskIndex) { @@ -551,6 +701,7 @@ void ComponentUpdateTask::checkIfAllFinished() if (d->remoteLoadSuccessful) { // nothing bad happened... clear the temp load status and proceed with looking at dependencies d->remoteLoadStatusList.clear(); + performUpdateActions(); resolveDependencies(d->mode == Mode::Launch); } else { // remote load failed... report error and bail diff --git a/launcher/minecraft/ComponentUpdateTask.h b/launcher/minecraft/ComponentUpdateTask.h index 2f396a049..484c0bedd 100644 --- a/launcher/minecraft/ComponentUpdateTask.h +++ b/launcher/minecraft/ComponentUpdateTask.h @@ -1,5 +1,6 @@ #pragma once +#include "minecraft/Component.h" #include "net/Mode.h" #include "tasks/Task.h" @@ -21,7 +22,11 @@ class ComponentUpdateTask : public Task { private: void loadComponents(); + /// collects components that are dependent on or dependencies of the component + QList collectTreeLinked(const QString& uid); void resolveDependencies(bool checkOnly); + void performUpdateActions(); + void finalizeComponents(); void remoteLoadSucceeded(size_t index); void remoteLoadFailed(size_t index, const QString& msg); diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index ce57288f6..debbf0fa7 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include "Application.h" #include "Exception.h" @@ -56,6 +57,7 @@ #include "Json.h" #include "meta/Index.h" #include "meta/JsonFormat.h" +#include "minecraft/Component.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/OneSixVersionFormat.h" #include "minecraft/ProfileUtils.h" @@ -67,6 +69,8 @@ #include "minecraft/Logging.h" +#include "ui/dialogs/CustomMessageBox.h" + static const QMap modloaderMapping{ { "net.neoforged", ModPlatform::NeoForge }, { "net.minecraftforge", ModPlatform::Forge }, { "net.fabricmc.fabric-loader", ModPlatform::Fabric }, @@ -988,58 +992,16 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version ComponentPtr component = *iter; // set existing if (component->revert()) { - // remove linked components to let them re-resolve their versions - if (important) { - component->waitLoadMeta(); - auto linked = collectTreeLinked(uid); - for (auto comp : linked) { - if (comp->isCustom()) { - continue; - } - if (modloaderMapping.contains(comp->getID())) { - qCDebug(instanceProfileC) - << d->m_instance->name() << "|" << comp->getID() << "is a mod loader, updating it to a compatible version"; - - auto versionList = APPLICATION->metadataIndex()->get(comp->getID()); - versionList->waitToLoad(); - if (versionList) { - auto recommended = versionList->getRecommendedForParent(uid, version); - if (recommended) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" - << "setting updated loader to recommended version: " << comp->getID() << " = " - << recommended->version(); - comp->setVersion(recommended->version()); - } else { - auto latest = versionList->getLatestForParent(uid, version); - if (latest) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" - << "setting updated loader to latest compatible version: " << comp->getID() - << " = " << latest->version(); - comp->setVersion(latest->version()); - } else { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" - << "no compatible version for" << comp->getID() << "removing"; - remove(comp->getID()); - } - } - } else { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" - << "no version list in metadata index for" << comp->getID(); - } - } else { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << comp->getID() << ":" << comp->getVersion() - << "linked to important component: " << uid << " | Removing so it re-resolves"; - remove(comp->getID()); - } - } - } // set new version + auto oldVersion = component->getVersion(); component->setVersion(version); component->setImportant(important); if (important) { + component->setUpdateAction(UpdateAction{ UpdateActionImportantChanged{ oldVersion } }); resolve(Net::Mode::Online); } + return true; } return false; @@ -1053,37 +1015,6 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version } } -ComponentContainer PackProfile::collectTreeLinked(const QString& uid) -{ - ComponentContainer linked; - for (auto comp : d->components) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" - << "scanning" << comp->getID() << ":" << comp->getVersion() << "for tree link"; - auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), - [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); - if (dep != comp->m_cachedRequires.cend()) { - qCDebug(instanceProfileResolveC) << comp->getID() << ":" << comp->getVersion() << "depends on" << uid; - linked.append(comp); - } - } - auto iter = d->componentIndex.find(uid); - if (iter != d->componentIndex.end()) { - ComponentPtr comp = *iter; - comp->updateCachedData(); - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << comp->getID() << ":" << comp->getVersion() << "has" - << comp->m_cachedRequires.size() << "dependencies"; - for (auto dep : comp->m_cachedRequires) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << uid << "depends on" << dep.uid; - auto found = d->componentIndex.find(dep.uid); - if (found != d->componentIndex.end()) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << (*found)->getID() << "is present"; - linked.append(*found); - } - } - } - return linked; -} - QString PackProfile::getComponentVersion(const QString& uid) const { const auto iter = d->componentIndex.find(uid); diff --git a/launcher/minecraft/PackProfile.h b/launcher/minecraft/PackProfile.h index f733b3524..e58e9ae9a 100644 --- a/launcher/minecraft/PackProfile.h +++ b/launcher/minecraft/PackProfile.h @@ -48,7 +48,6 @@ #include "Component.h" #include "LaunchProfile.h" -#include "minecraft/PackProfile_p.h" #include "modplatform/ModIndex.h" #include "net/Mode.h" @@ -120,9 +119,6 @@ class PackProfile : public QAbstractListModel { bool setComponentVersion(const QString& uid, const QString& version, bool important = false); - /// collects components that are dependant on or dependencies of the component - ComponentContainer collectTreeLinked(const QString& uid); - bool installEmpty(const QString& uid, const QString& name); QString patchFilePathForUid(const QString& uid) const; From 4ed92a95c2b362d09a8a2ff81926c282f1227c4c Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:28:09 -0700 Subject: [PATCH 107/616] fix segfaults consistently set component problems Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/Component.cpp | 5 +- launcher/minecraft/Component.h | 17 +- launcher/minecraft/ComponentUpdateTask.cpp | 183 +++++++++++++-------- 3 files changed, 131 insertions(+), 74 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 67f26a02e..00d3f2e42 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -45,6 +45,7 @@ #include "OneSixVersionFormat.h" #include "VersionFile.h" #include "meta/Version.h" +#include "minecraft/Component.h" #include "minecraft/PackProfile.h" #include @@ -438,14 +439,14 @@ void Component::setUpdateAction(UpdateAction action) m_updateAction = action; } -std::optional Component::getUpdateAction() +UpdateAction Component::getUpdateAction() { return m_updateAction; } void Component::clearUpdateAction() { - m_updateAction.reset(); + m_updateAction = UpdateAction{ UpdateActionNone{} }; } QDebug operator<<(QDebug d, const Component& comp) diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 50c4e02db..94a964182 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "ProblemProvider.h" #include "QObjectPtr.h" #include "meta/JsonFormat.h" @@ -17,7 +18,7 @@ class VersionList; } // namespace Meta class VersionFile; -struct UpdateActionChangeVerison { +struct UpdateActionChangeVersion { /// version to change to QString targetVersion; }; @@ -34,8 +35,13 @@ struct UpdateActionImportantChanged { QString oldVersion; }; -using UpdateAction = - std::variant; +using UpdateActionNone = std::monostate; + +using UpdateAction = std::variant; class Component : public QObject, public ProblemProvider { Q_OBJECT @@ -92,8 +98,7 @@ class Component : public QObject, public ProblemProvider { void setUpdateAction(UpdateAction action); void clearUpdateAction(); - std::optional getUpdateAction(); - std::optional takeUpdateAction(); + UpdateAction getUpdateAction(); signals: void dataChanged(); @@ -136,7 +141,7 @@ class Component : public QObject, public ProblemProvider { private: QList m_componentProblems; ProblemSeverity m_componentProblemSeverity = ProblemSeverity::None; - std::optional m_updateAction = std::nullopt; + UpdateAction m_updateAction = UpdateAction{ UpdateActionNone{} }; }; using ComponentPtr = shared_qobject_ptr; diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 8f19f20c8..8001627e4 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -153,6 +153,7 @@ void ComponentUpdateTask::loadComponents() Task::Ptr loadTask; LoadResult singleResult; RemoteLoadStatus::Type loadType; + component->resetComponentProblems(); // FIXME: to do this right, we need to load the lists and decide on which versions to use during dependency resolution. For now, // ignore all that... #if 0 @@ -445,6 +446,7 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) allRequires.clear(); toRemove.clear(); if (!gatherRequirementsFromComponents(components, allRequires)) { + finalizeComponents(); emitFailed(tr("Conflicting requirements detected during dependency checking!")); return; } @@ -461,10 +463,12 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) RequireExSet toChange; bool succeeded = getTrivialComponentChanges(componentIndex, allRequires, toAdd, toChange); if (!succeeded) { + finalizeComponents(); emitFailed(tr("Instance has conflicting dependencies.")); return; } if (checkOnly) { + finalizeComponents(); if (toAdd.size() || toChange.size()) { emitFailed(tr("Instance has unresolved dependencies while loading/checking for launch.")); } else { @@ -542,77 +546,115 @@ overload(Ts...) -> overload; void ComponentUpdateTask::performUpdateActions() { - auto& components = d->m_profile->d->components; - + auto& instance = d->m_profile->d->m_instance; bool addedActions; + QStringList toRemove; do { addedActions = false; + toRemove.clear(); + auto& components = d->m_profile->d->components; + auto& componentIndex = d->m_profile->d->componentIndex; for (auto component : components) { - if (auto action = component->getUpdateAction()) { - auto visitor = overload{ - [&component](const UpdateActionChangeVerison& cv) { - component->setVersion(cv.targetVersion); - component->waitLoadMeta(); - }, - [&component](const UpdateActionLatestRecommendedCompatable lrc) { - auto versionList = APPLICATION->metadataIndex()->get(component->getID()); - versionList->waitToLoad(); - if (versionList) { - auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); - if (recommended) { - component->setVersion(recommended->version()); - component->waitLoadMeta(); - return; - } + if (!component) { + continue; + } + auto action = component->getUpdateAction(); + auto visitor = + overload{ [](const UpdateActionNone&) { + // noop + }, + [&component, &instance](const UpdateActionChangeVersion& cv) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" + << "UpdateActionChangeVersion" << component->getID() << ":" + << component->getVersion() << "change to" << cv.targetVersion; + component->setVersion(cv.targetVersion); + component->waitLoadMeta(); + }, + [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" << component->getVersion() + << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; + auto versionList = APPLICATION->metadataIndex()->get(component->getID()); + versionList->waitToLoad(); + if (versionList) { + auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); + if (recommended) { + component->setVersion(recommended->version()); + component->waitLoadMeta(); + return; + } - auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); - if (latest) { - component->setVersion(latest->version()); - component->waitLoadMeta(); - } else { - component->addComponentProblem(ProblemSeverity::Error, - QObject::tr("No compatible version of %1 found for %2 %3") - .arg(component->getName(), lrc.parentName, lrc.version)); - } - } else { - component->addComponentProblem(ProblemSeverity::Error, - QObject::tr("No version list in metadata index for %1").arg(component->getID())); - } - }, - [this, &component](const UpdateActionRemove&) { d->m_profile->remove(component->getID()); }, - [this, &component, &addedActions](const UpdateActionImportantChanged&) { - auto linked = collectTreeLinked(component->getID()); - for (auto comp : linked) { - if (comp->isCustom()) { - continue; - } - auto compUid = comp->getID(); - auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), - [compUid](const Meta::Require& req) { return req.uid == compUid; }); - if (parentReq != component->m_cachedRequires.end()) { - auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; - if (!newVersion.isEmpty()) { - comp->setUpdateAction(UpdateAction{ UpdateActionChangeVerison{ newVersion } }); - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - addedActions = true; - } - } - }; - std::visit(visitor, *action); - component->clearUpdateAction(); + auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); + if (latest) { + component->setVersion(latest->version()); + component->waitLoadMeta(); + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No compatible version of %1 found for %2 %3") + .arg(component->getName(), lrc.parentName, lrc.version)); + } + } else { + component->addComponentProblem( + ProblemSeverity::Error, + QObject::tr("No version list in metadata index for %1").arg(component->getID())); + } + }, + [&component, &instance, &toRemove](const UpdateActionRemove&) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateActionRemove" << component->getID() << ":" << component->getVersion() << "removing"; + toRemove.append(component->getID()); + }, + [this, &component, &instance, &addedActions, &componentIndex](const UpdateActionImportantChanged& ic) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateImportantChanged" << component->getID() << ":" << component->getVersion() << "was changed from" + << ic.oldVersion << "updating linked components"; + auto oldVersion = APPLICATION->metadataIndex()->getLoadedVersion(component->getID(), ic.oldVersion); + for (auto oldReq : oldVersion->requiredSet()) { + auto currentlyRequired = component->m_cachedRequires.find(oldReq); + if (currentlyRequired == component->m_cachedRequires.cend()) { + auto oldReqComp = componentIndex.find(oldReq.uid); + if (oldReqComp != componentIndex.cend()) { + (*oldReqComp)->setUpdateAction(UpdateAction{ UpdateActionRemove{} }); + addedActions = true; + } + } + } + auto linked = collectTreeLinked(component->getID()); + for (auto comp : linked) { + if (comp->isCustom()) { + continue; + } + auto compUid = comp->getID(); + auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), + [compUid](const Meta::Require& req) { return req.uid == compUid; }); + if (parentReq != component->m_cachedRequires.end()) { + auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; + if (!newVersion.isEmpty()) { + comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + addedActions = true; + } + } }; + std::visit(visitor, action); + component->clearUpdateAction(); + for (auto uid : toRemove) { + d->m_profile->remove(uid); } } } while (addedActions); @@ -637,6 +679,15 @@ void ComponentUpdateTask::finalizeComponents() reqComp->getProblemSeverity(), QObject::tr("%1, a dependency of this component, has reported issues").arg(reqComp->getName())); } + if (!req.equalsVersion.isEmpty() && req.equalsVersion != reqComp->getVersion()) { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("%1, a dependency of this component, is not the required version %2") + .arg(reqComp->getName(), req.equalsVersion)); + } else if (!req.suggests.isEmpty() && req.suggests != reqComp->getVersion()) { + component->addComponentProblem(ProblemSeverity::Warning, + QObject::tr("%1, a dependency of this component, is not the suggested version %2") + .arg(reqComp->getName(), req.suggests)); + } } } } From c4cc1cfe4f30147c85b804825048b3c5288537a8 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 27 Jun 2024 19:25:38 -0700 Subject: [PATCH 108/616] Warn about known conflicting modloaders Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/Component.cpp | 16 ++ launcher/minecraft/Component.h | 15 ++ launcher/minecraft/ComponentUpdateTask.cpp | 199 +++++++++++---------- launcher/minecraft/PackProfile.cpp | 9 +- 4 files changed, 137 insertions(+), 102 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 00d3f2e42..329e6b78e 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -225,6 +225,22 @@ bool Component::isVersionChangeable() return false; } +bool Component::isKnownModloader() +{ + auto iter = KNOWN_MODLOADERS.find(m_uid); + return iter != KNOWN_MODLOADERS.cend(); +} + +QStringList Component::knownConfictingComponents() +{ + auto iter = KNOWN_MODLOADERS.find(m_uid); + if (iter != KNOWN_MODLOADERS.cend()) { + return (*iter).knownConfictingComponents; + } else { + return {}; + } +} + void Component::setImportant(bool state) { if (m_important != state) { diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 94a964182..3669638f2 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -9,6 +9,7 @@ #include "ProblemProvider.h" #include "QObjectPtr.h" #include "meta/JsonFormat.h" +#include "modplatform/ModIndex.h" class PackProfile; class LaunchProfile; @@ -43,6 +44,18 @@ using UpdateAction = std::variant; +struct ModloaderMapEntry { + ModPlatform::ModLoaderType type; + QStringList knownConfictingComponents; +}; +static const QMap KNOWN_MODLOADERS{ + { "net.neoforged", { ModPlatform::NeoForge, { "net.minecraftforge", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, + { "net.minecraftforge", { ModPlatform::Forge, { "net.neoforged", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, + { "net.fabricmc.fabric-loader", { ModPlatform::Fabric, { "net.minecraftforge", "net.neoforged", "org.quiltmc.quilt-loader" } } }, + { "org.quiltmc.quilt-loader", { ModPlatform::Quilt, { "net.minecraftforge", "net.neoforged", "net.fabricmc.fabric-loader" } } }, + { "com.mumfrey.liteloader", { ModPlatform::LiteLoader, {} } } +}; + class Component : public QObject, public ProblemProvider { Q_OBJECT public: @@ -65,6 +78,8 @@ class Component : public QObject, public ProblemProvider { bool isRemovable(); bool isCustom(); bool isVersionChangeable(); + bool isKnownModloader(); + QStringList knownConfictingComponents(); // DEPRECATED: explicit numeric order values, used for loading old non-component config. TODO: refactor and move to migration code void setOrder(int order); diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 8001627e4..1617a8f82 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -181,8 +181,8 @@ void ComponentUpdateTask::loadComponents() } result = composeLoadResult(result, singleResult); if (loadTask) { - qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" - << "Remote loading is being run for" << component->getName(); + qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" << "Remote loading is being run for" + << component->getName(); connect(loadTask.get(), &Task::succeeded, this, [this, taskIndex]() { remoteLoadSucceeded(taskIndex); }); connect(loadTask.get(), &Task::failed, this, [this, taskIndex](const QString& error) { remoteLoadFailed(taskIndex, error); }); connect(loadTask.get(), &Task::aborted, this, [this, taskIndex]() { remoteLoadFailed(taskIndex, tr("Aborted")); }); @@ -392,8 +392,8 @@ ComponentContainer ComponentUpdateTask::collectTreeLinked(const QString& uid) auto& componentIndex = d->m_profile->d->componentIndex; auto& instance = d->m_profile->d->m_instance; for (auto comp : components) { - qCDebug(instanceProfileResolveC) << instance->name() << "|" - << "scanning" << comp->getID() << ":" << comp->getVersion() << "for tree link"; + qCDebug(instanceProfileResolveC) << instance->name() << "|" << "scanning" << comp->getID() << ":" << comp->getVersion() + << "for tree link"; auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); if (dep != comp->m_cachedRequires.cend()) { @@ -559,98 +559,94 @@ void ComponentUpdateTask::performUpdateActions() continue; } auto action = component->getUpdateAction(); - auto visitor = - overload{ [](const UpdateActionNone&) { - // noop - }, - [&component, &instance](const UpdateActionChangeVersion& cv) { - qCDebug(instanceProfileResolveC) << instance->name() << "|" - << "UpdateActionChangeVersion" << component->getID() << ":" - << component->getVersion() << "change to" << cv.targetVersion; - component->setVersion(cv.targetVersion); - component->waitLoadMeta(); - }, - [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { - qCDebug(instanceProfileResolveC) - << instance->name() << "|" - << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" << component->getVersion() - << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; - auto versionList = APPLICATION->metadataIndex()->get(component->getID()); - versionList->waitToLoad(); - if (versionList) { - auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); - if (recommended) { - component->setVersion(recommended->version()); - component->waitLoadMeta(); - return; - } + auto visitor = overload{ + [](const UpdateActionNone&) { + // noop + }, + [&component, &instance](const UpdateActionChangeVersion& cv) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" << "UpdateActionChangeVersion" << component->getID() << ":" + << component->getVersion() << "change to" << cv.targetVersion; + component->setVersion(cv.targetVersion); + component->waitLoadMeta(); + }, + [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" + << component->getVersion() << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; + auto versionList = APPLICATION->metadataIndex()->get(component->getID()); + versionList->waitToLoad(); + if (versionList) { + auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); + if (recommended) { + component->setVersion(recommended->version()); + component->waitLoadMeta(); + return; + } - auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); - if (latest) { - component->setVersion(latest->version()); - component->waitLoadMeta(); - } else { - component->addComponentProblem(ProblemSeverity::Error, - QObject::tr("No compatible version of %1 found for %2 %3") - .arg(component->getName(), lrc.parentName, lrc.version)); - } - } else { - component->addComponentProblem( - ProblemSeverity::Error, - QObject::tr("No version list in metadata index for %1").arg(component->getID())); - } - }, - [&component, &instance, &toRemove](const UpdateActionRemove&) { - qCDebug(instanceProfileResolveC) - << instance->name() << "|" - << "UpdateActionRemove" << component->getID() << ":" << component->getVersion() << "removing"; - toRemove.append(component->getID()); - }, - [this, &component, &instance, &addedActions, &componentIndex](const UpdateActionImportantChanged& ic) { - qCDebug(instanceProfileResolveC) - << instance->name() << "|" - << "UpdateImportantChanged" << component->getID() << ":" << component->getVersion() << "was changed from" - << ic.oldVersion << "updating linked components"; - auto oldVersion = APPLICATION->metadataIndex()->getLoadedVersion(component->getID(), ic.oldVersion); - for (auto oldReq : oldVersion->requiredSet()) { - auto currentlyRequired = component->m_cachedRequires.find(oldReq); - if (currentlyRequired == component->m_cachedRequires.cend()) { - auto oldReqComp = componentIndex.find(oldReq.uid); - if (oldReqComp != componentIndex.cend()) { - (*oldReqComp)->setUpdateAction(UpdateAction{ UpdateActionRemove{} }); - addedActions = true; - } - } - } - auto linked = collectTreeLinked(component->getID()); - for (auto comp : linked) { - if (comp->isCustom()) { - continue; - } - auto compUid = comp->getID(); - auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), - [compUid](const Meta::Require& req) { return req.uid == compUid; }); - if (parentReq != component->m_cachedRequires.end()) { - auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; - if (!newVersion.isEmpty()) { - comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - addedActions = true; - } - } }; + auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); + if (latest) { + component->setVersion(latest->version()); + component->waitLoadMeta(); + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No compatible version of %1 found for %2 %3") + .arg(component->getName(), lrc.parentName, lrc.version)); + } + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No version list in metadata index for %1").arg(component->getID())); + } + }, + [&component, &instance, &toRemove](const UpdateActionRemove&) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" << "UpdateActionRemove" << component->getID() << ":" + << component->getVersion() << "removing"; + toRemove.append(component->getID()); + }, + [this, &component, &instance, &addedActions, &componentIndex](const UpdateActionImportantChanged& ic) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" << "UpdateImportantChanged" << component->getID() << ":" << component->getVersion() + << "was changed from" << ic.oldVersion << "updating linked components"; + auto oldVersion = APPLICATION->metadataIndex()->getLoadedVersion(component->getID(), ic.oldVersion); + for (auto oldReq : oldVersion->requiredSet()) { + auto currentlyRequired = component->m_cachedRequires.find(oldReq); + if (currentlyRequired == component->m_cachedRequires.cend()) { + auto oldReqComp = componentIndex.find(oldReq.uid); + if (oldReqComp != componentIndex.cend()) { + (*oldReqComp)->setUpdateAction(UpdateAction{ UpdateActionRemove{} }); + addedActions = true; + } + } + } + auto linked = collectTreeLinked(component->getID()); + for (auto comp : linked) { + if (comp->isCustom()) { + continue; + } + auto compUid = comp->getID(); + auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), + [compUid](const Meta::Require& req) { return req.uid == compUid; }); + if (parentReq != component->m_cachedRequires.end()) { + auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; + if (!newVersion.isEmpty()) { + comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + addedActions = true; + } + } + }; std::visit(visitor, action); component->clearUpdateAction(); for (auto uid : toRemove) { @@ -690,6 +686,19 @@ void ComponentUpdateTask::finalizeComponents() } } } + for (auto conflict : component->knownConfictingComponents()) { + auto found = componentIndex.find(conflict); + if (found != componentIndex.cend()) { + auto foundComp = *found; + if (foundComp ->isCustom()) { + continue; + } + component->addComponentProblem( + ProblemSeverity::Warning, + QObject::tr("%1 and %2 are known to not work together. It is recommended to remove one of them.") + .arg(component->getName(), foundComp->getName())); + } + } } } diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index debbf0fa7..c4a2dd273 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -71,11 +71,6 @@ #include "ui/dialogs/CustomMessageBox.h" -static const QMap modloaderMapping{ { "net.neoforged", ModPlatform::NeoForge }, - { "net.minecraftforge", ModPlatform::Forge }, - { "net.fabricmc.fabric-loader", ModPlatform::Fabric }, - { "org.quiltmc.quilt-loader", ModPlatform::Quilt }, - { "com.mumfrey.liteloader", ModPlatform::LiteLoader } }; PackProfile::PackProfile(MinecraftInstance* instance) : QAbstractListModel() { @@ -1040,12 +1035,12 @@ std::optional PackProfile::getModLoaders() ModPlatform::ModLoaderTypes result; bool has_any_loader = false; - QMapIterator i(modloaderMapping); + QMapIterator i(KNOWN_MODLOADERS); while (i.hasNext()) { i.next(); if (auto c = getComponent(i.key()); c != nullptr && c->isEnabled()) { - result |= i.value(); + result |= i.value().type; has_any_loader = true; } } From 492c78a570f52d23d58b54e38c4a4785865960e6 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 28 Jun 2024 13:41:07 +0300 Subject: [PATCH 109/616] format the code Signed-off-by: Trial97 --- launcher/minecraft/ComponentUpdateTask.cpp | 188 +++++++++++---------- launcher/minecraft/PackProfile.cpp | 1 - 2 files changed, 96 insertions(+), 93 deletions(-) diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 1617a8f82..f4efba36f 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -181,8 +181,8 @@ void ComponentUpdateTask::loadComponents() } result = composeLoadResult(result, singleResult); if (loadTask) { - qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" << "Remote loading is being run for" - << component->getName(); + qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" + << "Remote loading is being run for" << component->getName(); connect(loadTask.get(), &Task::succeeded, this, [this, taskIndex]() { remoteLoadSucceeded(taskIndex); }); connect(loadTask.get(), &Task::failed, this, [this, taskIndex](const QString& error) { remoteLoadFailed(taskIndex, error); }); connect(loadTask.get(), &Task::aborted, this, [this, taskIndex]() { remoteLoadFailed(taskIndex, tr("Aborted")); }); @@ -392,8 +392,8 @@ ComponentContainer ComponentUpdateTask::collectTreeLinked(const QString& uid) auto& componentIndex = d->m_profile->d->componentIndex; auto& instance = d->m_profile->d->m_instance; for (auto comp : components) { - qCDebug(instanceProfileResolveC) << instance->name() << "|" << "scanning" << comp->getID() << ":" << comp->getVersion() - << "for tree link"; + qCDebug(instanceProfileResolveC) << instance->name() << "|" + << "scanning" << comp->getID() << ":" << comp->getVersion() << "for tree link"; auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); if (dep != comp->m_cachedRequires.cend()) { @@ -559,94 +559,98 @@ void ComponentUpdateTask::performUpdateActions() continue; } auto action = component->getUpdateAction(); - auto visitor = overload{ - [](const UpdateActionNone&) { - // noop - }, - [&component, &instance](const UpdateActionChangeVersion& cv) { - qCDebug(instanceProfileResolveC) << instance->name() << "|" << "UpdateActionChangeVersion" << component->getID() << ":" - << component->getVersion() << "change to" << cv.targetVersion; - component->setVersion(cv.targetVersion); - component->waitLoadMeta(); - }, - [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { - qCDebug(instanceProfileResolveC) - << instance->name() << "|" << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" - << component->getVersion() << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; - auto versionList = APPLICATION->metadataIndex()->get(component->getID()); - versionList->waitToLoad(); - if (versionList) { - auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); - if (recommended) { - component->setVersion(recommended->version()); - component->waitLoadMeta(); - return; - } + auto visitor = + overload{ [](const UpdateActionNone&) { + // noop + }, + [&component, &instance](const UpdateActionChangeVersion& cv) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" + << "UpdateActionChangeVersion" << component->getID() << ":" + << component->getVersion() << "change to" << cv.targetVersion; + component->setVersion(cv.targetVersion); + component->waitLoadMeta(); + }, + [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" << component->getVersion() + << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; + auto versionList = APPLICATION->metadataIndex()->get(component->getID()); + versionList->waitToLoad(); + if (versionList) { + auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); + if (recommended) { + component->setVersion(recommended->version()); + component->waitLoadMeta(); + return; + } - auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); - if (latest) { - component->setVersion(latest->version()); - component->waitLoadMeta(); - } else { - component->addComponentProblem(ProblemSeverity::Error, - QObject::tr("No compatible version of %1 found for %2 %3") - .arg(component->getName(), lrc.parentName, lrc.version)); - } - } else { - component->addComponentProblem(ProblemSeverity::Error, - QObject::tr("No version list in metadata index for %1").arg(component->getID())); - } - }, - [&component, &instance, &toRemove](const UpdateActionRemove&) { - qCDebug(instanceProfileResolveC) << instance->name() << "|" << "UpdateActionRemove" << component->getID() << ":" - << component->getVersion() << "removing"; - toRemove.append(component->getID()); - }, - [this, &component, &instance, &addedActions, &componentIndex](const UpdateActionImportantChanged& ic) { - qCDebug(instanceProfileResolveC) - << instance->name() << "|" << "UpdateImportantChanged" << component->getID() << ":" << component->getVersion() - << "was changed from" << ic.oldVersion << "updating linked components"; - auto oldVersion = APPLICATION->metadataIndex()->getLoadedVersion(component->getID(), ic.oldVersion); - for (auto oldReq : oldVersion->requiredSet()) { - auto currentlyRequired = component->m_cachedRequires.find(oldReq); - if (currentlyRequired == component->m_cachedRequires.cend()) { - auto oldReqComp = componentIndex.find(oldReq.uid); - if (oldReqComp != componentIndex.cend()) { - (*oldReqComp)->setUpdateAction(UpdateAction{ UpdateActionRemove{} }); - addedActions = true; - } - } - } - auto linked = collectTreeLinked(component->getID()); - for (auto comp : linked) { - if (comp->isCustom()) { - continue; - } - auto compUid = comp->getID(); - auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), - [compUid](const Meta::Require& req) { return req.uid == compUid; }); - if (parentReq != component->m_cachedRequires.end()) { - auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; - if (!newVersion.isEmpty()) { - comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - addedActions = true; - } - } - }; + auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); + if (latest) { + component->setVersion(latest->version()); + component->waitLoadMeta(); + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No compatible version of %1 found for %2 %3") + .arg(component->getName(), lrc.parentName, lrc.version)); + } + } else { + component->addComponentProblem( + ProblemSeverity::Error, + QObject::tr("No version list in metadata index for %1").arg(component->getID())); + } + }, + [&component, &instance, &toRemove](const UpdateActionRemove&) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateActionRemove" << component->getID() << ":" << component->getVersion() << "removing"; + toRemove.append(component->getID()); + }, + [this, &component, &instance, &addedActions, &componentIndex](const UpdateActionImportantChanged& ic) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateImportantChanged" << component->getID() << ":" << component->getVersion() << "was changed from" + << ic.oldVersion << "updating linked components"; + auto oldVersion = APPLICATION->metadataIndex()->getLoadedVersion(component->getID(), ic.oldVersion); + for (auto oldReq : oldVersion->requiredSet()) { + auto currentlyRequired = component->m_cachedRequires.find(oldReq); + if (currentlyRequired == component->m_cachedRequires.cend()) { + auto oldReqComp = componentIndex.find(oldReq.uid); + if (oldReqComp != componentIndex.cend()) { + (*oldReqComp)->setUpdateAction(UpdateAction{ UpdateActionRemove{} }); + addedActions = true; + } + } + } + auto linked = collectTreeLinked(component->getID()); + for (auto comp : linked) { + if (comp->isCustom()) { + continue; + } + auto compUid = comp->getID(); + auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), + [compUid](const Meta::Require& req) { return req.uid == compUid; }); + if (parentReq != component->m_cachedRequires.end()) { + auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; + if (!newVersion.isEmpty()) { + comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + addedActions = true; + } + } }; std::visit(visitor, action); component->clearUpdateAction(); for (auto uid : toRemove) { @@ -690,7 +694,7 @@ void ComponentUpdateTask::finalizeComponents() auto found = componentIndex.find(conflict); if (found != componentIndex.cend()) { auto foundComp = *found; - if (foundComp ->isCustom()) { + if (foundComp->isCustom()) { continue; } component->addComponentProblem( diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index c4a2dd273..8623c500f 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -71,7 +71,6 @@ #include "ui/dialogs/CustomMessageBox.h" - PackProfile::PackProfile(MinecraftInstance* instance) : QAbstractListModel() { d.reset(new PackProfileData); From 8488d11c69ad181b4f4f303c4a8984938110b40f Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 28 Jun 2024 09:59:57 -0700 Subject: [PATCH 110/616] review suggestions + spelling Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/Component.cpp | 17 ++++++++++++++--- launcher/minecraft/Component.h | 17 ++++++----------- launcher/minecraft/ComponentUpdateTask.cpp | 21 +++++++++------------ launcher/minecraft/PackProfile.cpp | 2 +- 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 329e6b78e..df27ac071 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -38,7 +38,6 @@ #include #include -#include #include "Application.h" #include "FileSystem.h" @@ -50,6 +49,14 @@ #include +const QMap Component::KNOWN_MODLOADERS = { + { "net.neoforged", { ModPlatform::NeoForge, { "net.minecraftforge", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, + { "net.minecraftforge", { ModPlatform::Forge, { "net.neoforged", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, + { "net.fabricmc.fabric-loader", { ModPlatform::Fabric, { "net.minecraftforge", "net.neoforged", "org.quiltmc.quilt-loader" } } }, + { "org.quiltmc.quilt-loader", { ModPlatform::Quilt, { "net.minecraftforge", "net.neoforged", "net.fabricmc.fabric-loader" } } }, + { "com.mumfrey.liteloader", { ModPlatform::LiteLoader, {} } } +}; + Component::Component(PackProfile* parent, const QString& uid) { assert(parent); @@ -231,11 +238,11 @@ bool Component::isKnownModloader() return iter != KNOWN_MODLOADERS.cend(); } -QStringList Component::knownConfictingComponents() +QStringList Component::knownConflictingComponents() { auto iter = KNOWN_MODLOADERS.find(m_uid); if (iter != KNOWN_MODLOADERS.cend()) { - return (*iter).knownConfictingComponents; + return (*iter).knownConflictingComponents; } else { return {}; } @@ -276,12 +283,16 @@ void Component::addComponentProblem(ProblemSeverity severity, const QString& des m_componentProblemSeverity = severity; } m_componentProblems.append({ severity, description }); + + emit dataChanged(); } void Component::resetComponentProblems() { m_componentProblems.clear(); m_componentProblemSeverity = ProblemSeverity::None; + + emit dataChanged(); } void Component::setVersion(const QString& version) diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 3669638f2..7ff30889f 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -23,7 +23,7 @@ struct UpdateActionChangeVersion { /// version to change to QString targetVersion; }; -struct UpdateActionLatestRecommendedCompatable { +struct UpdateActionLatestRecommendedCompatible { /// Parent uid QString parentUid; QString parentName; @@ -40,20 +40,13 @@ using UpdateActionNone = std::monostate; using UpdateAction = std::variant; struct ModloaderMapEntry { ModPlatform::ModLoaderType type; - QStringList knownConfictingComponents; -}; -static const QMap KNOWN_MODLOADERS{ - { "net.neoforged", { ModPlatform::NeoForge, { "net.minecraftforge", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, - { "net.minecraftforge", { ModPlatform::Forge, { "net.neoforged", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, - { "net.fabricmc.fabric-loader", { ModPlatform::Fabric, { "net.minecraftforge", "net.neoforged", "org.quiltmc.quilt-loader" } } }, - { "org.quiltmc.quilt-loader", { ModPlatform::Quilt, { "net.minecraftforge", "net.neoforged", "net.fabricmc.fabric-loader" } } }, - { "com.mumfrey.liteloader", { ModPlatform::LiteLoader, {} } } + QStringList knownConflictingComponents; }; class Component : public QObject, public ProblemProvider { @@ -66,6 +59,8 @@ class Component : public QObject, public ProblemProvider { virtual ~Component() {} + static const QMap KNOWN_MODLOADERS; + void applyTo(LaunchProfile* profile); bool isEnabled(); @@ -79,7 +74,7 @@ class Component : public QObject, public ProblemProvider { bool isCustom(); bool isVersionChangeable(); bool isKnownModloader(); - QStringList knownConfictingComponents(); + QStringList knownConflictingComponents(); // DEPRECATED: explicit numeric order values, used for loading old non-component config. TODO: refactor and move to migration code void setOrder(int order); diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index f4efba36f..6656a84f8 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -570,25 +570,22 @@ void ComponentUpdateTask::performUpdateActions() component->setVersion(cv.targetVersion); component->waitLoadMeta(); }, - [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { + [&component, &instance](const UpdateActionLatestRecommendedCompatible lrc) { qCDebug(instanceProfileResolveC) << instance->name() << "|" - << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" << component->getVersion() + << "UpdateActionLatestRecommendedCompatible" << component->getID() << ":" << component->getVersion() << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; auto versionList = APPLICATION->metadataIndex()->get(component->getID()); - versionList->waitToLoad(); if (versionList) { + versionList->waitToLoad(); auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); + if (!recommended) { + recommended = versionList->getLatestForParent(lrc.parentUid, lrc.version); + } if (recommended) { component->setVersion(recommended->version()); component->waitLoadMeta(); return; - } - - auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); - if (latest) { - component->setVersion(latest->version()); - component->waitLoadMeta(); } else { component->addComponentProblem(ProblemSeverity::Error, QObject::tr("No compatible version of %1 found for %2 %3") @@ -635,14 +632,14 @@ void ComponentUpdateTask::performUpdateActions() if (!newVersion.isEmpty()) { comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatible{ component->getID(), component->getName(), component->getVersion(), } }); } } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatible{ component->getID(), component->getName(), component->getVersion(), @@ -690,7 +687,7 @@ void ComponentUpdateTask::finalizeComponents() } } } - for (auto conflict : component->knownConfictingComponents()) { + for (auto conflict : component->knownConflictingComponents()) { auto found = componentIndex.find(conflict); if (found != componentIndex.cend()) { auto foundComp = *found; diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 8623c500f..d992a18f3 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -1034,7 +1034,7 @@ std::optional PackProfile::getModLoaders() ModPlatform::ModLoaderTypes result; bool has_any_loader = false; - QMapIterator i(KNOWN_MODLOADERS); + QMapIterator i(Component::KNOWN_MODLOADERS); while (i.hasNext()) { i.next(); From c886111e18566c10ec15e5c389a3d4d1da3d2ccf Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 6 Jul 2024 09:09:54 +0300 Subject: [PATCH 111/616] format the code Signed-off-by: Trial97 --- launcher/meta/VersionList.cpp | 5 ++--- launcher/minecraft/Component.cpp | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 28a42d28d..8bc326839 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -254,9 +254,8 @@ void VersionList::setupAddedVersion(const int row, const Version::Ptr& version) connect(version.get(), &Version::requiresChanged, this, [this, row]() { emit dataChanged(index(row), index(row), QVector() << RequiresRole); }); - connect(version.get(), &Version::timeChanged, this, [this, row]() { - emit dataChanged(index(row), index(row), { TimeRole, SortRole }); - }); + connect(version.get(), &Version::timeChanged, this, + [this, row]() { emit dataChanged(index(row), index(row), { TimeRole, SortRole }); }); connect(version.get(), &Version::typeChanged, this, [this, row]() { emit dataChanged(index(row), index(row), { TypeRole }); }); } diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index df27ac071..aeb8a398f 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -291,7 +291,7 @@ void Component::resetComponentProblems() { m_componentProblems.clear(); m_componentProblemSeverity = ProblemSeverity::None; - + emit dataChanged(); } From c666d060fc1503e307d2acbdb1443a26090e6801 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 19 Jul 2024 17:10:04 +0300 Subject: [PATCH 112/616] fix merge issue Signed-off-by: Trial97 --- launcher/minecraft/PackProfile.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index ad8652488..f1d2473c2 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -1048,8 +1048,8 @@ QList PackProfile::getModLoadersList() { QList result; for (auto c : d->components) { - if (c->isEnabled() && modloaderMapping.contains(c->getID())) { - result.append(modloaderMapping[c->getID()]); + if (c->isEnabled() && Component::KNOWN_MODLOADERS.contains(c->getID())) { + result.append(Component::KNOWN_MODLOADERS[c->getID()].type); } } From 5d3549a5e900cc65cecfccd49da10e28765311e4 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 22 Jul 2024 09:18:20 +0300 Subject: [PATCH 113/616] Add tooltips and fix archive download task Signed-off-by: Trial97 --- launcher/java/download/ArchiveDownloadTask.cpp | 1 + launcher/ui/pages/global/JavaPage.cpp | 2 +- launcher/ui/pages/global/JavaPage.ui | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index af5381dfc..ba1c96faf 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -124,6 +124,7 @@ void ArchiveDownloadTask::extractJava(QString input) stepProgress(*progressStep); }); m_task->start(); + return; } emitFailed(tr("Could not determine archive type!")); diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index ad37fa740..97ffa5d4d 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -264,7 +264,7 @@ void JavaPage::on_removeJavaButton_clicked() for (auto& entry : entries) { if (dcast->path.startsWith(entry.canonicalFilePath())) { auto response = CustomMessageBox::selectable(this, tr("Confirm Deletion"), - tr("You are about to remove \"%1\" java version.\n" + tr("You are about to remove the Java installation named \"%1\".\n" "Are you sure?") .arg(entry.fileName()), QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index c8f62e075..e6bbeb15a 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -253,6 +253,9 @@ + + Automatically selects the Java version that is compatible with the current Minecraft instance, based on the major version required. + Autodetect Java version @@ -299,6 +302,9 @@ false + + Automatically downloads and selects the Java version recommended by Mojang. + Auto-download Mojang Java From 0ac62f9ddf0e6ef80bcb20d2828d013e31726579 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 23 Jul 2024 01:41:41 +0300 Subject: [PATCH 114/616] Recommend java major Signed-off-by: Trial97 --- launcher/Filter.cpp | 11 ++- launcher/Filter.h | 20 +++- launcher/minecraft/MinecraftInstance.h | 2 +- launcher/minecraft/VersionFile.h | 2 +- launcher/ui/java/InstallJavaDialog.cpp | 97 ++++++++++++++++++- launcher/ui/java/InstallJavaDialog.h | 3 +- launcher/ui/pages/BasePageProvider.h | 1 - launcher/ui/pages/global/JavaPage.cpp | 2 +- .../pages/instance/InstanceSettingsPage.cpp | 2 +- launcher/ui/widgets/JavaSettingsWidget.cpp | 2 +- 10 files changed, 122 insertions(+), 20 deletions(-) diff --git a/launcher/Filter.cpp b/launcher/Filter.cpp index fc1c42344..adeb2209e 100644 --- a/launcher/Filter.cpp +++ b/launcher/Filter.cpp @@ -1,16 +1,12 @@ #include "Filter.h" -Filter::~Filter() {} - ContainsFilter::ContainsFilter(const QString& pattern) : pattern(pattern) {} -ContainsFilter::~ContainsFilter() {} bool ContainsFilter::accepts(const QString& value) { return value.contains(pattern); } ExactFilter::ExactFilter(const QString& pattern) : pattern(pattern) {} -ExactFilter::~ExactFilter() {} bool ExactFilter::accepts(const QString& value) { return value == pattern; @@ -27,10 +23,15 @@ RegexpFilter::RegexpFilter(const QString& regexp, bool invert) : invert(invert) pattern.setPattern(regexp); pattern.optimize(); } -RegexpFilter::~RegexpFilter() {} bool RegexpFilter::accepts(const QString& value) { auto match = pattern.match(value); bool matched = match.hasMatch(); return invert ? (!matched) : (matched); } + +ExactListFilter::ExactListFilter(const QStringList& pattern) : m_pattern(pattern) {} +bool ExactListFilter::accepts(const QString& value) +{ + return m_pattern.isEmpty() || m_pattern.contains(value); +} \ No newline at end of file diff --git a/launcher/Filter.h b/launcher/Filter.h index 089c844d4..a8c9c14d8 100644 --- a/launcher/Filter.h +++ b/launcher/Filter.h @@ -5,14 +5,14 @@ class Filter { public: - virtual ~Filter(); + virtual ~Filter() = default; virtual bool accepts(const QString& value) = 0; }; class ContainsFilter : public Filter { public: ContainsFilter(const QString& pattern); - virtual ~ContainsFilter(); + virtual ~ContainsFilter() = default; bool accepts(const QString& value) override; private: @@ -22,7 +22,7 @@ class ContainsFilter : public Filter { class ExactFilter : public Filter { public: ExactFilter(const QString& pattern); - virtual ~ExactFilter(); + virtual ~ExactFilter() = default; bool accepts(const QString& value) override; private: @@ -32,7 +32,7 @@ class ExactFilter : public Filter { class ExactIfPresentFilter : public Filter { public: ExactIfPresentFilter(const QString& pattern); - ~ExactIfPresentFilter() override = default; + virtual ~ExactIfPresentFilter() override = default; bool accepts(const QString& value) override; private: @@ -42,10 +42,20 @@ class ExactIfPresentFilter : public Filter { class RegexpFilter : public Filter { public: RegexpFilter(const QString& regexp, bool invert); - virtual ~RegexpFilter(); + virtual ~RegexpFilter() = default; bool accepts(const QString& value) override; private: QRegularExpression pattern; bool invert = false; }; + +class ExactListFilter : public Filter { + public: + ExactListFilter(const QStringList& pattern = {}); + virtual ~ExactListFilter() = default; + bool accepts(const QString& value) override; + + private: + const QStringList& m_pattern; +}; diff --git a/launcher/minecraft/MinecraftInstance.h b/launcher/minecraft/MinecraftInstance.h index 7af0df389..730116072 100644 --- a/launcher/minecraft/MinecraftInstance.h +++ b/launcher/minecraft/MinecraftInstance.h @@ -56,7 +56,7 @@ class MinecraftInstance : public BaseInstance { Q_OBJECT public: MinecraftInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr settings, const QString& rootDir); - virtual ~MinecraftInstance() {}; + virtual ~MinecraftInstance() = default; virtual void saveNow() override; void loadSpecificSettings() override; diff --git a/launcher/minecraft/VersionFile.h b/launcher/minecraft/VersionFile.h index 85ac55426..40f49aaa4 100644 --- a/launcher/minecraft/VersionFile.h +++ b/launcher/minecraft/VersionFile.h @@ -101,7 +101,7 @@ class VersionFile : public ProblemContainer { /// Mojang: list of compatible java majors QList compatibleJavaMajors; - /// Mojang: the name of recomended java version + /// Mojang: the name of recommended java version QString compatibleJavaName; /// Mojang: type of the Minecraft version diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index 1a4b4cc58..01ec56dfd 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -18,6 +18,7 @@ #include "InstallJavaDialog.h" +#include #include #include #include @@ -27,10 +28,13 @@ #include "Application.h" #include "BaseVersionList.h" #include "FileSystem.h" +#include "Filter.h" #include "java/download/ArchiveDownloadTask.h" #include "java/download/ManifestDownloadTask.h" #include "meta/Index.h" #include "meta/VersionList.h" +#include "minecraft/MinecraftInstance.h" +#include "minecraft/PackProfile.h" #include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/ProgressDialog.h" #include "ui/java/VersionList.h" @@ -119,6 +123,27 @@ class InstallJavaPage : public QWidget, public BasePage { majorVersionSelect->loadList(); javaVersionSelect->loadList(); } + + public slots: + void setRecommendedMajors(const QStringList& majors) + { + m_recommended_majors = majors; + recommendedFilterChanged(); + } + void setRecomend(bool recomend) + { + m_recommend = recomend; + recommendedFilterChanged(); + } + void recommendedFilterChanged() + { + if (m_recommend) { + majorVersionSelect->setFilter(BaseVersionList::ModelRoles::JavaMajorRole, new ExactListFilter(m_recommended_majors)); + } else { + majorVersionSelect->setFilter(BaseVersionList::ModelRoles::JavaMajorRole, new ExactListFilter()); + } + } + signals: void selectionChanged(); @@ -131,6 +156,9 @@ class InstallJavaPage : public QWidget, public BasePage { QHBoxLayout* horizontalLayout = nullptr; VersionSelectWidget* majorVersionSelect = nullptr; VersionSelectWidget* javaVersionSelect = nullptr; + + QStringList m_recommended_majors; + bool m_recommend; }; static InstallJavaPage* pageCast(BasePage* page) @@ -140,8 +168,20 @@ static InstallJavaPage* pageCast(BasePage* page) return result; } namespace Java { +QStringList getRecommendedJavaVersionsFromVersionList(Meta::VersionList::Ptr list) +{ + QStringList recommendedJavas; + for (auto ver : list->versions()) { + auto major = ver->version(); + if (major.startsWith("java")) { + major = "Java " + major.mid(4); + } + recommendedJavas.append(major); + } + return recommendedJavas; +} -InstallDialog::InstallDialog(const QString& uid, QWidget* parent) +InstallDialog::InstallDialog(const QString& uid, BaseInstance* instance, QWidget* parent) : QDialog(parent), container(new PageContainer(this, QString(), this)), buttons(new QDialogButtonBox(this)) { auto layout = new QVBoxLayout(this); @@ -150,10 +190,22 @@ InstallDialog::InstallDialog(const QString& uid, QWidget* parent) layout->addWidget(container); auto buttonLayout = new QHBoxLayout(this); + auto refreshLayout = new QHBoxLayout(this); auto refreshButton = new QPushButton(tr("&Refresh"), this); connect(refreshButton, &QPushButton::clicked, this, [this] { pageCast(container->selectedPage())->loadList(); }); - buttonLayout->addWidget(refreshButton); + refreshLayout->addWidget(refreshButton); + + auto recommendedCheckBox = new QCheckBox("Recommended", this); + recommendedCheckBox->setCheckState(Qt::CheckState::Checked); + connect(recommendedCheckBox, &QCheckBox::stateChanged, this, [this](int state) { + for (BasePage* page : container->getPages()) { + pageCast(page)->setRecomend(state == Qt::Checked); + } + }); + + refreshLayout->addWidget(recommendedCheckBox); + buttonLayout->addLayout(refreshLayout); buttons->setOrientation(Qt::Horizontal); buttons->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); @@ -168,11 +220,49 @@ InstallDialog::InstallDialog(const QString& uid, QWidget* parent) setWindowModality(Qt::WindowModal); resize(840, 480); + QStringList recommendedJavas; + if (auto mcInst = dynamic_cast(instance); mcInst) { + auto mc = mcInst->getPackProfile()->getComponent("net.minecraft"); + if (mc) { + auto file = mc->getVersionFile(); // no need for load as it should already be loaded + if (file) { + for (auto major : file->compatibleJavaMajors) { + recommendedJavas.append(QString("Java %1").arg(major)); + } + } + } + } else { + const auto versions = APPLICATION->metadataIndex()->get("net.minecraft.java"); + if (versions) { + if (versions->isLoaded()) { + recommendedJavas = getRecommendedJavaVersionsFromVersionList(versions); + } else { + auto newTask = versions->getLoadTask(); + if (newTask) { + connect(newTask.get(), &Task::succeeded, this, [this, versions] { + auto recommendedJavas = getRecommendedJavaVersionsFromVersionList(versions); + for (BasePage* page : container->getPages()) { + pageCast(page)->setRecommendedMajors(recommendedJavas); + } + }); + if (!newTask->isRunning()) + newTask->start(); + } else { + recommendedJavas = getRecommendedJavaVersionsFromVersionList(versions); + } + } + } + } for (BasePage* page : container->getPages()) { if (page->id() == uid) container->selectPage(page->id()); - connect(pageCast(page), &InstallJavaPage::selectionChanged, this, [this] { validate(); }); + auto cast = pageCast(page); + cast->setRecomend(true); + connect(cast, &InstallJavaPage::selectionChanged, this, [this] { validate(); }); + if (!recommendedJavas.isEmpty()) { + cast->setRecommendedMajors(recommendedJavas); + } } connect(container, &PageContainer::selectedPageChanged, this, [this] { validate(); }); pageCast(container->selectedPage())->selectSearch(); @@ -243,6 +333,7 @@ void InstallDialog::done(int result) QDialog::done(result); } + } // namespace Java #include "InstallJavaDialog.moc" \ No newline at end of file diff --git a/launcher/ui/java/InstallJavaDialog.h b/launcher/ui/java/InstallJavaDialog.h index 80d010c1a..d6f879207 100644 --- a/launcher/ui/java/InstallJavaDialog.h +++ b/launcher/ui/java/InstallJavaDialog.h @@ -19,6 +19,7 @@ #pragma once #include +#include "BaseInstance.h" #include "ui/pages/BasePageProvider.h" class MinecraftInstance; @@ -31,7 +32,7 @@ class InstallDialog final : public QDialog, private BasePageProvider { Q_OBJECT public: - explicit InstallDialog(const QString& uid = QString(), QWidget* parent = nullptr); + explicit InstallDialog(const QString& uid = QString(), BaseInstance* instance = nullptr, QWidget* parent = nullptr); QList getPages() override; QString dialogTitle() override; diff --git a/launcher/ui/pages/BasePageProvider.h b/launcher/ui/pages/BasePageProvider.h index 422891e6b..ef3c1cd08 100644 --- a/launcher/ui/pages/BasePageProvider.h +++ b/launcher/ui/pages/BasePageProvider.h @@ -16,7 +16,6 @@ #pragma once #include -#include #include "ui/pages/BasePage.h" class BasePageProvider { diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 97ffa5d4d..6699b00c0 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -201,7 +201,7 @@ void JavaPage::on_javaTestBtn_clicked() void JavaPage::on_downloadJavaButton_clicked() { - auto jdialog = new Java::InstallDialog({}, this); + auto jdialog = new Java::InstallDialog({}, nullptr, this); jdialog->exec(); ui->managedJavaList->loadList(); } diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index 6e6b1db57..364f64e19 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -390,7 +390,7 @@ void InstanceSettingsPage::loadSettings() void InstanceSettingsPage::on_javaDownloadBtn_clicked() { - auto jdialog = new Java::InstallDialog({}, this); + auto jdialog = new Java::InstallDialog({}, m_instance, this); jdialog->exec(); } diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index ec1ed0605..fb90afe1d 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -351,7 +351,7 @@ void JavaSettingsWidget::on_javaBrowseBtn_clicked() void JavaSettingsWidget::javaDownloadBtn_clicked() { - auto jdialog = new Java::InstallDialog({}, this); + auto jdialog = new Java::InstallDialog({}, nullptr, this); jdialog->exec(); } From fe23e76714598f134f07ba04b482bdb2bf1ee34c Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 5 Aug 2024 12:04:08 +0300 Subject: [PATCH 115/616] fix codeql Signed-off-by: Trial97 --- launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h index 0879474cf..ddfa7ae95 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h @@ -1,5 +1,6 @@ #pragma once +#include #include "BaseInstance.h" #include "InstanceCreationTask.h" From 7a6627683895fab64f99a87e6b054614ff083f90 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 20 Aug 2024 01:07:23 +0300 Subject: [PATCH 116/616] fix conflicts Signed-off-by: Trial97 --- launcher/minecraft/launch/AutoInstallJava.cpp | 12 +++++++++--- launcher/ui/java/VersionList.cpp | 3 +-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index eefed9cf5..d43f41ddb 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -121,6 +121,9 @@ void AutoInstallJava::executeTask() connect(m_current_task.get(), &Task::stepProgress, this, &AutoInstallJava::propagateStepProgress); connect(m_current_task.get(), &Task::status, this, &AutoInstallJava::setStatus); connect(m_current_task.get(), &Task::details, this, &AutoInstallJava::setDetails); + if (!m_current_task->isRunning()) { + m_current_task->start(); + } emit progressReportingRequest(); } @@ -213,11 +216,11 @@ void AutoInstallJava::tryNextMajorJava() m_majorJavaVersionIndex++; auto javaMajor = versionList->getVersion(QString("java%1").arg(majorJavaVersion)); - javaMajor->load(Net::Mode::Online); - m_current_task = javaMajor->getCurrentTask(); - if (javaMajor->isLoaded() || !m_current_task) { + + if (javaMajor->isLoaded()) { downloadJava(javaMajor, wantedJavaName); } else { + m_current_task = APPLICATION->metadataIndex()->loadVersion("net.minecraft.java", javaMajor->version(), Net::Mode::Online); connect(m_current_task.get(), &Task::succeeded, this, [this, javaMajor, wantedJavaName] { downloadJava(javaMajor, wantedJavaName); }); connect(m_current_task.get(), &Task::failed, this, &AutoInstallJava::tryNextMajorJava); @@ -225,6 +228,9 @@ void AutoInstallJava::tryNextMajorJava() connect(m_current_task.get(), &Task::stepProgress, this, &AutoInstallJava::propagateStepProgress); connect(m_current_task.get(), &Task::status, this, &AutoInstallJava::setStatus); connect(m_current_task.get(), &Task::details, this, &AutoInstallJava::setDetails); + if (!m_current_task->isRunning()) { + m_current_task->start(); + } } } bool AutoInstallJava::abort() diff --git a/launcher/ui/java/VersionList.cpp b/launcher/ui/java/VersionList.cpp index 6f60a6867..f2c0cb3b9 100644 --- a/launcher/ui/java/VersionList.cpp +++ b/launcher/ui/java/VersionList.cpp @@ -35,8 +35,7 @@ VersionList::VersionList(Meta::Version::Ptr version, QObject* parent) : BaseVers Task::Ptr VersionList::getLoadTask() { - m_version->load(Net::Mode::Online); - auto task = m_version->getCurrentTask(); + auto task = m_version->loadTask(Net::Mode::Online); connect(task.get(), &Task::finished, this, &VersionList::sortVersions); return task; } From ca298d1ed5cffb9a92dc78523a72ee407a673694 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 20 Aug 2024 01:08:03 +0300 Subject: [PATCH 117/616] add automatic java switch on minecraft version switch Signed-off-by: Trial97 --- launcher/minecraft/MinecraftInstance.cpp | 1 + launcher/minecraft/launch/AutoInstallJava.cpp | 1 + launcher/ui/pages/instance/InstanceSettingsPage.cpp | 3 +++ launcher/ui/pages/instance/VersionPage.cpp | 5 +++++ 4 files changed, 10 insertions(+) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 3963b0148..d861056bf 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -138,6 +138,7 @@ void MinecraftInstance::loadSpecificSettings() // Java Settings auto locationOverride = m_settings->registerSetting("OverrideJavaLocation", false); auto argsOverride = m_settings->registerSetting("OverrideJavaArgs", false); + m_settings->registerSetting("AutomaticJava", false); if (auto global_settings = globalSettings()) { m_settings->registerOverride(global_settings->getSetting("JavaPath"), locationOverride); diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index d43f41ddb..3f58a28a6 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -132,6 +132,7 @@ void AutoInstallJava::setJavaPath(QString path) auto settings = m_instance->settings(); settings->set("OverrideJavaLocation", true); settings->set("JavaPath", path); + settings->set("AutomaticJava", true); emit logLine(tr("Compatible Java found at: %1.").arg(path), MessageLevel::Info); emitSucceeded(); } diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index 56c3e2b9a..19bc9fdf9 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -38,6 +38,7 @@ #include "InstanceSettingsPage.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/WorldList.h" +#include "settings/Setting.h" #include "ui/dialogs/CustomMessageBox.h" #include "ui/java/InstallJavaDialog.h" #include "ui_InstanceSettingsPage.h" @@ -346,6 +347,8 @@ void InstanceSettingsPage::loadSettings() bool overrideLocation = m_settings->get("OverrideJavaLocation").toBool(); bool overrideArgs = m_settings->get("OverrideJavaArgs").toBool(); + connect(m_settings->getSetting("OverrideJavaLocation").get(), &Setting::SettingChanged, ui->javaSettingsGroupBox, + [this] { ui->javaSettingsGroupBox->setChecked(m_settings->get("OverrideJavaLocation").toBool()); }); ui->javaSettingsGroupBox->setChecked(overrideLocation); ui->javaPathTextBox->setText(m_settings->get("JavaPath").toString()); ui->skipCompatibilityCheckbox->setChecked(m_settings->get("IgnoreJavaCompatibility").toBool()); diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index 807bc5d58..c55d32efb 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -393,6 +393,11 @@ void VersionPage::on_actionChange_version_triggered() bool important = false; if (uid == "net.minecraft") { important = true; + 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", ""); + } } m_profile->setComponentVersion(uid, vselect.selectedVersion()->descriptor(), important); m_profile->resolve(Net::Mode::Online); From 014fc142915ec4a0f96b3082f76d4d32ce7596aa Mon Sep 17 00:00:00 2001 From: maskers <97827489+mskrss@users.noreply.github.com> Date: Tue, 20 Aug 2024 21:53:05 +0300 Subject: [PATCH 118/616] truncate logs for mclo.gs upload to fit 25k line limit Signed-off-by: maskers <97827489+mskrss@users.noreply.github.com> --- launcher/net/PasteUpload.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/launcher/net/PasteUpload.cpp b/launcher/net/PasteUpload.cpp index c67d3b23c..5e8c5a8cd 100644 --- a/launcher/net/PasteUpload.cpp +++ b/launcher/net/PasteUpload.cpp @@ -49,6 +49,27 @@ #include "net/Logging.h" +constexpr int MaxMclogsLines = 25000; +constexpr int InitialMclogsLines = 10000; +constexpr int FinalMclogsLines = 14900; + +QString truncateLogForMclogs(const QString &logContent) { + QStringList lines = logContent.split("\n"); + if (lines.size() > MaxMclogsLines) { + QString truncatedLog = lines.mid(0, InitialMclogsLines).join("\n"); + truncatedLog += "\n\n\n\n\n\n\n\n\n\n" + "------------------------------------------------------------\n" + "--------------------- Log truncated by ---------------------\n" + "---------------------- Prism Launcher ----------------------\n" + "----- Middle portion omitted to fit mclo.gs size limits ----\n" + "------------------------------------------------------------\n" + "\n\n\n\n\n\n\n\n\n\n"; + truncatedLog += lines.mid(lines.size() - FinalMclogsLines, FinalMclogsLines).join("\n"); + return truncatedLog; + } + return logContent; +} + std::array PasteUpload::PasteTypes = { { { "0x0.st", "https://0x0.st", "" }, { "hastebin", "https://hst.sh", "/documents" }, { "paste.gg", "https://paste.gg", "/api/v1/pastes" }, @@ -98,6 +119,7 @@ void PasteUpload::executeTask() } case Mclogs: { QUrlQuery postData; + m_text = truncateLogForMclogs(m_text).toUtf8(); postData.addQueryItem("content", m_text); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); rep = APPLICATION->network()->post(request, postData.toString().toUtf8()); From e6f30c0ebe0ddd43b493f27156d6c0765105ded5 Mon Sep 17 00:00:00 2001 From: maskers <97827489+mskrss@users.noreply.github.com> Date: Tue, 20 Aug 2024 22:14:40 +0300 Subject: [PATCH 119/616] fix formatting Signed-off-by: maskers <97827489+mskrss@users.noreply.github.com> --- launcher/net/PasteUpload.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/launcher/net/PasteUpload.cpp b/launcher/net/PasteUpload.cpp index 5e8c5a8cd..92a44d5ed 100644 --- a/launcher/net/PasteUpload.cpp +++ b/launcher/net/PasteUpload.cpp @@ -53,17 +53,19 @@ constexpr int MaxMclogsLines = 25000; constexpr int InitialMclogsLines = 10000; constexpr int FinalMclogsLines = 14900; -QString truncateLogForMclogs(const QString &logContent) { +QString truncateLogForMclogs(const QString &logContent) +{ QStringList lines = logContent.split("\n"); if (lines.size() > MaxMclogsLines) { QString truncatedLog = lines.mid(0, InitialMclogsLines).join("\n"); - truncatedLog += "\n\n\n\n\n\n\n\n\n\n" - "------------------------------------------------------------\n" - "--------------------- Log truncated by ---------------------\n" - "---------------------- Prism Launcher ----------------------\n" - "----- Middle portion omitted to fit mclo.gs size limits ----\n" - "------------------------------------------------------------\n" - "\n\n\n\n\n\n\n\n\n\n"; + truncatedLog += + "\n\n\n\n\n\n\n\n\n\n" + "------------------------------------------------------------\n" + "--------------------- Log truncated by ---------------------\n" + "---------------------- Prism Launcher ----------------------\n" + "----- Middle portion omitted to fit mclo.gs size limits ----\n" + "------------------------------------------------------------\n" + "\n\n\n\n\n\n\n\n\n\n"; truncatedLog += lines.mid(lines.size() - FinalMclogsLines, FinalMclogsLines).join("\n"); return truncatedLog; } From 858f6aa9b8adcb5d2ac9eadd2702a21a88f9e4c4 Mon Sep 17 00:00:00 2001 From: maskers <97827489+mskrss@users.noreply.github.com> Date: Tue, 20 Aug 2024 22:16:40 +0300 Subject: [PATCH 120/616] fix formatting Signed-off-by: maskers <97827489+mskrss@users.noreply.github.com> --- launcher/net/PasteUpload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/net/PasteUpload.cpp b/launcher/net/PasteUpload.cpp index 92a44d5ed..953a0d722 100644 --- a/launcher/net/PasteUpload.cpp +++ b/launcher/net/PasteUpload.cpp @@ -53,7 +53,7 @@ constexpr int MaxMclogsLines = 25000; constexpr int InitialMclogsLines = 10000; constexpr int FinalMclogsLines = 14900; -QString truncateLogForMclogs(const QString &logContent) +QString truncateLogForMclogs(const QString& logContent) { QStringList lines = logContent.split("\n"); if (lines.size() > MaxMclogsLines) { From 7dff77ca356d93f0ef9de390276fce0a9c1a5ee6 Mon Sep 17 00:00:00 2001 From: seth Date: Tue, 20 Aug 2024 01:44:11 -0400 Subject: [PATCH 121/616] style(nix): alejandra -> nixfmt-rfc-style Signed-off-by: seth --- nix/dev.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nix/dev.nix b/nix/dev.nix index cf61449a7..22b4b43fb 100644 --- a/nix/dev.nix +++ b/nix/dev.nix @@ -9,9 +9,9 @@ hooks = { markdownlint.enable = true; - alejandra.enable = true; deadnix.enable = true; nil.enable = true; + nixfmt.enable = true; clang-format = { enable = true; @@ -31,6 +31,6 @@ buildInputs = with pkgs; [ccache ninja]; }; - formatter = pkgs.alejandra; + formatter = pkgs.nixfmt-rfc-style; }; } From 4c81d8c53d09196426568c4a31a4e752ed05397a Mon Sep 17 00:00:00 2001 From: seth Date: Tue, 20 Aug 2024 01:44:24 -0400 Subject: [PATCH 122/616] style(nix): format with nixfmt Signed-off-by: seth --- default.nix | 23 +++---- flake.nix | 13 ++-- nix/README.md | 72 ++++++++++++++-------- nix/dev.nix | 67 ++++++++++++--------- nix/distribution.nix | 54 ++++++++--------- nix/pkg/default.nix | 140 ++++++++++++++++++++++--------------------- nix/pkg/wrapper.nix | 126 +++++++++++++++++++------------------- 7 files changed, 259 insertions(+), 236 deletions(-) diff --git a/default.nix b/default.nix index c7d0c267d..6466507b7 100644 --- a/default.nix +++ b/default.nix @@ -1,14 +1,9 @@ -( - import - ( - let - lock = builtins.fromJSON (builtins.readFile ./flake.lock); - in - fetchTarball { - url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz"; - sha256 = lock.nodes.flake-compat.locked.narHash; - } - ) - {src = ./.;} -) -.defaultNix +(import ( + let + lock = builtins.fromJSON (builtins.readFile ./flake.lock); + in + fetchTarball { + url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz"; + sha256 = lock.nodes.flake-compat.locked.narHash; + } +) { src = ./.; }).defaultNix diff --git a/flake.nix b/flake.nix index 7cef5217a..1e3e36d66 100644 --- a/flake.nix +++ b/flake.nix @@ -2,8 +2,8 @@ description = "A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once (Fork of MultiMC)"; nixConfig = { - extra-substituters = ["https://cache.garnix.io"]; - extra-trusted-public-keys = ["cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g="]; + extra-substituters = [ "https://cache.garnix.io" ]; + extra-trusted-public-keys = [ "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" ]; }; inputs = { @@ -30,12 +30,9 @@ }; }; - outputs = { - flake-parts, - pre-commit-hooks, - ... - } @ inputs: - flake-parts.lib.mkFlake {inherit inputs;} { + outputs = + { flake-parts, pre-commit-hooks, ... }@inputs: + flake-parts.lib.mkFlake { inherit inputs; } { imports = [ pre-commit-hooks.flakeModule diff --git a/nix/README.md b/nix/README.md index f7923577f..8a0b9ba26 100644 --- a/nix/README.md +++ b/nix/README.md @@ -15,7 +15,6 @@ to temporarily enable it when using `nix` commands. Example (NixOS): ```nix -{...}: { nix.settings = { trusted-substituters = [ @@ -39,6 +38,7 @@ Example: { inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + prismlauncher = { url = "github:PrismLauncher/PrismLauncher"; # Optional: Override the nixpkgs input of prismlauncher to use the same revision as the rest of your flake @@ -47,19 +47,24 @@ Example: }; }; - outputs = {nixpkgs, prismlauncher}: { - nixosConfigurations.foo = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; + outputs = + { nixpkgs, prismlauncher }: + { + nixosConfigurations.foo = nixpkgs.lib.nixosSystem { + modules = [ + ./configuration.nix - modules = [ - ({pkgs, ...}: { - nixpkgs.overlays = [prismlauncher.overlays.default]; + ( + { pkgs, ... }: + { + nixpkgs.overlays = [ prismlauncher.overlays.default ]; - environment.systemPackages = [pkgs.prismlauncher]; - }) - ]; + environment.systemPackages = [ pkgs.prismlauncher ]; + } + ) + ]; + }; }; - } } ``` @@ -74,6 +79,7 @@ Example: { inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + prismlauncher = { url = "github:PrismLauncher/PrismLauncher"; # Optional: Override the nixpkgs input of prismlauncher to use the same revision as the rest of your flake @@ -82,17 +88,22 @@ Example: }; }; - outputs = {nixpkgs, prismlauncher}: { - nixosConfigurations.foo = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; + outputs = + { nixpkgs, prismlauncher }: + { + nixosConfigurations.foo = nixpkgs.lib.nixosSystem { + modules = [ + ./configuration.nix - modules = [ - ({pkgs, ...}: { - environment.systemPackages = [prismlauncher.packages.${pkgs.system}.prismlauncher]; - }) - ]; + ( + { pkgs, ... }: + { + environment.systemPackages = [ prismlauncher.packages.${pkgs.system}.prismlauncher ]; + } + ) + ]; + }; }; - } } ``` @@ -118,7 +129,6 @@ If you want to avoid rebuilds you may add the garnix cache to your substitutors. Example (NixOS): ```nix -{...}: { nix.settings = { trusted-substituters = [ @@ -139,10 +149,15 @@ We use flake-compat to allow using this Flake on a system that doesn't use flake Example: ```nix -{pkgs, ...}: { - nixpkgs.overlays = [(import (builtins.fetchTarball "https://github.com/PrismLauncher/PrismLauncher/archive/develop.tar.gz")).overlays.default]; +{ pkgs, ... }: +{ + nixpkgs.overlays = [ + (import ( + builtins.fetchTarball "https://github.com/PrismLauncher/PrismLauncher/archive/develop.tar.gz" + )).overlays.default + ]; - environment.systemPackages = [pkgs.prismlauncher]; + environment.systemPackages = [ pkgs.prismlauncher ]; } ``` @@ -154,8 +169,13 @@ This way the installed package is fully reproducible. Example: ```nix -{pkgs, ...}: { - environment.systemPackages = [(import (builtins.fetchTarball "https://github.com/PrismLauncher/PrismLauncher/archive/develop.tar.gz")).packages.${pkgs.system}.prismlauncher]; +{ pkgs, ... }: +{ + environment.systemPackages = [ + (import ( + builtins.fetchTarball "https://github.com/PrismLauncher/PrismLauncher/archive/develop.tar.gz" + )).packages.${pkgs.system}.prismlauncher + ]; } ``` diff --git a/nix/dev.nix b/nix/dev.nix index 22b4b43fb..2ae3c845b 100644 --- a/nix/dev.nix +++ b/nix/dev.nix @@ -1,36 +1,47 @@ { - perSystem = { - config, - lib, - pkgs, - ... - }: { - pre-commit.settings = { - hooks = { - markdownlint.enable = true; + perSystem = + { + config, + lib, + pkgs, + ... + }: + { + pre-commit.settings = { + hooks = { + markdownlint.enable = true; - deadnix.enable = true; - nil.enable = true; - nixfmt.enable = true; + deadnix.enable = true; + nil.enable = true; + nixfmt.enable = true; - clang-format = { - enable = true; - types_or = ["c" "c++" "java" "json" "objective-c"]; + clang-format = { + enable = true; + types_or = [ + "c" + "c++" + "java" + "json" + "objective-c" + ]; + }; }; + + tools.clang-tools = lib.mkForce pkgs.clang-tools_18; }; - tools.clang-tools = lib.mkForce pkgs.clang-tools_18; + devShells.default = pkgs.mkShell { + shellHook = '' + ${config.pre-commit.installationScript} + ''; + + inputsFrom = [ config.packages.prismlauncher-unwrapped ]; + buildInputs = with pkgs; [ + ccache + ninja + ]; + }; + + formatter = pkgs.nixfmt-rfc-style; }; - - devShells.default = pkgs.mkShell { - shellHook = '' - ${config.pre-commit.installationScript} - ''; - - inputsFrom = [config.packages.prismlauncher-unwrapped]; - buildInputs = with pkgs; [ccache ninja]; - }; - - formatter = pkgs.nixfmt-rfc-style; - }; } diff --git a/nix/distribution.nix b/nix/distribution.nix index 28ef7ced1..ac7fc9871 100644 --- a/nix/distribution.nix +++ b/nix/distribution.nix @@ -1,37 +1,33 @@ +{ inputs, self, ... }: { - inputs, - self, - ... -}: { - perSystem = { - lib, - pkgs, - ... - }: { - packages = let - ourPackages = lib.fix (final: self.overlays.default final pkgs); - in { - inherit - (ourPackages) - prismlauncher-unwrapped - prismlauncher - ; - default = ourPackages.prismlauncher; + perSystem = + { lib, pkgs, ... }: + { + packages = + let + ourPackages = lib.fix (final: self.overlays.default final pkgs); + in + { + inherit (ourPackages) prismlauncher-unwrapped prismlauncher; + default = ourPackages.prismlauncher; + }; }; - }; flake = { - overlays.default = final: prev: let - version = builtins.substring 0 8 self.lastModifiedDate or "dirty"; - in { - prismlauncher-unwrapped = prev.callPackage ./pkg { - inherit (inputs) libnbtplusplus; - inherit version; - }; + overlays.default = + final: prev: + let + version = builtins.substring 0 8 self.lastModifiedDate or "dirty"; + in + { + prismlauncher-unwrapped = prev.callPackage ./pkg { + inherit (inputs) libnbtplusplus; + inherit version; + }; - prismlauncher = prev.qt6Packages.callPackage ./pkg/wrapper.nix { - inherit (final) prismlauncher-unwrapped; + prismlauncher = prev.qt6Packages.callPackage ./pkg/wrapper.nix { + inherit (final) prismlauncher-unwrapped; + }; }; - }; }; } diff --git a/nix/pkg/default.nix b/nix/pkg/default.nix index f3ff3789c..a5a57eaf0 100644 --- a/nix/pkg/default.nix +++ b/nix/pkg/default.nix @@ -18,16 +18,19 @@ version, libnbtplusplus, }: + assert lib.assertMsg ( gamemodeSupport -> stdenv.isLinux ) "gamemodeSupport is only available on Linux."; - stdenv.mkDerivation { - pname = "prismlauncher-unwrapped"; - inherit version; - src = lib.fileset.toSource { - root = ../../.; - fileset = lib.fileset.unions (map (fileName: ../../${fileName}) [ +stdenv.mkDerivation { + pname = "prismlauncher-unwrapped"; + inherit version; + + src = lib.fileset.toSource { + root = ../../.; + fileset = lib.fileset.unions ( + map (fileName: ../../${fileName}) [ "buildconfig" "cmake" "launcher" @@ -36,71 +39,70 @@ assert lib.assertMsg ( "tests" "COPYING.md" "CMakeLists.txt" - ]); - }; + ] + ); + }; - postUnpack = '' - rm -rf source/libraries/libnbtplusplus - ln -s ${libnbtplusplus} source/libraries/libnbtplusplus - ''; + postUnpack = '' + rm -rf source/libraries/libnbtplusplus + ln -s ${libnbtplusplus} source/libraries/libnbtplusplus + ''; - nativeBuildInputs = [ - cmake - ninja - extra-cmake-modules - jdk17 - stripJavaArchivesHook + nativeBuildInputs = [ + cmake + ninja + extra-cmake-modules + jdk17 + stripJavaArchivesHook + ]; + + buildInputs = + [ + cmark + ghc_filesystem + kdePackages.qtbase + kdePackages.qtnetworkauth + kdePackages.quazip + tomlplusplus + zlib + ] + ++ lib.optionals stdenv.isDarwin [ darwin.apple_sdk.frameworks.Cocoa ] + ++ lib.optional gamemodeSupport gamemode; + + hardeningEnable = lib.optionals stdenv.isLinux [ "pie" ]; + + cmakeFlags = + [ (lib.cmakeFeature "Launcher_BUILD_PLATFORM" "nixpkgs") ] + ++ lib.optionals (msaClientID != null) [ + (lib.cmakeFeature "Launcher_MSA_CLIENT_ID" (toString msaClientID)) + ] + ++ lib.optionals (lib.versionOlder kdePackages.qtbase.version "6") [ + (lib.cmakeFeature "Launcher_QT_VERSION_MAJOR" "5") + ] + ++ lib.optionals stdenv.isDarwin [ + # we wrap our binary manually + (lib.cmakeFeature "INSTALL_BUNDLE" "nodeps") + # disable built-in updater + (lib.cmakeFeature "MACOSX_SPARKLE_UPDATE_FEED_URL" "''") + (lib.cmakeFeature "CMAKE_INSTALL_PREFIX" "${placeholder "out"}/Applications/") ]; - buildInputs = - [ - cmark - ghc_filesystem - kdePackages.qtbase - kdePackages.qtnetworkauth - kdePackages.quazip - tomlplusplus - zlib - ] - ++ lib.optionals stdenv.isDarwin [darwin.apple_sdk.frameworks.Cocoa] - ++ lib.optional gamemodeSupport gamemode; + dontWrapQtApps = true; - hardeningEnable = lib.optionals stdenv.isLinux ["pie"]; - - cmakeFlags = - [ - (lib.cmakeFeature "Launcher_BUILD_PLATFORM" "nixpkgs") - ] - ++ lib.optionals (msaClientID != null) [ - (lib.cmakeFeature "Launcher_MSA_CLIENT_ID" (toString msaClientID)) - ] - ++ lib.optionals (lib.versionOlder kdePackages.qtbase.version "6") [ - (lib.cmakeFeature "Launcher_QT_VERSION_MAJOR" "5") - ] - ++ lib.optionals stdenv.isDarwin [ - # we wrap our binary manually - (lib.cmakeFeature "INSTALL_BUNDLE" "nodeps") - # disable built-in updater - (lib.cmakeFeature "MACOSX_SPARKLE_UPDATE_FEED_URL" "''") - (lib.cmakeFeature "CMAKE_INSTALL_PREFIX" "${placeholder "out"}/Applications/") - ]; - - dontWrapQtApps = true; - - meta = { - description = "Free, open source launcher for Minecraft"; - longDescription = '' - Allows you to have multiple, separate instances of Minecraft (each with - their own mods, texture packs, saves, etc) and helps you manage them and - their associated options with a simple interface. - ''; - homepage = "https://prismlauncher.org/"; - license = lib.licenses.gpl3Only; - maintainers = with lib.maintainers; [ - Scrumplex - getchoo - ]; - mainProgram = "prismlauncher"; - platforms = lib.platforms.linux ++ lib.platforms.darwin; - }; - } + meta = { + description = "Free, open source launcher for Minecraft"; + longDescription = '' + Allows you to have multiple, separate instances of Minecraft (each with + their own mods, texture packs, saves, etc) and helps you manage them and + their associated options with a simple interface. + ''; + homepage = "https://prismlauncher.org/"; + license = lib.licenses.gpl3Only; + maintainers = with lib.maintainers; [ + Scrumplex + getchoo + ]; + mainProgram = "prismlauncher"; + platforms = lib.platforms.linux ++ lib.platforms.darwin; + }; +} diff --git a/nix/pkg/wrapper.nix b/nix/pkg/wrapper.nix index e7516397e..5632d483b 100644 --- a/nix/pkg/wrapper.nix +++ b/nix/pkg/wrapper.nix @@ -22,8 +22,8 @@ udev, vulkan-loader, xorg, - additionalLibs ? [], - additionalPrograms ? [], + additionalLibs ? [ ], + additionalPrograms ? [ ], controllerSupport ? stdenv.isLinux, gamemodeSupport ? stdenv.isLinux, jdks ? [ @@ -42,55 +42,60 @@ # itself can take slightly longer to start withWaylandGLFW ? false, }: + assert lib.assertMsg ( controllerSupport -> stdenv.isLinux ) "controllerSupport only has an effect on Linux."; + assert lib.assertMsg ( textToSpeechSupport -> stdenv.isLinux ) "textToSpeechSupport only has an effect on Linux."; + assert lib.assertMsg ( withWaylandGLFW -> stdenv.isLinux -) "withWaylandGLFW is only available on Linux."; let - prismlauncher' = prismlauncher-unwrapped.override {inherit msaClientID gamemodeSupport;}; +) "withWaylandGLFW is only available on Linux."; + +let + prismlauncher' = prismlauncher-unwrapped.override { inherit msaClientID gamemodeSupport; }; in - symlinkJoin { - name = "prismlauncher-${prismlauncher'.version}"; +symlinkJoin { + name = "prismlauncher-${prismlauncher'.version}"; - paths = [prismlauncher']; + paths = [ prismlauncher' ]; - nativeBuildInputs = - [kdePackages.wrapQtAppsHook] - # purposefully using a shell wrapper here for variable expansion - # see https://github.com/NixOS/nixpkgs/issues/172583 - ++ lib.optional withWaylandGLFW makeWrapper; + nativeBuildInputs = + [ kdePackages.wrapQtAppsHook ] + # purposefully using a shell wrapper here for variable expansion + # see https://github.com/NixOS/nixpkgs/issues/172583 + ++ lib.optional withWaylandGLFW makeWrapper; - buildInputs = - [ - kdePackages.qtbase - kdePackages.qtsvg - ] - ++ lib.optional ( - lib.versionAtLeast kdePackages.qtbase.version "6" && stdenv.isLinux - ) - kdePackages.qtwayland; + buildInputs = + [ + kdePackages.qtbase + kdePackages.qtsvg + ] + ++ lib.optional ( + lib.versionAtLeast kdePackages.qtbase.version "6" && stdenv.isLinux + ) kdePackages.qtwayland; - env = { - waylandPreExec = lib.optionalString withWaylandGLFW '' - if [ -n "$WAYLAND_DISPLAY" ]; then - export LD_LIBRARY_PATH=${lib.getLib glfw-wayland-minecraft}/lib:"$LD_LIBRARY_PATH" - fi - ''; - }; + env = { + waylandPreExec = lib.optionalString withWaylandGLFW '' + if [ -n "$WAYLAND_DISPLAY" ]; then + export LD_LIBRARY_PATH=${lib.getLib glfw-wayland-minecraft}/lib:"$LD_LIBRARY_PATH" + fi + ''; + }; - postBuild = - lib.optionalString withWaylandGLFW '' - qtWrapperArgs+=(--run "$waylandPreExec") - '' - + '' - wrapQtAppsHook - ''; + postBuild = + lib.optionalString withWaylandGLFW '' + qtWrapperArgs+=(--run "$waylandPreExec") + '' + + '' + wrapQtAppsHook + ''; - qtWrapperArgs = let + qtWrapperArgs = + let runtimeLibs = [ # lwjgl @@ -115,31 +120,28 @@ in ++ lib.optional controllerSupport libusb1 ++ additionalLibs; - runtimePrograms = - [ - glxinfo - pciutils # need lspci - xorg.xrandr # needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128 - ] - ++ additionalPrograms; + runtimePrograms = [ + glxinfo + pciutils # need lspci + xorg.xrandr # needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128 + ] ++ additionalPrograms; in - ["--prefix PRISMLAUNCHER_JAVA_PATHS : ${lib.makeSearchPath "bin/java" jdks}"] - ++ lib.optionals stdenv.isLinux [ - "--set LD_LIBRARY_PATH ${addOpenGLRunpath.driverLink}/lib:${lib.makeLibraryPath runtimeLibs}" - "--prefix PATH : ${lib.makeBinPath runtimePrograms}" - ]; + [ "--prefix PRISMLAUNCHER_JAVA_PATHS : ${lib.makeSearchPath "bin/java" jdks}" ] + ++ lib.optionals stdenv.isLinux [ + "--set LD_LIBRARY_PATH ${addOpenGLRunpath.driverLink}/lib:${lib.makeLibraryPath runtimeLibs}" + "--prefix PATH : ${lib.makeBinPath runtimePrograms}" + ]; - meta = { - inherit - (prismlauncher'.meta) - description - longDescription - homepage - changelog - license - maintainers - mainProgram - platforms - ; - }; - } + meta = { + inherit (prismlauncher'.meta) + description + longDescription + homepage + changelog + license + maintainers + mainProgram + platforms + ; + }; +} From 7a83d0cea03648bd6cefc46f454f1166773aa87f Mon Sep 17 00:00:00 2001 From: seth Date: Tue, 20 Aug 2024 01:47:03 -0400 Subject: [PATCH 123/616] ci(nix): drop pre-commit-hooks Signed-off-by: seth --- flake.lock | 51 +-------------------------------------------------- flake.nix | 38 ++++++++++++++++++++++---------------- nix/dev.nix | 36 ++---------------------------------- 3 files changed, 25 insertions(+), 100 deletions(-) diff --git a/flake.lock b/flake.lock index 77e707692..3e9cd8e42 100644 --- a/flake.lock +++ b/flake.lock @@ -36,27 +36,6 @@ "type": "github" } }, - "gitignore": { - "inputs": { - "nixpkgs": [ - "pre-commit-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1709087332, - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, "libnbtplusplus": { "flake": false, "locked": { @@ -89,40 +68,12 @@ "type": "github" } }, - "pre-commit-hooks": { - "inputs": { - "flake-compat": [ - "flake-compat" - ], - "gitignore": "gitignore", - "nixpkgs": [ - "nixpkgs" - ], - "nixpkgs-stable": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1723803910, - "narHash": "sha256-yezvUuFiEnCFbGuwj/bQcqg7RykIEqudOy/RBrId0pc=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "bfef0ada09e2c8ac55bbcd0831bd0c9d42e651ba", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, "root": { "inputs": { "flake-compat": "flake-compat", "flake-parts": "flake-parts", "libnbtplusplus": "libnbtplusplus", - "nixpkgs": "nixpkgs", - "pre-commit-hooks": "pre-commit-hooks" + "nixpkgs": "nixpkgs" } } }, diff --git a/flake.nix b/flake.nix index 1e3e36d66..d64874e30 100644 --- a/flake.nix +++ b/flake.nix @@ -12,30 +12,36 @@ url = "github:hercules-ci/flake-parts"; inputs.nixpkgs-lib.follows = "nixpkgs"; }; - pre-commit-hooks = { - url = "github:cachix/pre-commit-hooks.nix"; - inputs = { - nixpkgs.follows = "nixpkgs"; - nixpkgs-stable.follows = "nixpkgs"; - flake-compat.follows = "flake-compat"; - }; - }; - flake-compat = { - url = "github:edolstra/flake-compat"; - flake = false; - }; libnbtplusplus = { url = "github:PrismLauncher/libnbtplusplus"; flake = false; }; + + /* + Inputs below this are optional and can be removed + + ``` + { + inputs.prismlauncher = { + url = "github:PrismLauncher/PrismLauncher"; + inputs = { + flake-compat.follows = ""; + }; + }; + } + ``` + */ + + flake-compat = { + url = "github:edolstra/flake-compat"; + flake = false; + }; }; outputs = - { flake-parts, pre-commit-hooks, ... }@inputs: - flake-parts.lib.mkFlake { inherit inputs; } { + inputs: + inputs.flake-parts.lib.mkFlake { inherit inputs; } { imports = [ - pre-commit-hooks.flakeModule - ./nix/dev.nix ./nix/distribution.nix ]; diff --git a/nix/dev.nix b/nix/dev.nix index 2ae3c845b..32b1bd92b 100644 --- a/nix/dev.nix +++ b/nix/dev.nix @@ -1,41 +1,9 @@ { perSystem = + { pkgs, self', ... }: { - config, - lib, - pkgs, - ... - }: - { - pre-commit.settings = { - hooks = { - markdownlint.enable = true; - - deadnix.enable = true; - nil.enable = true; - nixfmt.enable = true; - - clang-format = { - enable = true; - types_or = [ - "c" - "c++" - "java" - "json" - "objective-c" - ]; - }; - }; - - tools.clang-tools = lib.mkForce pkgs.clang-tools_18; - }; - devShells.default = pkgs.mkShell { - shellHook = '' - ${config.pre-commit.installationScript} - ''; - - inputsFrom = [ config.packages.prismlauncher-unwrapped ]; + inputsFrom = [ self'.packages.prismlauncher-unwrapped ]; buildInputs = with pkgs; [ ccache ninja From 271c38bc568bc348186fb5c06a3f07f7646b2f24 Mon Sep 17 00:00:00 2001 From: seth Date: Tue, 20 Aug 2024 01:59:33 -0400 Subject: [PATCH 124/616] doc(nix): update package names and params Signed-off-by: seth --- nix/README.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/nix/README.md b/nix/README.md index 8a0b9ba26..2daeb73d3 100644 --- a/nix/README.md +++ b/nix/README.md @@ -197,18 +197,20 @@ nix-env -iA prismlauncher.prismlauncher Both Nixpkgs and this repository offer the following packages: -- `prismlauncher` - Preferred build using Qt 6 -- `prismlauncher-qt5` - Legacy build using Qt 5 (i.e. for Qt 5 theming support) - -Both of these packages also have `-unwrapped` counterparts, that are not wrapped and can therefore be customized even further than what the wrapper packages offer. +- `prismlauncher` - The preferred build, wrapped with everything necessary to run the launcher and Minecraft +- `prismlauncher-unwrapped` - A minimal build that allows for advanced customization of the launcher's runtime environment ### Customizing wrapped packages -The wrapped packages (`prismlauncher` and `prismlauncher-qt5`) offer some build parameters to further customize the launcher's environment. +The wrapped package (`prismlauncher`) offers some build parameters to further customize the launcher's environment. The following parameters can be overridden: -- `msaClientID` (default: `null`, requires full rebuild!) Client ID used for Microsoft Authentication -- `gamemodeSupport` (default: `true`) Turn on/off support for [Feral GameMode](https://github.com/FeralInteractive/gamemode) -- `jdks` (default: `[ jdk17 jdk8 ]`) Java runtimes added to `PRISMLAUNCHER_JAVA_PATHS` variable - `additionalLibs` (default: `[ ]`) Additional libraries that will be added to `LD_LIBRARY_PATH` +- `additionalPrograms` (default: `[ ]`) Additional libraries that will be added to `PATH` +- `controllerSupport` (default: `isLinux`) Turn on/off support for controllers on Linux (macOS will always have this) +- `gamemodeSupport` (default: `isLinux`) Turn on/off support for [Feral GameMode](https://github.com/FeralInteractive/gamemode) on Linux +- `jdks` (default: `[ jdk21 jdk17 jdk8 ]`) Java runtimes added to `PRISMLAUNCHER_JAVA_PATHS` variable +- `msaClientID` (default: `null`, requires full rebuild!) Client ID used for Microsoft Authentication +- `textToSpeechSupport` (default: `isLinux`) Turn on/off support for text-to-speech on Linux (macOS will always have this) +- `withWaylandGLFW` (default: `isLinux`) Build with support for native Wayland via a custom GLFW From e85b3647481f4af5638673837814c2f8835e4054 Mon Sep 17 00:00:00 2001 From: seth Date: Tue, 20 Aug 2024 02:04:05 -0400 Subject: [PATCH 125/616] refactor(nix): use `final` in overlay this allows to implictly pass `prismlauncher-unwrapped` it won't have an effect on our package set as directly inheriting from the scope we create filters out the extra attributes usually introduced with a scope Signed-off-by: seth --- nix/distribution.nix | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/nix/distribution.nix b/nix/distribution.nix index ac7fc9871..74e77da1b 100644 --- a/nix/distribution.nix +++ b/nix/distribution.nix @@ -5,7 +5,7 @@ { packages = let - ourPackages = lib.fix (final: self.overlays.default final pkgs); + ourPackages = lib.makeScope pkgs.newScope (final: self.overlays.default final pkgs); in { inherit (ourPackages) prismlauncher-unwrapped prismlauncher; @@ -25,9 +25,7 @@ inherit version; }; - prismlauncher = prev.qt6Packages.callPackage ./pkg/wrapper.nix { - inherit (final) prismlauncher-unwrapped; - }; + prismlauncher = final.callPackage ./pkg/wrapper.nix { }; }; }; } From 0ae421c265e665fc6621337b0c1216e548293690 Mon Sep 17 00:00:00 2001 From: seth Date: Tue, 20 Aug 2024 02:58:55 -0400 Subject: [PATCH 126/616] chore(nix): drop flake-parts The primary goals here include making the flake easier to contribute to by having it follow the standard boilerplate, while also limiting the size of our flake.lock to lower the chance of duplicate inputs for users Signed-off-by: seth --- flake.lock | 21 -------- flake.nix | 75 ++++++++++++++++++++------ nix/README.md | 10 +++- nix/dev.nix | 15 ------ nix/distribution.nix | 31 ----------- nix/{pkg/default.nix => unwrapped.nix} | 4 +- nix/{pkg => }/wrapper.nix | 0 7 files changed, 69 insertions(+), 87 deletions(-) delete mode 100644 nix/dev.nix delete mode 100644 nix/distribution.nix rename nix/{pkg/default.nix => unwrapped.nix} (97%) rename nix/{pkg => }/wrapper.nix (100%) diff --git a/flake.lock b/flake.lock index 3e9cd8e42..7d21aad14 100644 --- a/flake.lock +++ b/flake.lock @@ -16,26 +16,6 @@ "type": "github" } }, - "flake-parts": { - "inputs": { - "nixpkgs-lib": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1722555600, - "narHash": "sha256-XOQkdLafnb/p9ij77byFQjDf5m5QYl9b2REiVClC+x4=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "8471fe90ad337a8074e957b69ca4d0089218391d", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, "libnbtplusplus": { "flake": false, "locked": { @@ -71,7 +51,6 @@ "root": { "inputs": { "flake-compat": "flake-compat", - "flake-parts": "flake-parts", "libnbtplusplus": "libnbtplusplus", "nixpkgs": "nixpkgs" } diff --git a/flake.nix b/flake.nix index d64874e30..24227aca7 100644 --- a/flake.nix +++ b/flake.nix @@ -8,10 +8,7 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - flake-parts = { - url = "github:hercules-ci/flake-parts"; - inputs.nixpkgs-lib.follows = "nixpkgs"; - }; + libnbtplusplus = { url = "github:PrismLauncher/libnbtplusplus"; flake = false; @@ -39,18 +36,64 @@ }; outputs = - inputs: - inputs.flake-parts.lib.mkFlake { inherit inputs; } { - imports = [ - ./nix/dev.nix - ./nix/distribution.nix - ]; + { + self, + nixpkgs, + libnbtplusplus, + ... + }: + let + inherit (nixpkgs) lib; - systems = [ - "x86_64-linux" - "aarch64-linux" - "x86_64-darwin" - "aarch64-darwin" - ]; + # While we only officially support aarch and x86_64 on Linux and MacOS, + # we expose a reasonable amount of other systems for users who want to + # build for most exotic platforms + systems = lib.systems.flakeExposed; + + forAllSystems = lib.genAttrs systems; + nixpkgsFor = forAllSystems (system: nixpkgs.legacyPackages.${system}); + in + { + devShells = forAllSystems ( + system: + let + pkgs = nixpkgsFor.${system}; + in + { + default = pkgs.mkShell { + inputsFrom = [ self.packages.${system}.prismlauncher-unwrapped ]; + buildInputs = with pkgs; [ + ccache + ninja + ]; + }; + } + ); + + formatter = forAllSystems (system: nixpkgsFor.${system}.nixfmt-rfc-style); + + overlays.default = + final: prev: + let + version = builtins.substring 0 8 self.lastModifiedDate or "dirty"; + in + { + prismlauncher-unwrapped = prev.callPackage ./nix/unwrapped.nix { inherit libnbtplusplus version; }; + + prismlauncher = final.callPackage ./nix/wrapper.nix { }; + }; + + packages = forAllSystems ( + system: + let + pkgs = nixpkgsFor.${system}; + + prismPackages = lib.makeScope pkgs.newScope (final: self.overlays.default final pkgs); + in + { + inherit (prismPackages) prismlauncher-unwrapped prismlauncher; + default = prismPackages.prismlauncher; + } + ); }; } diff --git a/nix/README.md b/nix/README.md index 2daeb73d3..d6068a968 100644 --- a/nix/README.md +++ b/nix/README.md @@ -44,11 +44,14 @@ Example: # Optional: Override the nixpkgs input of prismlauncher to use the same revision as the rest of your flake # Note that overriding any input of prismlauncher may break reproducibility # inputs.nixpkgs.follows = "nixpkgs"; + + # This is not required for Flakes + inputs.flake-compat.follows = ""; }; }; outputs = - { nixpkgs, prismlauncher }: + { nixpkgs, prismlauncher, ... }: { nixosConfigurations.foo = nixpkgs.lib.nixosSystem { modules = [ @@ -85,11 +88,14 @@ Example: # Optional: Override the nixpkgs input of prismlauncher to use the same revision as the rest of your flake # Note that overriding any input of prismlauncher may break reproducibility # inputs.nixpkgs.follows = "nixpkgs"; + + # This is not required for Flakes + inputs.flake-compat.follows = ""; }; }; outputs = - { nixpkgs, prismlauncher }: + { nixpkgs, prismlauncher, ... }: { nixosConfigurations.foo = nixpkgs.lib.nixosSystem { modules = [ diff --git a/nix/dev.nix b/nix/dev.nix deleted file mode 100644 index 32b1bd92b..000000000 --- a/nix/dev.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ - perSystem = - { pkgs, self', ... }: - { - devShells.default = pkgs.mkShell { - inputsFrom = [ self'.packages.prismlauncher-unwrapped ]; - buildInputs = with pkgs; [ - ccache - ninja - ]; - }; - - formatter = pkgs.nixfmt-rfc-style; - }; -} diff --git a/nix/distribution.nix b/nix/distribution.nix deleted file mode 100644 index 74e77da1b..000000000 --- a/nix/distribution.nix +++ /dev/null @@ -1,31 +0,0 @@ -{ inputs, self, ... }: -{ - perSystem = - { lib, pkgs, ... }: - { - packages = - let - ourPackages = lib.makeScope pkgs.newScope (final: self.overlays.default final pkgs); - in - { - inherit (ourPackages) prismlauncher-unwrapped prismlauncher; - default = ourPackages.prismlauncher; - }; - }; - - flake = { - overlays.default = - final: prev: - let - version = builtins.substring 0 8 self.lastModifiedDate or "dirty"; - in - { - prismlauncher-unwrapped = prev.callPackage ./pkg { - inherit (inputs) libnbtplusplus; - inherit version; - }; - - prismlauncher = final.callPackage ./pkg/wrapper.nix { }; - }; - }; -} diff --git a/nix/pkg/default.nix b/nix/unwrapped.nix similarity index 97% rename from nix/pkg/default.nix rename to nix/unwrapped.nix index a5a57eaf0..f007c05b8 100644 --- a/nix/pkg/default.nix +++ b/nix/unwrapped.nix @@ -28,9 +28,9 @@ stdenv.mkDerivation { inherit version; src = lib.fileset.toSource { - root = ../../.; + root = ../.; fileset = lib.fileset.unions ( - map (fileName: ../../${fileName}) [ + map (fileName: ../${fileName}) [ "buildconfig" "cmake" "launcher" diff --git a/nix/pkg/wrapper.nix b/nix/wrapper.nix similarity index 100% rename from nix/pkg/wrapper.nix rename to nix/wrapper.nix From e29ea4efb08d01bf64948370810a7963e7b72c5f Mon Sep 17 00:00:00 2001 From: seth Date: Tue, 20 Aug 2024 03:16:32 -0400 Subject: [PATCH 127/616] build(nix): add formatting checks Signed-off-by: seth --- flake.nix | 21 +++++++++++++++++---- nix/checks.nix | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 nix/checks.nix diff --git a/flake.nix b/flake.nix index 24227aca7..2fe36902a 100644 --- a/flake.nix +++ b/flake.nix @@ -54,6 +54,14 @@ nixpkgsFor = forAllSystems (system: nixpkgs.legacyPackages.${system}); in { + checks = forAllSystems ( + system: + let + checks' = nixpkgsFor.${system}.callPackage ./nix/checks.nix { inherit self; }; + in + lib.filterAttrs (_: lib.isDerivation) checks' + ); + devShells = forAllSystems ( system: let @@ -88,12 +96,17 @@ let pkgs = nixpkgsFor.${system}; + # Build a scope from our overlay prismPackages = lib.makeScope pkgs.newScope (final: self.overlays.default final pkgs); + + # Grab our packages from it and set the default + packages = { + inherit (prismPackages) prismlauncher-unwrapped prismlauncher; + default = prismPackages.prismlauncher; + }; in - { - inherit (prismPackages) prismlauncher-unwrapped prismlauncher; - default = prismPackages.prismlauncher; - } + # Only output them if they're available on the current system + lib.filterAttrs (_: lib.meta.availableOn pkgs.stdenv.hostPlatform) packages ); }; } diff --git a/nix/checks.nix b/nix/checks.nix new file mode 100644 index 000000000..40a2e272f --- /dev/null +++ b/nix/checks.nix @@ -0,0 +1,42 @@ +{ + runCommand, + deadnix, + llvmPackages_18, + markdownlint-cli, + nixfmt-rfc-style, + statix, + self, +}: +{ + formatting = + runCommand "check-formatting" + { + nativeBuildInputs = [ + deadnix + llvmPackages_18.clang-tools + markdownlint-cli + nixfmt-rfc-style + statix + ]; + } + '' + cd ${self} + + echo "Running clang-format...." + clang-format -i --style='file' --Werror */**.{c,cc,cpp,h,hh,hpp} + + echo "Running deadnix..." + deadnix --fail + + echo "Running markdownlint..." + markdownlint --dot . + + echo "Running nixfmt..." + nixfmt --check . + + echo "Running statix" + statix check . + + touch $out + ''; +} From 13eedbb7de4f6bbc80308aa59745720c3cf7c33d Mon Sep 17 00:00:00 2001 From: seth Date: Tue, 20 Aug 2024 03:41:53 -0400 Subject: [PATCH 128/616] doc(nix): prefer `packages` output overlays can cause issues we don't run into upstream, especially when used on stable channels for example. preferring the pure `packages` output also encourages the use of our binary cache by users, who probably don't like building the launcher all too much Signed-off-by: seth --- nix/README.md | 136 ++++++++++++++++++++++++++------------------------ 1 file changed, 72 insertions(+), 64 deletions(-) diff --git a/nix/README.md b/nix/README.md index d6068a968..76cb8bf27 100644 --- a/nix/README.md +++ b/nix/README.md @@ -28,9 +28,9 @@ Example (NixOS): } ``` -### Using the overlay +### Installing the package directly -After adding `github:PrismLauncher/PrismLauncher` to your flake inputs, you can add the `default` overlay to your nixpkgs instance. +After adding `github:PrismLauncher/PrismLauncher` to your flake inputs, you can access the flake's `packages` output. Example: @@ -41,8 +41,58 @@ Example: prismlauncher = { url = "github:PrismLauncher/PrismLauncher"; + # Optional: Override the nixpkgs input of prismlauncher to use the same revision as the rest of your flake - # Note that overriding any input of prismlauncher may break reproducibility + # Note that this may break the reproducibility mentioned above, and you might not be able to access the binary cache + # + # inputs.nixpkgs.follows = "nixpkgs"; + + # This is not required for Flakes + inputs.flake-compat.follows = ""; + }; + }; + + outputs = + { nixpkgs, prismlauncher, ... }: + { + nixosConfigurations.foo = nixpkgs.lib.nixosSystem { + modules = [ + ./configuration.nix + + ( + { pkgs, ... }: + { + environment.systemPackages = [ prismlauncher.packages.${pkgs.system}.prismlauncher ]; + } + ) + ]; + }; + }; +} +``` + +### Using the overlay + +Alternatively, if you don't want to use our `packages` output, you can add our overlay to your nixpkgs instance. +This will ensure Prism is built with your system's packages. + +> [!WARNING] +> Depending on what revision of nixpkgs your system uses, this may result in binaries that differ from the above `packages` output +> If this is the case, you will not be able to use the binary cache + +Example: + +```nix +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + prismlauncher = { + url = "github:PrismLauncher/PrismLauncher"; + + # Optional: Override the nixpkgs input of prismlauncher to use the same revision as the rest of your flake + # Note that this may break the reproducibility mentioned above, and you might not be able to access the binary cache + # # inputs.nixpkgs.follows = "nixpkgs"; # This is not required for Flakes @@ -71,48 +121,6 @@ Example: } ``` -### Installing the package directly - -Alternatively, if you don't want to use an overlay, you can install Prism Launcher directly by installing the `prismlauncher` package. -This way the installed package is fully reproducible. - -Example: - -```nix -{ - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - - prismlauncher = { - url = "github:PrismLauncher/PrismLauncher"; - # Optional: Override the nixpkgs input of prismlauncher to use the same revision as the rest of your flake - # Note that overriding any input of prismlauncher may break reproducibility - # inputs.nixpkgs.follows = "nixpkgs"; - - # This is not required for Flakes - inputs.flake-compat.follows = ""; - }; - }; - - outputs = - { nixpkgs, prismlauncher, ... }: - { - nixosConfigurations.foo = nixpkgs.lib.nixosSystem { - modules = [ - ./configuration.nix - - ( - { pkgs, ... }: - { - environment.systemPackages = [ prismlauncher.packages.${pkgs.system}.prismlauncher ]; - } - ) - ]; - }; - }; -} -``` - ### Installing the package ad-hoc (`nix shell`, `nix run`, etc.) You can simply call the default package of this flake. @@ -148,12 +156,30 @@ Example (NixOS): } ``` -### Using the overlay (`fetchTarball`) +### Installing the package directly (`fetchTarball`) We use flake-compat to allow using this Flake on a system that doesn't use flakes. Example: +```nix +{ pkgs, ... }: +{ + environment.systemPackages = [ + (import ( + builtins.fetchTarball "https://github.com/PrismLauncher/PrismLauncher/archive/develop.tar.gz" + )).packages.${pkgs.system}.prismlauncher + ]; +} +``` + +### Using the overlay (`fetchTarball`) + +Alternatively, if you don't want to use our `packages` output, you can add our overlay to your instance of nixpkgs. +This results in Prism using your system's libraries + +Example: + ```nix { pkgs, ... }: { @@ -167,24 +193,6 @@ Example: } ``` -### Installing the package directly (`fetchTarball`) - -Alternatively, if you don't want to use an overlay, you can install Prism Launcher directly by installing the `prismlauncher` package. -This way the installed package is fully reproducible. - -Example: - -```nix -{ pkgs, ... }: -{ - environment.systemPackages = [ - (import ( - builtins.fetchTarball "https://github.com/PrismLauncher/PrismLauncher/archive/develop.tar.gz" - )).packages.${pkgs.system}.prismlauncher - ]; -} -``` - ### Installing the package ad-hoc (`nix-env`) You can add this repository as a channel and install its packages that way. From a49a58bc4571f87f42f45bb9eeb1a957d5d12331 Mon Sep 17 00:00:00 2001 From: seth Date: Wed, 21 Aug 2024 03:42:40 -0400 Subject: [PATCH 129/616] Revert "refactor(nix): nix-filter -> lib.fileset" This reverts commit 8312713dc2274670db6f9167125af8a27c2fd8a6. See nix#9428. Path coercion like `"${./.}"` in flakes causes the path to be copied to the store twice; using the `self` argument works around this. However, as `lib.fileset` doesn't support using `self`, so we need to go back to `nix-filter` Signed-off-by: seth --- flake.lock | 16 ++++++++++++++++ flake.nix | 12 +++++++++++- nix/unwrapped.nix | 28 ++++++++++++++-------------- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/flake.lock b/flake.lock index 7d21aad14..3210dc4e2 100644 --- a/flake.lock +++ b/flake.lock @@ -32,6 +32,21 @@ "type": "github" } }, + "nix-filter": { + "locked": { + "lastModified": 1710156097, + "narHash": "sha256-1Wvk8UP7PXdf8bCCaEoMnOT1qe5/Duqgj+rL8sRQsSM=", + "owner": "numtide", + "repo": "nix-filter", + "rev": "3342559a24e85fc164b295c3444e8a139924675b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nix-filter", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1723637854, @@ -52,6 +67,7 @@ "inputs": { "flake-compat": "flake-compat", "libnbtplusplus": "libnbtplusplus", + "nix-filter": "nix-filter", "nixpkgs": "nixpkgs" } } diff --git a/flake.nix b/flake.nix index 2fe36902a..987fc0eda 100644 --- a/flake.nix +++ b/flake.nix @@ -14,6 +14,8 @@ flake = false; }; + nix-filter.url = "github:numtide/nix-filter"; + /* Inputs below this are optional and can be removed @@ -40,6 +42,7 @@ self, nixpkgs, libnbtplusplus, + nix-filter, ... }: let @@ -86,7 +89,14 @@ version = builtins.substring 0 8 self.lastModifiedDate or "dirty"; in { - prismlauncher-unwrapped = prev.callPackage ./nix/unwrapped.nix { inherit libnbtplusplus version; }; + prismlauncher-unwrapped = prev.callPackage ./nix/unwrapped.nix { + inherit + libnbtplusplus + nix-filter + self + version + ; + }; prismlauncher = final.callPackage ./nix/wrapper.nix { }; }; diff --git a/nix/unwrapped.nix b/nix/unwrapped.nix index f007c05b8..f75acf1de 100644 --- a/nix/unwrapped.nix +++ b/nix/unwrapped.nix @@ -10,6 +10,8 @@ jdk17, kdePackages, ninja, + nix-filter, + self, stripJavaArchivesHook, tomlplusplus, zlib, @@ -27,20 +29,18 @@ stdenv.mkDerivation { pname = "prismlauncher-unwrapped"; inherit version; - src = lib.fileset.toSource { - root = ../.; - fileset = lib.fileset.unions ( - map (fileName: ../${fileName}) [ - "buildconfig" - "cmake" - "launcher" - "libraries" - "program_info" - "tests" - "COPYING.md" - "CMakeLists.txt" - ] - ); + src = nix-filter.lib { + root = self; + include = [ + "buildconfig" + "cmake" + "launcher" + "libraries" + "program_info" + "tests" + ../COPYING.md + ../CMakeLists.txt + ]; }; postUnpack = '' From 99ecab01fc8e5217c95c45263a224e92bf5566ed Mon Sep 17 00:00:00 2001 From: seth Date: Wed, 21 Aug 2024 04:02:48 -0400 Subject: [PATCH 130/616] ci(garnix): explicitly declare systems as we now create outputs for each system in `lib.systems.flakeExposed`, we should ensure garnix only builds the systems we officially support dev shells are also no longer built as they really don't need to be "built" on the developer's machine in any case; everything should be cached Signed-off-by: seth --- garnix.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/garnix.yaml b/garnix.yaml index 6cf8f7214..a7c1b48a9 100644 --- a/garnix.yaml +++ b/garnix.yaml @@ -1,7 +1,10 @@ builds: exclude: + # Currently broken on Garnix's end - "*.x86_64-darwin.*" include: - "checks.x86_64-linux.*" - - "devShells.*.*" - - "packages.*.*" + - "packages.x86_64-linux.*" + - "packages.aarch64-linux.*" + - "packages.x86_64-darwin.*" + - "packages.aarch64-darwin.*" From da7cc529f05c5f2a7cd51d97c1865f70f62b9ec8 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 21 Aug 2024 14:54:47 +0300 Subject: [PATCH 131/616] Enable auto-detect java if java path is not set Signed-off-by: Trial97 --- launcher/Application.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index a40222b41..9cd0445e6 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -647,8 +647,9 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_settings->registerSetting("JvmArgs", ""); m_settings->registerSetting("IgnoreJavaCompatibility", false); m_settings->registerSetting("IgnoreJavaWizard", false); - m_settings->registerSetting("AutomaticJavaSwitch", false); - m_settings->registerSetting("AutomaticJavaDownload", false); + auto defaultEnableAutoJava = m_settings->get("JavaPath").toString().isEmpty(); + m_settings->registerSetting("AutomaticJavaSwitch", defaultEnableAutoJava); + m_settings->registerSetting("AutomaticJavaDownload", defaultEnableAutoJava); // Legacy settings m_settings->registerSetting("OnlineFixes", false); From 26ae6086855bdb4638c1033a03675df04eb4b852 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 21 Aug 2024 15:01:42 +0300 Subject: [PATCH 132/616] fix initial java dialog Signed-off-by: Trial97 --- launcher/ui/widgets/JavaSettingsWidget.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index fb90afe1d..bf58bf9f7 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -186,13 +186,9 @@ void JavaSettingsWidget::initialize() .arg(BuildConfig.LAUNCHER_DISPLAYNAME), QMessageBox::Question, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) ->exec(); - if (button == QMessageBox::Yes) { - m_autodetectJavaCheckBox->setChecked(true); - m_autodownloadCheckBox->setChecked(true); - } else { - m_autodetectJavaCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool()); - m_autodownloadCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool() && s->get("AutomaticJavaDownload").toBool()); - } + auto checked = button == QMessageBox::Yes; + m_autodetectJavaCheckBox->setChecked(checked); + m_autodownloadCheckBox->setChecked(checked); } } From cf914526bf5330600f3cadb9f4baddb5144af21f Mon Sep 17 00:00:00 2001 From: maskers <97827489+mskrss@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:59:51 +0300 Subject: [PATCH 133/616] add a warning about the log being too large Signed-off-by: maskers <97827489+mskrss@users.noreply.github.com> --- launcher/net/PasteUpload.cpp | 24 ----------------- launcher/ui/GuiUtil.cpp | 51 +++++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/launcher/net/PasteUpload.cpp b/launcher/net/PasteUpload.cpp index 953a0d722..c67d3b23c 100644 --- a/launcher/net/PasteUpload.cpp +++ b/launcher/net/PasteUpload.cpp @@ -49,29 +49,6 @@ #include "net/Logging.h" -constexpr int MaxMclogsLines = 25000; -constexpr int InitialMclogsLines = 10000; -constexpr int FinalMclogsLines = 14900; - -QString truncateLogForMclogs(const QString& logContent) -{ - QStringList lines = logContent.split("\n"); - if (lines.size() > MaxMclogsLines) { - QString truncatedLog = lines.mid(0, InitialMclogsLines).join("\n"); - truncatedLog += - "\n\n\n\n\n\n\n\n\n\n" - "------------------------------------------------------------\n" - "--------------------- Log truncated by ---------------------\n" - "---------------------- Prism Launcher ----------------------\n" - "----- Middle portion omitted to fit mclo.gs size limits ----\n" - "------------------------------------------------------------\n" - "\n\n\n\n\n\n\n\n\n\n"; - truncatedLog += lines.mid(lines.size() - FinalMclogsLines, FinalMclogsLines).join("\n"); - return truncatedLog; - } - return logContent; -} - std::array PasteUpload::PasteTypes = { { { "0x0.st", "https://0x0.st", "" }, { "hastebin", "https://hst.sh", "/documents" }, { "paste.gg", "https://paste.gg", "/api/v1/pastes" }, @@ -121,7 +98,6 @@ void PasteUpload::executeTask() } case Mclogs: { QUrlQuery postData; - m_text = truncateLogForMclogs(m_text).toUtf8(); postData.addQueryItem("content", m_text); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); rep = APPLICATION->network()->post(request, postData.toString().toUtf8()); diff --git a/launcher/ui/GuiUtil.cpp b/launcher/ui/GuiUtil.cpp index 584a34710..3b0eccd02 100644 --- a/launcher/ui/GuiUtil.cpp +++ b/launcher/ui/GuiUtil.cpp @@ -51,11 +51,35 @@ #include #include "Application.h" +constexpr int MaxMclogsLines = 25000; +constexpr int InitialMclogsLines = 10000; +constexpr int FinalMclogsLines = 14900; + +QString truncateLogForMclogs(const QString& logContent) +{ + QStringList lines = logContent.split("\n"); + if (lines.size() > MaxMclogsLines) { + QString truncatedLog = lines.mid(0, InitialMclogsLines).join("\n"); + truncatedLog += + "\n\n\n\n\n\n\n\n\n\n" + "------------------------------------------------------------\n" + "--------------------- Log truncated by ---------------------\n" + "---------------------- Prism Launcher ----------------------\n" + "----- Middle portion omitted to fit mclo.gs size limits ----\n" + "------------------------------------------------------------\n" + "\n\n\n\n\n\n\n\n\n\n"; + truncatedLog += lines.mid(lines.size() - FinalMclogsLines, FinalMclogsLines).join("\n"); + return truncatedLog; + } + return logContent; +} + std::optional GuiUtil::uploadPaste(const QString& name, const QString& text, QWidget* parentWidget) { ProgressDialog dialog(parentWidget); auto pasteTypeSetting = static_cast(APPLICATION->settings()->get("PastebinType").toInt()); auto pasteCustomAPIBaseSetting = APPLICATION->settings()->get("PastebinCustomAPIBase").toString(); + bool shouldTruncate = false; { QUrl baseUrl; @@ -75,10 +99,35 @@ std::optional GuiUtil::uploadPaste(const QString& name, const QString& if (response != QMessageBox::Yes) return {}; + + if (baseUrl.toString() == "https://api.mclo.gs" && text.count("\n") > MaxMclogsLines) { + auto truncateResponse = + CustomMessageBox::selectable(parentWidget, QObject::tr("Confirm Truncate"), + QObject::tr("The log exceeds mclo.gs' limit: %1 lines (max %2).\n" + "Prism can keep the first %3 and last %4 lines, trimming the middle.\n\n" + "If you choose 'No', mclo.gs will only keep the first %2 lines, cutting off " + "potentially useful info like crashes at the end.\n\n" + "Proceed with Prism's truncation?") + .arg(text.count("\n")) + .arg(MaxMclogsLines) + .arg(InitialMclogsLines) + .arg(FinalMclogsLines), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); + + if (truncateResponse == QMessageBox::Yes) + shouldTruncate = true; + } } } - std::unique_ptr paste(new PasteUpload(parentWidget, text, pasteCustomAPIBaseSetting, pasteTypeSetting)); + QString textToUpload; + if (shouldTruncate) + textToUpload = truncateLogForMclogs(text); + else + textToUpload = text; + + std::unique_ptr paste(new PasteUpload(parentWidget, textToUpload, pasteCustomAPIBaseSetting, pasteTypeSetting)); dialog.execWithTask(paste.get()); if (!paste->wasSuccessful()) { From 99bd4a89373416cea641f1421d1082ff823eba2e Mon Sep 17 00:00:00 2001 From: maskers <97827489+maskersss@users.noreply.github.com> Date: Wed, 21 Aug 2024 19:42:35 +0300 Subject: [PATCH 134/616] Apply suggestions from code review Co-authored-by: Alexandru Ionut Tripon Signed-off-by: maskers <97827489+maskersss@users.noreply.github.com> --- launcher/ui/GuiUtil.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/launcher/ui/GuiUtil.cpp b/launcher/ui/GuiUtil.cpp index 3b0eccd02..de72a7d5d 100644 --- a/launcher/ui/GuiUtil.cpp +++ b/launcher/ui/GuiUtil.cpp @@ -115,17 +115,15 @@ std::optional GuiUtil::uploadPaste(const QString& name, const QString& QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ->exec(); - if (truncateResponse == QMessageBox::Yes) - shouldTruncate = true; + shouldTruncate = truncateResponse == QMessageBox::Yes; } } } - QString textToUpload; - if (shouldTruncate) + QString textToUpload = text; + if (shouldTruncate) { textToUpload = truncateLogForMclogs(text); - else - textToUpload = text; + } std::unique_ptr paste(new PasteUpload(parentWidget, textToUpload, pasteCustomAPIBaseSetting, pasteTypeSetting)); From 7472233033762eb5446cd5beefcc603f54d0296b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2024 17:22:09 +0000 Subject: [PATCH 135/616] chore(deps): update korthout/backport-action action to v3.1.0 --- .github/workflows/backport.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index d91d9507a..4146cddf4 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -25,7 +25,7 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} - name: Create backport PRs - uses: korthout/backport-action@v3.0.2 + uses: korthout/backport-action@v3.1.0 with: # Config README: https://github.com/korthout/backport-action#backport-action pull_description: |- From 65f852615247f6c1ba3cd81cf9e51ebc0220341b Mon Sep 17 00:00:00 2001 From: maskers <97827489+maskersss@users.noreply.github.com> Date: Wed, 21 Aug 2024 22:14:11 +0300 Subject: [PATCH 136/616] add a `Cancel` option Co-authored-by: Rachel Powers <508861+Ryex@users.noreply.github.com> Signed-off-by: maskers <97827489+maskersss@users.noreply.github.com> --- launcher/ui/GuiUtil.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/launcher/ui/GuiUtil.cpp b/launcher/ui/GuiUtil.cpp index de72a7d5d..cfc1715fc 100644 --- a/launcher/ui/GuiUtil.cpp +++ b/launcher/ui/GuiUtil.cpp @@ -112,9 +112,10 @@ std::optional GuiUtil::uploadPaste(const QString& name, const QString& .arg(MaxMclogsLines) .arg(InitialMclogsLines) .arg(FinalMclogsLines), - QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::No) ->exec(); + if (truncateResponse == QMessageBox::Cancel) { return {} ; } shouldTruncate = truncateResponse == QMessageBox::Yes; } } From 6d017b5f0b9fd878d387bf33585221ea079e305b Mon Sep 17 00:00:00 2001 From: maskers <97827489+mskrss@users.noreply.github.com> Date: Wed, 21 Aug 2024 22:39:27 +0300 Subject: [PATCH 137/616] fix formatting Signed-off-by: maskers <97827489+mskrss@users.noreply.github.com> --- launcher/ui/GuiUtil.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/launcher/ui/GuiUtil.cpp b/launcher/ui/GuiUtil.cpp index cfc1715fc..5cdd30e17 100644 --- a/launcher/ui/GuiUtil.cpp +++ b/launcher/ui/GuiUtil.cpp @@ -101,21 +101,23 @@ std::optional GuiUtil::uploadPaste(const QString& name, const QString& return {}; if (baseUrl.toString() == "https://api.mclo.gs" && text.count("\n") > MaxMclogsLines) { - auto truncateResponse = - CustomMessageBox::selectable(parentWidget, QObject::tr("Confirm Truncate"), - QObject::tr("The log exceeds mclo.gs' limit: %1 lines (max %2).\n" - "Prism can keep the first %3 and last %4 lines, trimming the middle.\n\n" - "If you choose 'No', mclo.gs will only keep the first %2 lines, cutting off " - "potentially useful info like crashes at the end.\n\n" - "Proceed with Prism's truncation?") - .arg(text.count("\n")) - .arg(MaxMclogsLines) - .arg(InitialMclogsLines) - .arg(FinalMclogsLines), - QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::No) - ->exec(); + auto truncateResponse = CustomMessageBox::selectable( + parentWidget, QObject::tr("Confirm Truncate"), + QObject::tr("The log exceeds mclo.gs' limit: %1 lines (max %2).\n" + "Prism can keep the first %3 and last %4 lines, trimming the middle.\n\n" + "If you choose 'No', mclo.gs will only keep the first %2 lines, cutting off " + "potentially useful info like crashes at the end.\n\n" + "Proceed with Prism's truncation?") + .arg(text.count("\n")) + .arg(MaxMclogsLines) + .arg(InitialMclogsLines) + .arg(FinalMclogsLines), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::No) + ->exec(); - if (truncateResponse == QMessageBox::Cancel) { return {} ; } + if (truncateResponse == QMessageBox::Cancel) { + return {}; + } shouldTruncate = truncateResponse == QMessageBox::Yes; } } From 2ad34c724e0cae50db9359147cb180aae15ab55d Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 21 Aug 2024 22:11:43 +0100 Subject: [PATCH 138/616] Make log colours themeable Signed-off-by: TheKodeToad --- launcher/CMakeLists.txt | 2 - launcher/ui/ColorCache.cpp | 32 --- launcher/ui/ColorCache.h | 106 ---------- launcher/ui/pages/global/LauncherPage.cpp | 64 +++--- launcher/ui/pages/global/LauncherPage.h | 3 - launcher/ui/pages/instance/LogPage.cpp | 37 ++-- launcher/ui/themes/BrightTheme.cpp | 5 - launcher/ui/themes/BrightTheme.h | 1 - launcher/ui/themes/CustomTheme.cpp | 234 ++++++++++------------ launcher/ui/themes/CustomTheme.h | 8 +- launcher/ui/themes/DarkTheme.cpp | 7 +- launcher/ui/themes/DarkTheme.h | 1 - launcher/ui/themes/ITheme.cpp | 31 ++- launcher/ui/themes/ITheme.h | 12 +- launcher/ui/themes/SystemTheme.cpp | 5 - launcher/ui/themes/SystemTheme.h | 1 - launcher/ui/themes/ThemeManager.cpp | 28 +-- launcher/ui/themes/ThemeManager.h | 9 +- 18 files changed, 230 insertions(+), 356 deletions(-) delete mode 100644 launcher/ui/ColorCache.cpp delete mode 100644 launcher/ui/ColorCache.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 719af84e6..98ef29452 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -784,8 +784,6 @@ SET(LAUNCHER_SOURCES # GUI - windows ui/GuiUtil.h ui/GuiUtil.cpp - ui/ColorCache.h - ui/ColorCache.cpp ui/MainWindow.h ui/MainWindow.cpp ui/InstanceWindow.h diff --git a/launcher/ui/ColorCache.cpp b/launcher/ui/ColorCache.cpp deleted file mode 100644 index f941a6093..000000000 --- a/launcher/ui/ColorCache.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "ColorCache.h" - -/** - * Blend the color with the front color, adapting to the back color - */ -QColor ColorCache::blend(QColor color) -{ - if (Rainbow::luma(m_front) > Rainbow::luma(m_back)) { - // for dark color schemes, produce a fitting color first - color = Rainbow::tint(m_front, color, 0.5); - } - // adapt contrast - return Rainbow::mix(m_front, color, m_bias); -} - -/** - * Blend the color with the back color - */ -QColor ColorCache::blendBackground(QColor color) -{ - // adapt contrast - return Rainbow::mix(m_back, color, m_bias); -} - -void ColorCache::recolorAll() -{ - auto iter = m_colors.begin(); - while (iter != m_colors.end()) { - iter->front = blend(iter->original); - iter->back = blendBackground(iter->original); - } -} diff --git a/launcher/ui/ColorCache.h b/launcher/ui/ColorCache.h deleted file mode 100644 index 1cf292c13..000000000 --- a/launcher/ui/ColorCache.h +++ /dev/null @@ -1,106 +0,0 @@ -#pragma once -#include -#include -#include -#include - -class ColorCache { - public: - ColorCache(QColor front, QColor back, qreal bias) - { - m_front = front; - m_back = back; - m_bias = bias; - }; - - void addColor(int key, QColor color) { m_colors[key] = { color, blend(color), blendBackground(color) }; } - - void setForeground(QColor front) - { - if (m_front != front) { - m_front = front; - recolorAll(); - } - } - - void setBackground(QColor back) - { - if (m_back != back) { - m_back = back; - recolorAll(); - } - } - - QColor getFront(int key) - { - auto iter = m_colors.find(key); - if (iter == m_colors.end()) { - return QColor(); - } - return (*iter).front; - } - - QColor getBack(int key) - { - auto iter = m_colors.find(key); - if (iter == m_colors.end()) { - return QColor(); - } - return (*iter).back; - } - - /** - * Blend the color with the front color, adapting to the back color - */ - QColor blend(QColor color); - - /** - * Blend the color with the back color - */ - QColor blendBackground(QColor color); - - protected: - void recolorAll(); - - protected: - struct ColorEntry { - QColor original; - QColor front; - QColor back; - }; - - protected: - qreal m_bias; - QColor m_front; - QColor m_back; - QMap m_colors; -}; - -class LogColorCache : public ColorCache { - public: - LogColorCache(QColor front, QColor back) : ColorCache(front, back, 1.0) - { - addColor((int)MessageLevel::Launcher, QColor("purple")); - addColor((int)MessageLevel::Debug, QColor("green")); - addColor((int)MessageLevel::Warning, QColor("orange")); - addColor((int)MessageLevel::Error, QColor("red")); - addColor((int)MessageLevel::Fatal, QColor("red")); - addColor((int)MessageLevel::Message, front); - } - - QColor getFront(MessageLevel::Enum level) - { - if (!m_colors.contains((int)level)) { - return ColorCache::getFront((int)MessageLevel::Message); - } - return ColorCache::getFront((int)level); - } - - QColor getBack(MessageLevel::Enum level) - { - if (level == MessageLevel::Fatal) { - return QColor(Qt::black); - } - return QColor(Qt::transparent); - } -}; diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index 6a240389a..2f2ce6f70 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2022 Jamie Mansfield * Copyright (c) 2022 dada513 * Copyright (C) 2022 Tayou + * Copyright (C) 2024 TheKodeToad * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,6 +51,7 @@ #include "DesktopServices.h" #include "settings/SettingsObject.h" #include "ui/themes/ITheme.h" +#include "ui/themes/ThemeManager.h" #include "updater/ExternalUpdater.h" #include @@ -66,9 +68,6 @@ enum InstSortMode { LauncherPage::LauncherPage(QWidget* parent) : QWidget(parent), ui(new Ui::LauncherPage) { ui->setupUi(this); - auto origForeground = ui->fontPreview->palette().color(ui->fontPreview->foregroundRole()); - auto origBackground = ui->fontPreview->palette().color(ui->fontPreview->backgroundRole()); - m_colors.reset(new LogColorCache(origForeground, origBackground)); ui->sortingModeGroup->setId(ui->sortByNameBtn, Sort_Name); ui->sortingModeGroup->setId(ui->sortLastLaunchedBtn, Sort_LastLaunch); @@ -80,8 +79,9 @@ LauncherPage::LauncherPage(QWidget* parent) : QWidget(parent), ui(new Ui::Launch ui->updateSettingsBox->setHidden(!APPLICATION->updater()); - connect(ui->fontSizeBox, SIGNAL(valueChanged(int)), SLOT(refreshFontPreview())); - connect(ui->consoleFont, SIGNAL(currentFontChanged(QFont)), SLOT(refreshFontPreview())); + connect(ui->fontSizeBox, QOverload::of(&QSpinBox::valueChanged), this, &LauncherPage::refreshFontPreview); + connect(ui->consoleFont, &QFontComboBox::currentFontChanged, this, &LauncherPage::refreshFontPreview); + connect(ui->themeCustomizationWidget, &ThemeCustomizationWidget::currentWidgetThemeChanged, this, &LauncherPage::refreshFontPreview); connect(ui->themeCustomizationWidget, &ThemeCustomizationWidget::currentCatChanged, APPLICATION, &Application::currentCatChanged); } @@ -311,37 +311,47 @@ void LauncherPage::loadSettings() void LauncherPage::refreshFontPreview() { + const LogColors& colors = APPLICATION->themeManager()->getLogColors(); + int fontSize = ui->fontSizeBox->value(); QString fontFamily = ui->consoleFont->currentFont().family(); ui->fontPreview->clear(); defaultFormat->setFont(QFont(fontFamily, fontSize)); - { + + auto print = [this, colors](const QString& message, MessageLevel::Enum level) { QTextCharFormat format(*defaultFormat); - format.setForeground(m_colors->getFront(MessageLevel::Error)); + + QColor bg = colors.background.value(level); + QColor fg = colors.foreground.value(level); + + if (bg.isValid()) + format.setBackground(bg); + + if (fg.isValid()) + format.setForeground(fg); + // append a paragraph/line auto workCursor = ui->fontPreview->textCursor(); workCursor.movePosition(QTextCursor::End); - workCursor.insertText(tr("[Something/ERROR] A spooky error!"), format); + workCursor.insertText(message, format); workCursor.insertBlock(); - } - { - QTextCharFormat format(*defaultFormat); - format.setForeground(m_colors->getFront(MessageLevel::Message)); - // append a paragraph/line - auto workCursor = ui->fontPreview->textCursor(); - workCursor.movePosition(QTextCursor::End); - workCursor.insertText(tr("[Test/INFO] A harmless message..."), format); - workCursor.insertBlock(); - } - { - QTextCharFormat format(*defaultFormat); - format.setForeground(m_colors->getFront(MessageLevel::Warning)); - // append a paragraph/line - auto workCursor = ui->fontPreview->textCursor(); - workCursor.movePosition(QTextCursor::End); - workCursor.insertText(tr("[Something/WARN] A not so spooky warning."), format); - workCursor.insertBlock(); - } + }; + + print(QString("%1 version: %2 (%3)\n") + .arg(BuildConfig.LAUNCHER_DISPLAYNAME, BuildConfig.printableVersionString(), BuildConfig.BUILD_PLATFORM), + MessageLevel::Launcher); + + QDate today = QDate::currentDate(); + + if (today.month() == 10 && today.day() == 31) + print(tr("[Test/ERROR] OOoooOOOoooo! A spooky error!"), MessageLevel::Error); + else + print(tr("[Test/ERROR] A spooky error!"), MessageLevel::Error); + + print(tr("[Test/INFO] A harmless message..."), MessageLevel::Info); + print(tr("[Test/WARN] A not so spooky warning."), MessageLevel::Warning); + print(tr("[Test/DEBUG] A secret debugging message..."), MessageLevel::Debug); + print(tr("[Test/FATAL] A terrifying fatal error!"), MessageLevel::Fatal); } void LauncherPage::retranslate() diff --git a/launcher/ui/pages/global/LauncherPage.h b/launcher/ui/pages/global/LauncherPage.h index f9aefb171..4a46d1e48 100644 --- a/launcher/ui/pages/global/LauncherPage.h +++ b/launcher/ui/pages/global/LauncherPage.h @@ -41,7 +41,6 @@ #include #include #include "java/JavaChecker.h" -#include "ui/ColorCache.h" #include "ui/pages/BasePage.h" class QTextCharFormat; @@ -93,7 +92,5 @@ class LauncherPage : public QWidget, public BasePage { // default format for the font preview... QTextCharFormat* defaultFormat; - std::unique_ptr m_colors; - std::shared_ptr m_languageModel; }; diff --git a/launcher/ui/pages/instance/LogPage.cpp b/launcher/ui/pages/instance/LogPage.cpp index 8e1e53762..0c22d1de6 100644 --- a/launcher/ui/pages/instance/LogPage.cpp +++ b/launcher/ui/pages/instance/LogPage.cpp @@ -3,7 +3,7 @@ * Prism Launcher - Minecraft Launcher * Copyright (c) 2022 Jamie Mansfield * Copyright (C) 2022 Sefa Eyeoglu - * Copyright (C) 2022 TheKodeToad + * Copyright (C) 2024 TheKodeToad * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -47,8 +47,8 @@ #include "launch/LaunchTask.h" #include "settings/Setting.h" -#include "ui/ColorCache.h" #include "ui/GuiUtil.h" +#include "ui/themes/ThemeManager.h" #include @@ -57,26 +57,36 @@ class LogFormatProxyModel : public QIdentityProxyModel { LogFormatProxyModel(QObject* parent = nullptr) : QIdentityProxyModel(parent) {} QVariant data(const QModelIndex& index, int role) const override { + const LogColors& colors = APPLICATION->themeManager()->getLogColors(); + switch (role) { case Qt::FontRole: return m_font; case Qt::ForegroundRole: { - MessageLevel::Enum level = (MessageLevel::Enum)QIdentityProxyModel::data(index, LogModel::LevelRole).toInt(); - return m_colors->getFront(level); + auto level = static_cast(QIdentityProxyModel::data(index, LogModel::LevelRole).toInt()); + QColor result = colors.foreground.value(level); + + if (result.isValid()) + return result; + + break; } case Qt::BackgroundRole: { - MessageLevel::Enum level = (MessageLevel::Enum)QIdentityProxyModel::data(index, LogModel::LevelRole).toInt(); - return m_colors->getBack(level); + auto level = static_cast(QIdentityProxyModel::data(index, LogModel::LevelRole).toInt()); + QColor result = colors.background.value(level); + + if (result.isValid()) + return result; + + break; } - default: - return QIdentityProxyModel::data(index, role); } + + return QIdentityProxyModel::data(index, role); } void setFont(QFont font) { m_font = font; } - void setColors(LogColorCache* colors) { m_colors.reset(colors); } - QModelIndex find(const QModelIndex& start, const QString& value, bool reverse) const { QModelIndex parentIndex = parent(start); @@ -125,7 +135,6 @@ class LogFormatProxyModel : public QIdentityProxyModel { private: QFont m_font; - std::unique_ptr m_colors; }; LogPage::LogPage(InstancePtr instance, QWidget* parent) : QWidget(parent), ui(new Ui::LogPage), m_instance(instance) @@ -134,12 +143,6 @@ LogPage::LogPage(InstancePtr instance, QWidget* parent) : QWidget(parent), ui(ne ui->tabWidget->tabBar()->hide(); m_proxy = new LogFormatProxyModel(this); - // set up text colors in the log proxy and adapt them to the current theme foreground and background - { - auto origForeground = ui->text->palette().color(ui->text->foregroundRole()); - auto origBackground = ui->text->palette().color(ui->text->backgroundRole()); - m_proxy->setColors(new LogColorCache(origForeground, origBackground)); - } // set up fonts in the log proxy { diff --git a/launcher/ui/themes/BrightTheme.cpp b/launcher/ui/themes/BrightTheme.cpp index 39a5bfd14..81bdd773e 100644 --- a/launcher/ui/themes/BrightTheme.cpp +++ b/launcher/ui/themes/BrightTheme.cpp @@ -46,11 +46,6 @@ QString BrightTheme::name() return QObject::tr("Bright"); } -bool BrightTheme::hasColorScheme() -{ - return true; -} - QPalette BrightTheme::colorScheme() { QPalette brightPalette; diff --git a/launcher/ui/themes/BrightTheme.h b/launcher/ui/themes/BrightTheme.h index 750e7bfc5..070eef124 100644 --- a/launcher/ui/themes/BrightTheme.h +++ b/launcher/ui/themes/BrightTheme.h @@ -45,7 +45,6 @@ class BrightTheme : public FusionTheme { QString tooltip() override; bool hasStyleSheet() override; QString appStyleSheet() override; - bool hasColorScheme() override; QPalette colorScheme() override; double fadeAmount() override; QColor fadeColor() override; diff --git a/launcher/ui/themes/CustomTheme.cpp b/launcher/ui/themes/CustomTheme.cpp index 22b366b62..081ba1900 100644 --- a/launcher/ui/themes/CustomTheme.cpp +++ b/launcher/ui/themes/CustomTheme.cpp @@ -2,6 +2,7 @@ /* * Prism Launcher - Minecraft Launcher * Copyright (C) 2024 Tayou + * Copyright (C) 2024 TheKodeToad * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,121 +40,6 @@ const char* themeFile = "theme.json"; -static bool readThemeJson(const QString& path, - QPalette& palette, - double& fadeAmount, - QColor& fadeColor, - QString& name, - QString& widgets, - QString& qssFilePath, - bool& dataIncomplete) -{ - QFileInfo pathInfo(path); - if (pathInfo.exists() && pathInfo.isFile()) { - try { - auto doc = Json::requireDocument(path, "Theme JSON file"); - const QJsonObject root = doc.object(); - dataIncomplete = !root.contains("qssFilePath"); - name = Json::requireString(root, "name", "Theme name"); - widgets = Json::requireString(root, "widgets", "Qt widget theme"); - qssFilePath = Json::ensureString(root, "qssFilePath", "themeStyle.css"); - auto colorsRoot = Json::requireObject(root, "colors", "colors object"); - auto readColor = [&](QString colorName) -> QColor { - auto colorValue = Json::ensureString(colorsRoot, colorName, QString()); - if (!colorValue.isEmpty()) { - QColor color(colorValue); - if (!color.isValid()) { - themeWarningLog() << "Color value" << colorValue << "for" << colorName << "was not recognized."; - return QColor(); - } - return color; - } - return QColor(); - }; - auto readAndSetColor = [&](QPalette::ColorRole role, QString colorName) { - auto color = readColor(colorName); - if (color.isValid()) { - palette.setColor(role, color); - } else { - themeDebugLog() << "Color value for" << colorName << "was not present."; - } - }; - - // palette - readAndSetColor(QPalette::Window, "Window"); - readAndSetColor(QPalette::WindowText, "WindowText"); - readAndSetColor(QPalette::Base, "Base"); - readAndSetColor(QPalette::AlternateBase, "AlternateBase"); - readAndSetColor(QPalette::ToolTipBase, "ToolTipBase"); - readAndSetColor(QPalette::ToolTipText, "ToolTipText"); - readAndSetColor(QPalette::Text, "Text"); - readAndSetColor(QPalette::Button, "Button"); - readAndSetColor(QPalette::ButtonText, "ButtonText"); - readAndSetColor(QPalette::BrightText, "BrightText"); - readAndSetColor(QPalette::Link, "Link"); - readAndSetColor(QPalette::Highlight, "Highlight"); - readAndSetColor(QPalette::HighlightedText, "HighlightedText"); - - // fade - fadeColor = readColor("fadeColor"); - fadeAmount = Json::ensureDouble(colorsRoot, "fadeAmount", 0.5, "fade amount"); - - } catch (const Exception& e) { - themeWarningLog() << "Couldn't load theme json: " << e.cause(); - return false; - } - } else { - themeDebugLog() << "No theme json present."; - return false; - } - return true; -} - -static bool writeThemeJson(const QString& path, - const QPalette& palette, - double fadeAmount, - QColor fadeColor, - QString name, - QString widgets, - QString qssFilePath) -{ - QJsonObject rootObj; - rootObj.insert("name", name); - rootObj.insert("widgets", widgets); - rootObj.insert("qssFilePath", qssFilePath); - - QJsonObject colorsObj; - auto insertColor = [&](QPalette::ColorRole role, QString colorName) { colorsObj.insert(colorName, palette.color(role).name()); }; - - // palette - insertColor(QPalette::Window, "Window"); - insertColor(QPalette::WindowText, "WindowText"); - insertColor(QPalette::Base, "Base"); - insertColor(QPalette::AlternateBase, "AlternateBase"); - insertColor(QPalette::ToolTipBase, "ToolTipBase"); - insertColor(QPalette::ToolTipText, "ToolTipText"); - insertColor(QPalette::Text, "Text"); - insertColor(QPalette::Button, "Button"); - insertColor(QPalette::ButtonText, "ButtonText"); - insertColor(QPalette::BrightText, "BrightText"); - insertColor(QPalette::Link, "Link"); - insertColor(QPalette::Highlight, "Highlight"); - insertColor(QPalette::HighlightedText, "HighlightedText"); - - // fade - colorsObj.insert("fadeColor", fadeColor.name()); - colorsObj.insert("fadeAmount", fadeAmount); - - rootObj.insert("colors", colorsObj); - try { - Json::write(rootObj, path); - return true; - } catch ([[maybe_unused]] const Exception& e) { - themeWarningLog() << "Failed to write theme json to" << path; - return false; - } -} - /// @param baseTheme Base Theme /// @param fileInfo FileInfo object for file to load /// @param isManifest whether to load a theme manifest or a qss file @@ -176,23 +62,22 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest auto themeFilePath = FS::PathCombine(path, themeFile); - bool jsonDataIncomplete = false; - m_palette = baseTheme->colorScheme(); - if (readThemeJson(themeFilePath, m_palette, m_fadeAmount, m_fadeColor, m_name, m_widgets, m_qssFilePath, jsonDataIncomplete)) { + + bool hasCustomLogColors = false; + + if (read(themeFilePath, hasCustomLogColors)) { // If theme data was found, fade "Disabled" color of each role according to FadeAmount m_palette = fadeInactive(m_palette, m_fadeAmount, m_fadeColor); + + if (!hasCustomLogColors) + m_logColors = defaultLogColors(m_palette); } else { themeDebugLog() << "Did not read theme json file correctly, not changing theme, keeping previous."; + m_logColors = defaultLogColors(m_palette); return; } - // FIXME: This is kinda jank, it only actually checks if the qss file path is not present. It should actually check for any relevant - // missing data (e.g. name, colors) - if (jsonDataIncomplete) { - writeThemeJson(fileInfo.absoluteFilePath(), m_palette, m_fadeAmount, m_fadeColor, m_name, m_widgets, m_qssFilePath); - } - auto qssFilePath = FS::PathCombine(path, m_qssFilePath); QFileInfo info(qssFilePath); if (info.isFile()) { @@ -251,11 +136,6 @@ QString CustomTheme::name() return m_name; } -bool CustomTheme::hasColorScheme() -{ - return true; -} - QPalette CustomTheme::colorScheme() { return m_palette; @@ -289,3 +169,99 @@ QString CustomTheme::tooltip() { return m_tooltip; } + +bool CustomTheme::read(const QString& path, bool& hasCustomLogColors) +{ + QFileInfo pathInfo(path); + if (pathInfo.exists() && pathInfo.isFile()) { + try { + auto doc = Json::requireDocument(path, "Theme JSON file"); + const QJsonObject root = doc.object(); + m_name = Json::requireString(root, "name", "Theme name"); + m_widgets = Json::requireString(root, "widgets", "Qt widget theme"); + m_qssFilePath = Json::ensureString(root, "qssFilePath", "themeStyle.css"); + + auto readColor = [&](const QJsonObject& colors, const QString& colorName) -> QColor { + auto colorValue = Json::ensureString(colors, colorName, QString()); + if (!colorValue.isEmpty()) { + QColor color(colorValue); + if (!color.isValid()) { + themeWarningLog() << "Color value" << colorValue << "for" << colorName << "was not recognized."; + return {}; + } + return color; + } + return {}; + }; + + if (root.contains("colors")) { + auto colorsRoot = Json::requireObject(root, "colors"); + auto readAndSetPaletteColor = [&](QPalette::ColorRole role, const QString& colorName) { + auto color = readColor(colorsRoot, colorName); + if (color.isValid()) { + m_palette.setColor(role, color); + } else { + themeDebugLog() << "Color value for" << colorName << "was not present."; + } + }; + + // palette + readAndSetPaletteColor(QPalette::Window, "Window"); + readAndSetPaletteColor(QPalette::WindowText, "WindowText"); + readAndSetPaletteColor(QPalette::Base, "Base"); + readAndSetPaletteColor(QPalette::AlternateBase, "AlternateBase"); + readAndSetPaletteColor(QPalette::ToolTipBase, "ToolTipBase"); + readAndSetPaletteColor(QPalette::ToolTipText, "ToolTipText"); + readAndSetPaletteColor(QPalette::Text, "Text"); + readAndSetPaletteColor(QPalette::Button, "Button"); + readAndSetPaletteColor(QPalette::ButtonText, "ButtonText"); + readAndSetPaletteColor(QPalette::BrightText, "BrightText"); + readAndSetPaletteColor(QPalette::Link, "Link"); + readAndSetPaletteColor(QPalette::Highlight, "Highlight"); + readAndSetPaletteColor(QPalette::HighlightedText, "HighlightedText"); + + // fade + m_fadeColor = readColor(colorsRoot, "fadeColor"); + m_fadeAmount = Json::ensureDouble(colorsRoot, "fadeAmount", 0.5, "fade amount"); + } + + if (root.contains("logColors")) { + hasCustomLogColors = true; + + auto logColorsRoot = Json::requireObject(root, "logColors"); + auto readAndSetLogColor = [&](MessageLevel::Enum level, bool fg, const QString& colorName) { + auto color = readColor(logColorsRoot, colorName); + if (color.isValid()) { + if (fg) + m_logColors.foreground[level] = color; + else + m_logColors.background[level] = color; + } else { + themeDebugLog() << "Color value for" << colorName << "was not present."; + } + }; + + readAndSetLogColor(MessageLevel::Message, false, "MessageHighlight"); + readAndSetLogColor(MessageLevel::Launcher, false, "LauncherHighlight"); + readAndSetLogColor(MessageLevel::Debug, false, "DebugHighlight"); + readAndSetLogColor(MessageLevel::Warning, false, "WarningHighlight"); + readAndSetLogColor(MessageLevel::Error, false, "ErrorHighlight"); + readAndSetLogColor(MessageLevel::Fatal, false, "FatalHighlight"); + + readAndSetLogColor(MessageLevel::Message, true, "Message"); + readAndSetLogColor(MessageLevel::Launcher, true, "Launcher"); + readAndSetLogColor(MessageLevel::Debug, true, "Debug"); + readAndSetLogColor(MessageLevel::Warning, true, "Warning"); + readAndSetLogColor(MessageLevel::Error, true, "Error"); + readAndSetLogColor(MessageLevel::Fatal, true, "Fatal"); + } + } catch (const Exception& e) { + themeWarningLog() << "Couldn't load theme json: " << e.cause(); + return false; + } + } else { + themeDebugLog() << "No theme json present."; + return false; + } + return true; +} diff --git a/launcher/ui/themes/CustomTheme.h b/launcher/ui/themes/CustomTheme.h index 761a2bd90..b8d073921 100644 --- a/launcher/ui/themes/CustomTheme.h +++ b/launcher/ui/themes/CustomTheme.h @@ -2,6 +2,7 @@ /* * Prism Launcher - Minecraft Launcher * Copyright (C) 2024 Tayou + * Copyright (C) 2024 TheKodeToad * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -47,14 +48,16 @@ class CustomTheme : public ITheme { QString tooltip() override; bool hasStyleSheet() override; QString appStyleSheet() override; - bool hasColorScheme() override; QPalette colorScheme() override; double fadeAmount() override; QColor fadeColor() override; QString qtTheme() override; + LogColors logColorScheme() override { return m_logColors; } QStringList searchPaths() override; - private: /* data */ + private: + bool read(const QString& path, bool& hasCustomLogColors); + QPalette m_palette; QColor m_fadeColor; double m_fadeAmount; @@ -63,6 +66,7 @@ class CustomTheme : public ITheme { QString m_id; QString m_widgets; QString m_qssFilePath; + LogColors m_logColors; /** * The tooltip could be defined in the theme json, * or composed of other fields that could be in there. diff --git a/launcher/ui/themes/DarkTheme.cpp b/launcher/ui/themes/DarkTheme.cpp index 429d046ac..804126547 100644 --- a/launcher/ui/themes/DarkTheme.cpp +++ b/launcher/ui/themes/DarkTheme.cpp @@ -2,6 +2,7 @@ /* * Prism Launcher - Minecraft Launcher * Copyright (C) 2024 Tayou + * Copyright (C) 2024 TheKodeToad * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -46,11 +47,6 @@ QString DarkTheme::name() return QObject::tr("Dark"); } -bool DarkTheme::hasColorScheme() -{ - return true; -} - QPalette DarkTheme::colorScheme() { QPalette darkPalette; @@ -90,6 +86,7 @@ QString DarkTheme::appStyleSheet() { return "QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"; } + QString DarkTheme::tooltip() { return ""; diff --git a/launcher/ui/themes/DarkTheme.h b/launcher/ui/themes/DarkTheme.h index 819f6a934..c97edbcbe 100644 --- a/launcher/ui/themes/DarkTheme.h +++ b/launcher/ui/themes/DarkTheme.h @@ -45,7 +45,6 @@ class DarkTheme : public FusionTheme { QString tooltip() override; bool hasStyleSheet() override; QString appStyleSheet() override; - bool hasColorScheme() override; QPalette colorScheme() override; double fadeAmount() override; QColor fadeColor() override; diff --git a/launcher/ui/themes/ITheme.cpp b/launcher/ui/themes/ITheme.cpp index 046ae16b4..cae6e90db 100644 --- a/launcher/ui/themes/ITheme.cpp +++ b/launcher/ui/themes/ITheme.cpp @@ -44,9 +44,7 @@ void ITheme::apply(bool) { APPLICATION->setStyleSheet(QString()); QApplication::setStyle(new HintOverrideProxyStyle(QStyleFactory::create(qtTheme()))); - if (hasColorScheme()) { - QApplication::setPalette(colorScheme()); - } + QApplication::setPalette(colorScheme()); APPLICATION->setStyleSheet(appStyleSheet()); QDir::setSearchPaths("theme", searchPaths()); } @@ -73,3 +71,30 @@ QPalette ITheme::fadeInactive(QPalette in, qreal bias, QColor color) blend(QPalette::HighlightedText); return in; } + +LogColors ITheme::defaultLogColors(const QPalette& palette) +{ + LogColors result; + + const QColor& bg = palette.color(QPalette::Base); + const QColor& fg = palette.color(QPalette::Text); + + auto blend = [bg, fg](QColor color) { + if (Rainbow::luma(fg) > Rainbow::luma(bg)) { + // for dark color schemes, produce a fitting color first + color = Rainbow::tint(fg, color, 0.5); + } + // adapt contrast + return Rainbow::mix(fg, color, 1); + }; + + result.background[MessageLevel::Fatal] = Qt::black; + + result.foreground[MessageLevel::Launcher] = blend(QColor("purple")); + result.foreground[MessageLevel::Debug] = blend(QColor("green")); + result.foreground[MessageLevel::Warning] = blend(QColor("orange")); + result.foreground[MessageLevel::Error] = blend(QColor("red")); + result.foreground[MessageLevel::Fatal] = blend(QColor("red")); + + return result; +} diff --git a/launcher/ui/themes/ITheme.h b/launcher/ui/themes/ITheme.h index 45d3e2739..7dc5fc64a 100644 --- a/launcher/ui/themes/ITheme.h +++ b/launcher/ui/themes/ITheme.h @@ -2,6 +2,7 @@ /* * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Tayou + * Copyright (C) 2024 TheKodeToad * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,11 +34,19 @@ * limitations under the License. */ #pragma once +#include +#include #include #include class QStyle; +struct LogColors { + QMap background; + QMap foreground; +}; + +// TODO: rename to Theme; this is not an interface as it contains method implementations class ITheme { public: virtual ~ITheme() {} @@ -48,11 +57,12 @@ class ITheme { virtual bool hasStyleSheet() = 0; virtual QString appStyleSheet() = 0; virtual QString qtTheme() = 0; - virtual bool hasColorScheme() = 0; virtual QPalette colorScheme() = 0; virtual QColor fadeColor() = 0; virtual double fadeAmount() = 0; + virtual LogColors logColorScheme() { return defaultLogColors(colorScheme()); } virtual QStringList searchPaths() { return {}; } static QPalette fadeInactive(QPalette in, qreal bias, QColor color); + static LogColors defaultLogColors(const QPalette& palette); }; diff --git a/launcher/ui/themes/SystemTheme.cpp b/launcher/ui/themes/SystemTheme.cpp index 70de21894..791df2ed4 100644 --- a/launcher/ui/themes/SystemTheme.cpp +++ b/launcher/ui/themes/SystemTheme.cpp @@ -125,8 +125,3 @@ bool SystemTheme::hasStyleSheet() { return false; } - -bool SystemTheme::hasColorScheme() -{ - return true; -} diff --git a/launcher/ui/themes/SystemTheme.h b/launcher/ui/themes/SystemTheme.h index 5c58856cb..783f2e4c2 100644 --- a/launcher/ui/themes/SystemTheme.h +++ b/launcher/ui/themes/SystemTheme.h @@ -48,7 +48,6 @@ class SystemTheme : public ITheme { QString qtTheme() override; bool hasStyleSheet() override; QString appStyleSheet() override; - bool hasColorScheme() override; QPalette colorScheme() override; double fadeAmount() override; QColor fadeColor() override; diff --git a/launcher/ui/themes/ThemeManager.cpp b/launcher/ui/themes/ThemeManager.cpp index d57e166f4..ad9a6f88e 100644 --- a/launcher/ui/themes/ThemeManager.cpp +++ b/launcher/ui/themes/ThemeManager.cpp @@ -123,11 +123,11 @@ void ThemeManager::initializeWidgets() { themeDebugLog() << "Determining System Widget Theme..."; const auto& style = QApplication::style(); - currentlySelectedSystemTheme = style->objectName(); - themeDebugLog() << "System theme seems to be:" << currentlySelectedSystemTheme; + m_currentlySelectedSystemTheme = style->objectName(); + themeDebugLog() << "System theme seems to be:" << m_currentlySelectedSystemTheme; themeDebugLog() << "<> Initializing Widget Themes"; - themeDebugLog() << "Loading Built-in Theme:" << addTheme(std::make_unique(currentlySelectedSystemTheme, true)); + themeDebugLog() << "Loading Built-in Theme:" << addTheme(std::make_unique(m_currentlySelectedSystemTheme, true)); auto darkThemeId = addTheme(std::make_unique()); themeDebugLog() << "Loading Built-in Theme:" << darkThemeId; themeDebugLog() << "Loading Built-in Theme:" << addTheme(std::make_unique()); @@ -196,8 +196,8 @@ QList ThemeManager::getValidApplicationThemes() QList ThemeManager::getValidCatPacks() { QList ret; - ret.reserve(m_cat_packs.size()); - for (auto&& [id, theme] : m_cat_packs) { + ret.reserve(m_catPacks.size()); + for (auto&& [id, theme] : m_catPacks) { ret.append(theme.get()); } return ret; @@ -246,6 +246,8 @@ void ThemeManager::setApplicationTheme(const QString& name, bool initial) auto& theme = themeIter->second; themeDebugLog() << "applying theme" << theme->name(); theme->apply(initial); + + m_logColors = theme->logColorScheme(); } else { themeWarningLog() << "Tried to set invalid theme:" << name; } @@ -258,7 +260,7 @@ void ThemeManager::applyCurrentlySelectedTheme(bool initial) themeDebugLog() << "<> Icon theme set."; auto applicationTheme = settings->get("ApplicationTheme").toString(); if (applicationTheme == "") { - applicationTheme = currentlySelectedSystemTheme; + applicationTheme = m_currentlySelectedSystemTheme; } setApplicationTheme(applicationTheme, initial); themeDebugLog() << "<> Application theme set."; @@ -266,8 +268,8 @@ void ThemeManager::applyCurrentlySelectedTheme(bool initial) QString ThemeManager::getCatPack(QString catName) { - auto catIter = m_cat_packs.find(!catName.isEmpty() ? catName : APPLICATION->settings()->get("BackgroundCat").toString()); - if (catIter != m_cat_packs.end()) { + auto catIter = m_catPacks.find(!catName.isEmpty() ? catName : APPLICATION->settings()->get("BackgroundCat").toString()); + if (catIter != m_catPacks.end()) { auto& catPack = catIter->second; themeDebugLog() << "applying catpack" << catPack->id(); return catPack->path(); @@ -275,14 +277,14 @@ QString ThemeManager::getCatPack(QString catName) themeWarningLog() << "Tried to get invalid catPack:" << catName; } - return m_cat_packs.begin()->second->path(); + return m_catPacks.begin()->second->path(); } QString ThemeManager::addCatPack(std::unique_ptr catPack) { QString id = catPack->id(); - if (m_cat_packs.find(id) == m_cat_packs.end()) - m_cat_packs.emplace(id, std::move(catPack)); + if (m_catPacks.find(id) == m_catPacks.end()) + m_catPacks.emplace(id, std::move(catPack)); else themeWarningLog() << "CatPack(" << id << ") not added to prevent id duplication"; return id; @@ -340,8 +342,8 @@ void ThemeManager::refresh() { m_themes.clear(); m_icons.clear(); - m_cat_packs.clear(); + m_catPacks.clear(); initializeThemes(); initializeCatPacks(); -}; \ No newline at end of file +} \ No newline at end of file diff --git a/launcher/ui/themes/ThemeManager.h b/launcher/ui/themes/ThemeManager.h index 9d01d38e7..8bbcd34a9 100644 --- a/launcher/ui/themes/ThemeManager.h +++ b/launcher/ui/themes/ThemeManager.h @@ -2,7 +2,7 @@ /* * Prism Launcher - Minecraft Launcher * Copyright (C) 2024 Tayou - * Copyright (C) 2023 TheKodeToad + * Copyright (C) 2024 TheKodeToad * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -55,6 +55,8 @@ class ThemeManager { QString getCatPack(QString catName = ""); QList getValidCatPacks(); + const LogColors& getLogColors() { return m_logColors; } + void refresh(); private: @@ -63,8 +65,9 @@ class ThemeManager { QDir m_iconThemeFolder{ "iconthemes" }; QDir m_applicationThemeFolder{ "themes" }; QDir m_catPacksFolder{ "catpacks" }; - std::map> m_cat_packs; - QString currentlySelectedSystemTheme; + std::map> m_catPacks; + QString m_currentlySelectedSystemTheme; + LogColors m_logColors; void initializeThemes(); void initializeCatPacks(); From aa3a4585ee8663250636427f67afccb537ce4428 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 22 Aug 2024 18:58:04 +0300 Subject: [PATCH 139/616] Add icons Signed-off-by: Trial97 --- launcher/resources/multimc/multimc.qrc | 6 + .../resources/multimc/scalable/adoptium.svg | 184 ++++++++++++++++++ launcher/resources/multimc/scalable/azul.svg | 17 ++ .../resources/multimc/scalable/mojang.svg | 55 ++++++ launcher/ui/java/InstallJavaDialog.cpp | 6 +- 5 files changed, 265 insertions(+), 3 deletions(-) create mode 100644 launcher/resources/multimc/scalable/adoptium.svg create mode 100644 launcher/resources/multimc/scalable/azul.svg create mode 100644 launcher/resources/multimc/scalable/mojang.svg diff --git a/launcher/resources/multimc/multimc.qrc b/launcher/resources/multimc/multimc.qrc index eeba32186..25edd09e0 100644 --- a/launcher/resources/multimc/multimc.qrc +++ b/launcher/resources/multimc/multimc.qrc @@ -353,5 +353,11 @@ scalable/instances/neoforged.svg 128x128/instances/forge.png 128x128/instances/liteloader.png + + + scalable/adoptium.svg + scalable/azul.svg + scalable/mojang.svg + diff --git a/launcher/resources/multimc/scalable/adoptium.svg b/launcher/resources/multimc/scalable/adoptium.svg new file mode 100644 index 000000000..3fcc956ed --- /dev/null +++ b/launcher/resources/multimc/scalable/adoptium.svg @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/resources/multimc/scalable/azul.svg b/launcher/resources/multimc/scalable/azul.svg new file mode 100644 index 000000000..1c4356eb7 --- /dev/null +++ b/launcher/resources/multimc/scalable/azul.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/launcher/resources/multimc/scalable/mojang.svg b/launcher/resources/multimc/scalable/mojang.svg new file mode 100644 index 000000000..0c1f48d3d --- /dev/null +++ b/launcher/resources/multimc/scalable/mojang.svg @@ -0,0 +1,55 @@ + + Created with Fabric.js 3.6.3 diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index 01ec56dfd..decbfb77d 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -273,11 +273,11 @@ QList InstallDialog::getPages() { return { // Mojang - new InstallJavaPage("net.minecraft.java", "", tr("Mojang")), + new InstallJavaPage("net.minecraft.java", "mojang", tr("Mojang")), // Adoptium - new InstallJavaPage("net.adoptium.java", "", tr("Adoptium")), + new InstallJavaPage("net.adoptium.java", "adoptium", tr("Adoptium")), // Azul - new InstallJavaPage("com.azul.java", "", tr("Azul")), + new InstallJavaPage("com.azul.java", "azul", tr("Azul Zulu")), }; } From 7d9e47ac18fc2b3278027bb99c9b5686aa165dc7 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 22 Aug 2024 18:58:38 +0300 Subject: [PATCH 140/616] Change major java column name Signed-off-by: Trial97 --- launcher/VersionProxyModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/VersionProxyModel.cpp b/launcher/VersionProxyModel.cpp index 62cf4c221..552900d35 100644 --- a/launcher/VersionProxyModel.cpp +++ b/launcher/VersionProxyModel.cpp @@ -121,7 +121,7 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, case JavaName: return tr("Java Name"); case JavaMajor: - return tr("Major"); + return tr("Major Version"); case Time: return tr("Released"); } From 0b05c7cb07030bada88ac253e9a92c24ea4bd473 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 22 Aug 2024 18:59:09 +0300 Subject: [PATCH 141/616] fix bug with buton not updating corectly for java dialog Signed-off-by: Trial97 --- launcher/ui/java/InstallJavaDialog.cpp | 11 +++++------ launcher/ui/java/InstallJavaDialog.h | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index decbfb77d..4fb9fc2d2 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -259,14 +259,14 @@ InstallDialog::InstallDialog(const QString& uid, BaseInstance* instance, QWidget auto cast = pageCast(page); cast->setRecomend(true); - connect(cast, &InstallJavaPage::selectionChanged, this, [this] { validate(); }); + connect(cast, &InstallJavaPage::selectionChanged, this, [this, cast] { validate(cast); }); if (!recommendedJavas.isEmpty()) { cast->setRecommendedMajors(recommendedJavas); } } - connect(container, &PageContainer::selectedPageChanged, this, [this] { validate(); }); + connect(container, &PageContainer::selectedPageChanged, this, [this](BasePage* previous, BasePage* selected) { validate(selected); }); pageCast(container->selectedPage())->selectSearch(); - validate(); + validate(container->selectedPage()); } QList InstallDialog::getPages() @@ -286,10 +286,9 @@ QString InstallDialog::dialogTitle() return tr("Install Java"); } -void InstallDialog::validate() +void InstallDialog::validate(BasePage* selected) { - buttons->button(QDialogButtonBox::Ok) - ->setEnabled(!!std::dynamic_pointer_cast(pageCast(container->selectedPage())->selectedVersion())); + buttons->button(QDialogButtonBox::Ok)->setEnabled(!!std::dynamic_pointer_cast(pageCast(selected)->selectedVersion())); } void InstallDialog::done(int result) diff --git a/launcher/ui/java/InstallJavaDialog.h b/launcher/ui/java/InstallJavaDialog.h index d6f879207..7d0edbfdd 100644 --- a/launcher/ui/java/InstallJavaDialog.h +++ b/launcher/ui/java/InstallJavaDialog.h @@ -37,7 +37,7 @@ class InstallDialog final : public QDialog, private BasePageProvider { QList getPages() override; QString dialogTitle() override; - void validate(); + void validate(BasePage* selected); void done(int result) override; private: From 5f64d7dc47b78a9fdd62b3f54ecb6bb1361b9e9b Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 22 Aug 2024 20:38:08 +0300 Subject: [PATCH 142/616] update adoptium icon Signed-off-by: Trial97 --- .../resources/multimc/scalable/adoptium.svg | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/launcher/resources/multimc/scalable/adoptium.svg b/launcher/resources/multimc/scalable/adoptium.svg index 3fcc956ed..d48f8b7d9 100644 --- a/launcher/resources/multimc/scalable/adoptium.svg +++ b/launcher/resources/multimc/scalable/adoptium.svg @@ -1,6 +1,6 @@ - + transform="matrix(13.679999,0,0,13.679976,-6760.5652,-16025.746)"> @@ -156,7 +152,7 @@ + transform="matrix(13.679999,0,0,13.679976,-6760.5652,-16025.746)"> @@ -168,7 +164,7 @@ + transform="matrix(1.2000009,0,0,1.1999989,-853.84911,665.71675)"> Date: Thu, 22 Aug 2024 19:07:15 +0100 Subject: [PATCH 143/616] Fix invalid Java path message Signed-off-by: TheKodeToad --- launcher/launch/steps/CheckJava.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/launcher/launch/steps/CheckJava.cpp b/launcher/launch/steps/CheckJava.cpp index 81337a88e..4628e154d 100644 --- a/launcher/launch/steps/CheckJava.cpp +++ b/launcher/launch/steps/CheckJava.cpp @@ -45,20 +45,23 @@ void CheckJava::executeTask() { auto instance = m_parent->instance(); auto settings = instance->settings(); - m_javaPath = FS::ResolveExecutable(settings->get("JavaPath").toString()); + + QString javaPathSetting = settings->get("JavaPath").toString(); + m_javaPath = FS::ResolveExecutable(javaPathSetting); + bool perInstance = settings->get("OverrideJava").toBool() || settings->get("OverrideJavaLocation").toBool(); auto realJavaPath = QStandardPaths::findExecutable(m_javaPath); if (realJavaPath.isEmpty()) { if (perInstance) { - emit logLine(QString("The java binary \"%1\" couldn't be found. Please fix the java path " + emit logLine(QString("The Java binary \"%1\" couldn't be found. Please fix the Java path " "override in the instance's settings or disable it.") - .arg(m_javaPath), + .arg(javaPathSetting), MessageLevel::Warning); } else { - emit logLine(QString("The java binary \"%1\" couldn't be found. Please set up java in " + emit logLine(QString("The Java binary \"%1\" couldn't be found. Please set up Java in " "the settings.") - .arg(m_javaPath), + .arg(javaPathSetting), MessageLevel::Warning); } emitFailed(QString("Java path is not valid.")); From a910337e9d148937fc6a7339a7bcdd9a2db1ec03 Mon Sep 17 00:00:00 2001 From: maskers <97827489+maskersss@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:42:05 +0300 Subject: [PATCH 144/616] apply suggestion from code review Co-authored-by: TheKodeToad Signed-off-by: maskers <97827489+maskersss@users.noreply.github.com> --- launcher/ui/GuiUtil.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/launcher/ui/GuiUtil.cpp b/launcher/ui/GuiUtil.cpp index 5cdd30e17..4d2e64af4 100644 --- a/launcher/ui/GuiUtil.cpp +++ b/launcher/ui/GuiUtil.cpp @@ -103,11 +103,11 @@ std::optional GuiUtil::uploadPaste(const QString& name, const QString& if (baseUrl.toString() == "https://api.mclo.gs" && text.count("\n") > MaxMclogsLines) { auto truncateResponse = CustomMessageBox::selectable( parentWidget, QObject::tr("Confirm Truncate"), - QObject::tr("The log exceeds mclo.gs' limit: %1 lines (max %2).\n" - "Prism can keep the first %3 and last %4 lines, trimming the middle.\n\n" + QObject::tr("The log has %1 lines, exceeding mclo.gs' limit of %2.\n" + "The launcher can keep the first %3 and last %4 lines, trimming the middle.\n\n" "If you choose 'No', mclo.gs will only keep the first %2 lines, cutting off " "potentially useful info like crashes at the end.\n\n" - "Proceed with Prism's truncation?") + "Proceed with truncation?") .arg(text.count("\n")) .arg(MaxMclogsLines) .arg(InitialMclogsLines) From 762d24bd02ae6a0c0f241626c9c06deeaae86574 Mon Sep 17 00:00:00 2001 From: maskers <97827489+mskrss@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:44:53 +0300 Subject: [PATCH 145/616] don't mention prism in the middle of the log Signed-off-by: maskers <97827489+mskrss@users.noreply.github.com> --- launcher/ui/GuiUtil.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/ui/GuiUtil.cpp b/launcher/ui/GuiUtil.cpp index 4d2e64af4..77d4a98e2 100644 --- a/launcher/ui/GuiUtil.cpp +++ b/launcher/ui/GuiUtil.cpp @@ -63,8 +63,8 @@ QString truncateLogForMclogs(const QString& logContent) truncatedLog += "\n\n\n\n\n\n\n\n\n\n" "------------------------------------------------------------\n" - "--------------------- Log truncated by ---------------------\n" - "---------------------- Prism Launcher ----------------------\n" + "----------------------- Log truncated ----------------------\n" + "------------------------------------------------------------\n" "----- Middle portion omitted to fit mclo.gs size limits ----\n" "------------------------------------------------------------\n" "\n\n\n\n\n\n\n\n\n\n"; From d2304b669872a5bc426a855cf2ee10dd40337808 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 24 Aug 2024 22:10:38 +0100 Subject: [PATCH 146/616] Improve Java checking speed by using startsWith for gentoo paths Signed-off-by: TheKodeToad --- launcher/java/JavaUtils.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index e82216fd4..bc8026348 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -403,12 +403,17 @@ QList JavaUtils::FindJavaPaths() { QList javas; javas.append(this->GetDefaultJava()->path); - auto scanJavaDir = [&](const QString& dirPath) { + auto scanJavaDir = [&]( + const QString& dirPath, + const std::function& filter = [](const QFileInfo&) { return true; }) { QDir dir(dirPath); if (!dir.exists()) return; auto entries = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); for (auto& entry : entries) { + if (!filter(entry)) + continue; + QString prefix; prefix = entry.canonicalFilePath(); javas.append(FS::PathCombine(prefix, "jre/bin/java")); @@ -431,9 +436,13 @@ QList JavaUtils::FindJavaPaths() scanJavaDirs("/usr/lib64/jvm"); scanJavaDirs("/usr/lib32/jvm"); // Gentoo's locations for openjdk and openjdk-bin respectively - scanJavaDir("/usr/lib64"); - scanJavaDir("/usr/lib"); - scanJavaDir("/opt"); + auto gentooFilter = [](const QFileInfo& info) { + QString fileName = info.fileName(); + return fileName.startsWith("openjdk-") || fileName.startsWith("openj9-"); + }; + scanJavaDir("/usr/lib64", gentooFilter); + scanJavaDir("/usr/lib", gentooFilter); + scanJavaDir("/opt", gentooFilter); // javas stored in Prism Launcher's folder scanJavaDirs("java"); // manually installed JDKs in /opt From cbdacf81eea15e1383619cbd0043517509d42f6d Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 24 Aug 2024 22:50:51 +0100 Subject: [PATCH 147/616] Fix system theme detection Signed-off-by: TheKodeToad --- launcher/ui/themes/SystemTheme.cpp | 6 +++--- launcher/ui/themes/SystemTheme.h | 2 +- launcher/ui/themes/ThemeManager.cpp | 18 ++++++++++-------- launcher/ui/themes/ThemeManager.h | 3 ++- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/launcher/ui/themes/SystemTheme.cpp b/launcher/ui/themes/SystemTheme.cpp index 791df2ed4..a1674455a 100644 --- a/launcher/ui/themes/SystemTheme.cpp +++ b/launcher/ui/themes/SystemTheme.cpp @@ -40,11 +40,11 @@ #include "HintOverrideProxyStyle.h" #include "ThemeManager.h" -SystemTheme::SystemTheme(QString& styleName, bool isSystemTheme) +SystemTheme::SystemTheme(const QString& styleName, const QPalette& palette, bool isDefaultTheme) { - themeName = isSystemTheme ? "system" : styleName; + themeName = isDefaultTheme ? "system" : styleName; widgetTheme = styleName; - colorPalette = QApplication::palette(); + colorPalette = palette; } void SystemTheme::apply(bool initial) diff --git a/launcher/ui/themes/SystemTheme.h b/launcher/ui/themes/SystemTheme.h index 783f2e4c2..7c260fdc4 100644 --- a/launcher/ui/themes/SystemTheme.h +++ b/launcher/ui/themes/SystemTheme.h @@ -38,7 +38,7 @@ class SystemTheme : public ITheme { public: - SystemTheme(QString& themeName, bool isSystemTheme = false); + SystemTheme(const QString& styleName, const QPalette& palette, bool isDefaultTheme); virtual ~SystemTheme() {} void apply(bool initial) override; diff --git a/launcher/ui/themes/ThemeManager.cpp b/launcher/ui/themes/ThemeManager.cpp index ad9a6f88e..691a51668 100644 --- a/launcher/ui/themes/ThemeManager.cpp +++ b/launcher/ui/themes/ThemeManager.cpp @@ -36,6 +36,13 @@ ThemeManager::ThemeManager() { + themeDebugLog() << "Determining System Widget Theme..."; + const auto& style = QApplication::style(); + m_defaultStyle = style->objectName(); + themeDebugLog() << "System theme seems to be:" << m_defaultStyle; + + m_defaultPalette = QApplication::palette(); + initializeThemes(); initializeCatPacks(); } @@ -121,13 +128,8 @@ void ThemeManager::initializeIcons() void ThemeManager::initializeWidgets() { - themeDebugLog() << "Determining System Widget Theme..."; - const auto& style = QApplication::style(); - m_currentlySelectedSystemTheme = style->objectName(); - themeDebugLog() << "System theme seems to be:" << m_currentlySelectedSystemTheme; - themeDebugLog() << "<> Initializing Widget Themes"; - themeDebugLog() << "Loading Built-in Theme:" << addTheme(std::make_unique(m_currentlySelectedSystemTheme, true)); + themeDebugLog() << "Loading Built-in Theme:" << addTheme(std::make_unique(m_defaultStyle, m_defaultPalette, true)); auto darkThemeId = addTheme(std::make_unique()); themeDebugLog() << "Loading Built-in Theme:" << darkThemeId; themeDebugLog() << "Loading Built-in Theme:" << addTheme(std::make_unique()); @@ -140,7 +142,7 @@ void ThemeManager::initializeWidgets() continue; } #endif - themeDebugLog() << "Loading System Theme:" << addTheme(std::make_unique(st)); + themeDebugLog() << "Loading System Theme:" << addTheme(std::make_unique(st, m_defaultPalette, false)); } // TODO: need some way to differentiate same name themes in different subdirectories @@ -260,7 +262,7 @@ void ThemeManager::applyCurrentlySelectedTheme(bool initial) themeDebugLog() << "<> Icon theme set."; auto applicationTheme = settings->get("ApplicationTheme").toString(); if (applicationTheme == "") { - applicationTheme = m_currentlySelectedSystemTheme; + applicationTheme = m_defaultStyle; } setApplicationTheme(applicationTheme, initial); themeDebugLog() << "<> Application theme set."; diff --git a/launcher/ui/themes/ThemeManager.h b/launcher/ui/themes/ThemeManager.h index 8bbcd34a9..c7e32bc8c 100644 --- a/launcher/ui/themes/ThemeManager.h +++ b/launcher/ui/themes/ThemeManager.h @@ -66,7 +66,8 @@ class ThemeManager { QDir m_applicationThemeFolder{ "themes" }; QDir m_catPacksFolder{ "catpacks" }; std::map> m_catPacks; - QString m_currentlySelectedSystemTheme; + QString m_defaultStyle; + QPalette m_defaultPalette; LogColors m_logColors; void initializeThemes(); From 96414d715376a3554e9ec93665a10fe3915660ed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 25 Aug 2024 00:22:51 +0000 Subject: [PATCH 148/616] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/c3aa7b8938b17aebd2deecf7be0636000d62a2b9?narHash=sha256-med8%2B5DSWa2UnOqtdICndjDAEjxr5D7zaIiK4pn0Q7c%3D' (2024-08-14) → 'github:NixOS/nixpkgs/c374d94f1536013ca8e92341b540eba4c22f9c62?narHash=sha256-Z/ELQhrSd7bMzTO8r7NZgi9g5emh%2BaRKoCdaAv5fiO0%3D' (2024-08-21) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 3210dc4e2..58ae840c2 100644 --- a/flake.lock +++ b/flake.lock @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1723637854, - "narHash": "sha256-med8+5DSWa2UnOqtdICndjDAEjxr5D7zaIiK4pn0Q7c=", + "lastModified": 1724224976, + "narHash": "sha256-Z/ELQhrSd7bMzTO8r7NZgi9g5emh+aRKoCdaAv5fiO0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c3aa7b8938b17aebd2deecf7be0636000d62a2b9", + "rev": "c374d94f1536013ca8e92341b540eba4c22f9c62", "type": "github" }, "original": { From 5f874330d50cd497decc5ca708d539de9df6b616 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sat, 24 Aug 2024 20:24:35 -0700 Subject: [PATCH 149/616] security(modrinth) reorder hash algo priority, prefer stronger hashes. Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .../modrinth/ModrinthInstanceCreationTask.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index c0806a638..bf224412e 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -348,14 +348,14 @@ bool ModrinthCreationTask::parseManifest(const QString& index_path, QJsonObject hashes = Json::requireObject(modInfo, "hashes"); QString hash; QCryptographicHash::Algorithm hashAlgorithm; - hash = Json::ensureString(hashes, "sha1"); - hashAlgorithm = QCryptographicHash::Sha1; + hash = Json::ensureString(hashes, "sha512"); + hashAlgorithm = QCryptographicHash::Sha512; if (hash.isEmpty()) { - hash = Json::ensureString(hashes, "sha512"); - hashAlgorithm = QCryptographicHash::Sha512; + hash = Json::ensureString(hashes, "sha256"); + hashAlgorithm = QCryptographicHash::Sha256; if (hash.isEmpty()) { - hash = Json::ensureString(hashes, "sha256"); - hashAlgorithm = QCryptographicHash::Sha256; + hash = Json::ensureString(hashes, "sha1"); + hashAlgorithm = QCryptographicHash::Sha1; if (hash.isEmpty()) { throw JSONValidationError("No hash found for: " + file.path); } From ff9fa6aa4fa912690cc30c0065dca872450cb033 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sun, 25 Aug 2024 11:45:45 +0100 Subject: [PATCH 150/616] Stop accepting malformed hashes object Signed-off-by: TheKodeToad --- .../modrinth/ModrinthInstanceCreationTask.cpp | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index bf224412e..517864790 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -346,23 +346,8 @@ bool ModrinthCreationTask::parseManifest(const QString& index_path, } QJsonObject hashes = Json::requireObject(modInfo, "hashes"); - QString hash; - QCryptographicHash::Algorithm hashAlgorithm; - hash = Json::ensureString(hashes, "sha512"); - hashAlgorithm = QCryptographicHash::Sha512; - if (hash.isEmpty()) { - hash = Json::ensureString(hashes, "sha256"); - hashAlgorithm = QCryptographicHash::Sha256; - if (hash.isEmpty()) { - hash = Json::ensureString(hashes, "sha1"); - hashAlgorithm = QCryptographicHash::Sha1; - if (hash.isEmpty()) { - throw JSONValidationError("No hash found for: " + file.path); - } - } - } - file.hash = QByteArray::fromHex(hash.toLatin1()); - file.hashAlgorithm = hashAlgorithm; + file.hash = QByteArray::fromHex(Json::requireString(hashes, "sha512").toLatin1()); + file.hashAlgorithm = QCryptographicHash::Sha512; // Do not use requireUrl, which uses StrictMode, instead use QUrl's default TolerantMode // (as Modrinth seems to incorrectly handle spaces) From 43fc9ba932ec65d274b60bafb4d3c3f1d5bf55f0 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sun, 25 Aug 2024 13:05:08 +0100 Subject: [PATCH 151/616] Confirm Truncate -> Truncation Signed-off-by: TheKodeToad --- launcher/ui/GuiUtil.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/GuiUtil.cpp b/launcher/ui/GuiUtil.cpp index 77d4a98e2..ccb4e48b5 100644 --- a/launcher/ui/GuiUtil.cpp +++ b/launcher/ui/GuiUtil.cpp @@ -102,7 +102,7 @@ std::optional GuiUtil::uploadPaste(const QString& name, const QString& if (baseUrl.toString() == "https://api.mclo.gs" && text.count("\n") > MaxMclogsLines) { auto truncateResponse = CustomMessageBox::selectable( - parentWidget, QObject::tr("Confirm Truncate"), + parentWidget, QObject::tr("Confirm Truncation"), QObject::tr("The log has %1 lines, exceeding mclo.gs' limit of %2.\n" "The launcher can keep the first %3 and last %4 lines, trimming the middle.\n\n" "If you choose 'No', mclo.gs will only keep the first %2 lines, cutting off " From 6a12c43c787db4a64748d6c3d03b34981948d7ce Mon Sep 17 00:00:00 2001 From: maskers <97827489+mskrss@users.noreply.github.com> Date: Sun, 25 Aug 2024 16:02:32 +0300 Subject: [PATCH 152/616] fix off by one error Signed-off-by: maskers <97827489+mskrss@users.noreply.github.com> --- launcher/ui/GuiUtil.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/GuiUtil.cpp b/launcher/ui/GuiUtil.cpp index ccb4e48b5..94dd01169 100644 --- a/launcher/ui/GuiUtil.cpp +++ b/launcher/ui/GuiUtil.cpp @@ -68,7 +68,7 @@ QString truncateLogForMclogs(const QString& logContent) "----- Middle portion omitted to fit mclo.gs size limits ----\n" "------------------------------------------------------------\n" "\n\n\n\n\n\n\n\n\n\n"; - truncatedLog += lines.mid(lines.size() - FinalMclogsLines, FinalMclogsLines).join("\n"); + truncatedLog += lines.mid(lines.size() - FinalMclogsLines - 1).join("\n"); return truncatedLog; } return logContent; From d55ebefac38c6fbba77c0cf0dc4c66298dea3a79 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 25 Aug 2024 21:42:40 +0300 Subject: [PATCH 153/616] fix java 64 bit condition Signed-off-by: Trial97 --- launcher/ui/widgets/JavaSettingsWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index bf58bf9f7..81bd22ff1 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -504,7 +504,7 @@ void JavaSettingsWidget::updateThresholds() } else if (observedMaxMemory < observedMinMemory) { iconName = "status-yellow"; m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value")); - } else if (observedMaxMemory > 2048 && m_result.is_64bit) { + } else if (observedMaxMemory > 2048 && !m_result.is_64bit) { iconName = "status-bad"; m_labelMaxMemIcon->setToolTip(tr("You are exceeding the maximum allocation supported by 32-bit installations of Java.")); } else { From 430013737a9e7268b6abb80905e99415e4a06caf Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 26 Aug 2024 00:27:23 +0300 Subject: [PATCH 154/616] add checksum validator Signed-off-by: Trial97 --- launcher/ResourceDownloadTask.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/launcher/ResourceDownloadTask.cpp b/launcher/ResourceDownloadTask.cpp index a02151ca1..6f5b9a189 100644 --- a/launcher/ResourceDownloadTask.cpp +++ b/launcher/ResourceDownloadTask.cpp @@ -24,7 +24,9 @@ #include "minecraft/mod/ModFolderModel.h" #include "minecraft/mod/ResourceFolderModel.h" +#include "modplatform/helpers/HashUtils.h" #include "net/ApiDownload.h" +#include "net/ChecksumValidator.h" ResourceDownloadTask::ResourceDownloadTask(ModPlatform::IndexedPack::Ptr pack, ModPlatform::IndexedVersion version, @@ -53,7 +55,29 @@ ResourceDownloadTask::ResourceDownloadTask(ModPlatform::IndexedPack::Ptr pack, } } - m_filesNetJob->addNetAction(Net::ApiDownload::makeFile(m_pack_version.downloadUrl, dir.absoluteFilePath(getFilename()))); + auto action = Net::ApiDownload::makeFile(m_pack_version.downloadUrl, dir.absoluteFilePath(getFilename())); + if (!m_pack_version.hash_type.isEmpty() && !m_pack_version.hash.isEmpty()) { + switch (Hashing::algorithmFromString(m_pack_version.hash_type)) { + case Hashing::Algorithm::Md4: + action->addValidator(new Net::ChecksumValidator(QCryptographicHash::Algorithm::Md4, m_pack_version.hash)); + break; + case Hashing::Algorithm::Md5: + action->addValidator(new Net::ChecksumValidator(QCryptographicHash::Algorithm::Md5, m_pack_version.hash)); + break; + case Hashing::Algorithm::Sha1: + action->addValidator(new Net::ChecksumValidator(QCryptographicHash::Algorithm::Sha1, m_pack_version.hash)); + break; + case Hashing::Algorithm::Sha256: + action->addValidator(new Net::ChecksumValidator(QCryptographicHash::Algorithm::Sha256, m_pack_version.hash)); + break; + case Hashing::Algorithm::Sha512: + action->addValidator(new Net::ChecksumValidator(QCryptographicHash::Algorithm::Sha512, m_pack_version.hash)); + break; + default: + break; + } + } + m_filesNetJob->addNetAction(action); connect(m_filesNetJob.get(), &NetJob::succeeded, this, &ResourceDownloadTask::downloadSucceeded); connect(m_filesNetJob.get(), &NetJob::progress, this, &ResourceDownloadTask::downloadProgressChanged); connect(m_filesNetJob.get(), &NetJob::stepProgress, this, &ResourceDownloadTask::propagateStepProgress); From c64b7cd693d10b740706a6424c2caf0d228a4c71 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 26 Aug 2024 09:00:46 +0300 Subject: [PATCH 155/616] fix mangohud detection for absolute path Signed-off-by: Trial97 --- launcher/MangoHud.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/launcher/MangoHud.cpp b/launcher/MangoHud.cpp index ba16ddc4a..29a7c63d9 100644 --- a/launcher/MangoHud.cpp +++ b/launcher/MangoHud.cpp @@ -108,24 +108,31 @@ QString getLibraryString() if (filePath.isEmpty()) { continue; } + try { + auto conf = Json::requireDocument(filePath, vkLayer); + auto confObject = Json::requireObject(conf, vkLayer); + auto layer = Json::ensureObject(confObject, "layer"); + QString libraryName = Json::ensureString(layer, "library_path"); - auto conf = Json::requireDocument(filePath, vkLayer); - auto confObject = Json::requireObject(conf, vkLayer); - auto layer = Json::ensureObject(confObject, "layer"); - QString libraryName = Json::ensureString(layer, "library_path"); + if (libraryName.isEmpty()) { + continue; + } + if (QFileInfo(libraryName).isAbsolute()) { + return libraryName; + } #ifdef __GLIBC__ - // Check whether mangohud is usable on a glibc based system - if (!libraryName.isEmpty()) { + // Check whether mangohud is usable on a glibc based system QString libraryPath = findLibrary(libraryName); if (!libraryPath.isEmpty()) { return libraryPath; } - } #else - // Without glibc return recorded shared library as-is. - return libraryName; + // Without glibc return recorded shared library as-is. + return libraryName; #endif + } catch (const Exception& e) { + } } return {}; From 034e2a44ad934cd289a116d311ed860e8d4c4023 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 26 Aug 2024 17:43:49 +0300 Subject: [PATCH 156/616] update thresholds each time java result changes Signed-off-by: Trial97 --- launcher/ui/widgets/JavaSettingsWidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 81bd22ff1..8e2d94556 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -468,6 +468,7 @@ void JavaSettingsWidget::checkFinished(const JavaChecker::Result& result) break; } } + updateThresholds(); m_checker.reset(); if (!queuedCheck.isNull()) { checkJavaPath(queuedCheck); From 630df290104879332fc7bce05c1c94e3c583851f Mon Sep 17 00:00:00 2001 From: Edgars Cirulis Date: Mon, 26 Aug 2024 01:34:31 +0300 Subject: [PATCH 157/616] feat: Improve left and right cursor navigation in Instances Signed-off-by: Edgars Cirulis --- launcher/ui/instanceview/InstanceView.cpp | 39 +++++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/launcher/ui/instanceview/InstanceView.cpp b/launcher/ui/instanceview/InstanceView.cpp index ed97de17a..c677f3951 100644 --- a/launcher/ui/instanceview/InstanceView.cpp +++ b/launcher/ui/instanceview/InstanceView.cpp @@ -848,7 +848,7 @@ QRegion InstanceView::visualRegionForSelection(const QItemSelection& selection) return region; } -QModelIndex InstanceView::moveCursor(QAbstractItemView::CursorAction cursorAction, [[maybe_unused]] Qt::KeyboardModifiers modifiers) +QModelIndex InstanceView::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers) { auto current = currentIndex(); if (!current.isValid()) { @@ -865,6 +865,7 @@ QModelIndex InstanceView::moveCursor(QAbstractItemView::CursorAction cursorActio if (m_currentCursorColumn < 0) { m_currentCursorColumn = column; } + // Handle different movement actions. switch (cursorAction) { case MoveUp: { if (row == 0) { @@ -925,16 +926,47 @@ QModelIndex InstanceView::moveCursor(QAbstractItemView::CursorAction cursorActio if (column > 0) { m_currentCursorColumn = column - 1; return cat->rows[row][column - 1]; + } else if (row > 0) { + row -= 1; + int newRowSize = cat->rows[row].size(); + m_currentCursorColumn = newRowSize - 1; + return cat->rows[row][m_currentCursorColumn]; + } else { + int prevGroupIndex = group_index - 1; + while (prevGroupIndex >= 0) { + auto prevGroup = m_groups[prevGroupIndex]; + if (prevGroup->collapsed) { + prevGroupIndex--; + continue; + } + int lastRow = prevGroup->numRows() - 1; + int lastCol = prevGroup->rows[lastRow].size() - 1; + m_currentCursorColumn = lastCol; + return prevGroup->rows[lastRow][lastCol]; + } } - // TODO: moving to previous line return current; } case MoveRight: { if (column < cat->rows[row].size() - 1) { m_currentCursorColumn = column + 1; return cat->rows[row][column + 1]; + } else if (row < cat->rows.size() - 1) { + row += 1; + m_currentCursorColumn = 0; + return cat->rows[row][m_currentCursorColumn]; + } else { + int nextGroupIndex = group_index + 1; + while (nextGroupIndex < m_groups.size()) { + auto nextGroup = m_groups[nextGroupIndex]; + if (nextGroup->collapsed) { + nextGroupIndex++; + continue; + } + m_currentCursorColumn = 0; + return nextGroup->rows[0][0]; + } } - // TODO: moving to next line return current; } case MoveHome: { @@ -947,6 +979,7 @@ QModelIndex InstanceView::moveCursor(QAbstractItemView::CursorAction cursorActio return cat->rows[row][last]; } default: + // For unsupported cursor actions, return the current index. break; } return current; From 4ea7132bdfdfc53690ababf66f1123c7e0217595 Mon Sep 17 00:00:00 2001 From: Kurumi78 <30587387+Kurumi78@users.noreply.github.com> Date: Fri, 30 Aug 2024 02:08:07 -0500 Subject: [PATCH 158/616] Add webp validIconExtensions Add webp to list of valid file extensions for Icons Signed-off-by: Kurumi78 <30587387+Kurumi78@users.noreply.github.com> --- launcher/icons/IconUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/icons/IconUtils.cpp b/launcher/icons/IconUtils.cpp index 6825dd6da..87e948729 100644 --- a/launcher/icons/IconUtils.cpp +++ b/launcher/icons/IconUtils.cpp @@ -39,7 +39,7 @@ #include "FileSystem.h" namespace { -static const QStringList validIconExtensions = { { "svg", "png", "ico", "gif", "jpg", "jpeg" } }; +static const QStringList validIconExtensions = { { "svg", "png", "ico", "gif", "jpg", "jpeg", "webp" } }; } namespace IconUtils { From 166207753c85d7295208989cd446399f5e833c01 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 5 Sep 2024 09:36:45 +0300 Subject: [PATCH 159/616] ensure that the shortcut destination exists Signed-off-by: Trial97 --- launcher/FileSystem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index b5c2c95cf..7f38cff04 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -921,6 +921,10 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri if (destination.isEmpty()) { destination = PathCombine(getDesktopDir(), RemoveInvalidFilenameChars(name)); } + if (!ensureFilePathExists(destination)) { + qWarning() << "Destination path can't be created!"; + return false; + } #if defined(Q_OS_MACOS) // Create the Application QDir applicationDirectory = From c5592a446ae1f63743d1d777eb5843e25ad376a1 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 6 Sep 2024 21:47:35 +0300 Subject: [PATCH 160/616] Remove all the slowdown code from CocurrentTask Signed-off-by: Trial97 --- launcher/tasks/ConcurrentTask.cpp | 64 ++++--------------------------- launcher/tasks/ConcurrentTask.h | 10 ----- 2 files changed, 7 insertions(+), 67 deletions(-) diff --git a/launcher/tasks/ConcurrentTask.cpp b/launcher/tasks/ConcurrentTask.cpp index 6f4a94e7f..f2ee40c31 100644 --- a/launcher/tasks/ConcurrentTask.cpp +++ b/launcher/tasks/ConcurrentTask.cpp @@ -38,8 +38,7 @@ #include #include "tasks/Task.h" -ConcurrentTask::ConcurrentTask(QObject* parent, QString task_name, int max_concurrent) - : Task(parent), m_name(task_name), m_total_max_size(max_concurrent) +ConcurrentTask::ConcurrentTask(QObject* parent, QString task_name, int max_concurrent) : Task(parent), m_total_max_size(max_concurrent) { setObjectName(task_name); } @@ -104,9 +103,9 @@ void ConcurrentTask::clear() m_done.clear(); m_failed.clear(); m_queue.clear(); + m_task_progress.clear(); m_progress = 0; - m_stepProgress = 0; } void ConcurrentTask::executeNextSubTask() @@ -139,7 +138,7 @@ void ConcurrentTask::startSubTask(Task::Ptr next) connect(next.get(), &Task::status, this, [this, next](QString msg) { subTaskStatus(next, msg); }); connect(next.get(), &Task::details, this, [this, next](QString msg) { subTaskDetails(next, msg); }); - connect(next.get(), &Task::stepProgress, this, [this, next](TaskStepProgress const& tp) { subTaskStepProgress(next, tp); }); + connect(next.get(), &Task::stepProgress, this, &ConcurrentTask::stepProgress); connect(next.get(), &Task::progress, this, [this, next](qint64 current, qint64 total) { subTaskProgress(next, current, total); }); @@ -149,7 +148,6 @@ void ConcurrentTask::startSubTask(Task::Ptr next) m_task_progress.insert(next->getUid(), task_progress); updateState(); - updateStepProgress(*task_progress.get(), Operation::ADDED); QMetaObject::invokeMethod(next.get(), &Task::start, Qt::QueuedConnection); } @@ -161,14 +159,14 @@ void ConcurrentTask::subTaskFinished(Task::Ptr task, TaskStepState state) m_doing.remove(task.get()); - auto task_progress = m_task_progress.value(task->getUid()); - task_progress->state = state; + auto task_progress = *m_task_progress.value(task->getUid()); + task_progress.state = state; + m_task_progress.remove(task->getUid()); disconnect(task.get(), 0, this, 0); - emit stepProgress(*task_progress); + emit stepProgress(task_progress); updateState(); - updateStepProgress(*task_progress, Operation::REMOVED); QMetaObject::invokeMethod(this, &ConcurrentTask::executeNextSubTask, Qt::QueuedConnection); } @@ -215,7 +213,6 @@ void ConcurrentTask::subTaskProgress(Task::Ptr task, qint64 current, qint64 tota task_progress->update(current, total); emit stepProgress(*task_progress); - updateStepProgress(*task_progress, Operation::CHANGED); updateState(); if (totalSize() == 1) { @@ -223,52 +220,6 @@ void ConcurrentTask::subTaskProgress(Task::Ptr task, qint64 current, qint64 tota } } -void ConcurrentTask::subTaskStepProgress(Task::Ptr task, TaskStepProgress const& task_progress) -{ - Operation op = Operation::ADDED; - - if (!m_task_progress.contains(task_progress.uid)) { - m_task_progress.insert(task_progress.uid, std::make_shared(task_progress)); - op = Operation::ADDED; - emit stepProgress(task_progress); - updateStepProgress(task_progress, op); - } else { - auto tp = m_task_progress.value(task_progress.uid); - - tp->old_current = tp->current; - tp->old_total = tp->total; - - tp->current = task_progress.current; - tp->total = task_progress.total; - tp->status = task_progress.status; - tp->details = task_progress.details; - - op = Operation::CHANGED; - emit stepProgress(*tp.get()); - updateStepProgress(*tp.get(), op); - } -} - -void ConcurrentTask::updateStepProgress(TaskStepProgress const& changed_progress, Operation op) -{ - switch (op) { - case Operation::ADDED: - m_stepProgress += changed_progress.current; - m_stepTotalProgress += changed_progress.total; - break; - case Operation::REMOVED: - m_stepProgress -= changed_progress.current; - m_stepTotalProgress -= changed_progress.total; - break; - case Operation::CHANGED: - m_stepProgress -= changed_progress.old_current; - m_stepTotalProgress -= changed_progress.old_total; - m_stepProgress += changed_progress.current; - m_stepTotalProgress += changed_progress.total; - break; - } -} - void ConcurrentTask::updateState() { if (totalSize() > 1) { @@ -276,7 +227,6 @@ void ConcurrentTask::updateState() setStatus(tr("Executing %1 task(s) (%2 out of %3 are done)") .arg(QString::number(m_doing.count()), QString::number(m_done.count()), QString::number(totalSize()))); } else { - setProgress(m_stepProgress, m_stepTotalProgress); QString status = tr("Please wait..."); if (m_queue.size() > 0) { status = tr("Waiting for a task to start..."); diff --git a/launcher/tasks/ConcurrentTask.h b/launcher/tasks/ConcurrentTask.h index 07ea58575..0d6709940 100644 --- a/launcher/tasks/ConcurrentTask.h +++ b/launcher/tasks/ConcurrentTask.h @@ -80,23 +80,16 @@ class ConcurrentTask : public Task { void subTaskStatus(Task::Ptr task, const QString& msg); void subTaskDetails(Task::Ptr task, const QString& msg); void subTaskProgress(Task::Ptr task, qint64 current, qint64 total); - void subTaskStepProgress(Task::Ptr task, TaskStepProgress const& task_step_progress); protected: // NOTE: This is not thread-safe. [[nodiscard]] unsigned int totalSize() const { return static_cast(m_queue.size() + m_doing.size() + m_done.size()); } - enum class Operation { ADDED, REMOVED, CHANGED }; - void updateStepProgress(TaskStepProgress const& changed_progress, Operation); - virtual void updateState(); void startSubTask(Task::Ptr task); protected: - QString m_name; - QString m_step_status; - QQueue m_queue; QHash m_doing; @@ -107,7 +100,4 @@ class ConcurrentTask : public Task { QHash> m_task_progress; int m_total_max_size; - - qint64 m_stepProgress = 0; - qint64 m_stepTotalProgress = 100; }; From c2a2e95183977bee5aebdca57fc6e342d7b9c9ed Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sat, 7 Sep 2024 21:35:01 -0700 Subject: [PATCH 161/616] fix: Forge and neoforge conflict with quilt, not fabric twice Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/Component.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index aeb8a398f..1073ef324 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -50,8 +50,8 @@ #include const QMap Component::KNOWN_MODLOADERS = { - { "net.neoforged", { ModPlatform::NeoForge, { "net.minecraftforge", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, - { "net.minecraftforge", { ModPlatform::Forge, { "net.neoforged", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, + { "net.neoforged", { ModPlatform::NeoForge, { "net.minecraftforge", "net.fabricmc.fabric-loader", "org.quiltmc.quilt-loader" } } }, + { "net.minecraftforge", { ModPlatform::Forge, { "net.neoforged", "net.fabricmc.fabric-loader", "org.quiltmc.quilt-loader" } } }, { "net.fabricmc.fabric-loader", { ModPlatform::Fabric, { "net.minecraftforge", "net.neoforged", "org.quiltmc.quilt-loader" } } }, { "org.quiltmc.quilt-loader", { ModPlatform::Quilt, { "net.minecraftforge", "net.neoforged", "net.fabricmc.fabric-loader" } } }, { "com.mumfrey.liteloader", { ModPlatform::LiteLoader, {} } } From 14fb54afd9673eebf43fad454db966e740c2c8e3 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 8 Sep 2024 01:00:59 +0300 Subject: [PATCH 162/616] Fix launch when no java is loaded Signed-off-by: Trial97 --- launcher/BaseInstance.h | 4 +- launcher/CMakeLists.txt | 6 +- launcher/NullInstance.h | 2 +- launcher/RuntimeContext.h | 23 +----- launcher/launch/LaunchStep.cpp | 3 +- launcher/launch/LaunchStep.h | 7 +- launcher/launch/LaunchTask.cpp | 1 - launcher/launch/LaunchTask.h | 3 +- launcher/launch/TaskStepWrapper.cpp | 65 +++++++++++++++++ .../{steps/Update.h => TaskStepWrapper.h} | 11 +-- launcher/launch/steps/CheckJava.cpp | 3 + launcher/launch/steps/CheckJava.h | 2 +- launcher/launch/steps/QuitAfterGameStop.h | 2 +- launcher/launch/steps/Update.cpp | 73 ------------------- launcher/minecraft/LaunchProfile.cpp | 1 + launcher/minecraft/MinecraftInstance.cpp | 54 ++++++++------ launcher/minecraft/MinecraftInstance.h | 4 +- launcher/minecraft/MinecraftLoadAndCheck.cpp | 35 ++++----- launcher/minecraft/MinecraftLoadAndCheck.h | 22 ++---- launcher/minecraft/MinecraftUpdate.cpp | 63 ---------------- launcher/minecraft/MinecraftUpdate.h | 33 --------- launcher/minecraft/PackProfile.h | 6 +- launcher/minecraft/launch/AutoInstallJava.h | 1 - launcher/minecraft/launch/ClaimAccount.h | 2 +- launcher/minecraft/update/AssetUpdateTask.cpp | 3 +- launcher/minecraft/update/AssetUpdateTask.h | 2 +- launcher/minecraft/update/FMLLibrariesTask.h | 2 +- launcher/minecraft/update/FoldersTask.cpp | 2 +- launcher/minecraft/update/FoldersTask.h | 2 +- launcher/minecraft/update/LibrariesTask.h | 2 +- launcher/ui/pages/instance/VersionPage.cpp | 14 +++- 31 files changed, 163 insertions(+), 290 deletions(-) create mode 100644 launcher/launch/TaskStepWrapper.cpp rename launcher/launch/{steps/Update.h => TaskStepWrapper.h} (73%) delete mode 100644 launcher/launch/steps/Update.cpp delete mode 100644 launcher/minecraft/MinecraftUpdate.cpp delete mode 100644 launcher/minecraft/MinecraftUpdate.h diff --git a/launcher/BaseInstance.h b/launcher/BaseInstance.h index 8c80331bc..2be28d1ec 100644 --- a/launcher/BaseInstance.h +++ b/launcher/BaseInstance.h @@ -181,7 +181,7 @@ class BaseInstance : public QObject, public std::enable_shared_from_this createUpdateTask() = 0; /// returns a valid launcher (task container) virtual shared_qobject_ptr createLaunchTask(AuthSessionPtr account, MinecraftTarget::Ptr targetToJoin) = 0; @@ -215,7 +215,7 @@ class BaseInstance : public QObject, public std::enable_shared_from_this traits() const override { return {}; }; QString instanceConfigFolder() const override { return instanceRoot(); }; shared_qobject_ptr createLaunchTask(AuthSessionPtr, MinecraftTarget::Ptr) override { return nullptr; } - shared_qobject_ptr createUpdateTask([[maybe_unused]] Net::Mode mode) override { return nullptr; } + QList createUpdateTask() override { return {}; } QProcessEnvironment createEnvironment() override { return QProcessEnvironment(); } QProcessEnvironment createLaunchEnvironment() override { return QProcessEnvironment(); } QMap getVariables() override { return QMap(); } diff --git a/launcher/RuntimeContext.h b/launcher/RuntimeContext.h index c57140d28..85304a5bc 100644 --- a/launcher/RuntimeContext.h +++ b/launcher/RuntimeContext.h @@ -20,13 +20,13 @@ #include #include +#include "SysInfo.h" #include "settings/SettingsObject.h" struct RuntimeContext { QString javaArchitecture; QString javaRealArchitecture; - QString javaPath; - QString system; + QString system = SysInfo::currentSystem(); QString mappedJavaRealArchitecture() const { @@ -45,8 +45,6 @@ struct RuntimeContext { { javaArchitecture = instanceSettings->get("JavaArchitecture").toString(); javaRealArchitecture = instanceSettings->get("JavaRealArchitecture").toString(); - javaPath = instanceSettings->get("JavaPath").toString(); - system = currentSystem(); } QString getClassifier() const { return system + "-" + mappedJavaRealArchitecture(); } @@ -68,21 +66,4 @@ struct RuntimeContext { return x; } - - static QString currentSystem() - { -#if defined(Q_OS_LINUX) - return "linux"; -#elif defined(Q_OS_MACOS) - return "osx"; -#elif defined(Q_OS_WINDOWS) - return "windows"; -#elif defined(Q_OS_FREEBSD) - return "freebsd"; -#elif defined(Q_OS_OPENBSD) - return "openbsd"; -#else - return "unknown"; -#endif - } }; diff --git a/launcher/launch/LaunchStep.cpp b/launcher/launch/LaunchStep.cpp index ebc534617..f3e9dfce0 100644 --- a/launcher/launch/LaunchStep.cpp +++ b/launcher/launch/LaunchStep.cpp @@ -16,9 +16,8 @@ #include "LaunchStep.h" #include "LaunchTask.h" -void LaunchStep::bind(LaunchTask* parent) +LaunchStep::LaunchStep(LaunchTask* parent) : Task(parent), m_parent(parent) { - m_parent = parent; connect(this, &LaunchStep::readyForLaunch, parent, &LaunchTask::onReadyForLaunch); connect(this, &LaunchStep::logLine, parent, &LaunchTask::onLogLine); connect(this, &LaunchStep::logLines, parent, &LaunchTask::onLogLines); diff --git a/launcher/launch/LaunchStep.h b/launcher/launch/LaunchStep.h index 6a28afb1f..d49d7545b 100644 --- a/launcher/launch/LaunchStep.h +++ b/launcher/launch/LaunchStep.h @@ -24,11 +24,8 @@ class LaunchTask; class LaunchStep : public Task { Q_OBJECT public: /* methods */ - explicit LaunchStep(LaunchTask* parent) : Task(nullptr), m_parent(parent) { bind(parent); }; - virtual ~LaunchStep() {}; - - private: /* methods */ - void bind(LaunchTask* parent); + explicit LaunchStep(LaunchTask* parent); + virtual ~LaunchStep() = default; signals: void logLines(QStringList lines, MessageLevel::Enum level); diff --git a/launcher/launch/LaunchTask.cpp b/launcher/launch/LaunchTask.cpp index 06a32bd28..4e4f5ead4 100644 --- a/launcher/launch/LaunchTask.cpp +++ b/launcher/launch/LaunchTask.cpp @@ -44,7 +44,6 @@ #include #include #include "MessageLevel.h" -#include "java/JavaChecker.h" #include "tasks/Task.h" void LaunchTask::init() diff --git a/launcher/launch/LaunchTask.h b/launcher/launch/LaunchTask.h index ae24b9a26..2fd8c78c7 100644 --- a/launcher/launch/LaunchTask.h +++ b/launcher/launch/LaunchTask.h @@ -41,7 +41,6 @@ #include "BaseInstance.h" #include "LaunchStep.h" #include "LogModel.h" -#include "LoggedProcess.h" #include "MessageLevel.h" class LaunchTask : public Task { @@ -55,7 +54,7 @@ class LaunchTask : public Task { public: /* methods */ static shared_qobject_ptr create(InstancePtr inst); - virtual ~LaunchTask() {}; + virtual ~LaunchTask() = default; void appendStep(shared_qobject_ptr step); void prependStep(shared_qobject_ptr step); diff --git a/launcher/launch/TaskStepWrapper.cpp b/launcher/launch/TaskStepWrapper.cpp new file mode 100644 index 000000000..136057620 --- /dev/null +++ b/launcher/launch/TaskStepWrapper.cpp @@ -0,0 +1,65 @@ +/* Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TaskStepWrapper.h" +#include "tasks/Task.h" + +void TaskStepWrapper::executeTask() +{ + if (m_state == Task::State::AbortedByUser) { + emitFailed(tr("Task aborted.")); + return; + } + connect(m_task.get(), &Task::finished, this, &TaskStepWrapper::updateFinished); + connect(m_task.get(), &Task::progress, this, &TaskStepWrapper::setProgress); + connect(m_task.get(), &Task::stepProgress, this, &TaskStepWrapper::propagateStepProgress); + connect(m_task.get(), &Task::status, this, &TaskStepWrapper::setStatus); + connect(m_task.get(), &Task::details, this, &TaskStepWrapper::setDetails); + emit progressReportingRequest(); +} + +void TaskStepWrapper::proceed() +{ + m_task->start(); +} + +void TaskStepWrapper::updateFinished() +{ + if (m_task->wasSuccessful()) { + m_task.reset(); + emitSucceeded(); + } else { + QString reason = tr("Instance update failed because: %1\n\n").arg(m_task->failReason()); + m_task.reset(); + emit logLine(reason, MessageLevel::Fatal); + emitFailed(reason); + } +} + +bool TaskStepWrapper::canAbort() const +{ + if (m_task) { + return m_task->canAbort(); + } + return true; +} + +bool TaskStepWrapper::abort() +{ + if (m_task && m_task->canAbort()) { + return m_task->abort(); + } + return Task::abort(); +} diff --git a/launcher/launch/steps/Update.h b/launcher/launch/TaskStepWrapper.h similarity index 73% rename from launcher/launch/steps/Update.h rename to launcher/launch/TaskStepWrapper.h index 878a43e7e..aec1b7037 100644 --- a/launcher/launch/steps/Update.h +++ b/launcher/launch/TaskStepWrapper.h @@ -21,12 +21,11 @@ #include #include -// FIXME: stupid. should be defined by the instance type? or even completely abstracted away... -class Update : public LaunchStep { +class TaskStepWrapper : public LaunchStep { Q_OBJECT public: - explicit Update(LaunchTask* parent, Net::Mode mode) : LaunchStep(parent), m_mode(mode) {}; - virtual ~Update() {}; + explicit TaskStepWrapper(LaunchTask* parent, Task::Ptr task) : LaunchStep(parent), m_task(task) {}; + virtual ~TaskStepWrapper() = default; void executeTask() override; bool canAbort() const override; @@ -38,7 +37,5 @@ class Update : public LaunchStep { void updateFinished(); private: - Task::Ptr m_updateTask; - bool m_aborted = false; - Net::Mode m_mode = Net::Mode::Offline; + Task::Ptr m_task; }; diff --git a/launcher/launch/steps/CheckJava.cpp b/launcher/launch/steps/CheckJava.cpp index 99ff62b67..55d13b58c 100644 --- a/launcher/launch/steps/CheckJava.cpp +++ b/launcher/launch/steps/CheckJava.cpp @@ -106,6 +106,7 @@ void CheckJava::executeTask() auto vendorString = instance->settings()->get("JavaVendor").toString(); printJavaInfo(verString, archString, realArchString, vendorString); } + m_parent->instance()->updateRuntimeContext(); emitSucceeded(); } @@ -124,6 +125,7 @@ void CheckJava::checkJavaFinished(const JavaChecker::Result& result) emit logLine(QString("Java checker returned some invalid data we don't understand:"), MessageLevel::Error); emit logLines(result.outLog.split('\n'), MessageLevel::Warning); emit logLine("\nMinecraft might not start properly.", MessageLevel::Launcher); + m_parent->instance()->updateRuntimeContext(); emitSucceeded(); return; } @@ -135,6 +137,7 @@ void CheckJava::checkJavaFinished(const JavaChecker::Result& result) instance->settings()->set("JavaRealArchitecture", result.realPlatform); instance->settings()->set("JavaVendor", result.javaVendor); instance->settings()->set("JavaSignature", m_javaSignature); + m_parent->instance()->updateRuntimeContext(); emitSucceeded(); return; } diff --git a/launcher/launch/steps/CheckJava.h b/launcher/launch/steps/CheckJava.h index 7bb1ceb7e..1c59b0053 100644 --- a/launcher/launch/steps/CheckJava.h +++ b/launcher/launch/steps/CheckJava.h @@ -23,7 +23,7 @@ class CheckJava : public LaunchStep { Q_OBJECT public: explicit CheckJava(LaunchTask* parent) : LaunchStep(parent) {}; - virtual ~CheckJava() {}; + virtual ~CheckJava() = default; virtual void executeTask(); virtual bool canAbort() const { return false; } diff --git a/launcher/launch/steps/QuitAfterGameStop.h b/launcher/launch/steps/QuitAfterGameStop.h index d4324cce6..19ca59632 100644 --- a/launcher/launch/steps/QuitAfterGameStop.h +++ b/launcher/launch/steps/QuitAfterGameStop.h @@ -24,7 +24,7 @@ class QuitAfterGameStop : public LaunchStep { Q_OBJECT public: explicit QuitAfterGameStop(LaunchTask* parent) : LaunchStep(parent) {}; - virtual ~QuitAfterGameStop() {}; + virtual ~QuitAfterGameStop() = default; virtual void executeTask(); virtual bool canAbort() const { return false; } diff --git a/launcher/launch/steps/Update.cpp b/launcher/launch/steps/Update.cpp deleted file mode 100644 index f23c0bb4b..000000000 --- a/launcher/launch/steps/Update.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Update.h" -#include - -void Update::executeTask() -{ - if (m_aborted) { - emitFailed(tr("Task aborted.")); - return; - } - m_updateTask.reset(m_parent->instance()->createUpdateTask(m_mode)); - if (m_updateTask) { - connect(m_updateTask.get(), &Task::finished, this, &Update::updateFinished); - connect(m_updateTask.get(), &Task::progress, this, &Update::setProgress); - connect(m_updateTask.get(), &Task::stepProgress, this, &Update::propagateStepProgress); - connect(m_updateTask.get(), &Task::status, this, &Update::setStatus); - connect(m_updateTask.get(), &Task::details, this, &Update::setDetails); - emit progressReportingRequest(); - return; - } - emitSucceeded(); -} - -void Update::proceed() -{ - m_updateTask->start(); -} - -void Update::updateFinished() -{ - if (m_updateTask->wasSuccessful()) { - m_updateTask.reset(); - emitSucceeded(); - } else { - QString reason = tr("Instance update failed because: %1\n\n").arg(m_updateTask->failReason()); - m_updateTask.reset(); - emit logLine(reason, MessageLevel::Fatal); - emitFailed(reason); - } -} - -bool Update::canAbort() const -{ - if (m_updateTask) { - return m_updateTask->canAbort(); - } - return true; -} - -bool Update::abort() -{ - m_aborted = true; - if (m_updateTask) { - if (m_updateTask->canAbort()) { - return m_updateTask->abort(); - } - } - return true; -} diff --git a/launcher/minecraft/LaunchProfile.cpp b/launcher/minecraft/LaunchProfile.cpp index 468798850..c11a0f915 100644 --- a/launcher/minecraft/LaunchProfile.cpp +++ b/launcher/minecraft/LaunchProfile.cpp @@ -164,6 +164,7 @@ void LaunchProfile::applyCompatibleJavaMajors(QList& javaMajor) { m_compatibleJavaMajors.append(javaMajor); } + void LaunchProfile::applyCompatibleJavaName(QString javaName) { if (!javaName.isEmpty()) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index d861056bf..c94f3f234 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -43,6 +43,9 @@ #include "minecraft/launch/CreateGameFolders.h" #include "minecraft/launch/ExtractNatives.h" #include "minecraft/launch/PrintInstanceInfo.h" +#include "minecraft/update/AssetUpdateTask.h" +#include "minecraft/update/FMLLibrariesTask.h" +#include "minecraft/update/LibrariesTask.h" #include "settings/Setting.h" #include "settings/SettingsObject.h" @@ -53,13 +56,13 @@ #include "pathmatcher/RegexpMatcher.h" #include "launch/LaunchTask.h" +#include "launch/TaskStepWrapper.h" #include "launch/steps/CheckJava.h" #include "launch/steps/LookupServerAddress.h" #include "launch/steps/PostLaunchCommand.h" #include "launch/steps/PreLaunchCommand.h" #include "launch/steps/QuitAfterGameStop.h" #include "launch/steps/TextPrint.h" -#include "launch/steps/Update.h" #include "minecraft/launch/ClaimAccount.h" #include "minecraft/launch/LauncherPartLaunch.h" @@ -70,9 +73,6 @@ #include "java/JavaUtils.h" -#include "meta/Index.h" -#include "meta/VersionList.h" - #include "icons/IconList.h" #include "mod/ModFolderModel.h" @@ -84,7 +84,6 @@ #include "AssetsUtils.h" #include "MinecraftLoadAndCheck.h" -#include "MinecraftUpdate.h" #include "PackProfile.h" #include "minecraft/gameoptions/GameOptions.h" #include "minecraft/update/FoldersTask.h" @@ -218,6 +217,7 @@ void MinecraftInstance::loadSpecificSettings() void MinecraftInstance::updateRuntimeContext() { m_runtimeContext.updateFromInstanceSettings(m_settings); + m_components->invalidateLaunchProfile(); } QString MinecraftInstance::typeName() const @@ -1030,18 +1030,18 @@ QString MinecraftInstance::getStatusbarDescription() return description; } -Task::Ptr MinecraftInstance::createUpdateTask(Net::Mode mode) +QList MinecraftInstance::createUpdateTask() { - updateRuntimeContext(); - switch (mode) { - case Net::Mode::Offline: { - return Task::Ptr(new MinecraftLoadAndCheck(this)); - } - case Net::Mode::Online: { - return Task::Ptr(new MinecraftUpdate(this)); - } - } - return nullptr; + return { + // create folders + makeShared(this), + // libraries download + makeShared(this), + // FML libraries download and copy into the instance + makeShared(this), + // assets update + makeShared(this), + }; } shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPtr session, MinecraftTarget::Ptr targetToJoin) @@ -1090,14 +1090,10 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt process->appendStep(step); } - // if we aren't in offline mode,. - if (session->status != AuthSession::PlayableOffline) { - if (!session->demo) { - process->appendStep(makeShared(pptr, session)); - } - process->appendStep(makeShared(pptr, Net::Mode::Online)); - } else { - process->appendStep(makeShared(pptr, Net::Mode::Offline)); + // load meta + { + auto mode = session->status != AuthSession::PlayableOffline ? Net::Mode::Online : Net::Mode::Offline; + process->appendStep(makeShared(pptr, makeShared(this, mode, pptr))); } // check java @@ -1106,6 +1102,16 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt process->appendStep(makeShared(pptr)); } + // if we aren't in offline mode,. + if (session->status != AuthSession::PlayableOffline) { + if (!session->demo) { + process->appendStep(makeShared(pptr, session)); + } + for (auto t : createUpdateTask()) { + process->appendStep(makeShared(pptr, t)); + } + } + // if there are any jar mods { process->appendStep(makeShared(pptr)); diff --git a/launcher/minecraft/MinecraftInstance.h b/launcher/minecraft/MinecraftInstance.h index ad2cda186..75e97ae45 100644 --- a/launcher/minecraft/MinecraftInstance.h +++ b/launcher/minecraft/MinecraftInstance.h @@ -104,7 +104,7 @@ class MinecraftInstance : public BaseInstance { /** Returns whether the instance, with its version, has support for demo mode. */ [[nodiscard]] bool supportsDemo() const; - void updateRuntimeContext(); + void updateRuntimeContext() override; ////// Profile management ////// std::shared_ptr getPackProfile() const; @@ -120,7 +120,7 @@ class MinecraftInstance : public BaseInstance { std::shared_ptr gameOptionsModel(); ////// Launch stuff ////// - Task::Ptr createUpdateTask(Net::Mode mode) override; + QList createUpdateTask() override; shared_qobject_ptr createLaunchTask(AuthSessionPtr account, MinecraftTarget::Ptr targetToJoin) override; QStringList extraArguments() override; QStringList verboseDescription(AuthSessionPtr session, MinecraftTarget::Ptr targetToJoin) override; diff --git a/launcher/minecraft/MinecraftLoadAndCheck.cpp b/launcher/minecraft/MinecraftLoadAndCheck.cpp index 818e90cfc..655894d2a 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.cpp +++ b/launcher/minecraft/MinecraftLoadAndCheck.cpp @@ -2,41 +2,42 @@ #include "MinecraftInstance.h" #include "PackProfile.h" -MinecraftLoadAndCheck::MinecraftLoadAndCheck(MinecraftInstance* inst, QObject* parent) : Task(parent), m_inst(inst) {} +MinecraftLoadAndCheck::MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode, QObject* parent) + : Task(parent), m_inst(inst), m_netmode(netmode) +{} void MinecraftLoadAndCheck::executeTask() { // add offline metadata load task auto components = m_inst->getPackProfile(); - components->reload(Net::Mode::Offline); + components->reload(m_netmode); m_task = components->getCurrentTask(); if (!m_task) { emitSucceeded(); return; } - connect(m_task.get(), &Task::succeeded, this, &MinecraftLoadAndCheck::subtaskSucceeded); - connect(m_task.get(), &Task::failed, this, &MinecraftLoadAndCheck::subtaskFailed); - connect(m_task.get(), &Task::aborted, this, [this] { subtaskFailed(tr("Aborted")); }); - connect(m_task.get(), &Task::progress, this, &MinecraftLoadAndCheck::progress); + connect(m_task.get(), &Task::succeeded, this, &MinecraftLoadAndCheck::emitSucceeded); + connect(m_task.get(), &Task::failed, this, &MinecraftLoadAndCheck::emitFailed); + connect(m_task.get(), &Task::aborted, this, [this] { emitFailed(tr("Aborted")); }); + connect(m_task.get(), &Task::progress, this, &MinecraftLoadAndCheck::setProgress); connect(m_task.get(), &Task::stepProgress, this, &MinecraftLoadAndCheck::propagateStepProgress); connect(m_task.get(), &Task::status, this, &MinecraftLoadAndCheck::setStatus); + connect(m_task.get(), &Task::details, this, &MinecraftLoadAndCheck::setDetails); } -void MinecraftLoadAndCheck::subtaskSucceeded() +bool MinecraftLoadAndCheck::canAbort() const { - if (isFinished()) { - qCritical() << "MinecraftUpdate: Subtask" << sender() << "succeeded, but work was already done!"; - return; + if (m_task) { + return m_task->canAbort(); } - emitSucceeded(); + return true; } -void MinecraftLoadAndCheck::subtaskFailed(QString error) +bool MinecraftLoadAndCheck::abort() { - if (isFinished()) { - qCritical() << "MinecraftUpdate: Subtask" << sender() << "failed, but work was already done!"; - return; + if (m_task && m_task->canAbort()) { + return m_task->abort(); } - emitFailed(error); -} + return Task::abort(); +} \ No newline at end of file diff --git a/launcher/minecraft/MinecraftLoadAndCheck.h b/launcher/minecraft/MinecraftLoadAndCheck.h index 09edaf909..72e9e0caa 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.h +++ b/launcher/minecraft/MinecraftLoadAndCheck.h @@ -15,32 +15,24 @@ #pragma once -#include -#include -#include - -#include +#include "net/Mode.h" #include "tasks/Task.h" -#include "QObjectPtr.h" - -class MinecraftVersion; class MinecraftInstance; class MinecraftLoadAndCheck : public Task { Q_OBJECT public: - explicit MinecraftLoadAndCheck(MinecraftInstance* inst, QObject* parent = 0); - virtual ~MinecraftLoadAndCheck() {}; + explicit MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode, QObject* parent = nullptr); + virtual ~MinecraftLoadAndCheck() = default; void executeTask() override; - private slots: - void subtaskSucceeded(); - void subtaskFailed(QString error); + bool canAbort() const override; + public slots: + bool abort() override; private: MinecraftInstance* m_inst = nullptr; Task::Ptr m_task; - QString m_preFailure; - QString m_fail_reason; + Net::Mode m_netmode; }; diff --git a/launcher/minecraft/MinecraftUpdate.cpp b/launcher/minecraft/MinecraftUpdate.cpp deleted file mode 100644 index b63430aa8..000000000 --- a/launcher/minecraft/MinecraftUpdate.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "MinecraftUpdate.h" -#include "MinecraftInstance.h" - -#include "minecraft/PackProfile.h" - -#include "tasks/SequentialTask.h" -#include "update/AssetUpdateTask.h" -#include "update/FMLLibrariesTask.h" -#include "update/FoldersTask.h" -#include "update/LibrariesTask.h" - -MinecraftUpdate::MinecraftUpdate(MinecraftInstance* inst, QObject* parent) : SequentialTask(parent), m_inst(inst) {} - -void MinecraftUpdate::executeTask() -{ - m_queue.clear(); - // create folders - { - addTask(makeShared(m_inst)); - } - - // add metadata update task if necessary - { - auto components = m_inst->getPackProfile(); - components->reload(Net::Mode::Online); - auto task = components->getCurrentTask(); - if (task) { - addTask(task); - } - } - - // libraries download - { - addTask(makeShared(m_inst)); - } - - // FML libraries download and copy into the instance - { - addTask(makeShared(m_inst)); - } - - // assets update - { - addTask(makeShared(m_inst)); - } - - SequentialTask::executeTask(); -} diff --git a/launcher/minecraft/MinecraftUpdate.h b/launcher/minecraft/MinecraftUpdate.h deleted file mode 100644 index 456a13518..000000000 --- a/launcher/minecraft/MinecraftUpdate.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "tasks/SequentialTask.h" - -class MinecraftInstance; - -// this needs to be a task because components->reload does stuff that may block -class MinecraftUpdate : public SequentialTask { - Q_OBJECT - public: - explicit MinecraftUpdate(MinecraftInstance* inst, QObject* parent = 0); - virtual ~MinecraftUpdate() = default; - - void executeTask() override; - - private: - MinecraftInstance* m_inst = nullptr; -}; diff --git a/launcher/minecraft/PackProfile.h b/launcher/minecraft/PackProfile.h index 9b6710cc3..b2de26ea0 100644 --- a/launcher/minecraft/PackProfile.h +++ b/launcher/minecraft/PackProfile.h @@ -148,13 +148,13 @@ class PackProfile : public QAbstractListModel { std::optional getSupportedModLoaders(); QList getModLoadersList(); + /// apply the component patches. Catches all the errors and returns true/false for success/failure + void invalidateLaunchProfile(); + private: void scheduleSave(); bool saveIsScheduled() const; - /// apply the component patches. Catches all the errors and returns true/false for success/failure - void invalidateLaunchProfile(); - /// insert component so that its index is ideally the specified one (returns real index) void insertComponent(size_t index, ComponentPtr component); diff --git a/launcher/minecraft/launch/AutoInstallJava.h b/launcher/minecraft/launch/AutoInstallJava.h index 7e4efc50c..cbfcf5ee7 100644 --- a/launcher/minecraft/launch/AutoInstallJava.h +++ b/launcher/minecraft/launch/AutoInstallJava.h @@ -37,7 +37,6 @@ #include #include -#include "java/JavaMetadata.h" #include "meta/Version.h" #include "minecraft/MinecraftInstance.h" #include "tasks/Task.h" diff --git a/launcher/minecraft/launch/ClaimAccount.h b/launcher/minecraft/launch/ClaimAccount.h index 357a4d4c5..561f0e848 100644 --- a/launcher/minecraft/launch/ClaimAccount.h +++ b/launcher/minecraft/launch/ClaimAccount.h @@ -22,7 +22,7 @@ class ClaimAccount : public LaunchStep { Q_OBJECT public: explicit ClaimAccount(LaunchTask* parent, AuthSessionPtr session); - virtual ~ClaimAccount() {}; + virtual ~ClaimAccount() = default; void executeTask() override; void finalize() override; diff --git a/launcher/minecraft/update/AssetUpdateTask.cpp b/launcher/minecraft/update/AssetUpdateTask.cpp index 8add02d84..acdddc833 100644 --- a/launcher/minecraft/update/AssetUpdateTask.cpp +++ b/launcher/minecraft/update/AssetUpdateTask.cpp @@ -1,5 +1,6 @@ #include "AssetUpdateTask.h" +#include "launch/LaunchStep.h" #include "minecraft/AssetsUtils.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/PackProfile.h" @@ -14,8 +15,6 @@ AssetUpdateTask::AssetUpdateTask(MinecraftInstance* inst) m_inst = inst; } -AssetUpdateTask::~AssetUpdateTask() {} - void AssetUpdateTask::executeTask() { setStatus(tr("Updating assets index...")); diff --git a/launcher/minecraft/update/AssetUpdateTask.h b/launcher/minecraft/update/AssetUpdateTask.h index 6f053a54a..88fac0ac5 100644 --- a/launcher/minecraft/update/AssetUpdateTask.h +++ b/launcher/minecraft/update/AssetUpdateTask.h @@ -7,7 +7,7 @@ class AssetUpdateTask : public Task { Q_OBJECT public: AssetUpdateTask(MinecraftInstance* inst); - virtual ~AssetUpdateTask(); + virtual ~AssetUpdateTask() = default; void executeTask() override; diff --git a/launcher/minecraft/update/FMLLibrariesTask.h b/launcher/minecraft/update/FMLLibrariesTask.h index 32712d239..4fe2648e8 100644 --- a/launcher/minecraft/update/FMLLibrariesTask.h +++ b/launcher/minecraft/update/FMLLibrariesTask.h @@ -9,7 +9,7 @@ class FMLLibrariesTask : public Task { Q_OBJECT public: FMLLibrariesTask(MinecraftInstance* inst); - virtual ~FMLLibrariesTask() {}; + virtual ~FMLLibrariesTask() = default; void executeTask() override; diff --git a/launcher/minecraft/update/FoldersTask.cpp b/launcher/minecraft/update/FoldersTask.cpp index c74e8d2ef..7d6fc4394 100644 --- a/launcher/minecraft/update/FoldersTask.cpp +++ b/launcher/minecraft/update/FoldersTask.cpp @@ -37,7 +37,7 @@ #include #include "minecraft/MinecraftInstance.h" -FoldersTask::FoldersTask(MinecraftInstance* inst) : Task() +FoldersTask::FoldersTask(MinecraftInstance* inst) { m_inst = inst; } diff --git a/launcher/minecraft/update/FoldersTask.h b/launcher/minecraft/update/FoldersTask.h index be4e33eb7..7df7ef81d 100644 --- a/launcher/minecraft/update/FoldersTask.h +++ b/launcher/minecraft/update/FoldersTask.h @@ -7,7 +7,7 @@ class FoldersTask : public Task { Q_OBJECT public: FoldersTask(MinecraftInstance* inst); - virtual ~FoldersTask() {}; + virtual ~FoldersTask() = default; void executeTask() override; diff --git a/launcher/minecraft/update/LibrariesTask.h b/launcher/minecraft/update/LibrariesTask.h index 441191154..838f9d9b4 100644 --- a/launcher/minecraft/update/LibrariesTask.h +++ b/launcher/minecraft/update/LibrariesTask.h @@ -7,7 +7,7 @@ class LibrariesTask : public Task { Q_OBJECT public: LibrariesTask(MinecraftInstance* inst); - virtual ~LibrariesTask() {}; + virtual ~LibrariesTask() = default; void executeTask() override; diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index c55d32efb..02bb08cab 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -50,7 +50,9 @@ #include #include +#include "QObjectPtr.h" #include "VersionPage.h" +#include "tasks/SequentialTask.h" #include "ui/dialogs/InstallLoaderDialog.h" #include "ui_VersionPage.h" @@ -415,14 +417,18 @@ void VersionPage::on_actionDownload_All_triggered() return; } - auto updateTask = m_inst->createUpdateTask(Net::Mode::Online); - if (!updateTask) { + auto updateTasks = m_inst->createUpdateTask(); + if (updateTasks.isEmpty()) { return; } + auto task = makeShared(this); + for (auto t : updateTasks) { + task->addTask(t); + } ProgressDialog tDialog(this); - connect(updateTask.get(), &Task::failed, this, &VersionPage::onGameUpdateError); + connect(task.get(), &Task::failed, this, &VersionPage::onGameUpdateError); // FIXME: unused return value - tDialog.execWithTask(updateTask.get()); + tDialog.execWithTask(task.get()); updateButtons(); m_container->refreshContainer(); } From 7fbf0d3bf3c3821916119a5303d6bc302f954580 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Mon, 9 Sep 2024 15:40:31 +0200 Subject: [PATCH 163/616] Sort files chronologically in descending order Signed-off-by: Qaz --- launcher/ui/pages/instance/ScreenshotsPage.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/launcher/ui/pages/instance/ScreenshotsPage.cpp b/launcher/ui/pages/instance/ScreenshotsPage.cpp index c3f955733..9c7df9d09 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.cpp +++ b/launcher/ui/pages/instance/ScreenshotsPage.cpp @@ -242,6 +242,10 @@ ScreenshotsPage::ScreenshotsPage(QString path, QWidget* parent) : QMainWindow(pa m_model->setReadOnly(false); m_model->setNameFilters({ "*.png" }); m_model->setNameFilterDisables(false); + // Sorts by modified date instead of creation date because that column is not available and would require subclassing, this should work + // considering screenshots aren't modified after creation. + constexpr int file_modified_column_index = 3; + m_model->sort(file_modified_column_index, Qt::DescendingOrder); m_folder = path; m_valid = FS::ensureFolderPathExists(m_folder); From e2ef280da98facec04a0e2b3d0f0e8b8317db043 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Mon, 9 Sep 2024 16:24:40 +0200 Subject: [PATCH 164/616] DCO Remediation Commit for QazCetelic I, QazCetelic , hereby add my Signed-off-by to this commit: 7fbf0d3bf3c3821916119a5303d6bc302f954580 Signed-off-by: QazCetelic --- launcher/ui/pages/instance/ScreenshotsPage.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/ui/pages/instance/ScreenshotsPage.cpp b/launcher/ui/pages/instance/ScreenshotsPage.cpp index 9c7df9d09..b619a07b8 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.cpp +++ b/launcher/ui/pages/instance/ScreenshotsPage.cpp @@ -246,6 +246,7 @@ ScreenshotsPage::ScreenshotsPage(QString path, QWidget* parent) : QMainWindow(pa // considering screenshots aren't modified after creation. constexpr int file_modified_column_index = 3; m_model->sort(file_modified_column_index, Qt::DescendingOrder); + m_folder = path; m_valid = FS::ensureFolderPathExists(m_folder); From 7e49fa04269b23c8cb4048a6a036aaf6d5e5bf8e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 19:05:56 +0000 Subject: [PATCH 165/616] chore(deps): update determinatesystems/update-flake-lock action to v24 --- .github/workflows/update-flake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-flake.yml b/.github/workflows/update-flake.yml index e1ab2e86e..ecc38ff28 100644 --- a/.github/workflows/update-flake.yml +++ b/.github/workflows/update-flake.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v4 - uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 - - uses: DeterminateSystems/update-flake-lock@v23 + - uses: DeterminateSystems/update-flake-lock@v24 with: commit-msg: "chore(nix): update lockfile" pr-title: "chore(nix): update lockfile" From 6b0007291bf8fd094300c21eb64cc119fb3a378d Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Tue, 10 Sep 2024 22:30:29 +0200 Subject: [PATCH 166/616] Added search and support for subdirectories to icon picker Signed-off-by: QazCetelic --- launcher/icons/IconList.cpp | 142 ++++++++++++++++++----- launcher/icons/IconList.h | 4 + launcher/ui/dialogs/IconPickerDialog.cpp | 23 +++- launcher/ui/dialogs/IconPickerDialog.h | 5 + 4 files changed, 144 insertions(+), 30 deletions(-) diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index e4157ea2d..56ff10e51 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -56,7 +56,7 @@ IconList::IconList(const QStringList& builtinPaths, QString path, QObject* paren QDir instance_icons(builtinPath); auto file_info_list = instance_icons.entryInfoList(QDir::Files, QDir::Name); for (auto file_info : file_info_list) { - builtinNames.insert(file_info.completeBaseName()); + builtinNames.insert(file_info.baseName()); } } for (auto& builtinName : builtinNames) { @@ -77,10 +77,95 @@ IconList::IconList(const QStringList& builtinPaths, QString path, QObject* paren void IconList::sortIconList() { qDebug() << "Sorting icon list..."; - std::sort(icons.begin(), icons.end(), [](const MMCIcon& a, const MMCIcon& b) { return a.m_key.localeAwareCompare(b.m_key) < 0; }); + std::sort(icons.begin(), icons.end(), [](const MMCIcon& a, const MMCIcon& b) { + bool aIsSubdir = a.m_key.contains(std::filesystem::path::preferred_separator); + bool bIsSubdir = b.m_key.contains(std::filesystem::path::preferred_separator); + if (aIsSubdir != bIsSubdir) { + return !aIsSubdir; // root-level icons come first + } + return a.m_key.localeAwareCompare(b.m_key) < 0; + }); reindex(); } +// Helper function to add directories recursively +bool IconList::addPathRecursively(const QString& path) +{ + QDir dir(path); + if (!dir.exists()) + return false; + + bool watching = false; + + // Add the directory itself + watching = m_watcher->addPath(path); + + // Add all subdirectories + QFileInfoList entries = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + for (const QFileInfo& entry : entries) + { + if (addPathRecursively(entry.absoluteFilePath())) + { + watching = true; + } + } + return watching; +} + +void IconList::removePathRecursively(const QString& path) +{ + QFileInfo file_info(path); + if (file_info.isFile()) { + // Remove the icon belonging to the file + QString key = m_dir.relativeFilePath(file_info.absoluteFilePath()); + int idx = getIconIndex(key); + if (idx == -1) + return; + + } + else if (file_info.isDir()) { + // Remove the directory itself + m_watcher->removePath(path); + + const QDir dir(path); + // Remove all files within the directory + for (const QFileInfo& file : dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) + { + removePathRecursively(file.absoluteFilePath()); + } + } +} + +QStringList IconList::getIconFilePaths() const +{ + QStringList icon_files {}; + QStringList directories {m_dir.absolutePath()}; + while (!directories.isEmpty()) { + QString first = directories.takeFirst(); + QDir dir(first); + for (QString& file_name : dir.entryList(QDir::AllDirs | QDir::Files |QDir::NoDotAndDotDot, QDir::Name)) { + QString full_path = dir.filePath(file_name); // Convert to full path + QFileInfo file_info(full_path); + if (file_info.isDir()) + directories.push_back(full_path); + else + icon_files.push_back(full_path); + } + } + return icon_files; +} + +QString formatName(const QDir& icons_dir, const QFileInfo& file) +{ + if (file.dir() == icons_dir) { + return file.baseName(); + } + else { + const QString delimiter = " » "; + return (icons_dir.relativeFilePath(file.dir().path()) + std::filesystem::path::preferred_separator + file.baseName()).replace(std::filesystem::path::preferred_separator, delimiter); + } +} + void IconList::directoryChanged(const QString& path) { QDir new_dir(path); @@ -95,13 +180,9 @@ void IconList::directoryChanged(const QString& path) if (!FS::ensureFolderPathExists(m_dir.absolutePath())) return; m_dir.refresh(); - auto new_list = m_dir.entryList(QDir::Files, QDir::Name); - for (auto it = new_list.begin(); it != new_list.end(); it++) { - QString& foo = (*it); - foo = m_dir.filePath(foo); - } + QStringList new_file_names_list = getIconFilePaths(); #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - QSet new_set(new_list.begin(), new_list.end()); + QSet new_set(new_file_names_list.begin(), new_file_names_list.end()); #else auto new_set = new_list.toSet(); #endif @@ -123,21 +204,16 @@ void IconList::directoryChanged(const QString& path) QSet to_add = new_set; to_add -= current_set; - for (auto remove : to_remove) { + for (const auto& remove : to_remove) { qDebug() << "Removing " << remove; - QFileInfo rmfile(remove); - QString key = rmfile.completeBaseName(); - - QString suffix = rmfile.suffix(); - // The icon doesnt have a suffix, but it can have other .s in the name, so we account for those as well - if (!IconUtils::isIconSuffix(suffix)) - key = rmfile.fileName(); + QFileInfo removed_file(remove); + QString key = m_dir.relativeFilePath(removed_file.absoluteFilePath()); int idx = getIconIndex(key); if (idx == -1) continue; - icons[idx].remove(IconType::FileBased); - if (icons[idx].type() == IconType::ToBeDeleted) { + icons[idx].remove(FileBased); + if (icons[idx].type() == ToBeDeleted) { beginRemoveRows(QModelIndex(), idx, idx); icons.remove(idx); reindex(); @@ -149,18 +225,14 @@ void IconList::directoryChanged(const QString& path) emit iconUpdated(key); } - for (auto add : to_add) { + for (const auto& add : to_add) { qDebug() << "Adding " << add; QFileInfo addfile(add); - QString key = addfile.completeBaseName(); + QString key = m_dir.relativeFilePath(addfile.absoluteFilePath()); + QString name = formatName(m_dir, addfile); - QString suffix = addfile.suffix(); - // The icon doesnt have a suffix, but it can have other .s in the name, so we account for those as well - if (!IconUtils::isIconSuffix(suffix)) - key = addfile.fileName(); - - if (addIcon(key, QString(), addfile.filePath(), IconType::FileBased)) { + if (addIcon(key, name, addfile.filePath(), IconType::FileBased)) { m_watcher->addPath(add); emit iconUpdated(key); } @@ -175,7 +247,7 @@ void IconList::fileChanged(const QString& path) QFileInfo checkfile(path); if (!checkfile.exists()) return; - QString key = checkfile.completeBaseName(); + QString key = m_dir.relativeFilePath(checkfile.absoluteFilePath()); int idx = getIconIndex(key); if (idx == -1) return; @@ -200,7 +272,7 @@ void IconList::startWatching() { auto abs_path = m_dir.absolutePath(); FS::ensureFolderPathExists(abs_path); - is_watching = m_watcher->addPath(abs_path); + is_watching = addPathRecursively(abs_path); if (is_watching) { qDebug() << "Started watching " << abs_path; } else { @@ -312,6 +384,7 @@ bool IconList::iconFileExists(const QString& key) const return iconEntry && iconEntry->has(IconType::FileBased); } +/// Returns the icon with the given key or nullptr if it doesn't exist. const MMCIcon* IconList::icon(const QString& key) const { int iconIdx = getIconIndex(key); @@ -394,6 +467,7 @@ void IconList::reindex() for (auto& iter : icons) { name_index[iter.m_key] = i; i++; + emit iconUpdated(iter.m_key); // prevents incorrect indices with proxy model } } @@ -425,3 +499,15 @@ QString IconList::getDirectory() const { return m_dir.absolutePath(); } + +/// Returns the directory of the icon with the given key or the default directory if it's a builtin icon. +QString IconList::iconDirectory(const QString& key) const +{ + for (auto mmc_icon : icons) { + if (mmc_icon.m_key == key && mmc_icon.has(IconType::FileBased)) { + QFileInfo icon_file(mmc_icon.getFilePath()); + return icon_file.dir().path(); + } + } + return getDirectory(); +} diff --git a/launcher/icons/IconList.h b/launcher/icons/IconList.h index 553946c42..fcd172561 100644 --- a/launcher/icons/IconList.h +++ b/launcher/icons/IconList.h @@ -72,6 +72,7 @@ class IconList : public QAbstractListModel { bool deleteIcon(const QString& key); bool trashIcon(const QString& key); bool iconFileExists(const QString& key) const; + QString iconDirectory(const QString& key) const; void installIcons(const QStringList& iconFiles); void installIcon(const QString& file, const QString& name); @@ -91,6 +92,9 @@ class IconList : public QAbstractListModel { IconList& operator=(const IconList&) = delete; void reindex(); void sortIconList(); + bool addPathRecursively(const QString& path); + void removePathRecursively(const QString& path); + QStringList getIconFilePaths() const; public slots: void directoryChanged(const QString& path); diff --git a/launcher/ui/dialogs/IconPickerDialog.cpp b/launcher/ui/dialogs/IconPickerDialog.cpp index a196fd587..a3f1d7ea4 100644 --- a/launcher/ui/dialogs/IconPickerDialog.cpp +++ b/launcher/ui/dialogs/IconPickerDialog.cpp @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include "Application.h" @@ -33,6 +35,15 @@ IconPickerDialog::IconPickerDialog(QWidget* parent) : QDialog(parent), ui(new Ui ui->setupUi(this); setWindowModality(Qt::WindowModal); + searchBar = new QLineEdit(this); + searchBar->setPlaceholderText(tr("Search...")); + ui->verticalLayout->insertWidget(0, searchBar); + + proxyModel = new QSortFilterProxyModel(this); + proxyModel->setSourceModel(APPLICATION->icons().get()); + proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); + ui->iconView->setModel(proxyModel); + auto contentsWidget = ui->iconView; contentsWidget->setViewMode(QListView::IconMode); contentsWidget->setFlow(QListView::LeftToRight); @@ -57,7 +68,7 @@ IconPickerDialog::IconPickerDialog(QWidget* parent) : QDialog(parent), ui(new Ui contentsWidget->installEventFilter(this); - contentsWidget->setModel(APPLICATION->icons().get()); + contentsWidget->setModel(proxyModel); // NOTE: ResetRole forces the button to be on the left, while the OK/Cancel ones are on the right. We win. auto buttonAdd = ui->buttonBox->addButton(tr("Add Icon"), QDialogButtonBox::ResetRole); @@ -73,6 +84,9 @@ IconPickerDialog::IconPickerDialog(QWidget* parent) : QDialog(parent), ui(new Ui auto buttonFolder = ui->buttonBox->addButton(tr("Open Folder"), QDialogButtonBox::ResetRole); connect(buttonFolder, &QPushButton::clicked, this, &IconPickerDialog::openFolder); + connect(searchBar, &QLineEdit::textChanged, this, &IconPickerDialog::filterIcons); + // Prevent incorrect indices from e.g. filesystem changes + connect(APPLICATION->icons().get(), &IconList::iconUpdated, this, [this]() { proxyModel->invalidate(); }); } bool IconPickerDialog::eventFilter(QObject* obj, QEvent* evt) @@ -159,5 +173,10 @@ IconPickerDialog::~IconPickerDialog() void IconPickerDialog::openFolder() { - DesktopServices::openPath(APPLICATION->icons()->getDirectory(), true); + DesktopServices::openPath(APPLICATION->icons()->iconDirectory(selectedIconKey), true); } + +void IconPickerDialog::filterIcons(const QString& query) +{ + proxyModel->setFilterFixedString(query); +} \ No newline at end of file diff --git a/launcher/ui/dialogs/IconPickerDialog.h b/launcher/ui/dialogs/IconPickerDialog.h index 37e53dcce..db1315338 100644 --- a/launcher/ui/dialogs/IconPickerDialog.h +++ b/launcher/ui/dialogs/IconPickerDialog.h @@ -16,6 +16,8 @@ #pragma once #include #include +#include +#include namespace Ui { class IconPickerDialog; @@ -36,6 +38,8 @@ class IconPickerDialog : public QDialog { private: Ui::IconPickerDialog* ui; QPushButton* buttonRemove; + QLineEdit* searchBar; + QSortFilterProxyModel* proxyModel; private slots: void selectionChanged(QItemSelection, QItemSelection); @@ -44,4 +48,5 @@ class IconPickerDialog : public QDialog { void addNewIcon(); void removeSelectedIcon(); void openFolder(); + void filterIcons(const QString& text); }; From 40c3866f635bcb0c084f9afc5c9bcec4a50fa036 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Wed, 11 Sep 2024 09:22:28 +0200 Subject: [PATCH 167/616] clang-tidy formatting Signed-off-by: QazCetelic --- launcher/icons/IconList.cpp | 54 +++++++++++------------- launcher/icons/IconList.h | 4 +- launcher/ui/dialogs/IconPickerDialog.cpp | 2 +- 3 files changed, 28 insertions(+), 32 deletions(-) diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index 56ff10e51..a9d5bda98 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -47,19 +47,19 @@ #define MAX_SIZE 1024 -IconList::IconList(const QStringList& builtinPaths, QString path, QObject* parent) : QAbstractListModel(parent) +IconList::IconList(const QStringList& builtinPaths, const QString& path, QObject* parent) : QAbstractListModel(parent) { QSet builtinNames; // add builtin icons - for (auto& builtinPath : builtinPaths) { + for (const auto& builtinPath : builtinPaths) { QDir instance_icons(builtinPath); auto file_info_list = instance_icons.entryInfoList(QDir::Files, QDir::Name); - for (auto file_info : file_info_list) { + for (const auto& file_info : file_info_list) { builtinNames.insert(file_info.baseName()); } } - for (auto& builtinName : builtinNames) { + for (const auto& builtinName : builtinNames) { addThemeIcon(builtinName); } @@ -81,7 +81,7 @@ void IconList::sortIconList() bool aIsSubdir = a.m_key.contains(std::filesystem::path::preferred_separator); bool bIsSubdir = b.m_key.contains(std::filesystem::path::preferred_separator); if (aIsSubdir != bIsSubdir) { - return !aIsSubdir; // root-level icons come first + return !aIsSubdir; // root-level icons come first } return a.m_key.localeAwareCompare(b.m_key) < 0; }); @@ -102,10 +102,8 @@ bool IconList::addPathRecursively(const QString& path) // Add all subdirectories QFileInfoList entries = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); - for (const QFileInfo& entry : entries) - { - if (addPathRecursively(entry.absoluteFilePath())) - { + for (const QFileInfo& entry : entries) { + if (addPathRecursively(entry.absoluteFilePath())) { watching = true; } } @@ -122,15 +120,13 @@ void IconList::removePathRecursively(const QString& path) if (idx == -1) return; - } - else if (file_info.isDir()) { + } else if (file_info.isDir()) { // Remove the directory itself m_watcher->removePath(path); const QDir dir(path); // Remove all files within the directory - for (const QFileInfo& file : dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) - { + for (const QFileInfo& file : dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) { removePathRecursively(file.absoluteFilePath()); } } @@ -138,13 +134,13 @@ void IconList::removePathRecursively(const QString& path) QStringList IconList::getIconFilePaths() const { - QStringList icon_files {}; - QStringList directories {m_dir.absolutePath()}; + QStringList icon_files{}; + QStringList directories{ m_dir.absolutePath() }; while (!directories.isEmpty()) { QString first = directories.takeFirst(); QDir dir(first); - for (QString& file_name : dir.entryList(QDir::AllDirs | QDir::Files |QDir::NoDotAndDotDot, QDir::Name)) { - QString full_path = dir.filePath(file_name); // Convert to full path + for (QString& file_name : dir.entryList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot, QDir::Name)) { + QString full_path = dir.filePath(file_name); // Convert to full path QFileInfo file_info(full_path); if (file_info.isDir()) directories.push_back(full_path); @@ -159,10 +155,10 @@ QString formatName(const QDir& icons_dir, const QFileInfo& file) { if (file.dir() == icons_dir) { return file.baseName(); - } - else { + } else { const QString delimiter = " » "; - return (icons_dir.relativeFilePath(file.dir().path()) + std::filesystem::path::preferred_separator + file.baseName()).replace(std::filesystem::path::preferred_separator, delimiter); + return (icons_dir.relativeFilePath(file.dir().path()) + std::filesystem::path::preferred_separator + file.baseName()) + .replace(std::filesystem::path::preferred_separator, delimiter); } } @@ -252,7 +248,7 @@ void IconList::fileChanged(const QString& path) if (idx == -1) return; QIcon icon(path); - if (!icon.availableSizes().size()) + if (icon.availableSizes().empty()) return; icons[idx].m_images[IconType::FileBased].icon = icon; @@ -260,7 +256,7 @@ void IconList::fileChanged(const QString& path) emit iconUpdated(key); } -void IconList::SettingChanged(const Setting& setting, QVariant value) +void IconList::SettingChanged(const Setting& setting, const QVariant& value) { if (setting.id() != "IconsDir") return; @@ -335,12 +331,12 @@ Qt::ItemFlags IconList::flags(const QModelIndex& index) const QVariant IconList::data(const QModelIndex& index, int role) const { if (!index.isValid()) - return QVariant(); + return {}; int row = index.row(); if (row < 0 || row >= icons.size()) - return QVariant(); + return {}; switch (role) { case Qt::DecorationRole: @@ -350,7 +346,7 @@ QVariant IconList::data(const QModelIndex& index, int role) const case Qt::UserRole: return icons[row].m_key; default: - return QVariant(); + return {}; } } @@ -361,7 +357,7 @@ int IconList::rowCount(const QModelIndex& parent) const void IconList::installIcons(const QStringList& iconFiles) { - for (QString file : iconFiles) + for (const QString& file : iconFiles) installIcon(file, {}); } @@ -467,7 +463,7 @@ void IconList::reindex() for (auto& iter : icons) { name_index[iter.m_key] = i; i++; - emit iconUpdated(iter.m_key); // prevents incorrect indices with proxy model + emit iconUpdated(iter.m_key); // prevents incorrect indices with proxy model } } @@ -483,7 +479,7 @@ QIcon IconList::getIcon(const QString& key) const if (icon_index != -1) return icons[icon_index].icon(); - return QIcon(); + return {}; } int IconList::getIconIndex(const QString& key) const @@ -503,7 +499,7 @@ QString IconList::getDirectory() const /// Returns the directory of the icon with the given key or the default directory if it's a builtin icon. QString IconList::iconDirectory(const QString& key) const { - for (auto mmc_icon : icons) { + for (const auto& mmc_icon : icons) { if (mmc_icon.m_key == key && mmc_icon.has(IconType::FileBased)) { QFileInfo icon_file(mmc_icon.getFilePath()); return icon_file.dir().path(); diff --git a/launcher/icons/IconList.h b/launcher/icons/IconList.h index fcd172561..6213b7da3 100644 --- a/launcher/icons/IconList.h +++ b/launcher/icons/IconList.h @@ -51,7 +51,7 @@ class QFileSystemWatcher; class IconList : public QAbstractListModel { Q_OBJECT public: - explicit IconList(const QStringList& builtinPaths, QString path, QObject* parent = 0); + explicit IconList(const QStringList& builtinPaths, const QString& path, QObject* parent = 0); virtual ~IconList() {}; QIcon getIcon(const QString& key) const; @@ -101,7 +101,7 @@ class IconList : public QAbstractListModel { protected slots: void fileChanged(const QString& path); - void SettingChanged(const Setting& setting, QVariant value); + void SettingChanged(const Setting& setting, const QVariant& value); private: shared_qobject_ptr m_watcher; diff --git a/launcher/ui/dialogs/IconPickerDialog.cpp b/launcher/ui/dialogs/IconPickerDialog.cpp index a3f1d7ea4..80effec07 100644 --- a/launcher/ui/dialogs/IconPickerDialog.cpp +++ b/launcher/ui/dialogs/IconPickerDialog.cpp @@ -15,9 +15,9 @@ #include #include +#include #include #include -#include #include "Application.h" From 0a576a0f6725aa2db1cdad7c153bfac25f2caef7 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Wed, 11 Sep 2024 09:31:16 +0200 Subject: [PATCH 168/616] fixes for ci errors Signed-off-by: QazCetelic --- launcher/icons/IconList.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index a9d5bda98..824bee617 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -35,6 +35,7 @@ */ #include "IconList.h" +#include #include #include #include @@ -180,7 +181,7 @@ void IconList::directoryChanged(const QString& path) #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) QSet new_set(new_file_names_list.begin(), new_file_names_list.end()); #else - auto new_set = new_list.toSet(); + auto new_set = new_file_names_list.toSet(); #endif QList current_list; for (auto& it : icons) { From 506ec642733e9c7c11ccb7c72619697c52307687 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Wed, 11 Sep 2024 09:43:45 +0200 Subject: [PATCH 169/616] fixes for ci errors II Signed-off-by: QazCetelic --- launcher/icons/IconList.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index 824bee617..66f6ad1f3 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -35,7 +35,6 @@ */ #include "IconList.h" -#include #include #include #include @@ -154,13 +153,13 @@ QStringList IconList::getIconFilePaths() const QString formatName(const QDir& icons_dir, const QFileInfo& file) { - if (file.dir() == icons_dir) { + if (file.dir() == icons_dir) return file.baseName(); - } else { - const QString delimiter = " » "; - return (icons_dir.relativeFilePath(file.dir().path()) + std::filesystem::path::preferred_separator + file.baseName()) - .replace(std::filesystem::path::preferred_separator, delimiter); - } + + constexpr auto delimiter = " » "; + constexpr auto fs_separator = std::filesystem::path::preferred_separator; + QString relative_path_without_extension = icons_dir.relativeFilePath(file.dir().path()) + fs_separator + file.baseName(); + return relative_path_without_extension.replace(fs_separator, delimiter); } void IconList::directoryChanged(const QString& path) @@ -311,7 +310,7 @@ bool IconList::dropMimeData(const QMimeData* data, if (data->hasUrls()) { auto urls = data->urls(); QStringList iconFiles; - for (auto url : urls) { + for (const auto& url : urls) { // only local files may be dropped... if (!url.isLocalFile()) continue; From f7f7c4b43ef2871d71fb3214bcafbd32e77bf85d Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Wed, 11 Sep 2024 09:55:27 +0200 Subject: [PATCH 170/616] fixes for ci errors III Signed-off-by: QazCetelic --- launcher/icons/IconList.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index 66f6ad1f3..df1905502 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -35,6 +35,7 @@ */ #include "IconList.h" +#include #include #include #include From 7b49fd65085b662875ed673b5319d2155efce5bd Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Wed, 11 Sep 2024 10:07:05 +0200 Subject: [PATCH 171/616] fixes for ci errors IV Signed-off-by: QazCetelic --- launcher/icons/IconList.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index df1905502..e226ab471 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -35,7 +35,6 @@ */ #include "IconList.h" -#include #include #include #include @@ -79,8 +78,8 @@ void IconList::sortIconList() { qDebug() << "Sorting icon list..."; std::sort(icons.begin(), icons.end(), [](const MMCIcon& a, const MMCIcon& b) { - bool aIsSubdir = a.m_key.contains(std::filesystem::path::preferred_separator); - bool bIsSubdir = b.m_key.contains(std::filesystem::path::preferred_separator); + bool aIsSubdir = a.m_key.contains(QDir::separator()); + bool bIsSubdir = b.m_key.contains(QDir::separator()); if (aIsSubdir != bIsSubdir) { return !aIsSubdir; // root-level icons come first } @@ -158,9 +157,8 @@ QString formatName(const QDir& icons_dir, const QFileInfo& file) return file.baseName(); constexpr auto delimiter = " » "; - constexpr auto fs_separator = std::filesystem::path::preferred_separator; - QString relative_path_without_extension = icons_dir.relativeFilePath(file.dir().path()) + fs_separator + file.baseName(); - return relative_path_without_extension.replace(fs_separator, delimiter); + QString relative_path_without_extension = icons_dir.relativeFilePath(file.dir().path()) + QDir::separator() + file.baseName(); + return relative_path_without_extension.replace(QDir::separator(), delimiter); } void IconList::directoryChanged(const QString& path) From c85294af9debc472446585b7851f41596fbcc0be Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 12 Sep 2024 17:57:57 +0300 Subject: [PATCH 172/616] Improve wizzard page Signed-off-by: Trial97 --- launcher/Application.cpp | 35 +++++-- launcher/CMakeLists.txt | 6 ++ .../ui/setupwizard/AutoJavaWizardPage.cpp | 33 +++++++ launcher/ui/setupwizard/AutoJavaWizardPage.h | 22 +++++ launcher/ui/setupwizard/AutoJavaWizardPage.ui | 93 +++++++++++++++++++ launcher/ui/setupwizard/JavaWizardPage.cpp | 4 +- launcher/ui/setupwizard/JavaWizardPage.h | 2 +- launcher/ui/setupwizard/LoginWizardPage.cpp | 45 +++++++++ launcher/ui/setupwizard/LoginWizardPage.h | 24 +++++ launcher/ui/setupwizard/LoginWizardPage.ui | 74 +++++++++++++++ launcher/ui/widgets/JavaSettingsWidget.cpp | 77 ++++++++++----- launcher/ui/widgets/JavaSettingsWidget.h | 8 +- 12 files changed, 384 insertions(+), 39 deletions(-) create mode 100644 launcher/ui/setupwizard/AutoJavaWizardPage.cpp create mode 100644 launcher/ui/setupwizard/AutoJavaWizardPage.h create mode 100644 launcher/ui/setupwizard/AutoJavaWizardPage.ui create mode 100644 launcher/ui/setupwizard/LoginWizardPage.cpp create mode 100644 launcher/ui/setupwizard/LoginWizardPage.h create mode 100644 launcher/ui/setupwizard/LoginWizardPage.ui diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 9cd0445e6..35eb6e91e 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -67,8 +67,10 @@ #include "ui/pages/global/MinecraftPage.h" #include "ui/pages/global/ProxyPage.h" +#include "ui/setupwizard/AutoJavaWizardPage.h" #include "ui/setupwizard/JavaWizardPage.h" #include "ui/setupwizard/LanguageWizardPage.h" +#include "ui/setupwizard/LoginWizardPage.h" #include "ui/setupwizard/PasteWizardPage.h" #include "ui/setupwizard/SetupWizard.h" #include "ui/setupwizard/ThemeWizardPage.h" @@ -650,6 +652,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) auto defaultEnableAutoJava = m_settings->get("JavaPath").toString().isEmpty(); m_settings->registerSetting("AutomaticJavaSwitch", defaultEnableAutoJava); m_settings->registerSetting("AutomaticJavaDownload", defaultEnableAutoJava); + m_settings->registerSetting("UserAskedAboutAutomaticJavaDownload", false); // Legacy settings m_settings->registerSetting("OnlineFixes", false); @@ -1077,13 +1080,15 @@ bool Application::createSetupWizard() } return false; }(); + bool askjava = BuildConfig.JAVA_DOWNLOADER_ENABLED && !javaRequired && !m_settings->get("AutomaticJavaDownload").toBool() && + !m_settings->get("AutomaticJavaSwitch").toBool() && !m_settings->get("UserAskedAboutAutomaticJavaDownload").toBool(); bool languageRequired = settings()->get("Language").toString().isEmpty(); bool pasteInterventionRequired = settings()->get("PastebinURL") != ""; bool validWidgets = m_themeManager->isValidApplicationTheme(settings()->get("ApplicationTheme").toString()); bool validIcons = m_themeManager->isValidIconTheme(settings()->get("IconTheme").toString()); + bool login = !m_accounts->anyAccountIsValid() && capabilities() & Application::SupportsMSA; bool themeInterventionRequired = !validWidgets || !validIcons; - bool wizardRequired = javaRequired || languageRequired || pasteInterventionRequired || themeInterventionRequired; - + bool wizardRequired = javaRequired || languageRequired || pasteInterventionRequired || themeInterventionRequired || askjava || login; if (wizardRequired) { // set default theme after going into theme wizard if (!validIcons) @@ -1100,6 +1105,8 @@ bool Application::createSetupWizard() if (javaRequired) { m_setupWizard->addPage(new JavaWizardPage(m_setupWizard)); + } else if (askjava) { + m_setupWizard->addPage(new AutoJavaWizardPage(m_setupWizard)); } if (pasteInterventionRequired) { @@ -1110,11 +1117,14 @@ bool Application::createSetupWizard() m_setupWizard->addPage(new ThemeWizardPage(m_setupWizard)); } + if (login) { + m_setupWizard->addPage(new LoginWizardPage(m_setupWizard)); + } connect(m_setupWizard, &QDialog::finished, this, &Application::setupWizardFinished); m_setupWizard->show(); - return true; } - return false; + + return wizardRequired || login; } bool Application::updaterEnabled() @@ -1259,16 +1269,23 @@ Application::~Application() void Application::messageReceived(const QByteArray& message) { - if (status() != Initialized) { - qDebug() << "Received message" << message << "while still initializing. It will be ignored."; - return; - } - ApplicationMessage received; received.parse(message); auto& command = received.command; + if (status() != Initialized) { + bool isLoginAtempt = false; + if (command == "import") { + QString url = received.args["url"]; + isLoginAtempt = !url.isEmpty() && normalizeImportUrl(url).scheme() == BuildConfig.LAUNCHER_APP_BINARY_NAME; + } + if (!isLoginAtempt) { + qDebug() << "Received message" << message << "while still initializing. It will be ignored."; + return; + } + } + if (command == "activate") { showMainWindow(); } else if (command == "import") { diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index a65d53d06..975946740 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -842,6 +842,10 @@ SET(LAUNCHER_SOURCES ui/setupwizard/PasteWizardPage.h ui/setupwizard/ThemeWizardPage.cpp ui/setupwizard/ThemeWizardPage.h + ui/setupwizard/AutoJavaWizardPage.cpp + ui/setupwizard/AutoJavaWizardPage.h + ui/setupwizard/LoginWizardPage.cpp + ui/setupwizard/LoginWizardPage.h # GUI - themes ui/themes/FusionTheme.cpp @@ -1154,6 +1158,8 @@ endif() qt_wrap_ui(LAUNCHER_UI ui/MainWindow.ui ui/setupwizard/PasteWizardPage.ui + ui/setupwizard/AutoJavaWizardPage.ui + ui/setupwizard/LoginWizardPage.ui ui/setupwizard/ThemeWizardPage.ui ui/pages/global/AccountListPage.ui ui/pages/global/JavaPage.ui diff --git a/launcher/ui/setupwizard/AutoJavaWizardPage.cpp b/launcher/ui/setupwizard/AutoJavaWizardPage.cpp new file mode 100644 index 000000000..fd173e71d --- /dev/null +++ b/launcher/ui/setupwizard/AutoJavaWizardPage.cpp @@ -0,0 +1,33 @@ +#include "AutoJavaWizardPage.h" +#include "ui_AutoJavaWizardPage.h" + +#include "Application.h" + +AutoJavaWizardPage::AutoJavaWizardPage(QWidget* parent) : BaseWizardPage(parent), ui(new Ui::AutoJavaWizardPage) +{ + ui->setupUi(this); +} + +AutoJavaWizardPage::~AutoJavaWizardPage() +{ + delete ui; +} + +void AutoJavaWizardPage::initializePage() {} + +bool AutoJavaWizardPage::validatePage() +{ + auto s = APPLICATION->settings(); + + if (!ui->previousSettingsRadioButton->isChecked()) { + s->set("AutomaticJavaSwitch", true); + s->set("AutomaticJavaDownload", true); + } + s->set("UserAskedAboutAutomaticJavaDownload", true); + return true; +} + +void AutoJavaWizardPage::retranslate() +{ + ui->retranslateUi(this); +} diff --git a/launcher/ui/setupwizard/AutoJavaWizardPage.h b/launcher/ui/setupwizard/AutoJavaWizardPage.h new file mode 100644 index 000000000..fcdf5bdf1 --- /dev/null +++ b/launcher/ui/setupwizard/AutoJavaWizardPage.h @@ -0,0 +1,22 @@ +#pragma once +#include +#include "BaseWizardPage.h" + +namespace Ui { +class AutoJavaWizardPage; +} + +class AutoJavaWizardPage : public BaseWizardPage { + Q_OBJECT + + public: + explicit AutoJavaWizardPage(QWidget* parent = nullptr); + ~AutoJavaWizardPage(); + + void initializePage() override; + bool validatePage() override; + void retranslate() override; + + private: + Ui::AutoJavaWizardPage* ui; +}; diff --git a/launcher/ui/setupwizard/AutoJavaWizardPage.ui b/launcher/ui/setupwizard/AutoJavaWizardPage.ui new file mode 100644 index 000000000..bd72cf695 --- /dev/null +++ b/launcher/ui/setupwizard/AutoJavaWizardPage.ui @@ -0,0 +1,93 @@ + + + AutoJavaWizardPage + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + <html><head/><body><p><span style=" font-size:14pt; font-weight:600;">New Feature Alert!</span></p></body></html> + + + Qt::RichText + + + true + + + + + + + We've added a feature to automatically download the correct Java version for each version of Minecraft(this can be changed in the Java Settings). Would you like to enable or disable this feature? + + + true + + + + + + + Qt::Horizontal + + + + + + + Enable Auto-Download + + + true + + + buttonGroup + + + + + + + Disable Auto-Download + + + false + + + buttonGroup + + + + + + + Qt::Vertical + + + + 20 + 156 + + + + + + + + + + + + diff --git a/launcher/ui/setupwizard/JavaWizardPage.cpp b/launcher/ui/setupwizard/JavaWizardPage.cpp index a47cebcaa..47718d6da 100644 --- a/launcher/ui/setupwizard/JavaWizardPage.cpp +++ b/launcher/ui/setupwizard/JavaWizardPage.cpp @@ -55,6 +55,7 @@ bool JavaWizardPage::validatePage() auto result = m_java_widget->validate(); settings->set("AutomaticJavaSwitch", m_java_widget->autoDetectJava()); settings->set("AutomaticJavaDownload", m_java_widget->autoDownloadJava()); + settings->set("UserAskedAboutAutomaticJavaDownload", true); switch (result) { default: case JavaSettingsWidget::ValidationStatus::Bad: { @@ -82,7 +83,6 @@ void JavaWizardPage::retranslate() { setTitle(tr("Java")); setSubTitle( - tr("You do not have a working Java set up yet or it went missing.\n" - "Please select one of the following or browse for a Java executable.")); + tr("Please select how much memory to allocate to instances and if Prism Launcher should manage java automatically or manually.")); m_java_widget->retranslate(); } diff --git a/launcher/ui/setupwizard/JavaWizardPage.h b/launcher/ui/setupwizard/JavaWizardPage.h index dde765f27..9bf9cfa2b 100644 --- a/launcher/ui/setupwizard/JavaWizardPage.h +++ b/launcher/ui/setupwizard/JavaWizardPage.h @@ -9,7 +9,7 @@ class JavaWizardPage : public BaseWizardPage { public: explicit JavaWizardPage(QWidget* parent = Q_NULLPTR); - virtual ~JavaWizardPage() {}; + virtual ~JavaWizardPage() = default; bool wantsRefreshButton() override; void refresh() override; diff --git a/launcher/ui/setupwizard/LoginWizardPage.cpp b/launcher/ui/setupwizard/LoginWizardPage.cpp new file mode 100644 index 000000000..6be24a2f7 --- /dev/null +++ b/launcher/ui/setupwizard/LoginWizardPage.cpp @@ -0,0 +1,45 @@ +#include "LoginWizardPage.h" +#include "minecraft/auth/AccountList.h" +#include "ui/dialogs/MSALoginDialog.h" +#include "ui_LoginWizardPage.h" + +#include "Application.h" + +LoginWizardPage::LoginWizardPage(QWidget* parent) : BaseWizardPage(parent), ui(new Ui::LoginWizardPage) +{ + ui->setupUi(this); +} + +LoginWizardPage::~LoginWizardPage() +{ + delete ui; +} + +void LoginWizardPage::initializePage() {} + +bool LoginWizardPage::validatePage() +{ + return true; +} + +void LoginWizardPage::retranslate() +{ + ui->retranslateUi(this); +} + +void LoginWizardPage::on_pushButton_clicked() +{ + wizard()->hide(); + auto account = MSALoginDialog::newAccount(nullptr); + wizard()->show(); + if (account) { + APPLICATION->accounts()->addAccount(account); + APPLICATION->accounts()->setDefaultAccount(account); + } + + if (wizard()->currentId() == wizard()->pageIds().last()) { + wizard()->accept(); + } else { + wizard()->next(); + } +} diff --git a/launcher/ui/setupwizard/LoginWizardPage.h b/launcher/ui/setupwizard/LoginWizardPage.h new file mode 100644 index 000000000..af71fc183 --- /dev/null +++ b/launcher/ui/setupwizard/LoginWizardPage.h @@ -0,0 +1,24 @@ +#pragma once +#include +#include "BaseWizardPage.h" + +namespace Ui { +class LoginWizardPage; +} + +class LoginWizardPage : public BaseWizardPage { + Q_OBJECT + + public: + explicit LoginWizardPage(QWidget* parent = nullptr); + ~LoginWizardPage(); + + void initializePage() override; + bool validatePage() override; + void retranslate() override; + private slots: + void on_pushButton_clicked(); + + private: + Ui::LoginWizardPage* ui; +}; diff --git a/launcher/ui/setupwizard/LoginWizardPage.ui b/launcher/ui/setupwizard/LoginWizardPage.ui new file mode 100644 index 000000000..191316c4e --- /dev/null +++ b/launcher/ui/setupwizard/LoginWizardPage.ui @@ -0,0 +1,74 @@ + + + LoginWizardPage + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + <html><head/><body><p><span style=" font-size:14pt; font-weight:600;">Add Microsoft account</span></p></body></html> + + + Qt::RichText + + + true + + + + + + + In order to play Minecraft, you must have at least one Microsoft account logged in. Do you want to log in now? + + + true + + + + + + + Qt::Horizontal + + + + + + + Add Microsoft account + + + + + + + Qt::Vertical + + + + 20 + 156 + + + + + + + + + + + + diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 8e2d94556..2b270c482 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -3,9 +3,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -34,11 +36,13 @@ JavaSettingsWidget::JavaSettingsWidget(QWidget* parent) : QWidget(parent) goodIcon = APPLICATION->getThemedIcon("status-good"); yellowIcon = APPLICATION->getThemedIcon("status-yellow"); badIcon = APPLICATION->getThemedIcon("status-bad"); + m_memoryTimer = new QTimer(this); setupUi(); - connect(m_minMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(memoryValueChanged(int))); - connect(m_maxMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(memoryValueChanged(int))); - connect(m_permGenSpinBox, SIGNAL(valueChanged(int)), this, SLOT(memoryValueChanged(int))); + connect(m_minMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int))); + connect(m_maxMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int))); + connect(m_permGenSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int))); + connect(m_memoryTimer, &QTimer::timeout, this, &JavaSettingsWidget::memoryValueChanged); connect(m_versionWidget, &VersionSelectWidget::selectedVersionChanged, this, &JavaSettingsWidget::javaVersionSelected); connect(m_javaBrowseBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaBrowseBtn_clicked); connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaSettingsWidget::javaPathEdited); @@ -55,7 +59,6 @@ void JavaSettingsWidget::setupUi() m_verticalLayout->setObjectName(QStringLiteral("verticalLayout")); m_versionWidget = new VersionSelectWidget(this); - m_verticalLayout->addWidget(m_versionWidget); m_horizontalLayout = new QHBoxLayout(); m_horizontalLayout->setObjectName(QStringLiteral("horizontalLayout")); @@ -73,8 +76,6 @@ void JavaSettingsWidget::setupUi() m_javaStatusBtn->setIcon(yellowIcon); m_horizontalLayout->addWidget(m_javaStatusBtn); - m_verticalLayout->addLayout(m_horizontalLayout); - m_memoryGroupBox = new QGroupBox(this); m_memoryGroupBox->setObjectName(QStringLiteral("memoryGroupBox")); m_gridLayout_2 = new QGridLayout(m_memoryGroupBox); @@ -136,8 +137,6 @@ void JavaSettingsWidget::setupUi() m_horizontalBtnLayout->addWidget(m_javaDownloadBtn); } - m_verticalLayout->addLayout(m_horizontalBtnLayout); - m_autoJavaGroupBox = new QGroupBox(this); m_autoJavaGroupBox->setObjectName(QStringLiteral("autoJavaGroupBox")); m_veriticalJavaLayout = new QVBoxLayout(m_autoJavaGroupBox); @@ -145,21 +144,42 @@ void JavaSettingsWidget::setupUi() m_autodetectJavaCheckBox = new QCheckBox(m_autoJavaGroupBox); m_autodetectJavaCheckBox->setObjectName("autodetectJavaCheckBox"); + m_autodetectJavaCheckBox->setChecked(true); m_veriticalJavaLayout->addWidget(m_autodetectJavaCheckBox); if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { m_autodownloadCheckBox = new QCheckBox(m_autoJavaGroupBox); m_autodownloadCheckBox->setObjectName("autodownloadCheckBox"); - m_autodownloadCheckBox->setEnabled(false); + m_autodownloadCheckBox->setEnabled(m_autodetectJavaCheckBox->isChecked()); m_veriticalJavaLayout->addWidget(m_autodownloadCheckBox); connect(m_autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] { m_autodownloadCheckBox->setEnabled(m_autodetectJavaCheckBox->isChecked()); if (!m_autodetectJavaCheckBox->isChecked()) m_autodownloadCheckBox->setChecked(false); }); + + connect(m_autodownloadCheckBox, &QCheckBox::stateChanged, this, [this] { + auto isChecked = m_autodownloadCheckBox->isChecked(); + m_versionWidget->setVisible(!isChecked); + m_javaStatusBtn->setVisible(!isChecked); + m_javaBrowseBtn->setVisible(!isChecked); + m_javaPathTextBox->setVisible(!isChecked); + m_javaDownloadBtn->setVisible(!isChecked); + if (!isChecked) { + m_verticalLayout->removeItem(m_verticalSpacer); + } else { + m_verticalLayout->addSpacerItem(m_verticalSpacer); + } + }); } m_verticalLayout->addWidget(m_autoJavaGroupBox); + m_verticalLayout->addLayout(m_horizontalBtnLayout); + + m_verticalLayout->addWidget(m_versionWidget); + m_verticalLayout->addLayout(m_horizontalLayout); + m_verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + retranslate(); } @@ -177,23 +197,16 @@ void JavaSettingsWidget::initialize() m_maxMemSpinBox->setValue(observedMaxMemory); m_permGenSpinBox->setValue(observedPermGenMemory); updateThresholds(); - if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { - auto button = - CustomMessageBox::selectable(this, tr("Automatic Java Download"), - tr("%1 can automatically download the correct Java version for each version of Minecraft..\n" - "Do you want to enable Java auto-download?\n") - .arg(BuildConfig.LAUNCHER_DISPLAYNAME), - QMessageBox::Question, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) - ->exec(); - auto checked = button == QMessageBox::Yes; - m_autodetectJavaCheckBox->setChecked(checked); - m_autodownloadCheckBox->setChecked(checked); + m_autodownloadCheckBox->setChecked(true); } } void JavaSettingsWidget::refresh() { + if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked()) { + return; + } if (JavaUtils::getJavaCheckPath().isEmpty()) { JavaCommon::javaCheckNotFound(this); return; @@ -297,20 +310,21 @@ int JavaSettingsWidget::permGenSize() const return m_permGenSpinBox->value(); } -void JavaSettingsWidget::memoryValueChanged(int) +void JavaSettingsWidget::memoryValueChanged() { bool actuallyChanged = false; unsigned int min = m_minMemSpinBox->value(); unsigned int max = m_maxMemSpinBox->value(); unsigned int permgen = m_permGenSpinBox->value(); - QObject* obj = sender(); - if (obj == m_minMemSpinBox && min != observedMinMemory) { + if (min != observedMinMemory) { observedMinMemory = min; actuallyChanged = true; - } else if (obj == m_maxMemSpinBox && max != observedMaxMemory) { + } + if (max != observedMaxMemory) { observedMaxMemory = max; actuallyChanged = true; - } else if (obj == m_permGenSpinBox && permgen != observedPermGenMemory) { + } + if (permgen != observedPermGenMemory) { observedPermGenMemory = permgen; actuallyChanged = true; } @@ -505,6 +519,9 @@ void JavaSettingsWidget::updateThresholds() } else if (observedMaxMemory < observedMinMemory) { iconName = "status-yellow"; m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value")); + } else if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked()) { + iconName = "status-good"; + m_labelMaxMemIcon->setToolTip(""); } else if (observedMaxMemory > 2048 && !m_result.is_64bit) { iconName = "status-bad"; m_labelMaxMemIcon->setToolTip(tr("You are exceeding the maximum allocation supported by 32-bit installations of Java.")); @@ -530,3 +547,13 @@ bool JavaSettingsWidget::autoDetectJava() const { return m_autodetectJavaCheckBox->isChecked(); } + +void JavaSettingsWidget::onSpinBoxValueChanged(int) +{ + m_memoryTimer->start(500); +} + +JavaSettingsWidget::~JavaSettingsWidget() +{ + delete m_verticalSpacer; +}; \ No newline at end of file diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index 622c473fe..35be48478 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -17,6 +17,7 @@ class QGroupBox; class QGridLayout; class QLabel; class QToolButton; +class QSpacerItem; /** * This is a widget for all the Java settings dialogs and pages. @@ -26,7 +27,7 @@ class JavaSettingsWidget : public QWidget { public: explicit JavaSettingsWidget(QWidget* parent); - virtual ~JavaSettingsWidget() = default; + virtual ~JavaSettingsWidget(); enum class JavaStatus { NotSet, Pending, Good, DoesNotExist, DoesNotStart, ReturnedInvalidData } javaStatus = JavaStatus::NotSet; @@ -48,7 +49,8 @@ class JavaSettingsWidget : public QWidget { void updateThresholds(); protected slots: - void memoryValueChanged(int); + void onSpinBoxValueChanged(int); + void memoryValueChanged(); void javaPathEdited(const QString& path); void javaVersionSelected(BaseVersion::Ptr version); void on_javaBrowseBtn_clicked(); @@ -65,6 +67,7 @@ class JavaSettingsWidget : public QWidget { private: /* data */ VersionSelectWidget* m_versionWidget = nullptr; QVBoxLayout* m_verticalLayout = nullptr; + QSpacerItem* m_verticalSpacer = nullptr; QLineEdit* m_javaPathTextBox = nullptr; QPushButton* m_javaBrowseBtn = nullptr; @@ -99,4 +102,5 @@ class JavaSettingsWidget : public QWidget { uint64_t m_availableMemory = 0ull; shared_qobject_ptr m_checker; JavaChecker::Result m_result; + QTimer* m_memoryTimer; }; From 973b43ca7a12cdcb6891d069b3bb6782eda6f28a Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 13 Sep 2024 20:01:45 +0300 Subject: [PATCH 173/616] Add techinc client ID Signed-off-by: Trial97 --- launcher/Application.cpp | 3 ++ launcher/ui/pages/global/APIPage.cpp | 2 ++ launcher/ui/pages/global/APIPage.ui | 34 +++++++++++++++++-- .../modplatform/technic/TechnicModel.cpp | 4 +++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 9cd0445e6..ba9a9caa9 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -777,6 +777,9 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) // FTBApp instances m_settings->registerSetting("FTBAppInstancesPath", ""); + // Custom Techinc Client ID + m_settings->registerSetting("TechincClientID", ""); + // Init page provider { m_globalSettingsProvider = std::make_shared(tr("Settings")); diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp index 82aa76a4f..4beb0b886 100644 --- a/launcher/ui/pages/global/APIPage.cpp +++ b/launcher/ui/pages/global/APIPage.cpp @@ -143,6 +143,7 @@ void APIPage::loadSettings() ui->modrinthToken->setText(modrinthToken); QString customUserAgent = s->get("UserAgentOverride").toString(); ui->userAgentLineEdit->setText(customUserAgent); + ui->techicClientID->setText(s->get("TechincClientID").toString()); } void APIPage::applySettings() @@ -172,6 +173,7 @@ void APIPage::applySettings() QString modrinthToken = ui->modrinthToken->text(); s->set("ModrinthToken", modrinthToken); s->set("UserAgentOverride", ui->userAgentLineEdit->text()); + s->set("TechincClientID", ui->techicClientID->text()); } bool APIPage::apply() diff --git a/launcher/ui/pages/global/APIPage.ui b/launcher/ui/pages/global/APIPage.ui index a7f3f3f72..f52d41d23 100644 --- a/launcher/ui/pages/global/APIPage.ui +++ b/launcher/ui/pages/global/APIPage.ui @@ -6,8 +6,8 @@ 0 0 - 800 - 600 + 841 + 620 @@ -288,6 +288,36 @@ + + + + Techinc Client ID + + + + + + <html><head/><body><p>Note: you only need to set this to access private data.</p></body></html> + + + + + + + (None) + + + + + + + Enter a custom GUID client ID for Techinc here. + + + + + + diff --git a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp index 4181edab6..55a8b254c 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp +++ b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp @@ -154,6 +154,10 @@ void Technic::ListModel::performSearch() QString("%1search?build=%2&q=%3").arg(BuildConfig.TECHNIC_API_BASE_URL, BuildConfig.TECHNIC_API_BUILD, currentSearchTerm); searchMode = List; } + auto clientId = APPLICATION->settings()->get("TechincClientID").toString(); + if (!clientId.isEmpty()) { + searchUrl += "?cid=" + clientId; + } netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl), response)); jobPtr = netJob; jobPtr->start(); From d20f24d96fa35311935b58aa6cbae5623f437c6a Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Fri, 13 Sep 2024 21:13:21 +0300 Subject: [PATCH 174/616] Apply suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- launcher/Application.cpp | 4 ++-- launcher/ui/pages/global/APIPage.cpp | 4 ++-- launcher/ui/pages/global/APIPage.ui | 6 +++--- launcher/ui/pages/modplatform/technic/TechnicModel.cpp | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index ba9a9caa9..815f842c5 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -777,8 +777,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) // FTBApp instances m_settings->registerSetting("FTBAppInstancesPath", ""); - // Custom Techinc Client ID - m_settings->registerSetting("TechincClientID", ""); + // Custom Technic Client ID + m_settings->registerSetting("TechnicClientID", ""); // Init page provider { diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp index 4beb0b886..0af34bcd6 100644 --- a/launcher/ui/pages/global/APIPage.cpp +++ b/launcher/ui/pages/global/APIPage.cpp @@ -143,7 +143,7 @@ void APIPage::loadSettings() ui->modrinthToken->setText(modrinthToken); QString customUserAgent = s->get("UserAgentOverride").toString(); ui->userAgentLineEdit->setText(customUserAgent); - ui->techicClientID->setText(s->get("TechincClientID").toString()); + ui->techicClientID->setText(s->get("TechnicClientID").toString()); } void APIPage::applySettings() @@ -173,7 +173,7 @@ void APIPage::applySettings() QString modrinthToken = ui->modrinthToken->text(); s->set("ModrinthToken", modrinthToken); s->set("UserAgentOverride", ui->userAgentLineEdit->text()); - s->set("TechincClientID", ui->techicClientID->text()); + s->set("TechincClientID", ui->technicClientID->text()); } bool APIPage::apply() diff --git a/launcher/ui/pages/global/APIPage.ui b/launcher/ui/pages/global/APIPage.ui index f52d41d23..9c713aa79 100644 --- a/launcher/ui/pages/global/APIPage.ui +++ b/launcher/ui/pages/global/APIPage.ui @@ -291,7 +291,7 @@ - Techinc Client ID + Technic Client ID @@ -302,7 +302,7 @@ - + (None) @@ -311,7 +311,7 @@ - Enter a custom GUID client ID for Techinc here. + Enter a custom GUID client ID for Technic here. diff --git a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp index 55a8b254c..f7e7f4433 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp +++ b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp @@ -154,7 +154,7 @@ void Technic::ListModel::performSearch() QString("%1search?build=%2&q=%3").arg(BuildConfig.TECHNIC_API_BASE_URL, BuildConfig.TECHNIC_API_BUILD, currentSearchTerm); searchMode = List; } - auto clientId = APPLICATION->settings()->get("TechincClientID").toString(); + auto clientId = APPLICATION->settings()->get("TechnicClientID").toString(); if (!clientId.isEmpty()) { searchUrl += "?cid=" + clientId; } From 1db122f1a29b90f2b556aeaddb7336233c0c4769 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 13 Sep 2024 21:37:50 +0300 Subject: [PATCH 175/616] fix typo Signed-off-by: Trial97 --- launcher/ui/pages/global/APIPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp index 0af34bcd6..5ec6fbce5 100644 --- a/launcher/ui/pages/global/APIPage.cpp +++ b/launcher/ui/pages/global/APIPage.cpp @@ -143,7 +143,7 @@ void APIPage::loadSettings() ui->modrinthToken->setText(modrinthToken); QString customUserAgent = s->get("UserAgentOverride").toString(); ui->userAgentLineEdit->setText(customUserAgent); - ui->techicClientID->setText(s->get("TechnicClientID").toString()); + ui->technicClientID->setText(s->get("TechnicClientID").toString()); } void APIPage::applySettings() From e18e9b0509b93513e9e99a4f571faa3f34764fc5 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 13 Sep 2024 22:57:08 +0300 Subject: [PATCH 176/616] fix server launch Signed-off-by: Trial97 --- launcher/minecraft/MinecraftInstance.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index c94f3f234..98ac7647f 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -193,7 +193,7 @@ void MinecraftInstance::loadSpecificSettings() } // Join server on launch, this does not have a global override - m_settings->registerSetting({ "JoinServerOnLaunch", "JoinOnLaunch" }, false); + m_settings->registerSetting("JoinServerOnLaunch", false); m_settings->registerSetting("JoinServerOnLaunchAddress", ""); m_settings->registerSetting("JoinWorldOnLaunch", ""); @@ -1063,7 +1063,7 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt process->appendStep(makeShared(pptr)); } - if (!targetToJoin && settings()->get("JoinOnLaunch").toBool()) { + if (!targetToJoin && settings()->get("JoinServerOnLaunch").toBool()) { QString fullAddress = settings()->get("JoinServerOnLaunchAddress").toString(); if (!fullAddress.isEmpty()) { targetToJoin.reset(new MinecraftTarget(MinecraftTarget::parse(fullAddress, false))); From 6706317f2076b20095eac8c7ad8495cf8e1172df Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 13 Sep 2024 23:26:04 +0300 Subject: [PATCH 177/616] fix java crash on refresh Signed-off-by: Trial97 --- launcher/Filter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/Filter.h b/launcher/Filter.h index a8c9c14d8..ae835e724 100644 --- a/launcher/Filter.h +++ b/launcher/Filter.h @@ -57,5 +57,5 @@ class ExactListFilter : public Filter { bool accepts(const QString& value) override; private: - const QStringList& m_pattern; + QStringList m_pattern; }; From 22ebf7e9611432ec6bc9a85df363a2cf6487d0b3 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 14 Sep 2024 00:13:16 +0300 Subject: [PATCH 178/616] fix download java abort being stuck Signed-off-by: Trial97 --- launcher/launch/TaskStepWrapper.cpp | 4 +++- launcher/minecraft/MinecraftLoadAndCheck.cpp | 4 +++- launcher/minecraft/launch/AutoInstallJava.cpp | 14 +++++++------- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/launcher/launch/TaskStepWrapper.cpp b/launcher/launch/TaskStepWrapper.cpp index 136057620..db9e8fad2 100644 --- a/launcher/launch/TaskStepWrapper.cpp +++ b/launcher/launch/TaskStepWrapper.cpp @@ -59,7 +59,9 @@ bool TaskStepWrapper::canAbort() const bool TaskStepWrapper::abort() { if (m_task && m_task->canAbort()) { - return m_task->abort(); + auto status = m_task->abort(); + emitFailed("Aborted."); + return status; } return Task::abort(); } diff --git a/launcher/minecraft/MinecraftLoadAndCheck.cpp b/launcher/minecraft/MinecraftLoadAndCheck.cpp index 655894d2a..a9dcdf067 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.cpp +++ b/launcher/minecraft/MinecraftLoadAndCheck.cpp @@ -37,7 +37,9 @@ bool MinecraftLoadAndCheck::canAbort() const bool MinecraftLoadAndCheck::abort() { if (m_task && m_task->canAbort()) { - return m_task->abort(); + auto status = m_task->abort(); + emitFailed("Aborted."); + return status; } return Task::abort(); } \ No newline at end of file diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 3f58a28a6..5daf89382 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -180,10 +180,7 @@ void AutoInstallJava::downloadJava(Meta::Version::Ptr version, QString javaName) deletePath(); emitFailed(reason); }); - connect(this, &Task::aborted, this, [this, deletePath] { - m_current_task->abort(); - deletePath(); - }); + connect(m_current_task.get(), &Task::aborted, this, [deletePath] { deletePath(); }); connect(m_current_task.get(), &Task::succeeded, this, &AutoInstallJava::setJavaPathFromPartial); connect(m_current_task.get(), &Task::failed, this, &AutoInstallJava::tryNextMajorJava); connect(m_current_task.get(), &Task::progress, this, &AutoInstallJava::setProgress); @@ -236,7 +233,10 @@ void AutoInstallJava::tryNextMajorJava() } bool AutoInstallJava::abort() { - if (m_current_task && m_current_task->canAbort()) - return m_current_task->abort(); - return true; + if (m_current_task && m_current_task->canAbort()) { + auto status = m_current_task->abort(); + emitFailed("Aborted."); + return status; + } + return Task::abort(); } From e59f90eca8db7f60328ee2ca93c6b20053572ea6 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Sat, 14 Sep 2024 00:19:48 +0300 Subject: [PATCH 179/616] Update launcher/ui/pages/global/APIPage.cpp Co-authored-by: TheKodeToad Signed-off-by: Alexandru Ionut Tripon --- launcher/ui/pages/global/APIPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp index 5ec6fbce5..a137c4cde 100644 --- a/launcher/ui/pages/global/APIPage.cpp +++ b/launcher/ui/pages/global/APIPage.cpp @@ -173,7 +173,7 @@ void APIPage::applySettings() QString modrinthToken = ui->modrinthToken->text(); s->set("ModrinthToken", modrinthToken); s->set("UserAgentOverride", ui->userAgentLineEdit->text()); - s->set("TechincClientID", ui->technicClientID->text()); + s->set("TechnicClientID", ui->technicClientID->text()); } bool APIPage::apply() From 5073fc19d437f9e070d2dba27e353eb6e505a7de Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 14 Sep 2024 00:36:31 +0300 Subject: [PATCH 180/616] fix java autodetect when instance settings are open Signed-off-by: Trial97 --- launcher/ui/pages/instance/InstanceSettingsPage.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index 19bc9fdf9..cf8d86cd4 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -351,6 +351,9 @@ void InstanceSettingsPage::loadSettings() [this] { ui->javaSettingsGroupBox->setChecked(m_settings->get("OverrideJavaLocation").toBool()); }); ui->javaSettingsGroupBox->setChecked(overrideLocation); ui->javaPathTextBox->setText(m_settings->get("JavaPath").toString()); + connect(m_settings->getSetting("JavaPath").get(), &Setting::SettingChanged, ui->javaSettingsGroupBox, + [this] { ui->javaPathTextBox->setText(m_settings->get("JavaPath").toString()); }); + ui->skipCompatibilityCheckbox->setChecked(m_settings->get("IgnoreJavaCompatibility").toBool()); ui->javaArgumentsGroupBox->setChecked(overrideArgs); From 312009513d0b3b3a8e08d386bd249ea85aa8bdef Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 14 Sep 2024 18:27:12 +0300 Subject: [PATCH 181/616] add open java folder action Signed-off-by: Trial97 --- launcher/Application.cpp | 1 + launcher/LaunchController.cpp | 1 + launcher/ui/MainWindow.cpp | 7 +++++++ launcher/ui/MainWindow.h | 2 +- launcher/ui/MainWindow.ui | 15 ++++++++++++++- launcher/ui/themes/ThemeManager.h | 4 +++- 6 files changed, 27 insertions(+), 3 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 35eb6e91e..3bed11db2 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1870,6 +1870,7 @@ QUrl Application::normalizeImportUrl(QString const& url) return QUrl::fromUserInput(url); } } + const QString Application::javaPath() { return m_settings->get("JavaDir").toString(); diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index 73800574f..687da1322 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -53,6 +53,7 @@ #include #include #include +#include #include #include "BuildConfig.h" diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index a5ccbc19a..f19ac85d2 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -233,6 +233,8 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi if (qgetenv("XDG_CURRENT_DESKTOP") == "gamescope") { ui->mainToolBar->addAction(ui->actionCloseWindow); } + + ui->actionViewJavaFolder->setVisible(BuildConfig.JAVA_DOWNLOADER_ENABLED); } // add the toolbar toggles to the view menu @@ -1223,6 +1225,11 @@ void MainWindow::on_actionViewLogsFolder_triggered() DesktopServices::openPath("logs", true); } +void MainWindow::on_actionViewJavaFolder_triggered() +{ + DesktopServices::openPath(APPLICATION->javaPath(), true); +} + void MainWindow::refreshInstances() { APPLICATION->instances()->loadList(); diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h index 41bef9980..0e692eda7 100644 --- a/launcher/ui/MainWindow.h +++ b/launcher/ui/MainWindow.h @@ -48,7 +48,6 @@ #include "BaseInstance.h" #include "minecraft/auth/MinecraftAccount.h" -#include "net/NetJob.h" class LaunchController; class NewsChecker; @@ -119,6 +118,7 @@ class MainWindow : public QMainWindow { void on_actionViewCatPackFolder_triggered(); void on_actionViewIconsFolder_triggered(); void on_actionViewLogsFolder_triggered(); + void on_actionViewJavaFolder_triggered(); void on_actionViewSkinsFolder_triggered(); diff --git a/launcher/ui/MainWindow.ui b/launcher/ui/MainWindow.ui index bad8762ad..819a1efe7 100644 --- a/launcher/ui/MainWindow.ui +++ b/launcher/ui/MainWindow.ui @@ -131,7 +131,7 @@ 0 0 800 - 22 + 27 @@ -192,6 +192,7 @@ + @@ -788,6 +789,18 @@ Open the cat packs folder in a file browser. + + + + .. + + + Java + + + Open the java folder in a file browser. + + diff --git a/launcher/ui/themes/ThemeManager.h b/launcher/ui/themes/ThemeManager.h index c7e32bc8c..a9036107c 100644 --- a/launcher/ui/themes/ThemeManager.h +++ b/launcher/ui/themes/ThemeManager.h @@ -18,10 +18,12 @@ */ #pragma once +#include +#include #include +#include #include "IconTheme.h" -#include "ui/MainWindow.h" #include "ui/themes/CatPack.h" #include "ui/themes/ITheme.h" From 0afdce8a31b94fca64fe064d83a07223b6a490a6 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 14 Sep 2024 21:18:20 +0300 Subject: [PATCH 182/616] Add extra step to macos java install Signed-off-by: Trial97 --- launcher/CMakeLists.txt | 2 + launcher/java/download/SymlinkTask.cpp | 81 +++++++++++++++++++ launcher/java/download/SymlinkTask.h | 36 +++++++++ launcher/minecraft/launch/AutoInstallJava.cpp | 9 +++ launcher/ui/java/InstallJavaDialog.cpp | 8 ++ 5 files changed, 136 insertions(+) create mode 100644 launcher/java/download/SymlinkTask.cpp create mode 100644 launcher/java/download/SymlinkTask.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 975946740..bd6dfc5b6 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -439,6 +439,8 @@ set(JAVA_SOURCES java/download/ArchiveDownloadTask.h java/download/ManifestDownloadTask.cpp java/download/ManifestDownloadTask.h + java/download/SymlinkTask.cpp + java/download/SymlinkTask.h ui/java/InstallJavaDialog.h ui/java/InstallJavaDialog.cpp diff --git a/launcher/java/download/SymlinkTask.cpp b/launcher/java/download/SymlinkTask.cpp new file mode 100644 index 000000000..9841c5015 --- /dev/null +++ b/launcher/java/download/SymlinkTask.cpp @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023-2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "java/download/SymlinkTask.h" +#include + +#include "FileSystem.h" + +namespace Java { +SymlinkTask::SymlinkTask(QString final_path) : m_path(final_path) {} + +QString findBinPath(QString root, QString pattern) +{ + auto path = FS::PathCombine(root, pattern); + if (QFileInfo::exists(path)) { + return path; + } + + auto entries = QDir(root).entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + for (auto& entry : entries) { + path = FS::PathCombine(entry.absoluteFilePath(), pattern); + if (QFileInfo::exists(path)) { + return path; + } + } + + return {}; +} + +void SymlinkTask::executeTask() +{ + setStatus(tr("Check Java bin")); + const auto binPath = FS::PathCombine("bin", "java"); + const auto wantedPath = FS::PathCombine(m_path, binPath); + if (QFileInfo::exists(wantedPath)) { + emitSucceeded(); + return; + } + + setStatus(tr("Search for Java bin")); + const auto contentsPartialPath = FS::PathCombine("Contents", "Home", binPath); + const auto relativePathToBin = findBinPath(m_path, contentsPartialPath); + if (relativePathToBin.isEmpty()) { + emitFailed(tr("Failed to find bin java")); + return; + } + const auto folderToLink = relativePathToBin.chopped(binPath.length()); + + setStatus(tr("Collect folders to symlink")); + auto entries = QDir(folderToLink).entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries); + QList files; + setProgress(0, entries.length()); + for (auto& entry : entries) { + files.append({ entry.absoluteFilePath(), FS::PathCombine(m_path, entry.fileName()) }); + } + + setStatus(tr("Symlink Java")); + FS::create_link folderLink(files); + connect(&folderLink, &FS::create_link::fileLinked, [this](QString src, QString dst) { setProgress(m_progress + 1, m_progressTotal); }); + if (!folderLink()) { + emitFailed(folderLink.getOSError().message().c_str()); + } else { + emitSucceeded(); + } +} + +} // namespace Java \ No newline at end of file diff --git a/launcher/java/download/SymlinkTask.h b/launcher/java/download/SymlinkTask.h new file mode 100644 index 000000000..88cb20dd7 --- /dev/null +++ b/launcher/java/download/SymlinkTask.h @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023-2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "tasks/Task.h" +namespace Java { + +class SymlinkTask : public Task { + Q_OBJECT + public: + SymlinkTask(QString final_path); + virtual ~SymlinkTask() = default; + + void executeTask() override; + + protected: + QString m_path; + Task::Ptr m_task; +}; +} // namespace Java \ No newline at end of file diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 5daf89382..4fad6f15f 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -41,6 +41,7 @@ #include "Application.h" #include "FileSystem.h" #include "MessageLevel.h" +#include "QObjectPtr.h" #include "SysInfo.h" #include "java/JavaInstall.h" #include "java/JavaInstallList.h" @@ -48,10 +49,12 @@ #include "java/JavaVersion.h" #include "java/download/ArchiveDownloadTask.h" #include "java/download/ManifestDownloadTask.h" +#include "java/download/SymlinkTask.h" #include "meta/Index.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/PackProfile.h" #include "net/Mode.h" +#include "tasks/SequentialTask.h" AutoInstallJava::AutoInstallJava(LaunchTask* parent) : LaunchStep(parent) @@ -175,6 +178,12 @@ void AutoInstallJava::downloadJava(Meta::Version::Ptr version, QString javaName) emitFailed(tr("Could not determine Java download type!")); return; } +#if defined(Q_OS_MACOS) + auto seq = makeShared(this, tr("Install Java")); + seq->addTask(m_current_task); + seq->addTask(makeShared(final_path)); + m_current_task = seq; +#endif auto deletePath = [final_path] { FS::deletePath(final_path); }; connect(m_current_task.get(), &Task::failed, this, [this, deletePath](QString reason) { deletePath(); diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index 4fb9fc2d2..f01edc5e5 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -31,10 +31,12 @@ #include "Filter.h" #include "java/download/ArchiveDownloadTask.h" #include "java/download/ManifestDownloadTask.h" +#include "java/download/SymlinkTask.h" #include "meta/Index.h" #include "meta/VersionList.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/PackProfile.h" +#include "tasks/SequentialTask.h" #include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/ProgressDialog.h" #include "ui/java/VersionList.h" @@ -313,6 +315,12 @@ void InstallDialog::done(int result) CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)->show(); deletePath(); } +#if defined(Q_OS_MACOS) + auto seq = makeShared(this, tr("Install Java")); + seq->addTask(task); + seq->addTask(makeShared(final_path)); + task = seq; +#endif connect(task.get(), &Task::failed, this, [this, &deletePath](QString reason) { QString error = QString("Java download failed: %1").arg(reason); CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)->show(); From 1c6bd74ed8d4818231dd153993ed1643dc4e4543 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Sat, 14 Sep 2024 22:04:18 +0200 Subject: [PATCH 183/616] Disable folder action instead of hiding it and add additional information in the tooltip. Signed-off-by: QazCetelic --- launcher/ui/MainWindow.cpp | 3 ++- launcher/ui/MainWindow.ui | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index f19ac85d2..3f0bb3281 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -234,7 +234,8 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi ui->mainToolBar->addAction(ui->actionCloseWindow); } - ui->actionViewJavaFolder->setVisible(BuildConfig.JAVA_DOWNLOADER_ENABLED); + ui->actionViewJavaFolder->setEnabled(BuildConfig.JAVA_DOWNLOADER_ENABLED); + } // add the toolbar toggles to the view menu diff --git a/launcher/ui/MainWindow.ui b/launcher/ui/MainWindow.ui index 819a1efe7..89e536b01 100644 --- a/launcher/ui/MainWindow.ui +++ b/launcher/ui/MainWindow.ui @@ -798,7 +798,7 @@ Java - Open the java folder in a file browser. + Open the java folder in a file browser. Only available if the built-in Java downloader is used. From 8932a42644411924e64a96c4c905b9f8071fba64 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 15 Sep 2024 00:24:43 +0000 Subject: [PATCH 184/616] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/c374d94f1536013ca8e92341b540eba4c22f9c62?narHash=sha256-Z/ELQhrSd7bMzTO8r7NZgi9g5emh%2BaRKoCdaAv5fiO0%3D' (2024-08-21) → 'github:NixOS/nixpkgs/4f807e8940284ad7925ebd0a0993d2a1791acb2f?narHash=sha256-IiA3jfbR7K/B5%2B9byVi9BZGWTD4VSbWe8VLpp9B/iYk%3D' (2024-09-11) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 58ae840c2..58bc4e30f 100644 --- a/flake.lock +++ b/flake.lock @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1724224976, - "narHash": "sha256-Z/ELQhrSd7bMzTO8r7NZgi9g5emh+aRKoCdaAv5fiO0=", + "lastModified": 1726062873, + "narHash": "sha256-IiA3jfbR7K/B5+9byVi9BZGWTD4VSbWe8VLpp9B/iYk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c374d94f1536013ca8e92341b540eba4c22f9c62", + "rev": "4f807e8940284ad7925ebd0a0993d2a1791acb2f", "type": "github" }, "original": { From e35faa5522449a8ed65bd855274ce6e54492ba42 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Sun, 15 Sep 2024 09:04:23 +0200 Subject: [PATCH 185/616] Feedback I Signed-off-by: QazCetelic --- launcher/icons/IconList.cpp | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index e226ab471..b60e67bec 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -95,10 +95,8 @@ bool IconList::addPathRecursively(const QString& path) if (!dir.exists()) return false; - bool watching = false; - // Add the directory itself - watching = m_watcher->addPath(path); + bool watching = m_watcher->addPath(path); // Add all subdirectories QFileInfoList entries = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); @@ -134,21 +132,19 @@ void IconList::removePathRecursively(const QString& path) QStringList IconList::getIconFilePaths() const { - QStringList icon_files{}; + QStringList iconFiles{}; QStringList directories{ m_dir.absolutePath() }; while (!directories.isEmpty()) { QString first = directories.takeFirst(); QDir dir(first); - for (QString& file_name : dir.entryList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot, QDir::Name)) { - QString full_path = dir.filePath(file_name); // Convert to full path - QFileInfo file_info(full_path); - if (file_info.isDir()) - directories.push_back(full_path); + for (QFileInfo& fileInfo : dir.entryInfoList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot, QDir::Name)) { + if (fileInfo.isDir()) + directories.push_back(fileInfo.absoluteFilePath()); else - icon_files.push_back(full_path); + iconFiles.push_back(fileInfo.absoluteFilePath()); } } - return icon_files; + return iconFiles; } QString formatName(const QDir& icons_dir, const QFileInfo& file) @@ -157,8 +153,8 @@ QString formatName(const QDir& icons_dir, const QFileInfo& file) return file.baseName(); constexpr auto delimiter = " » "; - QString relative_path_without_extension = icons_dir.relativeFilePath(file.dir().path()) + QDir::separator() + file.baseName(); - return relative_path_without_extension.replace(QDir::separator(), delimiter); + QString relativePathWithoutExtension = icons_dir.relativeFilePath(file.dir().path()) + QDir::separator() + file.baseName(); + return relativePathWithoutExtension.replace(QDir::separator(), delimiter); } void IconList::directoryChanged(const QString& path) From d38e7fa1424c406b86c5556e9c78c870eaa6b317 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 12:41:33 +0300 Subject: [PATCH 186/616] Add more null protection for skin management Signed-off-by: Trial97 --- launcher/minecraft/skins/SkinList.cpp | 6 +++++- launcher/minecraft/skins/SkinModel.cpp | 2 +- launcher/ui/dialogs/skins/SkinManageDialog.cpp | 16 ++++++++++++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/launcher/minecraft/skins/SkinList.cpp b/launcher/minecraft/skins/SkinList.cpp index fd883ad52..017cb8dc2 100644 --- a/launcher/minecraft/skins/SkinList.cpp +++ b/launcher/minecraft/skins/SkinList.cpp @@ -336,7 +336,11 @@ void SkinList::save() arr << s.toJSON(); } doc["skins"] = arr; - Json::write(doc, m_dir.absoluteFilePath("index.json")); + try { + Json::write(doc, m_dir.absoluteFilePath("index.json")); + } catch (const FS::FileSystemException& e) { + qCritical() << "Failed to write skin index file :" << e.cause(); + } } int SkinList::getSelectedAccountSkin() diff --git a/launcher/minecraft/skins/SkinModel.cpp b/launcher/minecraft/skins/SkinModel.cpp index d53b9e762..937864e2c 100644 --- a/launcher/minecraft/skins/SkinModel.cpp +++ b/launcher/minecraft/skins/SkinModel.cpp @@ -41,7 +41,7 @@ SkinModel::SkinModel(QDir skinDir, QJsonObject obj) QString SkinModel::name() const { - return QFileInfo(m_path).baseName(); + return QFileInfo(m_path).completeBaseName(); } bool SkinModel::rename(QString newName) diff --git a/launcher/ui/dialogs/skins/SkinManageDialog.cpp b/launcher/ui/dialogs/skins/SkinManageDialog.cpp index a947af632..6c85ffa96 100644 --- a/launcher/ui/dialogs/skins/SkinManageDialog.cpp +++ b/launcher/ui/dialogs/skins/SkinManageDialog.cpp @@ -116,7 +116,7 @@ void SkinManageDialog::selectionChanged(QItemSelection selected, QItemSelection return; m_selected_skin = key; auto skin = m_list.skin(key); - if (!skin) + if (!skin || !skin->isValid()) return; ui->selectedModel->setPixmap(skin->getTexture().scaled(size() * (1. / 3), Qt::KeepAspectRatio, Qt::FastTransformation)); ui->capeCombo->setCurrentIndex(m_capes_idx.value(skin->getCapeId())); @@ -212,7 +212,10 @@ void SkinManageDialog::setupCapes() void SkinManageDialog::on_capeCombo_currentIndexChanged(int index) { auto id = ui->capeCombo->currentData(); - ui->capeImage->setPixmap(m_capes.value(id.toString(), {}).scaled(size() * (1. / 3), Qt::KeepAspectRatio, Qt::FastTransformation)); + auto cape = m_capes.value(id.toString(), {}); + if (!cape.isNull()) { + ui->capeImage->setPixmap(cape.scaled(size() * (1. / 3), Qt::KeepAspectRatio, Qt::FastTransformation)); + } if (auto skin = m_list.skin(m_selected_skin); skin) { skin->setCapeId(id.toString()); } @@ -505,8 +508,13 @@ void SkinManageDialog::resizeEvent(QResizeEvent* event) QSize s = size() * (1. / 3); if (auto skin = m_list.skin(m_selected_skin); skin) { - ui->selectedModel->setPixmap(skin->getTexture().scaled(s, Qt::KeepAspectRatio, Qt::FastTransformation)); + if (skin->isValid()) { + ui->selectedModel->setPixmap(skin->getTexture().scaled(s, Qt::KeepAspectRatio, Qt::FastTransformation)); + } } auto id = ui->capeCombo->currentData(); - ui->capeImage->setPixmap(m_capes.value(id.toString(), {}).scaled(s, Qt::KeepAspectRatio, Qt::FastTransformation)); + auto cape = m_capes.value(id.toString(), {}); + if (!cape.isNull()) { + ui->capeImage->setPixmap(cape.scaled(s, Qt::KeepAspectRatio, Qt::FastTransformation)); + } } From d2f0d1d8d5529dc1bd462c4795c4746b13a3fb65 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 12:42:09 +0300 Subject: [PATCH 187/616] Wrap FS::write in try catch Signed-off-by: Trial97 --- launcher/InstanceCopyTask.cpp | 6 +++++- launcher/ui/dialogs/ExportToModListDialog.cpp | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/launcher/InstanceCopyTask.cpp b/launcher/InstanceCopyTask.cpp index ff2d37723..0220a4144 100644 --- a/launcher/InstanceCopyTask.cpp +++ b/launcher/InstanceCopyTask.cpp @@ -173,7 +173,11 @@ void InstanceCopyTask::copyFinished() allowed_symlinks_file .filePath()); // we dont want to modify the original. also make sure the resulting file is not itself a link. - FS::write(allowed_symlinks_file.filePath(), allowed_symlinks); + try { + FS::write(allowed_symlinks_file.filePath(), allowed_symlinks); + } catch (const FS::FileSystemException& e) { + qCritical() << "Failed to write symlink :" << e.cause(); + } } emitSucceeded(); diff --git a/launcher/ui/dialogs/ExportToModListDialog.cpp b/launcher/ui/dialogs/ExportToModListDialog.cpp index 1e0ae87a3..908743ab0 100644 --- a/launcher/ui/dialogs/ExportToModListDialog.cpp +++ b/launcher/ui/dialogs/ExportToModListDialog.cpp @@ -164,7 +164,12 @@ void ExportToModListDialog::done(int result) if (output.isEmpty()) return; - FS::write(output, ui->finalText->toPlainText().toUtf8()); + + try { + FS::write(output, ui->finalText->toPlainText().toUtf8()); + } catch (const FS::FileSystemException& e) { + qCritical() << "Failed to save mod list file :" << e.cause(); + } } QDialog::done(result); From 2c2defb2660c26731191a9ebf6c48912eb36e20b Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 14:30:23 +0300 Subject: [PATCH 188/616] add Launcher_ prefix to enable java option Signed-off-by: Trial97 --- .github/workflows/build.yml | 10 +++++----- CMakeLists.txt | 6 +++--- buildconfig/BuildConfig.cpp.in | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 942289b0b..25e1c2aab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -266,23 +266,23 @@ jobs: - name: Configure CMake (macOS) if: runner.os == 'macOS' && matrix.qt_ver == 6 run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -G Ninja - name: Configure CMake (macOS-Legacy) if: runner.os == 'macOS' && matrix.qt_ver == 5 run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -G Ninja - name: Configure CMake (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' shell: msys2 {0} run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=6 -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=6 -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} -G Ninja - name: Configure CMake (Windows MSVC) if: runner.os == 'Windows' && matrix.msystem == '' run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" -A${{ matrix.architecture}} -DLauncher_FORCE_BUNDLED_LIBS=ON -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" -A${{ matrix.architecture}} -DLauncher_FORCE_BUNDLED_LIBS=ON -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} # https://github.com/ccache/ccache/wiki/MS-Visual-Studio (I coudn't figure out the compiler prefix) if ("${{ env.CCACHE_VAR }}") { @@ -297,7 +297,7 @@ jobs: - name: Configure CMake (Linux) if: runner.os == 'Linux' run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DLauncher_BUILD_ARTIFACT=Linux-Qt${{ matrix.qt_ver }} -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DLauncher_BUILD_ARTIFACT=Linux-Qt${{ matrix.qt_ver }} -G Ninja ## # BUILD diff --git a/CMakeLists.txt b/CMakeLists.txt index 7445e574a..8727c2ef3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -220,17 +220,17 @@ set(Launcher_FORCE_BUNDLED_LIBS OFF CACHE BOOL "Prevent using system libraries, set(Launcher_QT_VERSION_MAJOR "6" CACHE STRING "Major Qt version to build against") # Java downloader -set(ENABLE_JAVA_DOWNLOADER_DEFAULT ON) +set(Launcher_ENABLE_JAVA_DOWNLOADER_DEFAULT ON) # Although we recommend enabling this, we cannot guarantee binary compatibility on # differing Linux/BSD/etc distributions. Downstream packagers should be explicitly opt-ing into this # feature if they know it will work with their distribution. if(UNIX AND NOT APPLE) - set(ENABLE_JAVA_DOWNLOADER_DEFAULT OFF) + set(Launcher_ENABLE_JAVA_DOWNLOADER_DEFAULT OFF) endif() # Java downloader -option(ENABLE_JAVA_DOWNLOADER "Build the java downloader feature" ${ENABLE_JAVA_DOWNLOADER_DEFAULT}) +option(Launcher_ENABLE_JAVA_DOWNLOADER "Build the java downloader feature" ${Launcher_ENABLE_JAVA_DOWNLOADER_DEFAULT}) # Native libraries if(UNIX AND APPLE) diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index a2b5c2187..f85b84dfb 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -81,8 +81,8 @@ Config::Config() UPDATER_ENABLED = true; } - #cmakedefine01 ENABLE_JAVA_DOWNLOADER - JAVA_DOWNLOADER_ENABLED = ENABLE_JAVA_DOWNLOADER; + #cmakedefine01 Launcher_ENABLE_JAVA_DOWNLOADER + JAVA_DOWNLOADER_ENABLED = Launcher_ENABLE_JAVA_DOWNLOADER; GIT_COMMIT = "@Launcher_GIT_COMMIT@"; GIT_TAG = "@Launcher_GIT_TAG@"; From ca6b62c773554213e507e915034d3a68933d0a1e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 15:51:51 +0300 Subject: [PATCH 189/616] move some URLs in cmake Signed-off-by: Trial97 --- CMakeLists.txt | 3 +++ buildconfig/BuildConfig.cpp.in | 3 +++ buildconfig/BuildConfig.h | 9 +++++++-- launcher/minecraft/auth/steps/MSAStep.cpp | 9 +++++---- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7445e574a..6b9cb8ea8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -176,6 +176,8 @@ endif() set(Launcher_NEWS_RSS_URL "https://prismlauncher.org/feed/feed.xml" CACHE STRING "URL to fetch Prism Launcher's news RSS feed from.") set(Launcher_NEWS_OPEN_URL "https://prismlauncher.org/news" CACHE STRING "URL that gets opened when the user clicks 'More News'") set(Launcher_HELP_URL "https://prismlauncher.org/wiki/help-pages/%1" CACHE STRING "URL (with arg %1 to be substituted with page-id) that gets opened when the user requests help") +set(Launcher_SUCCESSFULL_LOGIN_URL "https://prismlauncher.org/successful-login" CACHE STRING "URL that gets opened when the user succesfully logins.") +set(Launcher_FMLLIBS_BASE_URL "https://files.prismlauncher.org/fmllibs/" CACHE STRING "URL for FML Libraries.") ######## Set version numbers ######## set(Launcher_VERSION_MAJOR 9) @@ -205,6 +207,7 @@ set(Launcher_BUG_TRACKER_URL "https://github.com/PrismLauncher/PrismLauncher/iss # Translations Platform URL set(Launcher_TRANSLATIONS_URL "https://hosted.weblate.org/projects/prismlauncher/launcher/" CACHE STRING "URL for the translations platform.") +set(Launcher_TRANSLATIONS_BASE_URL "https://i18n.prismlauncher.org/" CACHE STRING "URL for the translations files.") # Matrix Space set(Launcher_MATRIX_URL "https://prismlauncher.org/matrix" CACHE STRING "URL to the Matrix Space") diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index a2b5c2187..121ce0729 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -116,16 +116,19 @@ Config::Config() NEWS_RSS_URL = "@Launcher_NEWS_RSS_URL@"; NEWS_OPEN_URL = "@Launcher_NEWS_OPEN_URL@"; HELP_URL = "@Launcher_HELP_URL@"; + SUCCESSFULL_LOGIN_URL = "@Launcher_SUCCESSFULL_LOGIN_URL@"; IMGUR_CLIENT_ID = "@Launcher_IMGUR_CLIENT_ID@"; MSA_CLIENT_ID = "@Launcher_MSA_CLIENT_ID@"; FLAME_API_KEY = "@Launcher_CURSEFORGE_API_KEY@"; META_URL = "@Launcher_META_URL@"; + FMLLIBS_BASE_URL = "@Launcher_FMLLIBS_BASE_URL@"; GLFW_LIBRARY_NAME = "@Launcher_GLFW_LIBRARY_NAME@"; OPENAL_LIBRARY_NAME = "@Launcher_OPENAL_LIBRARY_NAME@"; BUG_TRACKER_URL = "@Launcher_BUG_TRACKER_URL@"; TRANSLATIONS_URL = "@Launcher_TRANSLATIONS_URL@"; + TRANSLATIONS_BASE_URL = "@Launcher_TRANSLATIONS_BASE_URL@"; MATRIX_URL = "@Launcher_MATRIX_URL@"; DISCORD_URL = "@Launcher_DISCORD_URL@"; SUBREDDIT_URL = "@Launcher_SUBREDDIT_URL@"; diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index bb633f297..4684f5709 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -133,6 +133,11 @@ class Config { */ QString HELP_URL; + /** + * URL that gets opened when the user succesfully logins. + */ + QString SUCCESSFULL_LOGIN_URL; + /** * Client ID you can get from Imgur when you register an application */ @@ -165,8 +170,8 @@ class Config { QString RESOURCE_BASE = "https://resources.download.minecraft.net/"; QString LIBRARY_BASE = "https://libraries.minecraft.net/"; QString IMGUR_BASE_URL = "https://api.imgur.com/3/"; - QString FMLLIBS_BASE_URL = "https://files.prismlauncher.org/fmllibs/"; // FIXME: move into CMakeLists - QString TRANSLATIONS_BASE_URL = "https://i18n.prismlauncher.org/"; // FIXME: move into CMakeLists + QString FMLLIBS_BASE_URL; + QString TRANSLATIONS_BASE_URL; QString MODPACKSCH_API_BASE_URL = "https://api.modpacks.ch/"; diff --git a/launcher/minecraft/auth/steps/MSAStep.cpp b/launcher/minecraft/auth/steps/MSAStep.cpp index 3db04bf2f..916f84e4a 100644 --- a/launcher/minecraft/auth/steps/MSAStep.cpp +++ b/launcher/minecraft/auth/steps/MSAStep.cpp @@ -90,15 +90,16 @@ MSAStep::MSAStep(AccountData* data, bool silent) : AuthStep(data), m_silent(sile { auto replyHandler = new QOAuthHttpServerReplyHandler(this); - replyHandler->setCallbackText(R"XXX( + replyHandler->setCallbackText(QString(R"XXX( Login Successful, redirecting... - )XXX"); + )XXX") + .arg(BuildConfig.SUCCESSFULL_LOGIN_URL)); oauth2.setReplyHandler(replyHandler); } else { oauth2.setReplyHandler(new CustomOAuthOobReplyHandler(this)); From 81f30f03600cae726cb841f242235b492aabfd94 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 15:53:54 +0300 Subject: [PATCH 190/616] disable retry for translation files Signed-off-by: Trial97 --- launcher/translations/TranslationsModel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/translations/TranslationsModel.cpp b/launcher/translations/TranslationsModel.cpp index 39719b125..63867636d 100644 --- a/launcher/translations/TranslationsModel.cpp +++ b/launcher/translations/TranslationsModel.cpp @@ -597,6 +597,7 @@ void TranslationsModel::downloadTranslation(QString key) d->m_dl_job.reset(new NetJob("Translation for " + key, APPLICATION->network())); d->m_dl_job->addNetAction(dl); + d->m_dl_job->setAskRetry(false); connect(d->m_dl_job.get(), &NetJob::succeeded, this, &TranslationsModel::dlGood); connect(d->m_dl_job.get(), &NetJob::failed, this, &TranslationsModel::dlFailed); From 75756b49c3f81bd4426728307dcf99b7a4ad31f1 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 16:15:36 +0300 Subject: [PATCH 191/616] reshow login dialog in case account login fails Signed-off-by: Trial97 --- launcher/ui/setupwizard/LoginWizardPage.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/launcher/ui/setupwizard/LoginWizardPage.cpp b/launcher/ui/setupwizard/LoginWizardPage.cpp index 6be24a2f7..f53e31908 100644 --- a/launcher/ui/setupwizard/LoginWizardPage.cpp +++ b/launcher/ui/setupwizard/LoginWizardPage.cpp @@ -35,11 +35,10 @@ void LoginWizardPage::on_pushButton_clicked() if (account) { APPLICATION->accounts()->addAccount(account); APPLICATION->accounts()->setDefaultAccount(account); - } - - if (wizard()->currentId() == wizard()->pageIds().last()) { - wizard()->accept(); - } else { - wizard()->next(); + if (wizard()->currentId() == wizard()->pageIds().last()) { + wizard()->accept(); + } else { + wizard()->next(); + } } } From db3c7d01fd23b42e7f70a2809f6beb5a297375ec Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 16 Sep 2024 16:36:05 +0300 Subject: [PATCH 192/616] Apply suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- CMakeLists.txt | 2 +- buildconfig/BuildConfig.cpp.in | 2 +- buildconfig/BuildConfig.h | 2 +- launcher/minecraft/auth/steps/MSAStep.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b9cb8ea8..ecca591cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -176,7 +176,7 @@ endif() set(Launcher_NEWS_RSS_URL "https://prismlauncher.org/feed/feed.xml" CACHE STRING "URL to fetch Prism Launcher's news RSS feed from.") set(Launcher_NEWS_OPEN_URL "https://prismlauncher.org/news" CACHE STRING "URL that gets opened when the user clicks 'More News'") set(Launcher_HELP_URL "https://prismlauncher.org/wiki/help-pages/%1" CACHE STRING "URL (with arg %1 to be substituted with page-id) that gets opened when the user requests help") -set(Launcher_SUCCESSFULL_LOGIN_URL "https://prismlauncher.org/successful-login" CACHE STRING "URL that gets opened when the user succesfully logins.") +set(Launcher_LOGIN_CALLBACK_URL "https://prismlauncher.org/successful-login" CACHE STRING "URL that gets opened when the user successfully logins.") set(Launcher_FMLLIBS_BASE_URL "https://files.prismlauncher.org/fmllibs/" CACHE STRING "URL for FML Libraries.") ######## Set version numbers ######## diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index 121ce0729..a758122d9 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -116,7 +116,7 @@ Config::Config() NEWS_RSS_URL = "@Launcher_NEWS_RSS_URL@"; NEWS_OPEN_URL = "@Launcher_NEWS_OPEN_URL@"; HELP_URL = "@Launcher_HELP_URL@"; - SUCCESSFULL_LOGIN_URL = "@Launcher_SUCCESSFULL_LOGIN_URL@"; + LOGIN_CALLBACK_URL = "@Launcher_LOGIN_CALLBACK_URL@"; IMGUR_CLIENT_ID = "@Launcher_IMGUR_CLIENT_ID@"; MSA_CLIENT_ID = "@Launcher_MSA_CLIENT_ID@"; FLAME_API_KEY = "@Launcher_CURSEFORGE_API_KEY@"; diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index 4684f5709..0626c1d50 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -136,7 +136,7 @@ class Config { /** * URL that gets opened when the user succesfully logins. */ - QString SUCCESSFULL_LOGIN_URL; + QString LOGIN_CALLBACK_URL; /** * Client ID you can get from Imgur when you register an application diff --git a/launcher/minecraft/auth/steps/MSAStep.cpp b/launcher/minecraft/auth/steps/MSAStep.cpp index 916f84e4a..74999414c 100644 --- a/launcher/minecraft/auth/steps/MSAStep.cpp +++ b/launcher/minecraft/auth/steps/MSAStep.cpp @@ -99,7 +99,7 @@ MSAStep::MSAStep(AccountData* data, bool silent) : AuthStep(data), m_silent(sile window.location.replace("%1"); )XXX") - .arg(BuildConfig.SUCCESSFULL_LOGIN_URL)); + .arg(BuildConfig.LOGIN_CALLBACK_URL)); oauth2.setReplyHandler(replyHandler); } else { oauth2.setReplyHandler(new CustomOAuthOobReplyHandler(this)); From 580fc3251810009dc38c590253648b8f5784ce76 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 16:41:16 +0300 Subject: [PATCH 193/616] split the auth loading screen Signed-off-by: Trial97 --- launcher/ui/dialogs/MSALoginDialog.cpp | 14 +- launcher/ui/dialogs/MSALoginDialog.h | 3 +- launcher/ui/dialogs/MSALoginDialog.ui | 262 ++++++++++++++++--------- 3 files changed, 180 insertions(+), 99 deletions(-) diff --git a/launcher/ui/dialogs/MSALoginDialog.cpp b/launcher/ui/dialogs/MSALoginDialog.cpp index 799b5b332..4e38b4187 100644 --- a/launcher/ui/dialogs/MSALoginDialog.cpp +++ b/launcher/ui/dialogs/MSALoginDialog.cpp @@ -78,7 +78,7 @@ int MSALoginDialog::exec() connect(m_authflow_task.get(), &Task::failed, this, &MSALoginDialog::onTaskFailed); connect(m_authflow_task.get(), &Task::succeeded, this, &QDialog::accept); connect(m_authflow_task.get(), &Task::aborted, this, &MSALoginDialog::reject); - connect(m_authflow_task.get(), &Task::status, this, &MSALoginDialog::onTaskStatus); + connect(m_authflow_task.get(), &Task::status, this, &MSALoginDialog::onAuthFlowStatus); connect(m_authflow_task.get(), &AuthFlow::authorizeWithBrowser, this, &MSALoginDialog::authorizeWithBrowser); connect(m_authflow_task.get(), &AuthFlow::authorizeWithBrowserWithExtra, this, &MSALoginDialog::authorizeWithBrowserWithExtra); connect(ui->buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, m_authflow_task.get(), &Task::abort); @@ -87,7 +87,7 @@ int MSALoginDialog::exec() connect(m_devicecode_task.get(), &Task::failed, this, &MSALoginDialog::onTaskFailed); connect(m_devicecode_task.get(), &Task::succeeded, this, &QDialog::accept); connect(m_devicecode_task.get(), &Task::aborted, this, &MSALoginDialog::reject); - connect(m_devicecode_task.get(), &Task::status, this, &MSALoginDialog::onTaskStatus); + connect(m_devicecode_task.get(), &Task::status, this, &MSALoginDialog::onDeviceFlowStatus); connect(m_devicecode_task.get(), &AuthFlow::authorizeWithBrowser, this, &MSALoginDialog::authorizeWithBrowser); connect(m_devicecode_task.get(), &AuthFlow::authorizeWithBrowserWithExtra, this, &MSALoginDialog::authorizeWithBrowserWithExtra); connect(ui->buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, m_devicecode_task.get(), &Task::abort); @@ -132,7 +132,7 @@ void MSALoginDialog::onTaskFailed(QString reason) void MSALoginDialog::authorizeWithBrowser(const QUrl& url) { - ui->stackedWidget->setCurrentIndex(1); + ui->stackedWidget2->setCurrentIndex(1); ui->loginButton->setToolTip(QString("
%1
").arg(url.toString())); m_url = url; } @@ -152,12 +152,18 @@ void MSALoginDialog::authorizeWithBrowserWithExtra(QString url, QString code, in } } -void MSALoginDialog::onTaskStatus(QString status) +void MSALoginDialog::onDeviceFlowStatus(QString status) { ui->stackedWidget->setCurrentIndex(0); ui->status->setText(status); } +void MSALoginDialog::onAuthFlowStatus(QString status) +{ + ui->stackedWidget2->setCurrentIndex(0); + ui->status2->setText(status); +} + // Public interface MinecraftAccountPtr MSALoginDialog::newAccount(QWidget* parent) { diff --git a/launcher/ui/dialogs/MSALoginDialog.h b/launcher/ui/dialogs/MSALoginDialog.h index 70f480ca9..375ccc57a 100644 --- a/launcher/ui/dialogs/MSALoginDialog.h +++ b/launcher/ui/dialogs/MSALoginDialog.h @@ -40,7 +40,8 @@ class MSALoginDialog : public QDialog { protected slots: void onTaskFailed(QString reason); - void onTaskStatus(QString status); + void onDeviceFlowStatus(QString status); + void onAuthFlowStatus(QString status); void authorizeWithBrowser(const QUrl& url); void authorizeWithBrowserWithExtra(QString url, QString code, int expiresIn); diff --git a/launcher/ui/dialogs/MSALoginDialog.ui b/launcher/ui/dialogs/MSALoginDialog.ui index c6821782f..69cd2e1ab 100644 --- a/launcher/ui/dialogs/MSALoginDialog.ui +++ b/launcher/ui/dialogs/MSALoginDialog.ui @@ -7,7 +7,7 @@ 0 0 440 - 430 + 447 @@ -20,6 +20,171 @@ Add Microsoft Account + + + + 1 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 16 + 75 + true + + + + Please wait... + + + Qt::AlignCenter + + + true + + + + + + + Status + + + Qt::AlignCenter + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 250 + 40 + + + + Sign in with Microsoft + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + + + + 16 + + + + Or + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + @@ -28,7 +193,7 @@ - + Qt::Vertical @@ -89,98 +254,7 @@ - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 250 - 40 - - - - Sign in with Microsoft - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - 0 - 0 - - - - Qt::Horizontal - - - - - - - - 16 - - - - Or - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - Qt::Horizontal - - - - - + From 8d14060ad14e6463825210c2d28c266e1563e3e1 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 16 Sep 2024 16:46:01 +0300 Subject: [PATCH 194/616] Apply suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- launcher/java/download/SymlinkTask.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/launcher/java/download/SymlinkTask.cpp b/launcher/java/download/SymlinkTask.cpp index 9841c5015..843c7caa9 100644 --- a/launcher/java/download/SymlinkTask.cpp +++ b/launcher/java/download/SymlinkTask.cpp @@ -43,7 +43,7 @@ QString findBinPath(QString root, QString pattern) void SymlinkTask::executeTask() { - setStatus(tr("Check Java bin")); + setStatus(tr("Checking for Java binary path")); const auto binPath = FS::PathCombine("bin", "java"); const auto wantedPath = FS::PathCombine(m_path, binPath); if (QFileInfo::exists(wantedPath)) { @@ -51,16 +51,16 @@ void SymlinkTask::executeTask() return; } - setStatus(tr("Search for Java bin")); + setStatus(tr("Searching for Java binary path")); const auto contentsPartialPath = FS::PathCombine("Contents", "Home", binPath); const auto relativePathToBin = findBinPath(m_path, contentsPartialPath); if (relativePathToBin.isEmpty()) { - emitFailed(tr("Failed to find bin java")); + emitFailed(tr("Failed to find Java binary path")); return; } const auto folderToLink = relativePathToBin.chopped(binPath.length()); - setStatus(tr("Collect folders to symlink")); + setStatus(tr("Collecting folders to symlink")); auto entries = QDir(folderToLink).entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries); QList files; setProgress(0, entries.length()); @@ -68,7 +68,7 @@ void SymlinkTask::executeTask() files.append({ entry.absoluteFilePath(), FS::PathCombine(m_path, entry.fileName()) }); } - setStatus(tr("Symlink Java")); + setStatus(tr("Symlinking Java binary path")); FS::create_link folderLink(files); connect(&folderLink, &FS::create_link::fileLinked, [this](QString src, QString dst) { setProgress(m_progress + 1, m_progressTotal); }); if (!folderLink()) { From 2e537e55de415d04d4eebda244c609e2c16ad894 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 16 Sep 2024 17:47:58 +0300 Subject: [PATCH 195/616] Apply suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- CMakeLists.txt | 2 +- buildconfig/BuildConfig.cpp.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ecca591cb..cc01672c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -207,7 +207,7 @@ set(Launcher_BUG_TRACKER_URL "https://github.com/PrismLauncher/PrismLauncher/iss # Translations Platform URL set(Launcher_TRANSLATIONS_URL "https://hosted.weblate.org/projects/prismlauncher/launcher/" CACHE STRING "URL for the translations platform.") -set(Launcher_TRANSLATIONS_BASE_URL "https://i18n.prismlauncher.org/" CACHE STRING "URL for the translations files.") +set(Launcher_TRANSLATION_FILES_URL "https://i18n.prismlauncher.org/" CACHE STRING "URL for the translations files.") # Matrix Space set(Launcher_MATRIX_URL "https://prismlauncher.org/matrix" CACHE STRING "URL to the Matrix Space") diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index a758122d9..6585ebe31 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -128,7 +128,7 @@ Config::Config() BUG_TRACKER_URL = "@Launcher_BUG_TRACKER_URL@"; TRANSLATIONS_URL = "@Launcher_TRANSLATIONS_URL@"; - TRANSLATIONS_BASE_URL = "@Launcher_TRANSLATIONS_BASE_URL@"; + TRANSLATION_FILES_URL = "@Launcher_TRANSLATION_FILES_URL@"; MATRIX_URL = "@Launcher_MATRIX_URL@"; DISCORD_URL = "@Launcher_DISCORD_URL@"; SUBREDDIT_URL = "@Launcher_SUBREDDIT_URL@"; From e53a5b3eca40788c4acc6e2e806e0fd77ca92638 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 17:51:35 +0300 Subject: [PATCH 196/616] replace TRANSLATIONS_BASE_URL with TRANSLATION_FILES_URL Signed-off-by: Trial97 --- buildconfig/BuildConfig.h | 2 +- launcher/translations/TranslationsModel.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index 0626c1d50..ae705d098 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -171,7 +171,7 @@ class Config { QString LIBRARY_BASE = "https://libraries.minecraft.net/"; QString IMGUR_BASE_URL = "https://api.imgur.com/3/"; QString FMLLIBS_BASE_URL; - QString TRANSLATIONS_BASE_URL; + QString TRANSLATION_FILES_URL; QString MODPACKSCH_API_BASE_URL = "https://api.modpacks.ch/"; diff --git a/launcher/translations/TranslationsModel.cpp b/launcher/translations/TranslationsModel.cpp index 39719b125..e8dc01873 100644 --- a/launcher/translations/TranslationsModel.cpp +++ b/launcher/translations/TranslationsModel.cpp @@ -550,7 +550,7 @@ void TranslationsModel::downloadIndex() d->m_index_job.reset(new NetJob("Translations Index", APPLICATION->network())); MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("translations", "index_v2.json"); entry->setStale(true); - auto task = Net::Download::makeCached(QUrl(BuildConfig.TRANSLATIONS_BASE_URL + "index_v2.json"), entry); + auto task = Net::Download::makeCached(QUrl(BuildConfig.TRANSLATION_FILES_URL + "index_v2.json"), entry); d->m_index_task = task.get(); d->m_index_job->addNetAction(task); d->m_index_job->setAskRetry(false); @@ -591,7 +591,7 @@ void TranslationsModel::downloadTranslation(QString key) MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("translations", "mmc_" + key + ".qm"); entry->setStale(true); - auto dl = Net::Download::makeCached(QUrl(BuildConfig.TRANSLATIONS_BASE_URL + lang->file_name), entry); + auto dl = Net::Download::makeCached(QUrl(BuildConfig.TRANSLATION_FILES_URL + lang->file_name), entry); dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, lang->file_sha1)); dl->setProgress(dl->getProgress(), lang->file_size); From 914ae6ead62f7270894b07bd7f29a541a12d7164 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 16 Sep 2024 20:00:38 +0300 Subject: [PATCH 197/616] Use macOS 14 in CI (#2826) * chore: fix mac CI build Signed-off-by: Trial97 * try what the error says Signed-off-by: Trial97 * set -DCMAKE_OSX_ARCHITECTURES=x86_64 Signed-off-by: Trial97 --------- Signed-off-by: Trial97 --- .github/workflows/build.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 25e1c2aab..ccba62541 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -93,7 +93,7 @@ jobs: qt_version: "6.7.2" qt_modules: "qt5compat qtimageformats qtnetworkauth" - - os: macos-12 + - os: macos-14 name: macOS macosx_deployment_target: 11.0 qt_ver: 6 @@ -102,7 +102,7 @@ jobs: qt_version: "6.7.2" qt_modules: "qt5compat qtimageformats qtnetworkauth" - - os: macos-12 + - os: macos-14 name: macOS-Legacy macosx_deployment_target: 10.13 qt_ver: 5 @@ -259,6 +259,12 @@ jobs: run: | echo "QT_HOST_PATH=${{ github.workspace }}\HostQt\Qt\${{ matrix.qt_version }}\msvc2019_64" >> $env:GITHUB_ENV + - name: Setup java (macOS) + if: runner.os == 'macOS' + uses: actions/setup-java@v4 + with: + distribution: "temurin" + java-version: "17" ## # CONFIGURE ## @@ -271,7 +277,7 @@ jobs: - name: Configure CMake (macOS-Legacy) if: runner.os == 'macOS' && matrix.qt_ver == 5 run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -DCMAKE_OSX_ARCHITECTURES="x86_64" -G Ninja - name: Configure CMake (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' From 77463c6d33e8cafc66ac2b3fab59e167941af819 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 18 Sep 2024 21:17:15 +0300 Subject: [PATCH 198/616] display minecraft log before instance run Signed-off-by: Trial97 --- launcher/ui/pages/instance/LogPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/instance/LogPage.cpp b/launcher/ui/pages/instance/LogPage.cpp index 0c22d1de6..6a4888f9c 100644 --- a/launcher/ui/pages/instance/LogPage.cpp +++ b/launcher/ui/pages/instance/LogPage.cpp @@ -234,7 +234,7 @@ bool LogPage::apply() bool LogPage::shouldDisplay() const { - return m_instance->isRunning() || m_proxy->rowCount() > 0; + return true; } void LogPage::on_btnPaste_clicked() From 1243328876c7b655e15ab7211cc9162c32e16f30 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 20 Sep 2024 16:53:36 +0300 Subject: [PATCH 199/616] fix folder duplication for modrinth Signed-off-by: Trial97 --- launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index 7a3f71c3b..ba97c441f 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -302,7 +302,7 @@ bool ModrinthCreationTask::createInstance() loop.exec(); QEventLoop ensureMetaLoop; - QDir folder = FS::PathCombine(m_stagingPath, "minecraft", "mods", ".index"); + QDir folder = FS::PathCombine(instance.modsRoot(), ".index"); auto ensureMetadataTask = makeShared(mods, folder, ModPlatform::ResourceProvider::MODRINTH); connect(ensureMetadataTask.get(), &Task::succeeded, this, [&]() { ended_well = true; }); connect(ensureMetadataTask.get(), &Task::finished, &ensureMetaLoop, &QEventLoop::quit); From 3e1cf6b2a7a13a85d412ee5b7f06032f17fa4635 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 20 Sep 2024 16:58:22 +0300 Subject: [PATCH 200/616] fix updater typo Signed-off-by: Trial97 --- launcher/updater/prismupdater/PrismUpdater.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/updater/prismupdater/PrismUpdater.cpp b/launcher/updater/prismupdater/PrismUpdater.cpp index 6b9754864..8bf8cb473 100644 --- a/launcher/updater/prismupdater/PrismUpdater.cpp +++ b/launcher/updater/prismupdater/PrismUpdater.cpp @@ -1210,7 +1210,7 @@ std::optional PrismUpdaterApp::unpackArchive(QFileInfo archive) QProcess proc = QProcess(); proc.start(cmd, args); if (!proc.waitForStarted(5000)) { // wait 5 seconds to start - auto msg = tr("Failed to launcher child process \"%1 %2\".").arg(cmd).arg(args.join(" ")); + auto msg = tr("Failed to launch child process \"%1 %2\".").arg(cmd).arg(args.join(" ")); logUpdate(msg); showFatalErrorMessage(tr("Failed extract archive"), msg); return std::nullopt; @@ -1241,7 +1241,7 @@ bool PrismUpdaterApp::loadPrismVersionFromExe(const QString& exe_path) proc.setReadChannel(QProcess::StandardOutput); proc.start(exe_path, { "--version" }); if (!proc.waitForStarted(5000)) { - showFatalErrorMessage(tr("Failed to Check Version"), tr("Failed to launcher child launcher process to read version.")); + showFatalErrorMessage(tr("Failed to Check Version"), tr("Failed to launch child process to read version.")); return false; } // wait 5 seconds to start if (!proc.waitForFinished(5000)) { From 9567d763c1b0ed99370c1097abdc2db0a57d9fea Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 21 Sep 2024 22:17:44 +0300 Subject: [PATCH 201/616] fix java archive typo Signed-off-by: Trial97 --- launcher/java/download/ArchiveDownloadTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index ba1c96faf..6d6ab0cef 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -95,7 +95,7 @@ void ArchiveDownloadTask::extractJava(QString input) } auto files = zip->getFileNameList(); if (files.isEmpty()) { - emitFailed(tr("No files were found in the supplied zip file,")); + emitFailed(tr("No files were found in the supplied zip file.")); return; } m_task = makeShared(zip, m_final_path, files[0]); From a58e81d7441ad5887e0bb3d7f7b3ab1887115341 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Tue, 24 Sep 2024 09:58:47 +0200 Subject: [PATCH 202/616] snake_case to camelCase Signed-off-by: QazCetelic --- launcher/icons/IconList.cpp | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index b60e67bec..016affe29 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -147,13 +147,13 @@ QStringList IconList::getIconFilePaths() const return iconFiles; } -QString formatName(const QDir& icons_dir, const QFileInfo& file) +QString formatName(const QDir& iconsDir, const QFileInfo& file) { - if (file.dir() == icons_dir) + if (file.dir() == iconsDir) return file.baseName(); constexpr auto delimiter = " » "; - QString relativePathWithoutExtension = icons_dir.relativeFilePath(file.dir().path()) + QDir::separator() + file.baseName(); + QString relativePathWithoutExtension = iconsDir.relativeFilePath(file.dir().path()) + QDir::separator() + file.baseName(); return relativePathWithoutExtension.replace(QDir::separator(), delimiter); } @@ -171,9 +171,9 @@ void IconList::directoryChanged(const QString& path) if (!FS::ensureFolderPathExists(m_dir.absolutePath())) return; m_dir.refresh(); - QStringList new_file_names_list = getIconFilePaths(); + QStringList newFileNamesList = getIconFilePaths(); #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - QSet new_set(new_file_names_list.begin(), new_file_names_list.end()); + QSet new_set(newFileNamesList.begin(), newFileNamesList.end()); #else auto new_set = new_file_names_list.toSet(); #endif @@ -192,13 +192,13 @@ void IconList::directoryChanged(const QString& path) QSet to_remove = current_set; to_remove -= new_set; - QSet to_add = new_set; - to_add -= current_set; + QSet toAdd = new_set; + toAdd -= current_set; for (const auto& remove : to_remove) { qDebug() << "Removing " << remove; - QFileInfo removed_file(remove); - QString key = m_dir.relativeFilePath(removed_file.absoluteFilePath()); + QFileInfo removedFile(remove); + QString key = m_dir.relativeFilePath(removedFile.absoluteFilePath()); int idx = getIconIndex(key); if (idx == -1) @@ -216,7 +216,7 @@ void IconList::directoryChanged(const QString& path) emit iconUpdated(key); } - for (const auto& add : to_add) { + for (const auto& add : toAdd) { qDebug() << "Adding " << add; QFileInfo addfile(add); @@ -464,16 +464,16 @@ void IconList::reindex() QIcon IconList::getIcon(const QString& key) const { - int icon_index = getIconIndex(key); + int iconIndex = getIconIndex(key); - if (icon_index != -1) - return icons[icon_index].icon(); + if (iconIndex != -1) + return icons[iconIndex].icon(); // Fallback for icons that don't exist. - icon_index = getIconIndex("grass"); + iconIndex = getIconIndex("grass"); - if (icon_index != -1) - return icons[icon_index].icon(); + if (iconIndex != -1) + return icons[iconIndex].icon(); return {}; } @@ -494,9 +494,9 @@ QString IconList::getDirectory() const /// Returns the directory of the icon with the given key or the default directory if it's a builtin icon. QString IconList::iconDirectory(const QString& key) const { - for (const auto& mmc_icon : icons) { - if (mmc_icon.m_key == key && mmc_icon.has(IconType::FileBased)) { - QFileInfo icon_file(mmc_icon.getFilePath()); + for (const auto& mmcIcon : icons) { + if (mmcIcon.m_key == key && mmcIcon.has(IconType::FileBased)) { + QFileInfo icon_file(mmcIcon.getFilePath()); return icon_file.dir().path(); } } From b675406b1ad3b56e67ee56605d2f85a8f0947246 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Tue, 24 Sep 2024 10:16:26 +0200 Subject: [PATCH 203/616] Split set creation into a separate function for readability Signed-off-by: QazCetelic --- launcher/icons/IconList.cpp | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index 016affe29..0903131ce 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -157,6 +157,16 @@ QString formatName(const QDir& iconsDir, const QFileInfo& file) return relativePathWithoutExtension.replace(QDir::separator(), delimiter); } +QSet toStringSet(const QList& list) // Split into a separate function because the preprocessing impedes readability +{ +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + QSet set(list.begin(), list.end()); +#else + auto set = list.toSet(); +#endif + return set; +} + void IconList::directoryChanged(const QString& path) { QDir new_dir(path); @@ -171,31 +181,23 @@ void IconList::directoryChanged(const QString& path) if (!FS::ensureFolderPathExists(m_dir.absolutePath())) return; m_dir.refresh(); - QStringList newFileNamesList = getIconFilePaths(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - QSet new_set(newFileNamesList.begin(), newFileNamesList.end()); -#else - auto new_set = new_file_names_list.toSet(); -#endif + const QStringList newFileNamesList = getIconFilePaths(); + const QSet newSet = toStringSet(newFileNamesList); QList current_list; for (auto& it : icons) { if (!it.has(IconType::FileBased)) continue; current_list.push_back(it.m_images[IconType::FileBased].filename); } -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - QSet current_set(current_list.begin(), current_list.end()); -#else - QSet current_set = current_list.toSet(); -#endif + const QSet currentSet = toStringSet(current_list); - QSet to_remove = current_set; - to_remove -= new_set; + QSet toRemove = currentSet; + toRemove -= newSet; - QSet toAdd = new_set; - toAdd -= current_set; + QSet toAdd = newSet; + toAdd -= currentSet; - for (const auto& remove : to_remove) { + for (const auto& remove : toRemove) { qDebug() << "Removing " << remove; QFileInfo removedFile(remove); QString key = m_dir.relativeFilePath(removedFile.absoluteFilePath()); From f641f3acda6e96ad18dd24e16eee62e50e7bb29b Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Tue, 24 Sep 2024 12:32:49 +0200 Subject: [PATCH 204/616] Refactoring Signed-off-by: QazCetelic --- launcher/icons/IconList.cpp | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index 0903131ce..0edc97681 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -169,8 +169,8 @@ QSet toStringSet(const QList& list) // Split into a separate f void IconList::directoryChanged(const QString& path) { - QDir new_dir(path); - if (m_dir.absolutePath() != new_dir.absolutePath()) { + QDir newDir(path); + if (m_dir.absolutePath() != newDir.absolutePath()) { m_dir.setPath(path); m_dir.refresh(); if (is_watching) @@ -183,19 +183,14 @@ void IconList::directoryChanged(const QString& path) m_dir.refresh(); const QStringList newFileNamesList = getIconFilePaths(); const QSet newSet = toStringSet(newFileNamesList); - QList current_list; - for (auto& it : icons) { + QSet currentSet; + for (const MMCIcon& it : icons) { if (!it.has(IconType::FileBased)) continue; - current_list.push_back(it.m_images[IconType::FileBased].filename); + currentSet.insert(it.m_images[IconType::FileBased].filename); } - const QSet currentSet = toStringSet(current_list); - - QSet toRemove = currentSet; - toRemove -= newSet; - - QSet toAdd = newSet; - toAdd -= currentSet; + QSet toRemove = currentSet - newSet; + QSet toAdd = newSet - currentSet; for (const auto& remove : toRemove) { qDebug() << "Removing " << remove; @@ -456,11 +451,9 @@ void IconList::saveIcon(const QString& key, const QString& path, const char* for void IconList::reindex() { name_index.clear(); - int i = 0; - for (auto& iter : icons) { - name_index[iter.m_key] = i; - i++; - emit iconUpdated(iter.m_key); // prevents incorrect indices with proxy model + for (int i = 0; i < icons.size(); i++) { + name_index[icons[i].m_key] = i; + emit iconUpdated(icons[i].m_key); // prevents incorrect indices with proxy model } } @@ -471,7 +464,7 @@ QIcon IconList::getIcon(const QString& key) const if (iconIndex != -1) return icons[iconIndex].icon(); - // Fallback for icons that don't exist. + // Fallback for icons that don't exist.b iconIndex = getIconIndex("grass"); if (iconIndex != -1) From 1b2e9b95e2dd62f844c5d019d9b0b503084dd382 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 25 Sep 2024 19:37:25 +0300 Subject: [PATCH 205/616] add prefix to non-standard packwiz fields Signed-off-by: Trial97 --- launcher/modplatform/packwiz/Packwiz.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index 77a0935f3..325b0a6e4 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -208,9 +208,9 @@ void V1::updateModIndex(QDir& index_dir, Mod& mod) auto tbl = toml::table{ { "name", mod.name.toStdString() }, { "filename", mod.filename.toStdString() }, { "side", sideToString(mod.side).toStdString() }, - { "loaders", loaders }, - { "mcVersions", mcVersions }, - { "releaseType", mod.releaseType.toString().toStdString() }, + { "x-prismlauncher-loaders", loaders }, + { "x-prismlauncher-mc-versions", mcVersions }, + { "x-prismlauncher-release-type", mod.releaseType.toString().toStdString() }, { "download", toml::table{ { "mode", mod.mode.toStdString() }, @@ -295,15 +295,15 @@ auto V1::getIndexForMod(QDir& index_dir, QString slug) -> Mod mod.name = stringEntry(table, "name"); mod.filename = stringEntry(table, "filename"); mod.side = stringToSide(stringEntry(table, "side")); - mod.releaseType = ModPlatform::IndexedVersionType(stringEntry(table, "releaseType")); - if (auto loaders = table["loaders"]; loaders && loaders.is_array()) { + mod.releaseType = ModPlatform::IndexedVersionType(stringEntry(table, "x-prismlauncher-release-type")); + if (auto loaders = table["x-prismlauncher-loaders"]; loaders && loaders.is_array()) { for (auto&& loader : *loaders.as_array()) { if (loader.is_string()) { mod.loaders |= ModPlatform::getModLoaderFromString(QString::fromStdString(loader.as_string()->value_or(""))); } } } - if (auto versions = table["mcVersions"]; versions && versions.is_array()) { + if (auto versions = table["x-prismlauncher-mc-versions"]; versions && versions.is_array()) { for (auto&& version : *versions.as_array()) { if (version.is_string()) { auto ver = QString::fromStdString(version.as_string()->value_or("")); From 6475dc5786600ee19d512f9b11f662a240922fa1 Mon Sep 17 00:00:00 2001 From: Cart <81428538+cartrigger@users.noreply.github.com> Date: Thu, 26 Sep 2024 01:58:21 -0400 Subject: [PATCH 206/616] Lots of J's for Java needed to be uppercased --- launcher/VersionProxyModel.cpp | 4 ++-- launcher/java/download/ArchiveDownloadTask.cpp | 2 +- launcher/ui/MainWindow.ui | 2 +- launcher/ui/java/InstallJavaDialog.cpp | 8 ++++---- launcher/ui/pages/global/JavaPage.cpp | 4 ++-- launcher/ui/setupwizard/AutoJavaWizardPage.ui | 2 +- launcher/ui/setupwizard/JavaWizardPage.cpp | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/launcher/VersionProxyModel.cpp b/launcher/VersionProxyModel.cpp index 552900d35..12a82f73d 100644 --- a/launcher/VersionProxyModel.cpp +++ b/launcher/VersionProxyModel.cpp @@ -140,9 +140,9 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, case Path: return tr("Filesystem path to this version"); case JavaName: - return tr("The alternative name of the java version"); + return tr("The alternative name of the Java version"); case JavaMajor: - return tr("The java major version"); + return tr("The Java major version"); case Time: return tr("Release date of this version"); } diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index 6d6ab0cef..bb7cc568d 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -65,7 +65,7 @@ void ArchiveDownloadTask::executeTask() void ArchiveDownloadTask::extractJava(QString input) { - setStatus(tr("Extracting java")); + setStatus(tr("Extracting Java")); if (input.endsWith("tar")) { setStatus(tr("Extracting Java (Progress is not reported for tar archives)")); QFile in(input); diff --git a/launcher/ui/MainWindow.ui b/launcher/ui/MainWindow.ui index 89e536b01..f20c34206 100644 --- a/launcher/ui/MainWindow.ui +++ b/launcher/ui/MainWindow.ui @@ -798,7 +798,7 @@ Java - Open the java folder in a file browser. Only available if the built-in Java downloader is used. + Open the Java folder in a file browser. Only available if the built-in Java downloader is used. diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index f01edc5e5..0ece3220b 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -57,13 +57,13 @@ class InstallJavaPage : public QWidget, public BasePage { majorVersionSelect = new VersionSelectWidget(this); majorVersionSelect->selectCurrent(); - majorVersionSelect->setEmptyString(tr("No java versions are currently available in the meta.")); - majorVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + majorVersionSelect->setEmptyString(tr("No Java versions are currently available in the meta.")); + majorVersionSelect->setEmptyErrorString(tr("Couldn't load or download the Java version lists!")); horizontalLayout->addWidget(majorVersionSelect, 1); javaVersionSelect = new VersionSelectWidget(this); - javaVersionSelect->setEmptyString(tr("No java versions are currently available for your OS.")); - javaVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + javaVersionSelect->setEmptyString(tr("No Java versions are currently available for your OS.")); + javaVersionSelect->setEmptyErrorString(tr("Couldn't load or download the Java version lists!")); horizontalLayout->addWidget(javaVersionSelect, 4); connect(majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallJavaPage::setSelectedVersion); connect(majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallJavaPage::selectionChanged); diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 6699b00c0..0ae296815 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -67,8 +67,8 @@ JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage) ui->managedJavaList->initialize(new JavaInstallList(this, true)); ui->managedJavaList->setResizeOn(2); ui->managedJavaList->selectCurrent(); - ui->managedJavaList->setEmptyString(tr("No managed java versions are installed")); - ui->managedJavaList->setEmptyErrorString(tr("Couldn't load the managed java list!")); + ui->managedJavaList->setEmptyString(tr("No managed Java versions are installed")); + ui->managedJavaList->setEmptyErrorString(tr("Couldn't load the managed Java list!")); connect(ui->autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] { ui->autodownloadCheckBox->setEnabled(ui->autodetectJavaCheckBox->isChecked()); if (!ui->autodetectJavaCheckBox->isChecked()) diff --git a/launcher/ui/setupwizard/AutoJavaWizardPage.ui b/launcher/ui/setupwizard/AutoJavaWizardPage.ui index bd72cf695..a862524b0 100644 --- a/launcher/ui/setupwizard/AutoJavaWizardPage.ui +++ b/launcher/ui/setupwizard/AutoJavaWizardPage.ui @@ -30,7 +30,7 @@ - We've added a feature to automatically download the correct Java version for each version of Minecraft(this can be changed in the Java Settings). Would you like to enable or disable this feature? + We've added a feature to automatically download the correct Java version for each version of Minecraft (this can be changed in the Java Settings). Would you like to enable or disable this feature? true diff --git a/launcher/ui/setupwizard/JavaWizardPage.cpp b/launcher/ui/setupwizard/JavaWizardPage.cpp index 47718d6da..8caae173c 100644 --- a/launcher/ui/setupwizard/JavaWizardPage.cpp +++ b/launcher/ui/setupwizard/JavaWizardPage.cpp @@ -83,6 +83,6 @@ void JavaWizardPage::retranslate() { setTitle(tr("Java")); setSubTitle( - tr("Please select how much memory to allocate to instances and if Prism Launcher should manage java automatically or manually.")); + tr("Please select how much memory to allocate to instances and if Prism Launcher should manage Java automatically or manually.")); m_java_widget->retranslate(); } From 2dc6f7504b4cfb64b59b3eb905f1b1ac387b8c83 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 27 Sep 2024 00:18:35 -0700 Subject: [PATCH 207/616] add vc_redist as a NSIS install section Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- program_info/CMakeLists.txt | 15 +++++++++++++++ program_info/win_install.nsi.in | 2 ++ 2 files changed, 17 insertions(+) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 91b213274..90d038f4d 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -41,6 +41,21 @@ configure_file(org.prismlauncher.PrismLauncher.metainfo.xml.in org.prismlauncher configure_file(prismlauncher.rc.in prismlauncher.rc @ONLY) configure_file(prismlauncher.manifest.in prismlauncher.manifest @ONLY) configure_file(prismlauncher.ico prismlauncher.ico COPYONLY) + +if(MSVC) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION vc_redist) + include(InstallRequiredSystemLibraries) + file(TO_NATIVE_PATH ${MSVC_REDIST_DIR} Native_MSVC_REDIST_DIR) + set(Launcher_MSVC_Redist_NSIS_Section "\ +Section \"Visual Studio Runtime\" + SetOutPath \"$INSTDIR\\vc_redist\" + File \"${Native_MSVC_REDIST_DIR}\\vc_redist.x64.exe\" + ExecWait \"$INSTDIR\\vc_redist\\vc_redist.x64.exe /install /passive\" + ; Delete \"$INSTDIR\\vc_redist\\vc_redist.x64.exe\" +SectionEnd\ +") +endif() + configure_file(win_install.nsi.in win_install.nsi @ONLY) if(SCDOC_FOUND) diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index cc56b9bd5..c75e066bd 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -396,6 +396,8 @@ Section "@Launcher_DisplayName@" SectionEnd +@Launcher_MSVC_Redist_NSIS_Section@ + Section "Start Menu Shortcut" SM_SHORTCUTS CreateShortcut "$SMPROGRAMS\@Launcher_DisplayName@.lnk" "$INSTDIR\@Launcher_APP_BINARY_NAME@.exe" "" "$INSTDIR\@Launcher_APP_BINARY_NAME@.exe" 0 From 37d3b2a4f631d2a8ce3570a9c377576d4f5a3aa1 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 27 Sep 2024 00:49:00 -0700 Subject: [PATCH 208/616] prevent the unauthorised reditribution of MSVC CRT files Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- program_info/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 90d038f4d..c9a1d597d 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -43,7 +43,7 @@ configure_file(prismlauncher.manifest.in prismlauncher.manifest @ONLY) configure_file(prismlauncher.ico prismlauncher.ico COPYONLY) if(MSVC) - set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION vc_redist) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) include(InstallRequiredSystemLibraries) file(TO_NATIVE_PATH ${MSVC_REDIST_DIR} Native_MSVC_REDIST_DIR) set(Launcher_MSVC_Redist_NSIS_Section "\ From c5daca3b013bd9cc8b17283d2a63e873480c2c16 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 27 Sep 2024 00:57:28 -0700 Subject: [PATCH 209/616] include vc_redist in portable build Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d70fe79b..49d3f731f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -372,6 +372,11 @@ endif() if(NOT (UNIX AND APPLE)) # Install "portable.txt" if selected component is "portable" install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_Portable_File}" DESTINATION "." COMPONENT portable EXCLUDE_FROM_ALL) + if (MSVC) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) + include(InstallRequiredSystemLibraries) + install(FILES "${MSVC_REDIST_DIR}/vc_redist.x64.exe" DESTINATION "vc_redist/." COMPONENT portable EXCLUDE_FROM_ALL ) + endif() endif() if(UNIX AND APPLE) From 8fa4467a362a55d10a3491a3b1d2301d3510383a Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:29:00 -0700 Subject: [PATCH 210/616] use `/norestart` with redist install Co-authored-by: seth Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- program_info/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index c9a1d597d..0ce559406 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -50,7 +50,7 @@ if(MSVC) Section \"Visual Studio Runtime\" SetOutPath \"$INSTDIR\\vc_redist\" File \"${Native_MSVC_REDIST_DIR}\\vc_redist.x64.exe\" - ExecWait \"$INSTDIR\\vc_redist\\vc_redist.x64.exe /install /passive\" + ExecWait \"$INSTDIR\\vc_redist\\vc_redist.x64.exe /install /passive /norestart\" ; Delete \"$INSTDIR\\vc_redist\\vc_redist.x64.exe\" SectionEnd\ ") From b9c19fd3f73877f80fb2363617d893f91e5037e2 Mon Sep 17 00:00:00 2001 From: Mason Rocha Date: Fri, 27 Sep 2024 16:42:59 -0500 Subject: [PATCH 211/616] fix: don't annoy when java tmpdir jvmarg is set & /tmp is noexec Signed-off-by: Mason Rocha Got annoyed, didn't want to see it anymore. Java tmpdir noexec warning modified to include information about possible remedies available --- launcher/Application.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 6379678c9..4a66271a3 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1025,7 +1025,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) } // notify user if /tmp is mounted with `noexec` (#1693) - { + QString jvmArgs = m_settings->get("JvmArgs").toString(); + if(jvmArgs.indexOf("java.io.tmpdir") == -1) { /* java.io.tmpdir is a valid workaround, so don't annoy */ bool is_tmp_noexec = false; #if defined(Q_OS_LINUX) @@ -1045,7 +1046,11 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) if (is_tmp_noexec) { auto infoMsg = tr("Your /tmp directory is currently mounted with the 'noexec' flag enabled.\n" - "Some versions of Minecraft may not launch.\n"); + "Some versions of Minecraft may not launch.\n" + "\n" + "You may solve this issue by remounting /tmp as 'exec' or setting " + "the java.io.tmpdir JVM argument to a writeable directory in a " + "filesystem where the 'exec' flag is set (e.g., /home/user/.local/tmp)\n"); auto msgBox = new QMessageBox(QMessageBox::Information, tr("Incompatible system configuration"), infoMsg, QMessageBox::Ok); msgBox->setDefaultButton(QMessageBox::Ok); msgBox->setAttribute(Qt::WA_DeleteOnClose); From 00f4221a836bc747ec8d220a52e7b96ed24f871a Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 27 Sep 2024 19:16:50 -0700 Subject: [PATCH 212/616] reorg MSVC set(CMAKE_INSTALL_SYSTEM_RUNTIMES_LIBS_SKIP true) call Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- CMakeLists.txt | 6 ++++-- program_info/CMakeLists.txt | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 49d3f731f..cea61ddbf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -358,6 +358,10 @@ include(ECMQtDeclareLoggingCategory) ####################################### Program Info ####################################### set(Launcher_APP_BINARY_NAME "prismlauncher" CACHE STRING "Name of the Launcher binary") +if(MSVC) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) + include(InstallRequiredSystemLibraries) +endif() add_subdirectory(program_info) ####################################### Install layout ####################################### @@ -373,8 +377,6 @@ if(NOT (UNIX AND APPLE)) # Install "portable.txt" if selected component is "portable" install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_Portable_File}" DESTINATION "." COMPONENT portable EXCLUDE_FROM_ALL) if (MSVC) - set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) - include(InstallRequiredSystemLibraries) install(FILES "${MSVC_REDIST_DIR}/vc_redist.x64.exe" DESTINATION "vc_redist/." COMPONENT portable EXCLUDE_FROM_ALL ) endif() endif() diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 0ce559406..8a7d4868f 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -43,7 +43,6 @@ configure_file(prismlauncher.manifest.in prismlauncher.manifest @ONLY) configure_file(prismlauncher.ico prismlauncher.ico COPYONLY) if(MSVC) - set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) include(InstallRequiredSystemLibraries) file(TO_NATIVE_PATH ${MSVC_REDIST_DIR} Native_MSVC_REDIST_DIR) set(Launcher_MSVC_Redist_NSIS_Section "\ From a897b012d988861a47df887f0e8d2cd55d7bd584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgars=20C=C4=ABrulis?= Date: Sat, 28 Sep 2024 12:11:25 +0300 Subject: [PATCH 213/616] chore: update Qt to 6.7.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only bug fixes no new / breaking changes Signed-off-by: Edgars Cīrulis --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ccba62541..a8ee6e6cf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -79,7 +79,7 @@ jobs: qt_ver: 6 qt_host: windows qt_arch: "" - qt_version: "6.7.2" + qt_version: "6.7.3" qt_modules: "qt5compat qtimageformats qtnetworkauth" - os: windows-2022 @@ -90,7 +90,7 @@ jobs: qt_ver: 6 qt_host: windows qt_arch: "win64_msvc2019_arm64" - qt_version: "6.7.2" + qt_version: "6.7.3" qt_modules: "qt5compat qtimageformats qtnetworkauth" - os: macos-14 @@ -99,7 +99,7 @@ jobs: qt_ver: 6 qt_host: mac qt_arch: "" - qt_version: "6.7.2" + qt_version: "6.7.3" qt_modules: "qt5compat qtimageformats qtnetworkauth" - os: macos-14 From ed15a28eb3af1487cff7b81ed06b91afd35de4a0 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sat, 28 Sep 2024 14:58:13 -0700 Subject: [PATCH 214/616] fix : baking the redist into the installer breaks GPL, download at runtime instead Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 3 +++ CMakeLists.txt | 7 ------- program_info/CMakeLists.txt | 25 +++++++++++++++---------- program_info/win_install.nsi.in | 23 +++++++++++++++++++++++ 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ccba62541..7345ffe90 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -471,6 +471,9 @@ jobs: - name: Package (Windows, installer) if: runner.os == 'Windows' run: | + New-Item -Name NSISPlugins -ItemType Directory + Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/latest/download/NScurl.zip -OutFile NSISPlugins\NScurl.zip + Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NSIScurl cd ${{ env.INSTALL_DIR }} makensis -NOCD "${{ github.workspace }}/${{ env.BUILD_DIR }}/program_info/win_install.nsi" diff --git a/CMakeLists.txt b/CMakeLists.txt index cea61ddbf..3d70fe79b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -358,10 +358,6 @@ include(ECMQtDeclareLoggingCategory) ####################################### Program Info ####################################### set(Launcher_APP_BINARY_NAME "prismlauncher" CACHE STRING "Name of the Launcher binary") -if(MSVC) - set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) - include(InstallRequiredSystemLibraries) -endif() add_subdirectory(program_info) ####################################### Install layout ####################################### @@ -376,9 +372,6 @@ endif() if(NOT (UNIX AND APPLE)) # Install "portable.txt" if selected component is "portable" install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_Portable_File}" DESTINATION "." COMPONENT portable EXCLUDE_FROM_ALL) - if (MSVC) - install(FILES "${MSVC_REDIST_DIR}/vc_redist.x64.exe" DESTINATION "vc_redist/." COMPONENT portable EXCLUDE_FROM_ALL ) - endif() endif() if(UNIX AND APPLE) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 8a7d4868f..30a435866 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -43,16 +43,21 @@ configure_file(prismlauncher.manifest.in prismlauncher.manifest @ONLY) configure_file(prismlauncher.ico prismlauncher.ico COPYONLY) if(MSVC) - include(InstallRequiredSystemLibraries) - file(TO_NATIVE_PATH ${MSVC_REDIST_DIR} Native_MSVC_REDIST_DIR) - set(Launcher_MSVC_Redist_NSIS_Section "\ -Section \"Visual Studio Runtime\" - SetOutPath \"$INSTDIR\\vc_redist\" - File \"${Native_MSVC_REDIST_DIR}\\vc_redist.x64.exe\" - ExecWait \"$INSTDIR\\vc_redist\\vc_redist.x64.exe /install /passive /norestart\" - ; Delete \"$INSTDIR\\vc_redist\\vc_redist.x64.exe\" -SectionEnd\ -") + set(Launcher_MSVC_Redist_NSIS_Section [=[ +!ifdef haveNSIScurl +Section "Visual Studio Runtime" + DetailPrint 'Downloading Microsoft Visual C++ Redistributable...' + NScurl::http GET "https://aka.ms/vs/17/release/vc_redist.x64.exe" "$INSTDIR\vc_redist\vc_redist.x64.exe" /INSIST /CANCEL /Zone.Identifier /END + Pop $0 + ${If} $0 == "OK" + DetailPrint "Download successful" + ExecWait "$INSTDIR\vc_redist\vc_redist.x64.exe /install /passive /norestart\" + ${Else} + DetailPrint "Download failed with error $0" + ${EndIf} +SectionEnd +!endif +]=]) endif() configure_file(win_install.nsi.in win_install.nsi @ONLY) diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index c75e066bd..a5c38599d 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -112,6 +112,16 @@ VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "@Launcher_Copyright@" VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "@Launcher_VERSION_NAME4@" VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "@Launcher_VERSION_NAME4@" +;-------------------------------- +; Conditional comp with file exist + +!macro CompileTimeIfFileExist path define +!tempfile tmpinc +!system 'IF EXIST "${path}" echo !define ${define} > "${tmpinc}"' +!include "${tmpinc}" +!delfile "${tmpinc}" +!undef tmpinc +!macroend ;-------------------------------- ; Shell Associate Macros @@ -336,6 +346,19 @@ Section "" UninstallPrevious SectionEnd +;------------------------------------ +; include nice plugins + +; NSIScurl - curl in NSIS +; used for MSVS redist download +; extract to ../NSISPlugins/NSIScurl +; https://github.com/negrutiu/nsis-nscurl/releases/latest/download/NScurl.zip +!insertmacro CompileTimeIfFileExist "../NSISPlugins/NSIScurl/Plugins/" haveNSIScurl +!ifdef haveNSIScurl +!AddPluginDir /x86-unicode "../NSISPlugins/NSIScurl/Plugins/x86-unicode" +!AddPluginDir /x86-ansi "../NSISPlugins/NSIScurl/Plugins/x86-ansi" +!AddPluginDir /amd64-unicode "../NSISPlugins/NSIScurl/Plugins/amd64-unicode" +!endif ;------------------------------------ From c8990438165cce1d303e8754a125758fd69b8ad9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 29 Sep 2024 00:25:33 +0000 Subject: [PATCH 215/616] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/4f807e8940284ad7925ebd0a0993d2a1791acb2f?narHash=sha256-IiA3jfbR7K/B5%2B9byVi9BZGWTD4VSbWe8VLpp9B/iYk%3D' (2024-09-11) → 'github:NixOS/nixpkgs/1925c603f17fc89f4c8f6bf6f631a802ad85d784?narHash=sha256-J%2BPeFKSDV%2BpHL7ukkfpVzCOO7mBSrrpJ3svwBFABbhI%3D' (2024-09-26) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 58bc4e30f..7667a8688 100644 --- a/flake.lock +++ b/flake.lock @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1726062873, - "narHash": "sha256-IiA3jfbR7K/B5+9byVi9BZGWTD4VSbWe8VLpp9B/iYk=", + "lastModified": 1727348695, + "narHash": "sha256-J+PeFKSDV+pHL7ukkfpVzCOO7mBSrrpJ3svwBFABbhI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "4f807e8940284ad7925ebd0a0993d2a1791acb2f", + "rev": "1925c603f17fc89f4c8f6bf6f631a802ad85d784", "type": "github" }, "original": { From 732008db203d1ff6cc7c5d4957cb394d016eaf79 Mon Sep 17 00:00:00 2001 From: seth Date: Thu, 19 Sep 2024 16:27:06 -0400 Subject: [PATCH 216/616] ci: drop garnix Signed-off-by: seth --- garnix.yaml | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 garnix.yaml diff --git a/garnix.yaml b/garnix.yaml deleted file mode 100644 index a7c1b48a9..000000000 --- a/garnix.yaml +++ /dev/null @@ -1,10 +0,0 @@ -builds: - exclude: - # Currently broken on Garnix's end - - "*.x86_64-darwin.*" - include: - - "checks.x86_64-linux.*" - - "packages.x86_64-linux.*" - - "packages.aarch64-linux.*" - - "packages.x86_64-darwin.*" - - "packages.aarch64-darwin.*" From 2663ac5405cbfc3c29a38b32a755b7c7ebda0779 Mon Sep 17 00:00:00 2001 From: seth Date: Thu, 19 Sep 2024 16:34:59 -0400 Subject: [PATCH 217/616] build(nix): add debug builds This will lead to build times on par with our other CI jobs, as now we're not always building for release Signed-off-by: seth --- flake.nix | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/flake.nix b/flake.nix index 987fc0eda..d07834b4c 100644 --- a/flake.nix +++ b/flake.nix @@ -118,5 +118,24 @@ # Only output them if they're available on the current system lib.filterAttrs (_: lib.meta.availableOn pkgs.stdenv.hostPlatform) packages ); + + # We put these under legacyPackages as they are meant for CI, not end user consumption + legacyPackages = forAllSystems ( + system: + let + prismPackages = self.packages.${system}; + legacyPackages = self.legacyPackages.${system}; + in + { + prismlauncher-debug = prismPackages.prismlauncher.override { + prismlauncher-unwrapped = legacyPackages.prismlauncher-unwrapped-debug; + }; + + prismlauncher-unwrapped-debug = prismPackages.prismlauncher-unwrapped.overrideAttrs { + cmakeBuildType = "Debug"; + dontStrip = true; + }; + } + ); }; } From 5adca58337e9fe2a71f7bdd0951494ceddb34659 Mon Sep 17 00:00:00 2001 From: seth Date: Thu, 19 Sep 2024 16:44:19 -0400 Subject: [PATCH 218/616] ci: add nix job Signed-off-by: seth --- .github/workflows/build.yml | 53 +++++++++++++++++++++++++++ .github/workflows/trigger_builds.yml | 1 + .github/workflows/trigger_release.yml | 1 + 3 files changed, 55 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ccba62541..f26884c2c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,6 +39,9 @@ on: APPLE_NOTARIZE_PASSWORD: description: Password used for notarizing macOS builds required: false + CACHIX_AUTH_TOKEN: + description: Private token for authenticating against Cachix cache + required: false GPG_PRIVATE_KEY: description: Private key for AppImage signing required: false @@ -631,3 +634,53 @@ jobs: with: bundle: "Prism Launcher.flatpak" manifest-path: flatpak/org.prismlauncher.PrismLauncher.yml + + nix: + name: Nix (${{ matrix.system }}) + + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-22.04 + system: x86_64-linux + + - os: macos-13 + system: x86_64-darwin + + - os: macos-14 + system: aarch64-darwin + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v27 + + # For PRs + - name: Setup Nix Magic Cache + uses: DeterminateSystems/magic-nix-cache-action@v8 + + # For in-tree builds + - name: Setup Cachix + uses: cachix/cachix-action@v15 + with: + name: prismlauncher + authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} + + - name: Run flake checks + run: | + nix flake check --print-build-logs --show-trace + + - name: Build debug package + if: ${{ inputs.build_type == 'Debug' }} + run: | + nix build --print-build-logs .#prismlauncher-debug + + - name: Build release package + if: ${{ inputs.build_type != 'Debug' }} + run: | + nix build --print-build-logs .#prismlauncher diff --git a/.github/workflows/trigger_builds.yml b/.github/workflows/trigger_builds.yml index 9efafc8cc..0b8386d69 100644 --- a/.github/workflows/trigger_builds.yml +++ b/.github/workflows/trigger_builds.yml @@ -38,5 +38,6 @@ jobs: APPLE_NOTARIZE_APPLE_ID: ${{ secrets.APPLE_NOTARIZE_APPLE_ID }} APPLE_NOTARIZE_TEAM_ID: ${{ secrets.APPLE_NOTARIZE_TEAM_ID }} APPLE_NOTARIZE_PASSWORD: ${{ secrets.APPLE_NOTARIZE_PASSWORD }} + CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }} GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} GPG_PRIVATE_KEY_ID: ${{ secrets.GPG_PRIVATE_KEY_ID }} diff --git a/.github/workflows/trigger_release.yml b/.github/workflows/trigger_release.yml index 134281b2c..e800653e3 100644 --- a/.github/workflows/trigger_release.yml +++ b/.github/workflows/trigger_release.yml @@ -22,6 +22,7 @@ jobs: APPLE_NOTARIZE_APPLE_ID: ${{ secrets.APPLE_NOTARIZE_APPLE_ID }} APPLE_NOTARIZE_TEAM_ID: ${{ secrets.APPLE_NOTARIZE_TEAM_ID }} APPLE_NOTARIZE_PASSWORD: ${{ secrets.APPLE_NOTARIZE_PASSWORD }} + CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }} GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} GPG_PRIVATE_KEY_ID: ${{ secrets.GPG_PRIVATE_KEY_ID }} From 68bf500f7ee48f17abf2a27e942d953a9962ef55 Mon Sep 17 00:00:00 2001 From: seth Date: Thu, 19 Sep 2024 16:50:45 -0400 Subject: [PATCH 219/616] chore: add nix reformat to .git-blame-ignore-revs Signed-off-by: seth --- .git-blame-ignore-revs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 2163db45b..528b128b1 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -2,3 +2,6 @@ # tabs -> spaces bbb3b3e6f6e3c0f95873f22e6d0a4aaf350f49d9 + +# (nix) alejandra -> nixfmt +4c81d8c53d09196426568c4a31a4e752ed05397a From bf432b5514d7c9c90761a285d17afbd736e4a687 Mon Sep 17 00:00:00 2001 From: seth Date: Mon, 30 Sep 2024 16:21:07 -0400 Subject: [PATCH 220/616] chore(nix): use cachix for binary cache Signed-off-by: seth --- flake.nix | 6 ++++-- nix/README.md | 20 ++++++++------------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/flake.nix b/flake.nix index d07834b4c..f4ca782ec 100644 --- a/flake.nix +++ b/flake.nix @@ -2,8 +2,10 @@ description = "A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once (Fork of MultiMC)"; nixConfig = { - extra-substituters = [ "https://cache.garnix.io" ]; - extra-trusted-public-keys = [ "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" ]; + extra-substituters = [ "https://prismlauncher.cachix.org" ]; + extra-trusted-public-keys = [ + "prismlauncher.cachix.org-1:9/n/FGyABA2jLUVfY+DEp4hKds/rwO+SCOtbOkDzd+c=" + ]; }; inputs = { diff --git a/nix/README.md b/nix/README.md index 76cb8bf27..8bb658477 100644 --- a/nix/README.md +++ b/nix/README.md @@ -8,8 +8,8 @@ See [Package variants](#package-variants) for a list of available packages. ## Installing a development release (flake) -We use [garnix](https://garnix.io/) to build and cache our development builds. -If you want to avoid rebuilds you may add the garnix cache to your substitutors, or use `--accept-flake-config` +We use [cachix](https://cachix.org/) to cache our development and release builds. +If you want to avoid rebuilds you may add the Cachix bucket to your substitutors, or use `--accept-flake-config` to temporarily enable it when using `nix` commands. Example (NixOS): @@ -17,12 +17,10 @@ Example (NixOS): ```nix { nix.settings = { - trusted-substituters = [ - "https://cache.garnix.io" - ]; + trusted-substituters = [ "https://prismlauncher.cachix.org" ]; trusted-public-keys = [ - "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" + "prismlauncher.cachix.org-1:9/n/FGyABA2jLUVfY+DEp4hKds/rwO+SCOtbOkDzd+c=" ]; }; } @@ -137,20 +135,18 @@ nix profile install github:PrismLauncher/PrismLauncher ## Installing a development release (without flakes) -We use [garnix](https://garnix.io/) to build and cache our development builds. -If you want to avoid rebuilds you may add the garnix cache to your substitutors. +We use [Cachix](https://cachix.org/) to cache our development and release builds. +If you want to avoid rebuilds you may add the Cachix bucket to your substitutors. Example (NixOS): ```nix { nix.settings = { - trusted-substituters = [ - "https://cache.garnix.io" - ]; + trusted-substituters = [ "https://prismlauncher.cachix.org" ]; trusted-public-keys = [ - "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" + "prismlauncher.cachix.org-1:9/n/FGyABA2jLUVfY+DEp4hKds/rwO+SCOtbOkDzd+c=" ]; }; } From 988ef320193e5bfb7de600bc38f99f9ba122c379 Mon Sep 17 00:00:00 2001 From: seth Date: Mon, 30 Sep 2024 16:30:22 -0400 Subject: [PATCH 221/616] fix(nix): don't write to files in formatting check Signed-off-by: seth --- nix/checks.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix/checks.nix b/nix/checks.nix index 40a2e272f..ec219d6f8 100644 --- a/nix/checks.nix +++ b/nix/checks.nix @@ -23,7 +23,7 @@ cd ${self} echo "Running clang-format...." - clang-format -i --style='file' --Werror */**.{c,cc,cpp,h,hh,hpp} + clang-format --dry-run --style='file' --Werror */**.{c,cc,cpp,h,hh,hpp} echo "Running deadnix..." deadnix --fail From 38fa2e0cd494d400110496a35c7f112b2b801d97 Mon Sep 17 00:00:00 2001 From: seth Date: Mon, 30 Sep 2024 16:32:35 -0400 Subject: [PATCH 222/616] style: format with clang-format Signed-off-by: seth --- launcher/Application.cpp | 2 +- launcher/ui/MainWindow.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 4a66271a3..b8dcc1099 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1026,7 +1026,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) // notify user if /tmp is mounted with `noexec` (#1693) QString jvmArgs = m_settings->get("JvmArgs").toString(); - if(jvmArgs.indexOf("java.io.tmpdir") == -1) { /* java.io.tmpdir is a valid workaround, so don't annoy */ + if (jvmArgs.indexOf("java.io.tmpdir") == -1) { /* java.io.tmpdir is a valid workaround, so don't annoy */ bool is_tmp_noexec = false; #if defined(Q_OS_LINUX) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 3f0bb3281..09c47b609 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -235,7 +235,6 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi } ui->actionViewJavaFolder->setEnabled(BuildConfig.JAVA_DOWNLOADER_ENABLED); - } // add the toolbar toggles to the view menu From 79be2fc0622103b2d969044490fa179d31482f50 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 00:32:42 +0000 Subject: [PATCH 223/616] chore(deps): update cachix/install-nix-action action to v29 --- .github/workflows/build.yml | 2 +- .github/workflows/update-flake.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f26884c2c..ad77d282b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -658,7 +658,7 @@ jobs: uses: actions/checkout@v4 - name: Install Nix - uses: cachix/install-nix-action@v27 + uses: cachix/install-nix-action@v29 # For PRs - name: Setup Nix Magic Cache diff --git a/.github/workflows/update-flake.yml b/.github/workflows/update-flake.yml index ecc38ff28..0c8cfde67 100644 --- a/.github/workflows/update-flake.yml +++ b/.github/workflows/update-flake.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + - uses: cachix/install-nix-action@9f70348d77d0422624097c4b7a75563948901306 # v29 - uses: DeterminateSystems/update-flake-lock@v24 with: From 0eefa52dbcdc595f4b388ae306eae5f556f816e4 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 25 Sep 2024 15:04:31 +0300 Subject: [PATCH 224/616] fix some transtaions warnings Signed-off-by: Trial97 --- launcher/MMCZip.h | 2 ++ launcher/modplatform/flame/FlamePackExportTask.h | 1 + launcher/modplatform/modrinth/ModrinthPackExportTask.h | 1 + launcher/ui/dialogs/InstallLoaderDialog.cpp | 2 ++ launcher/ui/pages/instance/ModFolderPage.h | 2 ++ 5 files changed, 8 insertions(+) diff --git a/launcher/MMCZip.h b/launcher/MMCZip.h index 1635f8b32..d81df9d81 100644 --- a/launcher/MMCZip.h +++ b/launcher/MMCZip.h @@ -153,6 +153,7 @@ bool collectFileListRecursively(const QString& rootDir, const QString& subDir, Q #if defined(LAUNCHER_APPLICATION) class ExportToZipTask : public Task { + Q_OBJECT public: ExportToZipTask(QString outputPath, QDir dir, @@ -207,6 +208,7 @@ class ExportToZipTask : public Task { }; class ExtractZipTask : public Task { + Q_OBJECT public: ExtractZipTask(QString input, QDir outputDir, QString subdirectory = "") : ExtractZipTask(std::make_shared(input), outputDir, subdirectory) diff --git a/launcher/modplatform/flame/FlamePackExportTask.h b/launcher/modplatform/flame/FlamePackExportTask.h index 78b46e91f..b11eb17fa 100644 --- a/launcher/modplatform/flame/FlamePackExportTask.h +++ b/launcher/modplatform/flame/FlamePackExportTask.h @@ -26,6 +26,7 @@ #include "tasks/Task.h" class FlamePackExportTask : public Task { + Q_OBJECT public: FlamePackExportTask(const QString& name, const QString& version, diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.h b/launcher/modplatform/modrinth/ModrinthPackExportTask.h index 81c2f25bf..ee740a456 100644 --- a/launcher/modplatform/modrinth/ModrinthPackExportTask.h +++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.h @@ -27,6 +27,7 @@ #include "tasks/Task.h" class ModrinthPackExportTask : public Task { + Q_OBJECT public: ModrinthPackExportTask(const QString& name, const QString& version, diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp index 541119d10..8e5463b31 100644 --- a/launcher/ui/dialogs/InstallLoaderDialog.cpp +++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp @@ -31,6 +31,7 @@ #include "ui/widgets/VersionSelectWidget.h" class InstallLoaderPage : public VersionSelectWidget, public BasePage { + Q_OBJECT public: InstallLoaderPage(const QString& id, const QString& iconName, @@ -164,3 +165,4 @@ void InstallLoaderDialog::done(int result) QDialog::done(result); } +#include "InstallLoaderDialog.moc" \ No newline at end of file diff --git a/launcher/ui/pages/instance/ModFolderPage.h b/launcher/ui/pages/instance/ModFolderPage.h index 2ec2b402d..41b605991 100644 --- a/launcher/ui/pages/instance/ModFolderPage.h +++ b/launcher/ui/pages/instance/ModFolderPage.h @@ -74,6 +74,7 @@ class ModFolderPage : public ExternalResourcesPage { }; class CoreModFolderPage : public ModFolderPage { + Q_OBJECT public: explicit CoreModFolderPage(BaseInstance* inst, std::shared_ptr mods, QWidget* parent = 0); virtual ~CoreModFolderPage() = default; @@ -87,6 +88,7 @@ class CoreModFolderPage : public ModFolderPage { }; class NilModFolderPage : public ModFolderPage { + Q_OBJECT public: explicit NilModFolderPage(BaseInstance* inst, std::shared_ptr mods, QWidget* parent = 0); virtual ~NilModFolderPage() = default; From 5ea2dece54f27c812af3eb5ba697ec7aab07e04b Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 26 Sep 2024 22:59:00 +0300 Subject: [PATCH 225/616] fix search term not remaining the same between providers on resource download Signed-off-by: Trial97 --- launcher/ui/dialogs/ResourceDownloadDialog.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.cpp b/launcher/ui/dialogs/ResourceDownloadDialog.cpp index 90d3b79a9..02a8454b4 100644 --- a/launcher/ui/dialogs/ResourceDownloadDialog.cpp +++ b/launcher/ui/dialogs/ResourceDownloadDialog.cpp @@ -258,7 +258,9 @@ void ResourceDownloadDialog::selectedPageChanged(BasePage* previous, BasePage* s } // Same effect as having a global search bar - selectedPage()->setSearchTerm(prev_page->getSearchTerm()); + ResourcePage* result = dynamic_cast(selected); + Q_ASSERT(result != nullptr); + result->setSearchTerm(prev_page->getSearchTerm()); } ModDownloadDialog::ModDownloadDialog(QWidget* parent, const std::shared_ptr& mods, BaseInstance* instance) From 946e791d39a19f50d7604b1f57714f8f3a7f63cb Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 30 Sep 2024 21:50:07 +0300 Subject: [PATCH 226/616] sync modpack search field Signed-off-by: Trial97 --- launcher/CMakeLists.txt | 3 ++ launcher/ui/dialogs/NewInstanceDialog.cpp | 16 ++++++++++ launcher/ui/dialogs/NewInstanceDialog.h | 3 ++ .../modplatform/ModpackProviderBasePage.h | 29 +++++++++++++++++++ .../pages/modplatform/atlauncher/AtlPage.cpp | 10 +++++++ .../ui/pages/modplatform/atlauncher/AtlPage.h | 10 +++++-- .../ui/pages/modplatform/flame/FlamePage.cpp | 9 ++++++ .../ui/pages/modplatform/flame/FlamePage.h | 9 ++++-- .../modplatform/import_ftb/ImportFTBPage.cpp | 9 ++++++ .../modplatform/import_ftb/ImportFTBPage.h | 9 ++++-- .../ui/pages/modplatform/legacy_ftb/Page.cpp | 9 ++++++ .../ui/pages/modplatform/legacy_ftb/Page.h | 9 ++++-- .../modplatform/modrinth/ModrinthPage.cpp | 10 +++++++ .../pages/modplatform/modrinth/ModrinthPage.h | 9 ++++-- .../pages/modplatform/technic/TechnicPage.cpp | 10 +++++++ .../pages/modplatform/technic/TechnicPage.h | 9 ++++-- 16 files changed, 150 insertions(+), 13 deletions(-) create mode 100644 launcher/ui/pages/modplatform/ModpackProviderBasePage.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index bd6dfc5b6..dcbfe8fde 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -965,6 +965,9 @@ SET(LAUNCHER_SOURCES ui/pages/modplatform/ShaderPackPage.cpp ui/pages/modplatform/ShaderPackModel.cpp + + ui/pages/modplatform/ModpackProviderBasePage.h + ui/pages/modplatform/atlauncher/AtlFilterModel.cpp ui/pages/modplatform/atlauncher/AtlFilterModel.h ui/pages/modplatform/atlauncher/AtlListModel.cpp diff --git a/launcher/ui/dialogs/NewInstanceDialog.cpp b/launcher/ui/dialogs/NewInstanceDialog.cpp index 2e799d2a8..f16c50860 100644 --- a/launcher/ui/dialogs/NewInstanceDialog.cpp +++ b/launcher/ui/dialogs/NewInstanceDialog.cpp @@ -36,6 +36,7 @@ #include "NewInstanceDialog.h" #include "Application.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" #include "ui/pages/modplatform/import_ftb/ImportFTBPage.h" #include "ui_NewInstanceDialog.h" @@ -140,6 +141,8 @@ NewInstanceDialog::NewInstanceDialog(const QString& initialGroup, auto geometry = screen->availableSize(); resize(width(), qMin(geometry.height() - 50, 710)); } + + connect(m_container, &PageContainer::selectedPageChanged, this, &NewInstanceDialog::selectedPageChanged); } void NewInstanceDialog::reject() @@ -316,3 +319,16 @@ void NewInstanceDialog::importIconNow() } APPLICATION->settings()->set("NewInstanceGeometry", saveGeometry().toBase64()); } + +void NewInstanceDialog::selectedPageChanged(BasePage* previous, BasePage* selected) +{ + auto prevPage = dynamic_cast(previous); + if (prevPage) { + m_searchTerm = prevPage->getSerachTerm(); + } + + auto nextPage = dynamic_cast(selected); + if (nextPage) { + nextPage->setSearchTerm(m_searchTerm); + } +} diff --git a/launcher/ui/dialogs/NewInstanceDialog.h b/launcher/ui/dialogs/NewInstanceDialog.h index 923579567..e97c9f543 100644 --- a/launcher/ui/dialogs/NewInstanceDialog.h +++ b/launcher/ui/dialogs/NewInstanceDialog.h @@ -82,6 +82,7 @@ class NewInstanceDialog : public QDialog, public BasePageProvider { private slots: void on_iconButton_clicked(); void on_instNameTextBox_textChanged(const QString& arg1); + void selectedPageChanged(BasePage* previous, BasePage* selected); private: Ui::NewInstanceDialog* ui = nullptr; @@ -98,5 +99,7 @@ class NewInstanceDialog : public QDialog, public BasePageProvider { QString importVersion; + QString m_searchTerm; + void importIconNow(); }; diff --git a/launcher/ui/pages/modplatform/ModpackProviderBasePage.h b/launcher/ui/pages/modplatform/ModpackProviderBasePage.h new file mode 100644 index 000000000..a3daa9a81 --- /dev/null +++ b/launcher/ui/pages/modplatform/ModpackProviderBasePage.h @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "ui/pages/BasePage.h" + +class ModpackProviderBasePage : public BasePage { + public: + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) = 0; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const = 0; +}; \ No newline at end of file diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlPage.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlPage.cpp index d79b7621a..7c69b315e 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlPage.cpp +++ b/launcher/ui/pages/modplatform/atlauncher/AtlPage.cpp @@ -164,3 +164,13 @@ void AtlPage::onVersionSelectionChanged(QString version) selectedVersion = version; suggestCurrent(); } + +void AtlPage::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} + +QString AtlPage::getSerachTerm() const +{ + return ui->searchEdit->text(); +} diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlPage.h b/launcher/ui/pages/modplatform/atlauncher/AtlPage.h index 6bc449649..73460232b 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlPage.h +++ b/launcher/ui/pages/modplatform/atlauncher/AtlPage.h @@ -42,8 +42,7 @@ #include #include "Application.h" -#include "tasks/Task.h" -#include "ui/pages/BasePage.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" namespace Ui { class AtlPage; @@ -51,7 +50,7 @@ class AtlPage; class NewInstanceDialog; -class AtlPage : public QWidget, public BasePage { +class AtlPage : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -66,6 +65,11 @@ class AtlPage : public QWidget, public BasePage { void openedImpl() override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private: void suggestCurrent(); diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.cpp b/launcher/ui/pages/modplatform/flame/FlamePage.cpp index decb5de3b..4195683e7 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlamePage.cpp @@ -299,3 +299,12 @@ void FlamePage::updateUi() ui->packDescription->setHtml(StringUtils::htmlListPatch(text + current.description)); ui->packDescription->flush(); } +QString FlamePage::getSerachTerm() const +{ + return ui->searchEdit->text(); +} + +void FlamePage::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.h b/launcher/ui/pages/modplatform/flame/FlamePage.h index 7590e1a95..45a3c6b22 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.h +++ b/launcher/ui/pages/modplatform/flame/FlamePage.h @@ -40,7 +40,7 @@ #include #include #include -#include "ui/pages/BasePage.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" #include "ui/widgets/ProgressWidget.h" namespace Ui { @@ -53,7 +53,7 @@ namespace Flame { class ListModel; } -class FlamePage : public QWidget, public BasePage { +class FlamePage : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -72,6 +72,11 @@ class FlamePage : public QWidget, public BasePage { bool eventFilter(QObject* watched, QEvent* event) override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private: void suggestCurrent(); diff --git a/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.cpp b/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.cpp index db59fe10a..15303bb22 100644 --- a/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.cpp +++ b/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.cpp @@ -135,4 +135,13 @@ void ImportFTBPage::triggerSearch() currentModel->setSearchTerm(ui->searchEdit->text()); } +void ImportFTBPage::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} + +QString ImportFTBPage::getSerachTerm() const +{ + return ui->searchEdit->text(); +} } // namespace FTBImportAPP diff --git a/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.h b/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.h index 00f013f6f..7afff5a9d 100644 --- a/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.h +++ b/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.h @@ -25,7 +25,7 @@ #include #include "modplatform/import_ftb/PackHelpers.h" -#include "ui/pages/BasePage.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" #include "ui/pages/modplatform/import_ftb/ListModel.h" class NewInstanceDialog; @@ -35,7 +35,7 @@ namespace Ui { class ImportFTBPage; } -class ImportFTBPage : public QWidget, public BasePage { +class ImportFTBPage : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -49,6 +49,11 @@ class ImportFTBPage : public QWidget, public BasePage { void openedImpl() override; void retranslate() override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private: void suggestCurrent(); void onPackSelectionChanged(Modpack* pack = nullptr); diff --git a/launcher/ui/pages/modplatform/legacy_ftb/Page.cpp b/launcher/ui/pages/modplatform/legacy_ftb/Page.cpp index a587b5baf..226a30ee3 100644 --- a/launcher/ui/pages/modplatform/legacy_ftb/Page.cpp +++ b/launcher/ui/pages/modplatform/legacy_ftb/Page.cpp @@ -369,4 +369,13 @@ void Page::triggerSearch() currentModel->setSearchTerm(ui->searchEdit->text()); } +void Page::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} + +QString Page::getSerachTerm() const +{ + return ui->searchEdit->text(); +} } // namespace LegacyFTB diff --git a/launcher/ui/pages/modplatform/legacy_ftb/Page.h b/launcher/ui/pages/modplatform/legacy_ftb/Page.h index daef23342..a2dee24e9 100644 --- a/launcher/ui/pages/modplatform/legacy_ftb/Page.h +++ b/launcher/ui/pages/modplatform/legacy_ftb/Page.h @@ -43,7 +43,7 @@ #include "QObjectPtr.h" #include "modplatform/legacy_ftb/PackFetchTask.h" #include "modplatform/legacy_ftb/PackHelpers.h" -#include "ui/pages/BasePage.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" class NewInstanceDialog; @@ -57,7 +57,7 @@ class ListModel; class FilterModel; class PrivatePackManager; -class Page : public QWidget, public BasePage { +class Page : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -71,6 +71,11 @@ class Page : public QWidget, public BasePage { void openedImpl() override; void retranslate() override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private: void suggestCurrent(); void onPackSelectionChanged(Modpack* pack = nullptr); diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp index 03461d85a..a000044fa 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp @@ -351,3 +351,13 @@ void ModrinthPage::onVersionSelectionChanged(int index) selectedVersion = ui->versionSelectionBox->currentData().toString(); suggestCurrent(); } + +void ModrinthPage::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} + +QString ModrinthPage::getSerachTerm() const +{ + return ui->searchEdit->text(); +} diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h index dadaeb0a0..dd99e0d29 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h @@ -38,9 +38,9 @@ #include "Application.h" #include "ui/dialogs/NewInstanceDialog.h" -#include "ui/pages/BasePage.h" #include "modplatform/modrinth/ModrinthPackManifest.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" #include "ui/widgets/ProgressWidget.h" #include @@ -54,7 +54,7 @@ namespace Modrinth { class ModpackListModel; } -class ModrinthPage : public QWidget, public BasePage { +class ModrinthPage : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -78,6 +78,11 @@ class ModrinthPage : public QWidget, public BasePage { void openedImpl() override; bool eventFilter(QObject* watched, QEvent* event) override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private slots: void onSelectionChanged(QModelIndex first, QModelIndex second); void onVersionSelectionChanged(int index); diff --git a/launcher/ui/pages/modplatform/technic/TechnicPage.cpp b/launcher/ui/pages/modplatform/technic/TechnicPage.cpp index a8f06619f..50d267b1f 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicPage.cpp +++ b/launcher/ui/pages/modplatform/technic/TechnicPage.cpp @@ -342,3 +342,13 @@ void TechnicPage::onVersionSelectionChanged(QString version) selectedVersion = version; selectVersion(); } + +void TechnicPage::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} + +QString TechnicPage::getSerachTerm() const +{ + return ui->searchEdit->text(); +} diff --git a/launcher/ui/pages/modplatform/technic/TechnicPage.h b/launcher/ui/pages/modplatform/technic/TechnicPage.h index 01439337d..d1f691b22 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicPage.h +++ b/launcher/ui/pages/modplatform/technic/TechnicPage.h @@ -41,7 +41,7 @@ #include #include "TechnicData.h" #include "net/NetJob.h" -#include "ui/pages/BasePage.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" #include "ui/widgets/ProgressWidget.h" namespace Ui { @@ -54,7 +54,7 @@ namespace Technic { class ListModel; } -class TechnicPage : public QWidget, public BasePage { +class TechnicPage : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -71,6 +71,11 @@ class TechnicPage : public QWidget, public BasePage { bool eventFilter(QObject* watched, QEvent* event) override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private: void suggestCurrent(); void metadataLoaded(); From dfe3cd849def92682c45610e65bde3f6f5344a39 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 2 Oct 2024 01:06:45 +0300 Subject: [PATCH 227/616] add curseforge modpack filter Signed-off-by: Trial97 --- launcher/modplatform/ModIndex.h | 2 +- launcher/modplatform/flame/FlameAPI.cpp | 10 ++- launcher/modplatform/flame/FlameAPI.h | 17 +++-- launcher/modplatform/flame/FlamePackIndex.cpp | 22 +++++- launcher/modplatform/flame/FlamePackIndex.h | 1 + launcher/modplatform/modrinth/ModrinthAPI.cpp | 11 ++- launcher/modplatform/modrinth/ModrinthAPI.h | 1 + .../ui/pages/modplatform/flame/FlameModel.cpp | 27 +++---- .../ui/pages/modplatform/flame/FlameModel.h | 4 +- .../ui/pages/modplatform/flame/FlamePage.cpp | 65 +++++++++++++++- .../ui/pages/modplatform/flame/FlamePage.h | 5 ++ .../ui/pages/modplatform/flame/FlamePage.ui | 69 ++++++++++------- .../modplatform/flame/FlameResourcePages.cpp | 6 +- .../modplatform/flame/FlameResourcePages.h | 3 + launcher/ui/widgets/ModFilterWidget.cpp | 74 +++++++++++++++---- 15 files changed, 242 insertions(+), 75 deletions(-) diff --git a/launcher/modplatform/ModIndex.h b/launcher/modplatform/ModIndex.h index e3fe69e0c..d5ee12473 100644 --- a/launcher/modplatform/ModIndex.h +++ b/launcher/modplatform/ModIndex.h @@ -35,7 +35,7 @@ Q_DECLARE_FLAGS(ModLoaderTypes, ModLoaderType) enum class ResourceProvider { MODRINTH, FLAME }; -enum class ResourceType { MOD, RESOURCE_PACK, SHADER_PACK }; +enum class ResourceType { MOD, RESOURCE_PACK, SHADER_PACK, MODPACK }; enum class DependencyType { REQUIRED, OPTIONAL, INCOMPATIBLE, EMBEDDED, TOOL, INCLUDE, UNKNOWN }; diff --git a/launcher/modplatform/flame/FlameAPI.cpp b/launcher/modplatform/flame/FlameAPI.cpp index 72437976d..ddd48c2b1 100644 --- a/launcher/modplatform/flame/FlameAPI.cpp +++ b/launcher/modplatform/flame/FlameAPI.cpp @@ -221,14 +221,20 @@ QList FlameAPI::getSortingMethods() const { 8, "GameVersion", QObject::tr("Sort by Game Version") } }; } -Task::Ptr FlameAPI::getModCategories(std::shared_ptr response) +Task::Ptr FlameAPI::getCategories(std::shared_ptr response, ModPlatform::ResourceType type) { auto netJob = makeShared(QString("Flame::GetCategories"), APPLICATION->network()); - netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl("https://api.curseforge.com/v1/categories?gameId=432&classId=6"), response)); + netJob->addNetAction(Net::ApiDownload::makeByteArray( + QUrl(QString("https://api.curseforge.com/v1/categories?gameId=432&classId=%1").arg(getClassId(type))), response)); QObject::connect(netJob.get(), &Task::failed, [](QString msg) { qDebug() << "Flame failed to get categories:" << msg; }); return netJob; } +Task::Ptr FlameAPI::getModCategories(std::shared_ptr response) +{ + return getCategories(response, ModPlatform::ResourceType::MOD); +} + QList FlameAPI::loadModCategories(std::shared_ptr response) { QList categories; diff --git a/launcher/modplatform/flame/FlameAPI.h b/launcher/modplatform/flame/FlameAPI.h index 1160151c5..c66ece8a3 100644 --- a/launcher/modplatform/flame/FlameAPI.h +++ b/launcher/modplatform/flame/FlameAPI.h @@ -25,6 +25,7 @@ class FlameAPI : public NetworkResourceAPI { Task::Ptr getFiles(const QStringList& fileIds, std::shared_ptr response) const; Task::Ptr getFile(const QString& addonId, const QString& fileId, std::shared_ptr response) const; + static Task::Ptr getCategories(std::shared_ptr response, ModPlatform::ResourceType type); static Task::Ptr getModCategories(std::shared_ptr response); static QList loadModCategories(std::shared_ptr response); @@ -46,6 +47,8 @@ class FlameAPI : public NetworkResourceAPI { return 12; case ModPlatform::ResourceType::SHADER_PACK: return 6552; + case ModPlatform::ResourceType::MODPACK: + return 4471; } } @@ -82,8 +85,8 @@ class FlameAPI : public NetworkResourceAPI { static const QString getModLoaderFilters(ModPlatform::ModLoaderTypes types) { return "[" + getModLoaderStrings(types).join(',') + "]"; } - private: - [[nodiscard]] std::optional getSearchURL(SearchArgs const& args) const override + public: + static std::optional getStaticSearchURL(SearchArgs const& args) { auto gameVersionStr = args.versions.has_value() ? QString("gameVersion=%1").arg(args.versions.value().front().toString()) : QString(); @@ -105,12 +108,14 @@ class FlameAPI : public NetworkResourceAPI { get_arguments.append(gameVersionStr); return "https://api.curseforge.com/v1/mods/search?gameId=432&" + get_arguments.join('&'); - }; + } + [[nodiscard]] std::optional getSearchURL(SearchArgs const& args) const override { return getStaticSearchURL(args); } + private: [[nodiscard]] std::optional getInfoURL(QString const& id) const override { return QString("https://api.curseforge.com/v1/mods/%1").arg(id); - }; + } [[nodiscard]] std::optional getVersionsURL(VersionSearchArgs const& args) const override { @@ -125,7 +130,7 @@ class FlameAPI : public NetworkResourceAPI { url += QString("&modLoaderType=%1").arg(mappedModLoader); } return url; - }; + } [[nodiscard]] std::optional getDependencyURL(DependencySearchArgs const& args) const override { @@ -137,5 +142,5 @@ class FlameAPI : public NetworkResourceAPI { url += QString("&modLoaderType=%1").arg(mappedModLoader); } return url; - }; + } }; diff --git a/launcher/modplatform/flame/FlamePackIndex.cpp b/launcher/modplatform/flame/FlamePackIndex.cpp index ca8e0a853..8c25b0482 100644 --- a/launcher/modplatform/flame/FlamePackIndex.cpp +++ b/launcher/modplatform/flame/FlamePackIndex.cpp @@ -3,6 +3,7 @@ #include #include "Json.h" +#include "modplatform/ModIndex.h" void Flame::loadIndexedPack(Flame::IndexedPack& pack, QJsonObject& obj) { @@ -88,8 +89,27 @@ void Flame::loadIndexedPackVersions(Flame::IndexedPack& pack, QJsonArray& arr) continue; } + for (auto mcVer : versionArray) { + auto str = mcVer.toString(); + + if (str.contains('.')) + file.mcVersion.append(str); + + if (auto loader = str.toLower(); loader == "neoforge") + file.loaders |= ModPlatform::NeoForge; + else if (loader == "forge") + file.loaders |= ModPlatform::Forge; + else if (loader == "cauldron") + file.loaders |= ModPlatform::Cauldron; + else if (loader == "liteloader") + file.loaders |= ModPlatform::LiteLoader; + else if (loader == "fabric") + file.loaders |= ModPlatform::Fabric; + else if (loader == "quilt") + file.loaders |= ModPlatform::Quilt; + } + // pick the latest version supported - file.mcVersion = versionArray[0].toString(); file.version = Json::requireString(version, "displayName"); ModPlatform::IndexedVersionType::VersionType ver_type; diff --git a/launcher/modplatform/flame/FlamePackIndex.h b/launcher/modplatform/flame/FlamePackIndex.h index b2a12a67f..11633deee 100644 --- a/launcher/modplatform/flame/FlamePackIndex.h +++ b/launcher/modplatform/flame/FlamePackIndex.h @@ -18,6 +18,7 @@ struct IndexedVersion { int fileId; QString version; ModPlatform::IndexedVersionType version_type; + ModPlatform::ModLoaderTypes loaders = {}; QString mcVersion; QString downloadUrl; }; diff --git a/launcher/modplatform/modrinth/ModrinthAPI.cpp b/launcher/modplatform/modrinth/ModrinthAPI.cpp index 4798ace84..323711e02 100644 --- a/launcher/modplatform/modrinth/ModrinthAPI.cpp +++ b/launcher/modplatform/modrinth/ModrinthAPI.cpp @@ -129,7 +129,7 @@ Task::Ptr ModrinthAPI::getModCategories(std::shared_ptr response) return netJob; } -QList ModrinthAPI::loadModCategories(std::shared_ptr response) +QList ModrinthAPI::loadCategories(std::shared_ptr response, QString projectType) { QList categories; QJsonParseError parse_error{}; @@ -147,7 +147,7 @@ QList ModrinthAPI::loadModCategories(std::shared_ptr ModrinthAPI::loadModCategories(std::shared_ptr ModrinthAPI::loadModCategories(std::shared_ptr response) +{ + return loadCategories(response, "mod"); +}; diff --git a/launcher/modplatform/modrinth/ModrinthAPI.h b/launcher/modplatform/modrinth/ModrinthAPI.h index d1f8f712a..07be06756 100644 --- a/launcher/modplatform/modrinth/ModrinthAPI.h +++ b/launcher/modplatform/modrinth/ModrinthAPI.h @@ -31,6 +31,7 @@ class ModrinthAPI : public NetworkResourceAPI { Task::Ptr getProjects(QStringList addonIds, std::shared_ptr response) const override; static Task::Ptr getModCategories(std::shared_ptr response); + static QList loadCategories(std::shared_ptr response, QString projectType); static QList loadModCategories(std::shared_ptr response); public: diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.cpp b/launcher/ui/pages/modplatform/flame/FlameModel.cpp index a92d5b579..8383b756f 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModel.cpp @@ -1,6 +1,7 @@ #include "FlameModel.h" #include #include "Application.h" +#include "modplatform/ModIndex.h" #include "modplatform/ResourceAPI.h" #include "modplatform/flame/FlameAPI.h" #include "ui/widgets/ProjectItem.h" @@ -183,34 +184,28 @@ void ListModel::performPaginatedSearch() return; } } - auto netJob = makeShared("Flame::Search", APPLICATION->network()); - auto searchUrl = QString( - "https://api.curseforge.com/v1/mods/search?" - "gameId=432&" - "classId=4471&" - "index=%1&" - "pageSize=25&" - "searchFilter=%2&" - "sortField=%3&" - "sortOrder=desc") - .arg(nextSearchOffset) - .arg(currentSearchTerm) - .arg(currentSort + 1); + ResourceAPI::SortingMethod sort{}; + sort.index = currentSort + 1; - netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl), response)); + auto netJob = makeShared("Flame::Search", APPLICATION->network()); + auto searchUrl = FlameAPI::getStaticSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, + m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); + + netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl.value()), response)); jobPtr = netJob; jobPtr->start(); QObject::connect(netJob.get(), &NetJob::succeeded, this, &ListModel::searchRequestFinished); QObject::connect(netJob.get(), &NetJob::failed, this, &ListModel::searchRequestFailed); } -void ListModel::searchWithTerm(const QString& term, int sort) +void ListModel::searchWithTerm(const QString& term, int sort, std::shared_ptr filter, bool filterChanged) { - if (currentSearchTerm == term && currentSearchTerm.isNull() == term.isNull() && currentSort == sort) { + if (currentSearchTerm == term && currentSearchTerm.isNull() == term.isNull() && currentSort == sort && !filterChanged) { return; } currentSearchTerm = term; currentSort = sort; + m_filter = filter; if (hasActiveSearchJob()) { jobPtr->abort(); searchState = ResetRequested; diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.h b/launcher/ui/pages/modplatform/flame/FlameModel.h index 9b6d70fec..026f6d1ee 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.h +++ b/launcher/ui/pages/modplatform/flame/FlameModel.h @@ -14,6 +14,7 @@ #include #include +#include "ui/widgets/ModFilterWidget.h" #include @@ -38,7 +39,7 @@ class ListModel : public QAbstractListModel { void fetchMore(const QModelIndex& parent) override; void getLogo(const QString& logo, const QString& logoUrl, LogoCallback callback); - void searchWithTerm(const QString& term, int sort); + void searchWithTerm(const QString& term, int sort, std::shared_ptr filter, bool filterChanged); [[nodiscard]] bool hasActiveSearchJob() const { return jobPtr && jobPtr->isRunning(); } [[nodiscard]] Task::Ptr activeSearchJob() { return hasActiveSearchJob() ? jobPtr : nullptr; } @@ -65,6 +66,7 @@ class ListModel : public QAbstractListModel { QString currentSearchTerm; int currentSort = 0; + std::shared_ptr m_filter; int nextSearchOffset = 0; enum SearchState { None, CanPossiblyFetchMore, ResetRequested, Finished } searchState = None; Task::Ptr jobPtr; diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.cpp b/launcher/ui/pages/modplatform/flame/FlamePage.cpp index 4195683e7..62798f4bc 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlamePage.cpp @@ -34,10 +34,13 @@ */ #include "FlamePage.h" +#include "modplatform/flame/FlamePackIndex.h" #include "ui/dialogs/CustomMessageBox.h" +#include "ui/widgets/ModFilterWidget.h" #include "ui_FlamePage.h" #include +#include #include "Application.h" #include "FlameModel.h" @@ -88,6 +91,7 @@ FlamePage::FlamePage(NewInstanceDialog* dialog, QWidget* parent) ui->packView->setItemDelegate(new ProjectItemDelegate(this)); ui->packDescription->setMetaEntry("FlamePacks"); + createFilterWidget(); } FlamePage::~FlamePage() @@ -131,10 +135,35 @@ void FlamePage::openedImpl() void FlamePage::triggerSearch() { - listModel->searchWithTerm(ui->searchEdit->text(), ui->sortByBox->currentIndex()); + ui->packView->selectionModel()->setCurrentIndex({}, QItemSelectionModel::SelectionFlag::ClearAndSelect); + ui->packView->clearSelection(); + ui->packDescription->clear(); + ui->versionSelectionBox->clear(); + listModel->searchWithTerm(ui->searchEdit->text(), ui->sortByBox->currentIndex(), m_filterWidget->getFilter(), + m_filterWidget->changed()); m_fetch_progress.watch(listModel->activeSearchJob().get()); } +bool checkMcVersions(std::list filter, QString value) +{ + for (auto mcVersion : filter) { + if (value == mcVersion.toString()) { + return true; + } + } + return filter.empty(); +} + +bool checkVersionFilters(const Flame::IndexedVersion& v, std::shared_ptr filter) +{ + if (!filter) + return true; + return ((!filter->loaders || !v.loaders || filter->loaders & v.loaders) && // loaders + (filter->releases.empty() || // releases + std::find(filter->releases.cbegin(), filter->releases.cend(), v.version_type) != filter->releases.cend()) && + checkMcVersions(filter->versions, v.mcVersion)); // mcVersions} +} + void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelIndex prev) { ui->versionSelectionBox->clear(); @@ -148,7 +177,7 @@ void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelInde current = listModel->data(curr, Qt::UserRole).value(); - if (current.versionsLoaded == false) { + if (!current.versionsLoaded || m_filterWidget->changed()) { qDebug() << "Loading flame modpack versions"; auto netJob = new NetJob(QString("Flame::PackVersions(%1)").arg(current.name), APPLICATION->network()); auto response = std::make_shared(); @@ -176,6 +205,16 @@ void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelInde qWarning() << "Error while reading flame modpack version: " << e.cause(); } + auto pred = [this](const Flame::IndexedVersion& v) { return !checkVersionFilters(v, m_filterWidget->getFilter()); }; +#if QT_VERSION >= QT_VERSION_CHECK(6, 1, 0) + current.versions.removeIf(pred); +#else + for (auto it = current.versions.begin(); it != current.versions.end();) + if (pred(*it)) + it = current.versions.erase(it); + else + ++it; +#endif for (auto version : current.versions) { auto release_type = version.version_type.isValid() ? QString(" [%1]").arg(version.version_type.toString()) : ""; auto mcVersion = !version.mcVersion.isEmpty() && !version.version.contains(version.mcVersion) @@ -308,3 +347,25 @@ void FlamePage::setSearchTerm(QString term) { ui->searchEdit->setText(term); } + +void FlamePage::createFilterWidget() +{ + auto widget = ModFilterWidget::create(nullptr, false, this); + m_filterWidget.swap(widget); + auto old = ui->splitter->replaceWidget(0, m_filterWidget.get()); + // because we replaced the widget we also need to delete it + if (old) { + delete old; + } + + connect(ui->filterButton, &QPushButton::clicked, this, [this] { m_filterWidget->setHidden(!m_filterWidget->isHidden()); }); + + connect(m_filterWidget.get(), &ModFilterWidget::filterChanged, this, &FlamePage::triggerSearch); + auto response = std::make_shared(); + m_categoriesTask = FlameAPI::getCategories(response, ModPlatform::ResourceType::MODPACK); + QObject::connect(m_categoriesTask.get(), &Task::succeeded, [this, response]() { + auto categories = FlameAPI::loadModCategories(response); + m_filterWidget->setCategories(categories); + }); + m_categoriesTask->start(); +} diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.h b/launcher/ui/pages/modplatform/flame/FlamePage.h index 45a3c6b22..27c96d2f1 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.h +++ b/launcher/ui/pages/modplatform/flame/FlamePage.h @@ -41,6 +41,7 @@ #include #include #include "ui/pages/modplatform/ModpackProviderBasePage.h" +#include "ui/widgets/ModFilterWidget.h" #include "ui/widgets/ProgressWidget.h" namespace Ui { @@ -84,6 +85,7 @@ class FlamePage : public QWidget, public ModpackProviderBasePage { void triggerSearch(); void onSelectionChanged(QModelIndex first, QModelIndex second); void onVersionSelectionChanged(int index); + void createFilterWidget(); private: Ui::FlamePage* ui = nullptr; @@ -97,4 +99,7 @@ class FlamePage : public QWidget, public ModpackProviderBasePage { // Used to do instant searching with a delay to cache quick changes QTimer m_search_timer; + + unique_qobject_ptr m_filterWidget; + Task::Ptr m_categoriesTask; }; diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.ui b/launcher/ui/pages/modplatform/flame/FlamePage.ui index d4ddb37a4..b028e7569 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.ui +++ b/launcher/ui/pages/modplatform/flame/FlamePage.ui @@ -30,42 +30,59 @@ - - - Search and filter... - - - - - + - - - Qt::ScrollBarAlwaysOff - - - true - - - - 48 - 48 - + + + Search and filter... - - - true - - - true + + + Filter + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + Qt::ScrollBarAlwaysOff + + + true + + + + 48 + 48 + + + + + + true + + + true + + + + diff --git a/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp b/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp index 62c22902e..ce8c03fa1 100644 --- a/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp @@ -215,11 +215,11 @@ unique_qobject_ptr FlameModPage::createFilterWidget() void FlameModPage::prepareProviderCategories() { auto response = std::make_shared(); - auto task = FlameAPI::getModCategories(response); - QObject::connect(task.get(), &Task::succeeded, [this, response]() { + m_categoriesTask = FlameAPI::getModCategories(response); + QObject::connect(m_categoriesTask.get(), &Task::succeeded, [this, response]() { auto categories = FlameAPI::loadModCategories(response); m_filter_widget->setCategories(categories); }); - task->start(); + m_categoriesTask->start(); }; } // namespace ResourceDownload diff --git a/launcher/ui/pages/modplatform/flame/FlameResourcePages.h b/launcher/ui/pages/modplatform/flame/FlameResourcePages.h index 6eef3e435..052706549 100644 --- a/launcher/ui/pages/modplatform/flame/FlameResourcePages.h +++ b/launcher/ui/pages/modplatform/flame/FlameResourcePages.h @@ -100,6 +100,9 @@ class FlameModPage : public ModPage { protected: virtual void prepareProviderCategories() override; + + private: + Task::Ptr m_categoriesTask; }; class FlameResourcePackPage : public ResourcePackResourcePage { diff --git a/launcher/ui/widgets/ModFilterWidget.cpp b/launcher/ui/widgets/ModFilterWidget.cpp index bbb91eac2..a048dbe10 100644 --- a/launcher/ui/widgets/ModFilterWidget.cpp +++ b/launcher/ui/widgets/ModFilterWidget.cpp @@ -68,6 +68,40 @@ class VersionBasicModel : public QIdentityProxyModel { } }; +class AllVersionProxyModel : public QSortFilterProxyModel { + Q_OBJECT + + public: + AllVersionProxyModel(QObject* parent = nullptr) : QSortFilterProxyModel(parent) {} + + int rowCount(const QModelIndex& parent = QModelIndex()) const override { return QSortFilterProxyModel::rowCount(parent) + 1; } + + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override + { + if (!index.isValid()) { + return {}; + } + + if (index.row() == 0) { + if (role == Qt::DisplayRole) { + return tr("All Versions"); + } + return {}; + } + + QModelIndex newIndex = QSortFilterProxyModel::index(index.row() - 1, index.column()); + return QSortFilterProxyModel::data(newIndex, role); + } + + Qt::ItemFlags flags(const QModelIndex& index) const override + { + if (index.row() == 0) { + return Qt::ItemIsSelectable | Qt::ItemIsEnabled; + } + return QSortFilterProxyModel::flags(index); + } +}; + ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended, QWidget* parent) : QTabWidget(parent), ui(new Ui::ModFilterWidget), m_instance(instance), m_filter(new Filter()) { @@ -76,9 +110,15 @@ ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended, QWi m_versions_proxy = new VersionProxyModel(this); m_versions_proxy->setFilter(BaseVersionList::TypeRole, new ExactFilter("release")); - auto proxy = new VersionBasicModel(this); + QAbstractProxyModel* proxy = new VersionBasicModel(this); proxy->setSourceModel(m_versions_proxy); + if (!m_instance && !extended) { + auto allVersions = new AllVersionProxyModel(this); + allVersions->setSourceModel(proxy); + proxy = allVersions; + } + if (extended) { ui->versions->setSourceModel(proxy); ui->versions->setSeparator(", "); @@ -162,18 +202,22 @@ void ModFilterWidget::loadVersionList() void ModFilterWidget::prepareBasicFilter() { - m_filter->hideInstalled = false; - m_filter->side = ""; // or "both" - auto loaders = m_instance->getPackProfile()->getSupportedModLoaders().value(); - ui->neoForge->setChecked(loaders & ModPlatform::NeoForge); - ui->forge->setChecked(loaders & ModPlatform::Forge); - ui->fabric->setChecked(loaders & ModPlatform::Fabric); - ui->quilt->setChecked(loaders & ModPlatform::Quilt); - m_filter->loaders = loaders; - auto def = m_instance->getPackProfile()->getComponentVersion("net.minecraft"); - m_filter->versions.emplace_front(def); - ui->versions->setCheckedItems({ def }); - ui->version->setCurrentIndex(ui->version->findText(def)); + if (m_instance) { + m_filter->hideInstalled = false; + m_filter->side = ""; // or "both" + auto loaders = m_instance->getPackProfile()->getSupportedModLoaders().value(); + ui->neoForge->setChecked(loaders & ModPlatform::NeoForge); + ui->forge->setChecked(loaders & ModPlatform::Forge); + ui->fabric->setChecked(loaders & ModPlatform::Fabric); + ui->quilt->setChecked(loaders & ModPlatform::Quilt); + m_filter->loaders = loaders; + auto def = m_instance->getPackProfile()->getComponentVersion("net.minecraft"); + m_filter->versions.emplace_front(def); + ui->versions->setCheckedItems({ def }); + ui->version->setCurrentIndex(ui->version->findText(def)); + } else { + ui->hideInstalled->hide(); + } } void ModFilterWidget::onShowAllVersionsChanged() @@ -249,7 +293,9 @@ void ModFilterWidget::onHideInstalledFilterChanged() void ModFilterWidget::onVersionFilterTextChanged(const QString& version) { m_filter->versions.clear(); - m_filter->versions.emplace_back(version); + if (version != tr("All Versions")) { + m_filter->versions.emplace_back(version); + } m_filter_changed = true; emit filterChanged(); } From 010678da53c864f08b0f900265aacdca256a4dd8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:46:28 +0000 Subject: [PATCH 228/616] chore(deps): update cachix/install-nix-action action to v30 --- .github/workflows/build.yml | 2 +- .github/workflows/update-flake.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ad77d282b..f578839fb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -658,7 +658,7 @@ jobs: uses: actions/checkout@v4 - name: Install Nix - uses: cachix/install-nix-action@v29 + uses: cachix/install-nix-action@v30 # For PRs - name: Setup Nix Magic Cache diff --git a/.github/workflows/update-flake.yml b/.github/workflows/update-flake.yml index 0c8cfde67..5e978f356 100644 --- a/.github/workflows/update-flake.yml +++ b/.github/workflows/update-flake.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@9f70348d77d0422624097c4b7a75563948901306 # v29 + - uses: cachix/install-nix-action@08dcb3a5e62fa31e2da3d490afc4176ef55ecd72 # v30 - uses: DeterminateSystems/update-flake-lock@v24 with: From bcb1d456d4773f985d3b18d42382400a2c8148e7 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 3 Oct 2024 21:56:19 -0700 Subject: [PATCH 229/616] fix: version NSCurl plugin in workflow, detect and use arm64 vc_redist for arm64 Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 13 +++++++++++-- program_info/CMakeLists.txt | 12 +++++++++--- program_info/win_install.nsi.in | 14 +++++++------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7345ffe90..16c9290f2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -81,6 +81,8 @@ jobs: qt_arch: "" qt_version: "6.7.2" qt_modules: "qt5compat qtimageformats qtnetworkauth" + nscurl_tag: "v24.9.26.122" + nscurl_sha256: "AEE6C4BE3CB6455858E9C1EE4B3AFE0DB9960FA03FE99CCDEDC28390D57CCBB0" - os: windows-2022 name: "Windows-MSVC-arm64" @@ -92,6 +94,8 @@ jobs: qt_arch: "win64_msvc2019_arm64" qt_version: "6.7.2" qt_modules: "qt5compat qtimageformats qtnetworkauth" + nscurl_tag: "v24.9.26.122" + nscurl_sha256: "AEE6C4BE3CB6455858E9C1EE4B3AFE0DB9960FA03FE99CCDEDC28390D57CCBB0" - os: macos-14 name: macOS @@ -472,8 +476,13 @@ jobs: if: runner.os == 'Windows' run: | New-Item -Name NSISPlugins -ItemType Directory - Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/latest/download/NScurl.zip -OutFile NSISPlugins\NScurl.zip - Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NSIScurl + Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/download/${{ matrix.nscurl_tag }}/NScurl.zip -OutFile NSISPlugins\NScurl.zip + $nscurl_hash = Get-FileHash NSISPlugins\NScurl.zip -Algorithm Sha256 | Select-Object -ExpandProperty Hash + if ( $nscurl_hash -ne "${{ matrix.nscurl_sha256 }}") { + echo "::error:: NSCurl.zib sha256 mismatch" + exit 1 + } + Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NScurl cd ${{ env.INSTALL_DIR }} makensis -NOCD "${{ github.workspace }}/${{ env.BUILD_DIR }}/program_info/win_install.nsi" diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 30a435866..8fb6f68aa 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -44,14 +44,20 @@ configure_file(prismlauncher.ico prismlauncher.ico COPYONLY) if(MSVC) set(Launcher_MSVC_Redist_NSIS_Section [=[ -!ifdef haveNSIScurl +!ifdef haveNScurl Section "Visual Studio Runtime" + Var /GLOBAL vc_redist_exe + ${If} ${IsNativeARM64} + StrCpy $vc_redist_exe "vc_redist.arm64.exe" + ${Else} + StrCpy $vc_redist_exe "vc_redist.x64.exe" + ${EndIf} DetailPrint 'Downloading Microsoft Visual C++ Redistributable...' - NScurl::http GET "https://aka.ms/vs/17/release/vc_redist.x64.exe" "$INSTDIR\vc_redist\vc_redist.x64.exe" /INSIST /CANCEL /Zone.Identifier /END + NScurl::http GET "https://aka.ms/vs/17/release/${vc_redist_exe}" "$INSTDIR\vc_redist\${vc_redist_exe}" /INSIST /CANCEL /Zone.Identifier /END Pop $0 ${If} $0 == "OK" DetailPrint "Download successful" - ExecWait "$INSTDIR\vc_redist\vc_redist.x64.exe /install /passive /norestart\" + ExecWait "$INSTDIR\vc_redist\${vc_redist_exe} /install /passive /norestart\" ${Else} DetailPrint "Download failed with error $0" ${EndIf} diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index a5c38599d..c0e2b892f 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -349,15 +349,15 @@ SectionEnd ;------------------------------------ ; include nice plugins -; NSIScurl - curl in NSIS +; NScurl - curl in NSIS ; used for MSVS redist download -; extract to ../NSISPlugins/NSIScurl +; extract to ../NSISPlugins/NScurl ; https://github.com/negrutiu/nsis-nscurl/releases/latest/download/NScurl.zip -!insertmacro CompileTimeIfFileExist "../NSISPlugins/NSIScurl/Plugins/" haveNSIScurl -!ifdef haveNSIScurl -!AddPluginDir /x86-unicode "../NSISPlugins/NSIScurl/Plugins/x86-unicode" -!AddPluginDir /x86-ansi "../NSISPlugins/NSIScurl/Plugins/x86-ansi" -!AddPluginDir /amd64-unicode "../NSISPlugins/NSIScurl/Plugins/amd64-unicode" +!insertmacro CompileTimeIfFileExist "../NSISPlugins/NScurl/Plugins/" haveNScurl +!ifdef haveNScurl +!AddPluginDir /x86-unicode "../NSISPlugins/NScurl/Plugins/x86-unicode" +!AddPluginDir /x86-ansi "../NSISPlugins/NScurl/Plugins/x86-ansi" +!AddPluginDir /amd64-unicode "../NSISPlugins/NScurl/Plugins/amd64-unicode" !endif ;------------------------------------ From 63172540fb467386864ae22356999451dd2ebe08 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 3 Oct 2024 22:38:30 -0700 Subject: [PATCH 230/616] fix: nisi needs `!include` "x64.nsh" now. also, there were some broken varible Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- program_info/CMakeLists.txt | 4 ++-- program_info/win_install.nsi.in | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 8fb6f68aa..ee2e336b1 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -53,11 +53,11 @@ Section "Visual Studio Runtime" StrCpy $vc_redist_exe "vc_redist.x64.exe" ${EndIf} DetailPrint 'Downloading Microsoft Visual C++ Redistributable...' - NScurl::http GET "https://aka.ms/vs/17/release/${vc_redist_exe}" "$INSTDIR\vc_redist\${vc_redist_exe}" /INSIST /CANCEL /Zone.Identifier /END + NScurl::http GET "https://aka.ms/vs/17/release/$vc_redist_exe" "$INSTDIR\vc_redist\$vc_redist_exe" /INSIST /CANCEL /Zone.Identifier /END Pop $0 ${If} $0 == "OK" DetailPrint "Download successful" - ExecWait "$INSTDIR\vc_redist\${vc_redist_exe} /install /passive /norestart\" + ExecWait "$INSTDIR\vc_redist\$vc_redist_exe /install /passive /norestart\" ${Else} DetailPrint "Download failed with error $0" ${EndIf} diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index c0e2b892f..24f6ee4e8 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -2,6 +2,8 @@ !include "LogicLib.nsh" !include "MUI2.nsh" +!include "x64.nsh" + Unicode true Name "@Launcher_DisplayName@" @@ -185,7 +187,7 @@ VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "@Launcher_VERSION_NAME4@ !macroend -!macro APP_UNASSOCIATE EXT APP_ID +!macro APP_UNASSOCIATE EXT APP_ID APP_EXE # Unregister file type ClearErrors @@ -489,8 +491,8 @@ Section -un.ShellAssoc !insertmacro APP_TEARDOWN_DEFAULT `${APPID}` `${APPNAME}` `${APPEXE}` - !insertmacro APP_UNASSOCIATE ".zip" `${APPID}` - !insertmacro APP_UNASSOCIATE ".mrpack" `${APPID}` + !insertmacro APP_UNASSOCIATE ".zip" `${APPID}` `${APPEXE}` + !insertmacro APP_UNASSOCIATE ".mrpack" `${APPID}` `${APPEXE}` !insertmacro NotifyShell_AssocChanged SectionEnd From 023aa18e852ab1b570b378609edee1e7bbcd1588 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 3 Oct 2024 23:14:29 -0700 Subject: [PATCH 231/616] ci: NSCurl only needed on MSVC Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 16c9290f2..4063df355 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -475,14 +475,16 @@ jobs: - name: Package (Windows, installer) if: runner.os == 'Windows' run: | - New-Item -Name NSISPlugins -ItemType Directory - Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/download/${{ matrix.nscurl_tag }}/NScurl.zip -OutFile NSISPlugins\NScurl.zip - $nscurl_hash = Get-FileHash NSISPlugins\NScurl.zip -Algorithm Sha256 | Select-Object -ExpandProperty Hash - if ( $nscurl_hash -ne "${{ matrix.nscurl_sha256 }}") { - echo "::error:: NSCurl.zib sha256 mismatch" - exit 1 + if ('${{ matrix.nscurl_tag }}') { + New-Item -Name NSISPlugins -ItemType Directory + Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/download/${{ matrix.nscurl_tag }}/NScurl.zip -OutFile NSISPlugins\NScurl.zip + $nscurl_hash = Get-FileHash NSISPlugins\NScurl.zip -Algorithm Sha256 | Select-Object -ExpandProperty Hash + if ( $nscurl_hash -ne "${{ matrix.nscurl_sha256 }}") { + echo "::error:: NSCurl.zib sha256 mismatch" + exit 1 + } + Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NScurl } - Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NScurl cd ${{ env.INSTALL_DIR }} makensis -NOCD "${{ github.workspace }}/${{ env.BUILD_DIR }}/program_info/win_install.nsi" From a61c93bedefced10b59c310daa567e31cb30f967 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 4 Oct 2024 07:06:19 -0700 Subject: [PATCH 232/616] Update .github/workflows/build.yml Co-authored-by: Sefa Eyeoglu Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4063df355..98caa901d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -480,7 +480,7 @@ jobs: Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/download/${{ matrix.nscurl_tag }}/NScurl.zip -OutFile NSISPlugins\NScurl.zip $nscurl_hash = Get-FileHash NSISPlugins\NScurl.zip -Algorithm Sha256 | Select-Object -ExpandProperty Hash if ( $nscurl_hash -ne "${{ matrix.nscurl_sha256 }}") { - echo "::error:: NSCurl.zib sha256 mismatch" + echo "::error:: NSCurl.zip sha256 mismatch" exit 1 } Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NScurl From 859fac604bf698755e73083625c75969b59c5e8a Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 4 Oct 2024 17:06:47 +0300 Subject: [PATCH 233/616] add modrinth modpack filter Signed-off-by: Trial97 --- launcher/Version.cpp | 15 +++- launcher/Version.h | 2 + launcher/modplatform/flame/FlameAPI.h | 8 +-- launcher/modplatform/modrinth/ModrinthAPI.h | 19 +++-- .../modrinth/ModrinthPackManifest.cpp | 15 ++++ .../modrinth/ModrinthPackManifest.h | 1 + launcher/ui/pages/modplatform/ModModel.cpp | 12 ---- .../ui/pages/modplatform/flame/FlamePage.cpp | 13 +--- .../modplatform/modrinth/ModrinthModel.cpp | 41 +++++------ .../modplatform/modrinth/ModrinthModel.h | 5 +- .../modplatform/modrinth/ModrinthPage.cpp | 53 +++++++++++++- .../pages/modplatform/modrinth/ModrinthPage.h | 5 ++ .../modplatform/modrinth/ModrinthPage.ui | 69 ++++++++++++------- 13 files changed, 170 insertions(+), 88 deletions(-) diff --git a/launcher/Version.cpp b/launcher/Version.cpp index 511aa9c35..e43d9d3f7 100644 --- a/launcher/Version.cpp +++ b/launcher/Version.cpp @@ -123,8 +123,19 @@ QDebug operator<<(QDebug debug, const Version& v) first = false; } - debug.nospace() << " ]" - << " }"; + debug.nospace() << " ]" << " }"; return debug; } + +bool checkMcVersions(std::list filter, QStringList value) +{ + bool valid = false; + for (auto mcVersion : filter) { + if (value.contains(mcVersion.toString())) { + valid = true; + break; + } + } + return filter.empty() || valid; +} diff --git a/launcher/Version.h b/launcher/Version.h index b06e256aa..f596bfeba 100644 --- a/launcher/Version.h +++ b/launcher/Version.h @@ -161,3 +161,5 @@ class Version { void parse(); }; + +bool checkMcVersions(std::list filter, QStringList value); diff --git a/launcher/modplatform/flame/FlameAPI.h b/launcher/modplatform/flame/FlameAPI.h index c66ece8a3..4abaff4ea 100644 --- a/launcher/modplatform/flame/FlameAPI.h +++ b/launcher/modplatform/flame/FlameAPI.h @@ -88,9 +88,6 @@ class FlameAPI : public NetworkResourceAPI { public: static std::optional getStaticSearchURL(SearchArgs const& args) { - auto gameVersionStr = - args.versions.has_value() ? QString("gameVersion=%1").arg(args.versions.value().front().toString()) : QString(); - QStringList get_arguments; get_arguments.append(QString("classId=%1").arg(getClassId(args.type))); get_arguments.append(QString("index=%1").arg(args.offset)); @@ -100,12 +97,13 @@ class FlameAPI : public NetworkResourceAPI { if (args.sorting.has_value()) get_arguments.append(QString("sortField=%1").arg(args.sorting.value().index)); get_arguments.append("sortOrder=desc"); - if (args.loaders.has_value()) + if (args.loaders.has_value() && args.loaders.value() != 0) get_arguments.append(QString("modLoaderTypes=%1").arg(getModLoaderFilters(args.loaders.value()))); if (args.categoryIds.has_value() && !args.categoryIds->empty()) get_arguments.append(QString("categoryIds=[%1]").arg(args.categoryIds->join(","))); - get_arguments.append(gameVersionStr); + if (args.versions.has_value() && !args.versions.value().empty()) + get_arguments.append(QString("gameVersion=%1").arg(args.versions.value().front().toString())); return "https://api.curseforge.com/v1/mods/search?gameId=432&" + get_arguments.join('&'); } diff --git a/launcher/modplatform/modrinth/ModrinthAPI.h b/launcher/modplatform/modrinth/ModrinthAPI.h index 07be06756..b84d281aa 100644 --- a/launcher/modplatform/modrinth/ModrinthAPI.h +++ b/launcher/modplatform/modrinth/ModrinthAPI.h @@ -91,6 +91,8 @@ class ModrinthAPI : public NetworkResourceAPI { return "resourcepack"; case ModPlatform::ResourceType::SHADER_PACK: return "shader"; + case ModPlatform::ResourceType::MODPACK: + return "modpack"; default: qWarning() << "Invalid resource type for Modrinth API!"; break; @@ -99,13 +101,13 @@ class ModrinthAPI : public NetworkResourceAPI { return ""; } - [[nodiscard]] QString createFacets(SearchArgs const& args) const + [[nodiscard]] static QString createFacets(SearchArgs const& args) { QStringList facets_list; - if (args.loaders.has_value()) + if (args.loaders.has_value() && args.loaders.value() != 0) facets_list.append(QString("[%1]").arg(getModLoaderFilters(args.loaders.value()))); - if (args.versions.has_value()) + if (args.versions.has_value() && !args.versions.value().empty()) facets_list.append(QString("[%1]").arg(getGameVersionsArray(args.versions.value()))); if (args.side.has_value()) { auto side = getSideFilters(args.side.value()); @@ -121,9 +123,9 @@ class ModrinthAPI : public NetworkResourceAPI { } public: - [[nodiscard]] inline auto getSearchURL(SearchArgs const& args) const -> std::optional override + static std::optional getStaticSearchURL(SearchArgs const& args) { - if (args.loaders.has_value()) { + if (args.loaders.has_value() && args.loaders.value() != 0) { if (!validateModLoaders(args.loaders.value())) { qWarning() << "Modrinth - or our interface - does not support any the provided mod loaders!"; return {}; @@ -142,6 +144,11 @@ class ModrinthAPI : public NetworkResourceAPI { return BuildConfig.MODRINTH_PROD_URL + "/search?" + get_arguments.join('&'); }; + [[nodiscard]] inline auto getSearchURL(SearchArgs const& args) const -> std::optional override + { + return getStaticSearchURL(args); + } + inline auto getInfoURL(QString const& id) const -> std::optional override { return BuildConfig.MODRINTH_PROD_URL + "/project/" + id; @@ -164,7 +171,7 @@ class ModrinthAPI : public NetworkResourceAPI { .arg(BuildConfig.MODRINTH_PROD_URL, args.pack.addonId.toString(), get_arguments.isEmpty() ? "" : "?", get_arguments.join('&')); }; - auto getGameVersionsArray(std::list mcVersions) const -> QString + static QString getGameVersionsArray(std::list mcVersions) { QString s; for (auto& ver : mcVersions) { diff --git a/launcher/modplatform/modrinth/ModrinthPackManifest.cpp b/launcher/modplatform/modrinth/ModrinthPackManifest.cpp index f360df43a..c52a1743b 100644 --- a/launcher/modplatform/modrinth/ModrinthPackManifest.cpp +++ b/launcher/modplatform/modrinth/ModrinthPackManifest.cpp @@ -135,6 +135,21 @@ auto loadIndexedVersion(QJsonObject& obj) -> ModpackVersion if (!gameVersions.isEmpty()) { file.gameVersion = Json::ensureString(gameVersions[0]); } + auto loaders = Json::requireArray(obj, "loaders"); + for (auto loader : loaders) { + if (loader == "neoforge") + file.loaders |= ModPlatform::NeoForge; + else if (loader == "forge") + file.loaders |= ModPlatform::Forge; + else if (loader == "cauldron") + file.loaders |= ModPlatform::Cauldron; + else if (loader == "liteloader") + file.loaders |= ModPlatform::LiteLoader; + else if (loader == "fabric") + file.loaders |= ModPlatform::Fabric; + else if (loader == "quilt") + file.loaders |= ModPlatform::Quilt; + } file.version_type = ModPlatform::IndexedVersionType(Json::requireString(obj, "version_type")); file.changelog = Json::ensureString(obj, "changelog"); diff --git a/launcher/modplatform/modrinth/ModrinthPackManifest.h b/launcher/modplatform/modrinth/ModrinthPackManifest.h index 2bd61c5d9..2e5e2da84 100644 --- a/launcher/modplatform/modrinth/ModrinthPackManifest.h +++ b/launcher/modplatform/modrinth/ModrinthPackManifest.h @@ -87,6 +87,7 @@ struct ModpackVersion { QString gameVersion; ModPlatform::IndexedVersionType version_type; QString changelog; + ModPlatform::ModLoaderTypes loaders = {}; QString id; QString project_id; diff --git a/launcher/ui/pages/modplatform/ModModel.cpp b/launcher/ui/pages/modplatform/ModModel.cpp index e87a423fa..dfc308566 100644 --- a/launcher/ui/pages/modplatform/ModModel.cpp +++ b/launcher/ui/pages/modplatform/ModModel.cpp @@ -104,18 +104,6 @@ bool checkSide(QString filter, QString value) return filter.isEmpty() || value.isEmpty() || filter == "both" || value == "both" || filter == value; } -bool checkMcVersions(std::list filter, QStringList value) -{ - bool valid = false; - for (auto mcVersion : filter) { - if (value.contains(mcVersion.toString())) { - valid = true; - break; - } - } - return filter.empty() || valid; -} - bool ModModel::checkFilters(ModPlatform::IndexedPack::Ptr pack) { if (!m_filter) diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.cpp b/launcher/ui/pages/modplatform/flame/FlamePage.cpp index 62798f4bc..b92401988 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlamePage.cpp @@ -34,6 +34,7 @@ */ #include "FlamePage.h" +#include "Version.h" #include "modplatform/flame/FlamePackIndex.h" #include "ui/dialogs/CustomMessageBox.h" #include "ui/widgets/ModFilterWidget.h" @@ -144,16 +145,6 @@ void FlamePage::triggerSearch() m_fetch_progress.watch(listModel->activeSearchJob().get()); } -bool checkMcVersions(std::list filter, QString value) -{ - for (auto mcVersion : filter) { - if (value == mcVersion.toString()) { - return true; - } - } - return filter.empty(); -} - bool checkVersionFilters(const Flame::IndexedVersion& v, std::shared_ptr filter) { if (!filter) @@ -161,7 +152,7 @@ bool checkVersionFilters(const Flame::IndexedVersion& v, std::shared_ptrloaders || !v.loaders || filter->loaders & v.loaders) && // loaders (filter->releases.empty() || // releases std::find(filter->releases.cbegin(), filter->releases.cend(), v.version_type) != filter->releases.cend()) && - checkMcVersions(filter->versions, v.mcVersion)); // mcVersions} + checkMcVersions(filter->versions, { v.mcVersion })); // mcVersions} } void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelIndex prev) diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp index b53eea4ef..132150bd2 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp @@ -152,33 +152,26 @@ void ModpackListModel::performPaginatedSearch() return; } } // TODO: Move to standalone API - auto netJob = makeShared("Modrinth::SearchModpack", APPLICATION->network()); - auto searchAllUrl = QString(BuildConfig.MODRINTH_PROD_URL + - "/search?" - "offset=%1&" - "limit=%2&" - "query=%3&" - "index=%4&" - "facets=[[\"project_type:modpack\"]]") - .arg(nextSearchOffset) - .arg(m_modpacks_per_page) - .arg(currentSearchTerm) - .arg(currentSort); + ResourceAPI::SortingMethod sort{}; + sort.name = currentSort; + auto searchUrl = ModrinthAPI::getStaticSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, + m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); - netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchAllUrl), m_all_response)); + auto netJob = makeShared("Modrinth::SearchModpack", APPLICATION->network()); + netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl.value()), m_allResponse)); QObject::connect(netJob.get(), &NetJob::succeeded, this, [this] { - QJsonParseError parse_error_all{}; + QJsonParseError parseError{}; - QJsonDocument doc_all = QJsonDocument::fromJson(*m_all_response, &parse_error_all); - if (parse_error_all.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response from " << debugName() << " at " << parse_error_all.offset - << " reason: " << parse_error_all.errorString(); - qWarning() << *m_all_response; + QJsonDocument doc = QJsonDocument::fromJson(*m_allResponse, &parseError); + if (parseError.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response from " << debugName() << " at " << parseError.offset + << " reason: " << parseError.errorString(); + qWarning() << *m_allResponse; return; } - searchRequestFinished(doc_all); + searchRequestFinished(doc); }); QObject::connect(netJob.get(), &NetJob::failed, this, &ModpackListModel::searchRequestFailed); @@ -220,19 +213,23 @@ static auto sortFromIndex(int index) -> QString } } -void ModpackListModel::searchWithTerm(const QString& term, const int sort) +void ModpackListModel::searchWithTerm(const QString& term, + const int sort, + std::shared_ptr filter, + bool filterChanged) { if (sort > 5 || sort < 0) return; auto sort_str = sortFromIndex(sort); - if (currentSearchTerm == term && currentSearchTerm.isNull() == term.isNull() && currentSort == sort_str) { + if (currentSearchTerm == term && currentSearchTerm.isNull() == term.isNull() && currentSort == sort_str && !filterChanged) { return; } currentSearchTerm = term; currentSort = sort_str; + m_filter = filter; refresh(); } diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h index 514ee4484..640ddf688 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h @@ -71,7 +71,7 @@ class ModpackListModel : public QAbstractListModel { /* Ask the API for more information */ void fetchMore(const QModelIndex& parent) override; void refresh(); - void searchWithTerm(const QString& term, int sort); + void searchWithTerm(const QString& term, int sort, std::shared_ptr filter, bool filterChanged); [[nodiscard]] bool hasActiveSearchJob() const { return jobPtr && jobPtr->isRunning(); } [[nodiscard]] Task::Ptr activeSearchJob() { return hasActiveSearchJob() ? jobPtr : nullptr; } @@ -112,12 +112,13 @@ class ModpackListModel : public QAbstractListModel { QString currentSearchTerm; QString currentSort; + std::shared_ptr m_filter; int nextSearchOffset = 0; enum SearchState { None, CanPossiblyFetchMore, ResetRequested, Finished } searchState = None; Task::Ptr jobPtr; - std::shared_ptr m_all_response = std::make_shared(); + std::shared_ptr m_allResponse = std::make_shared(); QByteArray m_specific_response; int m_modpacks_per_page = 20; diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp index a000044fa..ff21e8c37 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp @@ -35,6 +35,8 @@ */ #include "ModrinthPage.h" +#include "Version.h" +#include "modplatform/modrinth/ModrinthAPI.h" #include "ui/dialogs/CustomMessageBox.h" #include "ui_ModrinthPage.h" @@ -58,6 +60,7 @@ ModrinthPage::ModrinthPage(NewInstanceDialog* dialog, QWidget* parent) : QWidget(parent), ui(new Ui::ModrinthPage), dialog(dialog), m_fetch_progress(this, false) { ui->setupUi(this); + createFilterWidget(); ui->searchEdit->installEventFilter(this); m_model = new Modrinth::ModpackListModel(this); @@ -126,6 +129,16 @@ bool ModrinthPage::eventFilter(QObject* watched, QEvent* event) return QObject::eventFilter(watched, event); } +bool checkVersionFilters(const Modrinth::ModpackVersion& v, std::shared_ptr filter) +{ + if (!filter) + return true; + return ((!filter->loaders || !v.loaders || filter->loaders & v.loaders) && // loaders + (filter->releases.empty() || // releases + std::find(filter->releases.cbegin(), filter->releases.cend(), v.version_type) != filter->releases.cend()) && + checkMcVersions(filter->versions, { v.gameVersion })); // gameVersion} +} + void ModrinthPage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelIndex prev) { ui->versionSelectionBox->clear(); @@ -190,7 +203,7 @@ void ModrinthPage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI } else updateUI(); - if (!current.versionsLoaded) { + if (!current.versionsLoaded || m_filterWidget->changed()) { qDebug() << "Loading modrinth modpack versions"; auto netJob = new NetJob(QString("Modrinth::PackVersions(%1)").arg(current.name), APPLICATION->network()); @@ -221,6 +234,16 @@ void ModrinthPage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI qDebug() << *response; qWarning() << "Error while reading modrinth modpack version: " << e.cause(); } + auto pred = [this](const Modrinth::ModpackVersion& v) { return !checkVersionFilters(v, m_filterWidget->getFilter()); }; +#if QT_VERSION >= QT_VERSION_CHECK(6, 1, 0) + current.versions.removeIf(pred); +#else + for (auto it = current.versions.begin(); it != current.versions.end();) + if (pred(*it)) + it = current.versions.erase(it); + else + ++it; +#endif for (auto version : current.versions) { auto release_type = version.version_type.isValid() ? QString(" [%1]").arg(version.version_type.toString()) : ""; auto mcVersion = !version.gameVersion.isEmpty() && !version.name.contains(version.gameVersion) @@ -338,7 +361,11 @@ void ModrinthPage::suggestCurrent() void ModrinthPage::triggerSearch() { - m_model->searchWithTerm(ui->searchEdit->text(), ui->sortByBox->currentIndex()); + ui->packView->selectionModel()->setCurrentIndex({}, QItemSelectionModel::SelectionFlag::ClearAndSelect); + ui->packView->clearSelection(); + ui->packDescription->clear(); + ui->versionSelectionBox->clear(); + m_model->searchWithTerm(ui->searchEdit->text(), ui->sortByBox->currentIndex(), m_filterWidget->getFilter(), m_filterWidget->changed()); m_fetch_progress.watch(m_model->activeSearchJob().get()); } @@ -361,3 +388,25 @@ QString ModrinthPage::getSerachTerm() const { return ui->searchEdit->text(); } + +void ModrinthPage::createFilterWidget() +{ + auto widget = ModFilterWidget::create(nullptr, false, this); + m_filterWidget.swap(widget); + auto old = ui->splitter->replaceWidget(0, m_filterWidget.get()); + // because we replaced the widget we also need to delete it + if (old) { + delete old; + } + + connect(ui->filterButton, &QPushButton::clicked, this, [this] { m_filterWidget->setHidden(!m_filterWidget->isHidden()); }); + + connect(m_filterWidget.get(), &ModFilterWidget::filterChanged, this, &ModrinthPage::triggerSearch); + auto response = std::make_shared(); + m_categoriesTask = ModrinthAPI::getModCategories(response); + QObject::connect(m_categoriesTask.get(), &Task::succeeded, [this, response]() { + auto categories = ModrinthAPI::loadCategories(response, "modpack"); + m_filterWidget->setCategories(categories); + }); + m_categoriesTask->start(); +} \ No newline at end of file diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h index dd99e0d29..7f504cdbd 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h @@ -41,6 +41,7 @@ #include "modplatform/modrinth/ModrinthPackManifest.h" #include "ui/pages/modplatform/ModpackProviderBasePage.h" +#include "ui/widgets/ModFilterWidget.h" #include "ui/widgets/ProgressWidget.h" #include @@ -87,6 +88,7 @@ class ModrinthPage : public QWidget, public ModpackProviderBasePage { void onSelectionChanged(QModelIndex first, QModelIndex second); void onVersionSelectionChanged(int index); void triggerSearch(); + void createFilterWidget(); private: Ui::ModrinthPage* ui; @@ -100,4 +102,7 @@ class ModrinthPage : public QWidget, public ModpackProviderBasePage { // Used to do instant searching with a delay to cache quick changes QTimer m_search_timer; + + unique_qobject_ptr m_filterWidget; + Task::Ptr m_categoriesTask; }; diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui index 7f4f903f6..ef44abb52 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui @@ -12,42 +12,59 @@ - - - Search and filter ... - - - - - + - - - Qt::ScrollBarAlwaysOff - - - true - - - - 48 - 48 - + + + Search and filter... - - - true - - - true + + + Filter + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + Qt::ScrollBarAlwaysOff + + + true + + + + 48 + 48 + + + + + + true + + + true + + + + From cc0c9d208dc4b686a254138f71465199a895ee3a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 4 Oct 2024 22:22:10 +0000 Subject: [PATCH 234/616] chore(deps): update actions/cache action to v4.1.0 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ad77d282b..a659e162c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -169,7 +169,7 @@ jobs: - name: Retrieve ccache cache (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug' - uses: actions/cache@v4.0.2 + uses: actions/cache@v4.1.0 with: path: '${{ github.workspace }}\.ccache' key: ${{ matrix.os }}-mingw-w64-ccache-${{ github.run_id }} From f7bd76c7d4ce0d834f259e4d085b726e8117bd29 Mon Sep 17 00:00:00 2001 From: arnfaldur Date: Sat, 5 Oct 2024 17:58:53 +0000 Subject: [PATCH 235/616] flatpak: don't cleanup libGLU The mod AAA Particles (found in the modpack Prominence II RPG) fails to start due to a missing `libGLU.so.1` file. Removing this cleanup command fixes the issue and makes the modpack run without issue. I reproduced the issue at the head of the develop branch, with and without the change. No other issue was detected by adding the library, and I could not find the initial justification for removing it. Signed-off-by: arnfaldur --- flatpak/org.prismlauncher.PrismLauncher.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml index bd09f7fd8..71e6dd11e 100644 --- a/flatpak/org.prismlauncher.PrismLauncher.yml +++ b/flatpak/org.prismlauncher.PrismLauncher.yml @@ -22,9 +22,6 @@ finish-args: # FTBApp import - --filesystem=~/.ftba:ro -cleanup: - - /lib/libGLU* - modules: # Might be needed by some Controller mods (see https://github.com/isXander/Controlify/issues/31) - shared-modules/libusb/libusb.json From 03294f0000eba56edc39cbd80cc53418a2429528 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 6 Oct 2024 00:24:57 +0000 Subject: [PATCH 236/616] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/1925c603f17fc89f4c8f6bf6f631a802ad85d784?narHash=sha256-J%2BPeFKSDV%2BpHL7ukkfpVzCOO7mBSrrpJ3svwBFABbhI%3D' (2024-09-26) → 'github:NixOS/nixpkgs/bc947f541ae55e999ffdb4013441347d83b00feb?narHash=sha256-NOiTvBbRLIOe5F6RbHaAh6%2B%2BBNjsb149fGZd1T4%2BKBg%3D' (2024-10-04) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 7667a8688..6897c162d 100644 --- a/flake.lock +++ b/flake.lock @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1727348695, - "narHash": "sha256-J+PeFKSDV+pHL7ukkfpVzCOO7mBSrrpJ3svwBFABbhI=", + "lastModified": 1728018373, + "narHash": "sha256-NOiTvBbRLIOe5F6RbHaAh6++BNjsb149fGZd1T4+KBg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1925c603f17fc89f4c8f6bf6f631a802ad85d784", + "rev": "bc947f541ae55e999ffdb4013441347d83b00feb", "type": "github" }, "original": { From d5990cca4318121dea8d6b669abdada64944c88b Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sun, 6 Oct 2024 13:51:36 +0100 Subject: [PATCH 237/616] Disable retry for private pack fetch This is already handled with a dialog asking whether you want it to be removed. Signed-off-by: TheKodeToad --- launcher/modplatform/legacy_ftb/PackFetchTask.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/modplatform/legacy_ftb/PackFetchTask.cpp b/launcher/modplatform/legacy_ftb/PackFetchTask.cpp index 8f1a6e2ff..a0beeddcc 100644 --- a/launcher/modplatform/legacy_ftb/PackFetchTask.cpp +++ b/launcher/modplatform/legacy_ftb/PackFetchTask.cpp @@ -74,6 +74,7 @@ void PackFetchTask::fetchPrivate(const QStringList& toFetch) auto data = std::make_shared(); NetJob* job = new NetJob("Fetching private pack", m_network); job->addNetAction(Net::ApiDownload::makeByteArray(privatePackBaseUrl.arg(packCode), data)); + job->setAskRetry(false); QObject::connect(job, &NetJob::succeeded, this, [this, job, data, packCode] { ModpackList packs; From 6e5f616ced96acee9a9aad76193f82e6a0c2cd27 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 6 Oct 2024 23:33:24 +0300 Subject: [PATCH 238/616] move checkMcVersions to Filter struct Signed-off-by: Trial97 --- launcher/Version.cpp | 12 ------------ launcher/Version.h | 2 -- launcher/ui/pages/modplatform/ModModel.cpp | 2 +- launcher/ui/pages/modplatform/flame/FlamePage.cpp | 2 +- .../ui/pages/modplatform/modrinth/ModrinthPage.cpp | 2 +- launcher/ui/widgets/ModFilterWidget.h | 9 +++++++++ 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/launcher/Version.cpp b/launcher/Version.cpp index e43d9d3f7..2edb17e72 100644 --- a/launcher/Version.cpp +++ b/launcher/Version.cpp @@ -127,15 +127,3 @@ QDebug operator<<(QDebug debug, const Version& v) return debug; } - -bool checkMcVersions(std::list filter, QStringList value) -{ - bool valid = false; - for (auto mcVersion : filter) { - if (value.contains(mcVersion.toString())) { - valid = true; - break; - } - } - return filter.empty() || valid; -} diff --git a/launcher/Version.h b/launcher/Version.h index f596bfeba..b06e256aa 100644 --- a/launcher/Version.h +++ b/launcher/Version.h @@ -161,5 +161,3 @@ class Version { void parse(); }; - -bool checkMcVersions(std::list filter, QStringList value); diff --git a/launcher/ui/pages/modplatform/ModModel.cpp b/launcher/ui/pages/modplatform/ModModel.cpp index dfc308566..1f0329321 100644 --- a/launcher/ui/pages/modplatform/ModModel.cpp +++ b/launcher/ui/pages/modplatform/ModModel.cpp @@ -123,7 +123,7 @@ bool ModModel::checkVersionFilters(const ModPlatform::IndexedVersion& v) checkSide(m_filter->side, v.side) && // side (m_filter->releases.empty() || // releases std::find(m_filter->releases.cbegin(), m_filter->releases.cend(), v.version_type) != m_filter->releases.cend()) && - checkMcVersions(m_filter->versions, v.mcVersion)); // mcVersions + m_filter->checkMcVersions(v.mcVersion)); // mcVersions } } // namespace ResourceDownload diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.cpp b/launcher/ui/pages/modplatform/flame/FlamePage.cpp index b92401988..9abf4a9c6 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlamePage.cpp @@ -152,7 +152,7 @@ bool checkVersionFilters(const Flame::IndexedVersion& v, std::shared_ptrloaders || !v.loaders || filter->loaders & v.loaders) && // loaders (filter->releases.empty() || // releases std::find(filter->releases.cbegin(), filter->releases.cend(), v.version_type) != filter->releases.cend()) && - checkMcVersions(filter->versions, { v.mcVersion })); // mcVersions} + filter->checkMcVersions({ v.mcVersion })); // mcVersions} } void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelIndex prev) diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp index ff21e8c37..2c19d54ad 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp @@ -136,7 +136,7 @@ bool checkVersionFilters(const Modrinth::ModpackVersion& v, std::shared_ptrloaders || !v.loaders || filter->loaders & v.loaders) && // loaders (filter->releases.empty() || // releases std::find(filter->releases.cbegin(), filter->releases.cend(), v.version_type) != filter->releases.cend()) && - checkMcVersions(filter->versions, { v.gameVersion })); // gameVersion} + filter->checkMcVersions({ v.gameVersion })); // gameVersion} } void ModrinthPage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelIndex prev) diff --git a/launcher/ui/widgets/ModFilterWidget.h b/launcher/ui/widgets/ModFilterWidget.h index fdfd2c8bb..50f0e06c9 100644 --- a/launcher/ui/widgets/ModFilterWidget.h +++ b/launcher/ui/widgets/ModFilterWidget.h @@ -71,6 +71,15 @@ class ModFilterWidget : public QTabWidget { releases == other.releases && categoryIds == other.categoryIds; } bool operator!=(const Filter& other) const { return !(*this == other); } + + bool checkMcVersions(QStringList value) + { + for (auto mcVersion : versions) + if (value.contains(mcVersion.toString())) + return true; + + return versions.empty(); + } }; static unique_qobject_ptr create(MinecraftInstance* instance, bool extended, QWidget* parent = nullptr); From 5bd5627a9646361ccee2d96bb555de58072bc7ab Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 8 Oct 2024 15:06:50 +0300 Subject: [PATCH 239/616] extended the modrinth search and applied the suggested change Signed-off-by: Trial97 --- .../modplatform/modrinth/ModrinthPage.cpp | 2 +- launcher/ui/widgets/ModFilterWidget.cpp | 24 ++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp index 2c19d54ad..8803c6dd9 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp @@ -391,7 +391,7 @@ QString ModrinthPage::getSerachTerm() const void ModrinthPage::createFilterWidget() { - auto widget = ModFilterWidget::create(nullptr, false, this); + auto widget = ModFilterWidget::create(nullptr, true, this); m_filterWidget.swap(widget); auto old = ui->splitter->replaceWidget(0, m_filterWidget.get()); // because we replaced the widget we also need to delete it diff --git a/launcher/ui/widgets/ModFilterWidget.cpp b/launcher/ui/widgets/ModFilterWidget.cpp index a048dbe10..68adcdb71 100644 --- a/launcher/ui/widgets/ModFilterWidget.cpp +++ b/launcher/ui/widgets/ModFilterWidget.cpp @@ -64,6 +64,8 @@ class VersionBasicModel : public QIdentityProxyModel { { if (role == Qt::DisplayRole) return QIdentityProxyModel::data(index, BaseVersionList::VersionIdRole); + if (role == Qt::UserRole) + return QIdentityProxyModel::data(index, BaseVersionList::VersionIdRole); return {}; } }; @@ -86,6 +88,9 @@ class AllVersionProxyModel : public QSortFilterProxyModel { if (role == Qt::DisplayRole) { return tr("All Versions"); } + if (role == Qt::UserRole) { + return "all"; + } return {}; } @@ -113,17 +118,18 @@ ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended, QWi QAbstractProxyModel* proxy = new VersionBasicModel(this); proxy->setSourceModel(m_versions_proxy); - if (!m_instance && !extended) { + if (extended) { + if (!m_instance) { + ui->environmentGroup->hide(); + } + ui->versions->setSourceModel(proxy); + ui->versions->setSeparator(", "); + ui->versions->setDefaultText(tr("All Versions")); + ui->version->hide(); + } else { auto allVersions = new AllVersionProxyModel(this); allVersions->setSourceModel(proxy); proxy = allVersions; - } - - if (extended) { - ui->versions->setSourceModel(proxy); - ui->versions->setSeparator(", "); - ui->version->hide(); - } else { ui->version->setModel(proxy); ui->versions->hide(); ui->showAllVersions->hide(); @@ -293,7 +299,7 @@ void ModFilterWidget::onHideInstalledFilterChanged() void ModFilterWidget::onVersionFilterTextChanged(const QString& version) { m_filter->versions.clear(); - if (version != tr("All Versions")) { + if (ui->version->currentData(Qt::UserRole) != "all") { m_filter->versions.emplace_back(version); } m_filter_changed = true; From df9f54454ac8cfe40fad525e64e6cc3578f26a77 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 8 Oct 2024 19:19:03 +0300 Subject: [PATCH 240/616] removed static functions Signed-off-by: Trial97 --- launcher/modplatform/flame/FlameAPI.h | 3 +-- launcher/modplatform/modrinth/ModrinthAPI.h | 11 +++-------- launcher/ui/pages/modplatform/flame/FlameModel.cpp | 4 ++-- .../ui/pages/modplatform/modrinth/ModrinthModel.cpp | 4 ++-- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/launcher/modplatform/flame/FlameAPI.h b/launcher/modplatform/flame/FlameAPI.h index 4abaff4ea..3ca0d5448 100644 --- a/launcher/modplatform/flame/FlameAPI.h +++ b/launcher/modplatform/flame/FlameAPI.h @@ -86,7 +86,7 @@ class FlameAPI : public NetworkResourceAPI { static const QString getModLoaderFilters(ModPlatform::ModLoaderTypes types) { return "[" + getModLoaderStrings(types).join(',') + "]"; } public: - static std::optional getStaticSearchURL(SearchArgs const& args) + [[nodiscard]] std::optional getSearchURL(SearchArgs const& args) const override { QStringList get_arguments; get_arguments.append(QString("classId=%1").arg(getClassId(args.type))); @@ -107,7 +107,6 @@ class FlameAPI : public NetworkResourceAPI { return "https://api.curseforge.com/v1/mods/search?gameId=432&" + get_arguments.join('&'); } - [[nodiscard]] std::optional getSearchURL(SearchArgs const& args) const override { return getStaticSearchURL(args); } private: [[nodiscard]] std::optional getInfoURL(QString const& id) const override diff --git a/launcher/modplatform/modrinth/ModrinthAPI.h b/launcher/modplatform/modrinth/ModrinthAPI.h index b84d281aa..070f59dad 100644 --- a/launcher/modplatform/modrinth/ModrinthAPI.h +++ b/launcher/modplatform/modrinth/ModrinthAPI.h @@ -101,7 +101,7 @@ class ModrinthAPI : public NetworkResourceAPI { return ""; } - [[nodiscard]] static QString createFacets(SearchArgs const& args) + [[nodiscard]] QString createFacets(SearchArgs const& args) const { QStringList facets_list; @@ -123,7 +123,7 @@ class ModrinthAPI : public NetworkResourceAPI { } public: - static std::optional getStaticSearchURL(SearchArgs const& args) + [[nodiscard]] inline auto getSearchURL(SearchArgs const& args) const -> std::optional override { if (args.loaders.has_value() && args.loaders.value() != 0) { if (!validateModLoaders(args.loaders.value())) { @@ -144,11 +144,6 @@ class ModrinthAPI : public NetworkResourceAPI { return BuildConfig.MODRINTH_PROD_URL + "/search?" + get_arguments.join('&'); }; - [[nodiscard]] inline auto getSearchURL(SearchArgs const& args) const -> std::optional override - { - return getStaticSearchURL(args); - } - inline auto getInfoURL(QString const& id) const -> std::optional override { return BuildConfig.MODRINTH_PROD_URL + "/project/" + id; @@ -171,7 +166,7 @@ class ModrinthAPI : public NetworkResourceAPI { .arg(BuildConfig.MODRINTH_PROD_URL, args.pack.addonId.toString(), get_arguments.isEmpty() ? "" : "?", get_arguments.join('&')); }; - static QString getGameVersionsArray(std::list mcVersions) + QString getGameVersionsArray(std::list mcVersions) const { QString s; for (auto& ver : mcVersions) { diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.cpp b/launcher/ui/pages/modplatform/flame/FlameModel.cpp index 8383b756f..cfdb185ff 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModel.cpp @@ -188,8 +188,8 @@ void ListModel::performPaginatedSearch() sort.index = currentSort + 1; auto netJob = makeShared("Flame::Search", APPLICATION->network()); - auto searchUrl = FlameAPI::getStaticSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, - m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); + auto searchUrl = FlameAPI().getSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, + m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl.value()), response)); jobPtr = netJob; diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp index 132150bd2..417ff4080 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp @@ -154,8 +154,8 @@ void ModpackListModel::performPaginatedSearch() } // TODO: Move to standalone API ResourceAPI::SortingMethod sort{}; sort.name = currentSort; - auto searchUrl = ModrinthAPI::getStaticSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, - m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); + auto searchUrl = ModrinthAPI().getSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, + m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); auto netJob = makeShared("Modrinth::SearchModpack", APPLICATION->network()); netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl.value()), m_allResponse)); From d31c947b36c907f59e82150f4fc60781d70185ab Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 8 Oct 2024 22:02:38 +0300 Subject: [PATCH 241/616] fix crash when no resorce version is available Signed-off-by: Trial97 --- launcher/ui/pages/modplatform/ResourcePage.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index bed118465..dea28d6d5 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -254,7 +254,10 @@ void ResourcePage::updateSelectionButton() m_ui->resourceSelectionButton->setEnabled(true); if (auto current_pack = getCurrentPack(); current_pack) { - if (!current_pack->isVersionSelected(m_selected_version_index)) + if (current_pack->versionsLoaded && current_pack->versions.empty()) { + m_ui->resourceSelectionButton->setEnabled(false); + qWarning() << tr("No version available for the selected pack"); + } else if (!current_pack->isVersionSelected(m_selected_version_index)) m_ui->resourceSelectionButton->setText(tr("Select %1 for download").arg(resourceString())); else m_ui->resourceSelectionButton->setText(tr("Deselect %1 for download").arg(resourceString())); From a76f37760cb043749e15582afda349caf67e330c Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 8 Oct 2024 22:30:50 +0100 Subject: [PATCH 242/616] Fix log spam when opening files from older versions Signed-off-by: TheKodeToad --- launcher/modplatform/packwiz/Packwiz.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index 19929f173..7e7411b03 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -299,7 +299,7 @@ auto V1::getIndexForMod(const QDir& index_dir, QString slug) -> Mod mod.name = stringEntry(table, "name"); mod.filename = stringEntry(table, "filename"); mod.side = stringToSide(stringEntry(table, "side")); - mod.releaseType = ModPlatform::IndexedVersionType(stringEntry(table, "x-prismlauncher-release-type")); + mod.releaseType = ModPlatform::IndexedVersionType(table["x-prismlauncher-release-type"].value_or("")); if (auto loaders = table["x-prismlauncher-loaders"]; loaders && loaders.is_array()) { for (auto&& loader : *loaders.as_array()) { if (loader.is_string()) { @@ -352,7 +352,10 @@ auto V1::getIndexForMod(const QDir& index_dir, QString slug) -> Mod mod.provider = Provider::MODRINTH; mod.mod_id() = stringEntry(*mod_provider_table, "mod-id"); mod.version() = stringEntry(*mod_provider_table, "version"); - mod.version_number = stringEntry(*mod_provider_table, "x-prismlauncher-version-number"); + + auto version_number_node = (*mod_provider_table)["x-prismlauncher-version-number"]; + if (version_number_node) + mod.version_number = version_number_node.value_or(""); } else { qCritical() << QString("No mod provider on mod metadata!"); return {}; From 4b66320f63031b63090f42bc164b62f82ddfc1df Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 8 Oct 2024 22:51:03 +0100 Subject: [PATCH 243/616] Move x-prism-launcher to unnamed table for consistency Signed-off-by: TheKodeToad --- launcher/modplatform/packwiz/Packwiz.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index 7e7411b03..fe5ef34e7 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -120,7 +120,7 @@ auto V1::createModFormat([[maybe_unused]] const QDir& index_dir, mod.releaseType = mod_version.version_type; mod.version_number = mod_version.version_number; - if (mod.version_number.isNull()) // on CurseForge, there is only a version name - not a version number + if (mod.version_number.isNull()) // on CurseForge, there is only a version name - not a version number mod.version_number = mod_version.version; return mod; @@ -172,9 +172,10 @@ void V1::updateModIndex(const QDir& index_dir, Mod& mod) qCritical() << QString("Did not write file %1 because missing information!").arg(normalized_fname); return; } - update = toml::table{ { "file-id", mod.file_id.toInt() }, - { "project-id", mod.project_id.toInt() }, - { "x-prismlauncher-version-number", mod.version_number.toStdString() } }; + update = toml::table{ + { "file-id", mod.file_id.toInt() }, + { "project-id", mod.project_id.toInt() }, + }; break; case (ModPlatform::ResourceProvider::MODRINTH): if (mod.mod_id().toString().isEmpty() || mod.version().toString().isEmpty()) { @@ -184,7 +185,6 @@ void V1::updateModIndex(const QDir& index_dir, Mod& mod) update = toml::table{ { "mod-id", mod.mod_id().toString().toStdString() }, { "version", mod.version().toString().toStdString() }, - { "x-prismlauncher-version-number", mod.version_number.toStdString() }, }; break; } @@ -215,6 +215,7 @@ void V1::updateModIndex(const QDir& index_dir, Mod& mod) { "x-prismlauncher-loaders", loaders }, { "x-prismlauncher-mc-versions", mcVersions }, { "x-prismlauncher-release-type", mod.releaseType.toString().toStdString() }, + { "x-prismlauncher-version-number", mod.version_number.toStdString() }, { "download", toml::table{ { "mode", mod.mode.toStdString() }, @@ -319,6 +320,7 @@ auto V1::getIndexForMod(const QDir& index_dir, QString slug) -> Mod mod.mcVersions.sort(); } } + mod.version_number = table["x-prismlauncher-version-number"].value_or(""); { // [download] info auto download_table = table["download"].as_table(); @@ -347,15 +349,10 @@ auto V1::getIndexForMod(const QDir& index_dir, QString slug) -> Mod mod.provider = Provider::FLAME; mod.file_id = intEntry(*mod_provider_table, "file-id"); mod.project_id = intEntry(*mod_provider_table, "project-id"); - mod.version_number = stringEntry(*mod_provider_table, "x-prismlauncher-version-number"); } else if ((mod_provider_table = update_table[ModPlatform::ProviderCapabilities::name(Provider::MODRINTH)].as_table())) { mod.provider = Provider::MODRINTH; mod.mod_id() = stringEntry(*mod_provider_table, "mod-id"); mod.version() = stringEntry(*mod_provider_table, "version"); - - auto version_number_node = (*mod_provider_table)["x-prismlauncher-version-number"]; - if (version_number_node) - mod.version_number = version_number_node.value_or(""); } else { qCritical() << QString("No mod provider on mod metadata!"); return {}; From 093313e5914b3759bdb1147cd0fd1ff6627bdb31 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 07:14:47 +0000 Subject: [PATCH 244/616] chore(deps): update actions/cache action to v4.1.1 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5dc02edf3..dc45252fa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -173,7 +173,7 @@ jobs: - name: Retrieve ccache cache (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug' - uses: actions/cache@v4.1.0 + uses: actions/cache@v4.1.1 with: path: '${{ github.workspace }}\.ccache' key: ${{ matrix.os }}-mingw-w64-ccache-${{ github.run_id }} From 909114bf2ae1090e7c4d2d757645b413c71aaba1 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 9 Oct 2024 15:07:09 +0100 Subject: [PATCH 245/616] Change LaunchTask to only accept MinecraftInstance Signed-off-by: TheKodeToad --- launcher/launch/LaunchTask.cpp | 4 +-- launcher/launch/LaunchTask.h | 9 +++--- launcher/minecraft/launch/AutoInstallJava.cpp | 2 +- .../minecraft/launch/CreateGameFolders.cpp | 5 ++-- launcher/minecraft/launch/ExtractNatives.cpp | 9 +++--- .../minecraft/launch/LauncherPartLaunch.cpp | 29 +++++++++---------- launcher/minecraft/launch/ModMinecraftJar.cpp | 4 +-- .../minecraft/launch/ReconstructAssets.cpp | 5 ++-- launcher/minecraft/launch/ScanModFolders.cpp | 2 +- .../minecraft/launch/VerifyJavaInstall.cpp | 2 +- 10 files changed, 34 insertions(+), 37 deletions(-) diff --git a/launcher/launch/LaunchTask.cpp b/launcher/launch/LaunchTask.cpp index 4e4f5ead4..0251b302d 100644 --- a/launcher/launch/LaunchTask.cpp +++ b/launcher/launch/LaunchTask.cpp @@ -51,14 +51,14 @@ void LaunchTask::init() m_instance->setRunning(true); } -shared_qobject_ptr LaunchTask::create(InstancePtr inst) +shared_qobject_ptr LaunchTask::create(MinecraftInstancePtr inst) { shared_qobject_ptr proc(new LaunchTask(inst)); proc->init(); return proc; } -LaunchTask::LaunchTask(InstancePtr instance) : m_instance(instance) {} +LaunchTask::LaunchTask(MinecraftInstancePtr instance) : m_instance(instance) {} void LaunchTask::appendStep(shared_qobject_ptr step) { diff --git a/launcher/launch/LaunchTask.h b/launcher/launch/LaunchTask.h index 2fd8c78c7..56065af5b 100644 --- a/launcher/launch/LaunchTask.h +++ b/launcher/launch/LaunchTask.h @@ -37,6 +37,7 @@ #pragma once #include +#include #include #include "BaseInstance.h" #include "LaunchStep.h" @@ -46,21 +47,21 @@ class LaunchTask : public Task { Q_OBJECT protected: - explicit LaunchTask(InstancePtr instance); + explicit LaunchTask(MinecraftInstancePtr instance); void init(); public: enum State { NotStarted, Running, Waiting, Failed, Aborted, Finished }; public: /* methods */ - static shared_qobject_ptr create(InstancePtr inst); + static shared_qobject_ptr create(MinecraftInstancePtr inst); virtual ~LaunchTask() = default; void appendStep(shared_qobject_ptr step); void prependStep(shared_qobject_ptr step); void setCensorFilter(QMap filter); - InstancePtr instance() { return m_instance; } + MinecraftInstancePtr instance() { return m_instance; } void setPid(qint64 pid) { m_pid = pid; } @@ -115,7 +116,7 @@ class LaunchTask : public Task { void finalizeSteps(bool successful, const QString& error); protected: /* data */ - InstancePtr m_instance; + MinecraftInstancePtr m_instance; shared_qobject_ptr m_logModel; QList> m_steps; QMap m_censorFilter; diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 4fad6f15f..b23b23ed2 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -58,7 +58,7 @@ AutoInstallJava::AutoInstallJava(LaunchTask* parent) : LaunchStep(parent) - , m_instance(std::dynamic_pointer_cast(m_parent->instance())) + , m_instance(m_parent->instance()) , m_supported_arch(SysInfo::getSupportedJavaArchitecture()) {}; void AutoInstallJava::executeTask() diff --git a/launcher/minecraft/launch/CreateGameFolders.cpp b/launcher/minecraft/launch/CreateGameFolders.cpp index 36f5e6407..07bdbb600 100644 --- a/launcher/minecraft/launch/CreateGameFolders.cpp +++ b/launcher/minecraft/launch/CreateGameFolders.cpp @@ -8,16 +8,15 @@ CreateGameFolders::CreateGameFolders(LaunchTask* parent) : LaunchStep(parent) {} void CreateGameFolders::executeTask() { auto instance = m_parent->instance(); - std::shared_ptr minecraftInstance = std::dynamic_pointer_cast(instance); - if (!FS::ensureFolderPathExists(minecraftInstance->gameRoot())) { + if (!FS::ensureFolderPathExists(instance->gameRoot())) { emit logLine("Couldn't create the main game folder", MessageLevel::Error); emitFailed(tr("Couldn't create the main game folder")); return; } // HACK: this is a workaround for MCL-3732 - 'server-resource-packs' folder is created. - if (!FS::ensureFolderPathExists(FS::PathCombine(minecraftInstance->gameRoot(), "server-resource-packs"))) { + if (!FS::ensureFolderPathExists(FS::PathCombine(instance->gameRoot(), "server-resource-packs"))) { emit logLine("Couldn't create the 'server-resource-packs' folder", MessageLevel::Error); } emitSucceeded(); diff --git a/launcher/minecraft/launch/ExtractNatives.cpp b/launcher/minecraft/launch/ExtractNatives.cpp index 405008f40..afe091758 100644 --- a/launcher/minecraft/launch/ExtractNatives.cpp +++ b/launcher/minecraft/launch/ExtractNatives.cpp @@ -70,17 +70,16 @@ static bool unzipNatives(QString source, QString targetFolder, bool applyJnilibH void ExtractNatives::executeTask() { auto instance = m_parent->instance(); - std::shared_ptr minecraftInstance = std::dynamic_pointer_cast(instance); - auto toExtract = minecraftInstance->getNativeJars(); + auto toExtract = instance->getNativeJars(); if (toExtract.isEmpty()) { emitSucceeded(); return; } - auto settings = minecraftInstance->settings(); + auto settings = instance->settings(); - auto outputPath = minecraftInstance->getNativePath(); + auto outputPath = instance->getNativePath(); FS::ensureFolderPathExists(outputPath); - auto javaVersion = minecraftInstance->getJavaVersion(); + auto javaVersion = instance->getJavaVersion(); bool jniHackEnabled = javaVersion.major() >= 8; for (const auto& source : toExtract) { if (!unzipNatives(source, outputPath, jniHackEnabled)) { diff --git a/launcher/minecraft/launch/LauncherPartLaunch.cpp b/launcher/minecraft/launch/LauncherPartLaunch.cpp index 2b932ae47..10c14a95f 100644 --- a/launcher/minecraft/launch/LauncherPartLaunch.cpp +++ b/launcher/minecraft/launch/LauncherPartLaunch.cpp @@ -50,16 +50,16 @@ LauncherPartLaunch::LauncherPartLaunch(LaunchTask* parent) : LaunchStep(parent) { - auto instance = parent->instance(); - if (instance->settings()->get("CloseAfterLaunch").toBool()) { + if (parent->instance()->settings()->get("CloseAfterLaunch").toBool()) { std::shared_ptr connection{ new QMetaObject::Connection }; - *connection = connect(&m_process, &LoggedProcess::log, this, [=](QStringList lines, [[maybe_unused]] MessageLevel::Enum level) { - qDebug() << lines; - if (lines.filter(QRegularExpression(".*Setting user.+", QRegularExpression::CaseInsensitiveOption)).length() != 0) { - APPLICATION->closeAllWindows(); - disconnect(*connection); - } - }); + *connection = + connect(&m_process, &LoggedProcess::log, this, [=](const QStringList& lines, [[maybe_unused]] MessageLevel::Enum level) { + qDebug() << lines; + if (lines.filter(QRegularExpression(".*Setting user.+", QRegularExpression::CaseInsensitiveOption)).length() != 0) { + APPLICATION->closeAllWindows(); + disconnect(*connection); + } + }); } connect(&m_process, &LoggedProcess::log, this, &LauncherPartLaunch::logLines); @@ -77,10 +77,9 @@ void LauncherPartLaunch::executeTask() } auto instance = m_parent->instance(); - std::shared_ptr minecraftInstance = std::dynamic_pointer_cast(instance); QString legacyJarPath; - if (minecraftInstance->getLauncher() == "legacy" || minecraftInstance->shouldApplyOnlineFixes()) { + if (instance->getLauncher() == "legacy" || instance->shouldApplyOnlineFixes()) { legacyJarPath = APPLICATION->getJarPath("NewLaunchLegacy.jar"); if (legacyJarPath.isEmpty()) { const char* reason = QT_TR_NOOP("Legacy launcher library could not be found. Please check your installation."); @@ -90,8 +89,8 @@ void LauncherPartLaunch::executeTask() } } - m_launchScript = minecraftInstance->createLaunchScript(m_session, m_targetToJoin); - QStringList args = minecraftInstance->javaArguments(); + m_launchScript = instance->createLaunchScript(m_session, m_targetToJoin); + QStringList args = instance->javaArguments(); QString allArgs = args.join(", "); emit logLine("Java Arguments:\n[" + m_parent->censorPrivateInfo(allArgs) + "]\n\n", MessageLevel::Launcher); @@ -102,13 +101,13 @@ void LauncherPartLaunch::executeTask() // make detachable - this will keep the process running even if the object is destroyed m_process.setDetachable(true); - auto classPath = minecraftInstance->getClassPath(); + auto classPath = instance->getClassPath(); classPath.prepend(jarPath); if (!legacyJarPath.isEmpty()) classPath.prepend(legacyJarPath); - auto natPath = minecraftInstance->getNativePath(); + auto natPath = instance->getNativePath(); #ifdef Q_OS_WIN natPath = FS::getPathNameInLocal8bit(natPath); #endif diff --git a/launcher/minecraft/launch/ModMinecraftJar.cpp b/launcher/minecraft/launch/ModMinecraftJar.cpp index 6e73333b1..e06080ba7 100644 --- a/launcher/minecraft/launch/ModMinecraftJar.cpp +++ b/launcher/minecraft/launch/ModMinecraftJar.cpp @@ -42,7 +42,7 @@ void ModMinecraftJar::executeTask() { - auto m_inst = std::dynamic_pointer_cast(m_parent->instance()); + auto m_inst = m_parent->instance(); if (!m_inst->getJarMods().size()) { emitSucceeded(); @@ -82,7 +82,7 @@ void ModMinecraftJar::finalize() bool ModMinecraftJar::removeJar() { - auto m_inst = std::dynamic_pointer_cast(m_parent->instance()); + auto m_inst = m_parent->instance(); auto finalJarPath = QDir(m_inst->binRoot()).absoluteFilePath("minecraft.jar"); QFile finalJar(finalJarPath); if (finalJar.exists()) { diff --git a/launcher/minecraft/launch/ReconstructAssets.cpp b/launcher/minecraft/launch/ReconstructAssets.cpp index 843ccc554..21ae395f0 100644 --- a/launcher/minecraft/launch/ReconstructAssets.cpp +++ b/launcher/minecraft/launch/ReconstructAssets.cpp @@ -22,12 +22,11 @@ void ReconstructAssets::executeTask() { auto instance = m_parent->instance(); - std::shared_ptr minecraftInstance = std::dynamic_pointer_cast(instance); - auto components = minecraftInstance->getPackProfile(); + auto components = instance->getPackProfile(); auto profile = components->getProfile(); auto assets = profile->getMinecraftAssets(); - if (!AssetsUtils::reconstructAssets(assets->id, minecraftInstance->resourcesDir())) { + if (!AssetsUtils::reconstructAssets(assets->id, instance->resourcesDir())) { emit logLine("Failed to reconstruct Minecraft assets.", MessageLevel::Error); } diff --git a/launcher/minecraft/launch/ScanModFolders.cpp b/launcher/minecraft/launch/ScanModFolders.cpp index 7e08a4e36..1a2ddf194 100644 --- a/launcher/minecraft/launch/ScanModFolders.cpp +++ b/launcher/minecraft/launch/ScanModFolders.cpp @@ -42,7 +42,7 @@ void ScanModFolders::executeTask() { - auto m_inst = std::dynamic_pointer_cast(m_parent->instance()); + auto m_inst = m_parent->instance(); auto loaders = m_inst->loaderModList(); connect(loaders.get(), &ModFolderModel::updateFinished, this, &ScanModFolders::modsDone); diff --git a/launcher/minecraft/launch/VerifyJavaInstall.cpp b/launcher/minecraft/launch/VerifyJavaInstall.cpp index 1e7448089..bc950d673 100644 --- a/launcher/minecraft/launch/VerifyJavaInstall.cpp +++ b/launcher/minecraft/launch/VerifyJavaInstall.cpp @@ -46,7 +46,7 @@ void VerifyJavaInstall::executeTask() { - auto instance = std::dynamic_pointer_cast(m_parent->instance()); + auto instance = m_parent->instance(); auto packProfile = instance->getPackProfile(); auto settings = instance->settings(); auto storedVersion = settings->get("JavaVersion").toString(); From 98adcc60a30a95a86b564ebe69bb0ad276263424 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 9 Oct 2024 16:59:56 +0100 Subject: [PATCH 246/616] Use UTF-8 to decode logs on Java 18 or newer Signed-off-by: TheKodeToad --- launcher/LoggedProcess.cpp | 3 ++- launcher/LoggedProcess.h | 6 +++--- launcher/java/JavaVersion.cpp | 6 ++++++ launcher/java/JavaVersion.h | 2 +- launcher/minecraft/launch/LauncherPartLaunch.cpp | 4 +++- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/launcher/LoggedProcess.cpp b/launcher/LoggedProcess.cpp index fadd64e68..35ce4e0e5 100644 --- a/launcher/LoggedProcess.cpp +++ b/launcher/LoggedProcess.cpp @@ -39,7 +39,8 @@ #include #include "MessageLevel.h" -LoggedProcess::LoggedProcess(QObject* parent) : QProcess(parent) +LoggedProcess::LoggedProcess(const QTextCodec* output_codec, QObject* parent) + : QProcess(parent), m_err_decoder(output_codec), m_out_decoder(output_codec) { // QProcess has a strange interface... let's map a lot of those into a few. connect(this, &QProcess::readyReadStandardOutput, this, &LoggedProcess::on_stdOut); diff --git a/launcher/LoggedProcess.h b/launcher/LoggedProcess.h index 46bdaa830..75ba15dfd 100644 --- a/launcher/LoggedProcess.h +++ b/launcher/LoggedProcess.h @@ -49,7 +49,7 @@ class LoggedProcess : public QProcess { enum State { NotRunning, Starting, FailedToStart, Running, Finished, Crashed, Aborted }; public: - explicit LoggedProcess(QObject* parent = 0); + explicit LoggedProcess(const QTextCodec* output_codec = QTextCodec::codecForLocale(), QObject* parent = 0); virtual ~LoggedProcess(); State state() const; @@ -80,8 +80,8 @@ class LoggedProcess : public QProcess { QStringList reprocess(const QByteArray& data, QTextDecoder& decoder); private: - QTextDecoder m_err_decoder = QTextDecoder(QTextCodec::codecForLocale()); - QTextDecoder m_out_decoder = QTextDecoder(QTextCodec::codecForLocale()); + QTextDecoder m_err_decoder; + QTextDecoder m_out_decoder; QString m_leftover_line; bool m_killed = false; State m_state = NotRunning; diff --git a/launcher/java/JavaVersion.cpp b/launcher/java/JavaVersion.cpp index 5e9700012..bca50f2c9 100644 --- a/launcher/java/JavaVersion.cpp +++ b/launcher/java/JavaVersion.cpp @@ -48,6 +48,12 @@ bool JavaVersion::requiresPermGen() const return !m_parseable || m_major < 8; } +bool JavaVersion::defaultsToUtf8() const +{ + // starting from Java 18, UTF-8 is the default charset: https://openjdk.org/jeps/400 + return m_parseable && m_major >= 18; +} + bool JavaVersion::isModular() const { return m_parseable && m_major >= 9; diff --git a/launcher/java/JavaVersion.h b/launcher/java/JavaVersion.h index dfb4770da..c070bdeec 100644 --- a/launcher/java/JavaVersion.h +++ b/launcher/java/JavaVersion.h @@ -25,7 +25,7 @@ class JavaVersion { bool operator>(const JavaVersion& rhs); bool requiresPermGen() const; - + bool defaultsToUtf8() const; bool isModular() const; QString toString() const; diff --git a/launcher/minecraft/launch/LauncherPartLaunch.cpp b/launcher/minecraft/launch/LauncherPartLaunch.cpp index 10c14a95f..d9a2b9b6b 100644 --- a/launcher/minecraft/launch/LauncherPartLaunch.cpp +++ b/launcher/minecraft/launch/LauncherPartLaunch.cpp @@ -48,7 +48,9 @@ #include "gamemode_client.h" #endif -LauncherPartLaunch::LauncherPartLaunch(LaunchTask* parent) : LaunchStep(parent) +LauncherPartLaunch::LauncherPartLaunch(LaunchTask* parent) + : LaunchStep(parent) + , m_process(parent->instance()->getJavaVersion().defaultsToUtf8() ? QTextCodec::codecForName("UTF-8") : QTextCodec::codecForLocale()) { if (parent->instance()->settings()->get("CloseAfterLaunch").toBool()) { std::shared_ptr connection{ new QMetaObject::Connection }; From 5b6d551650e4590567321647ce68ae2043a8180c Mon Sep 17 00:00:00 2001 From: Edgars Cirulis Date: Thu, 10 Oct 2024 03:45:35 +0300 Subject: [PATCH 247/616] chore: update Qt to 6.8.0 Signed-off-by: Edgars Cirulis --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5dc02edf3..39dc2305e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -82,7 +82,7 @@ jobs: qt_ver: 6 qt_host: windows qt_arch: "" - qt_version: "6.7.3" + qt_version: "6.8.0" qt_modules: "qt5compat qtimageformats qtnetworkauth" nscurl_tag: "v24.9.26.122" nscurl_sha256: "AEE6C4BE3CB6455858E9C1EE4B3AFE0DB9960FA03FE99CCDEDC28390D57CCBB0" @@ -95,7 +95,7 @@ jobs: qt_ver: 6 qt_host: windows qt_arch: "win64_msvc2019_arm64" - qt_version: "6.7.3" + qt_version: "6.8.0" qt_modules: "qt5compat qtimageformats qtnetworkauth" nscurl_tag: "v24.9.26.122" nscurl_sha256: "AEE6C4BE3CB6455858E9C1EE4B3AFE0DB9960FA03FE99CCDEDC28390D57CCBB0" @@ -106,7 +106,7 @@ jobs: qt_ver: 6 qt_host: mac qt_arch: "" - qt_version: "6.7.3" + qt_version: "6.8.0" qt_modules: "qt5compat qtimageformats qtnetworkauth" - os: macos-14 From b39098dbc5b371e31ce585f7534ffdb00096c2b5 Mon Sep 17 00:00:00 2001 From: Edgars Cirulis Date: Thu, 10 Oct 2024 03:47:11 +0300 Subject: [PATCH 248/616] ci: fix qt-6.8 workflow Signed-off-by: Edgars Cirulis --- .github/workflows/build.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 39dc2305e..017bc68e9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -80,8 +80,8 @@ jobs: architecture: "x64" vcvars_arch: "amd64" qt_ver: 6 - qt_host: windows - qt_arch: "" + qt_host: "windows" + qt_arch: "win64_msvc2022_64" qt_version: "6.8.0" qt_modules: "qt5compat qtimageformats qtnetworkauth" nscurl_tag: "v24.9.26.122" @@ -93,8 +93,8 @@ jobs: architecture: "arm64" vcvars_arch: "amd64_arm64" qt_ver: 6 - qt_host: windows - qt_arch: "win64_msvc2019_arm64" + qt_host: "windows" + qt_arch: "win64_msvc2022_arm64_cross_compiled" qt_version: "6.8.0" qt_modules: "qt5compat qtimageformats qtnetworkauth" nscurl_tag: "v24.9.26.122" @@ -223,7 +223,7 @@ jobs: version: ${{ matrix.qt_version }} host: "windows" target: "desktop" - arch: "" + arch: ${{ matrix.qt_arch }} modules: ${{ matrix.qt_modules }} cache: ${{ inputs.is_qt_cached }} cache-key-prefix: host-qt-arm64-windows @@ -264,7 +264,7 @@ jobs: - name: Add QT_HOST_PATH var (Windows MSVC arm64) if: runner.os == 'Windows' && matrix.architecture == 'arm64' run: | - echo "QT_HOST_PATH=${{ github.workspace }}\HostQt\Qt\${{ matrix.qt_version }}\msvc2019_64" >> $env:GITHUB_ENV + echo "QT_HOST_PATH=${{ github.workspace }}\HostQt\Qt\${{ matrix.qt_version }}\msvc2022_64" >> $env:GITHUB_ENV - name: Setup java (macOS) if: runner.os == 'macOS' From 0beaa94311a00cdc02ef5ff7d182849fce419aa9 Mon Sep 17 00:00:00 2001 From: Edgars Cirulis Date: Thu, 10 Oct 2024 15:23:48 +0300 Subject: [PATCH 249/616] ci: uprev qt install action to v4 Signed-off-by: Edgars Cirulis --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 017bc68e9..a96278ba3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -216,7 +216,7 @@ jobs: - name: Install host Qt (Windows MSVC arm64) if: runner.os == 'Windows' && matrix.architecture == 'arm64' - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 with: aqtversion: "==3.1.*" py7zrversion: ">=0.20.2" @@ -232,7 +232,7 @@ jobs: - name: Install Qt (macOS, Linux & Windows MSVC) if: matrix.msystem == '' - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 with: aqtversion: "==3.1.*" py7zrversion: ">=0.20.2" From 2bc6ae97568f9c9e522c4a64988cb325eb4d25ec Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 11 Oct 2024 19:53:28 +0100 Subject: [PATCH 250/616] Prevent directories from being removed on instance update Signed-off-by: TheKodeToad --- launcher/InstanceCreationTask.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/launcher/InstanceCreationTask.cpp b/launcher/InstanceCreationTask.cpp index 9c17dfc9f..d89a00d6c 100644 --- a/launcher/InstanceCreationTask.cpp +++ b/launcher/InstanceCreationTask.cpp @@ -42,11 +42,11 @@ void InstanceCreationTask::executeTask() setStatus(tr("Removing old conflicting files...")); qDebug() << "Removing old files"; - for (auto path : m_files_to_remove) { + for (const QString& path : m_files_to_remove) { if (!QFile::exists(path)) continue; qDebug() << "Removing" << path; - if (!FS::deletePath(path)) { + if (!QFile::remove(path)) { qCritical() << "Couldn't remove the old conflicting files."; emitFailed(tr("Failed to remove old conflicting files.")); return; @@ -55,5 +55,4 @@ void InstanceCreationTask::executeTask() } emitSucceeded(); - return; } From 09c9da268fdc833304f6159735cfb7e80d0e69bc Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 11 Oct 2024 13:26:20 -0700 Subject: [PATCH 251/616] fix: prevent inf recursion when mod icon load fails; cut max pixmapcache to 1/4 previous value Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/MTPixmapCache.h | 6 +-- launcher/minecraft/mod/Mod.cpp | 41 +++++++++++-------- launcher/minecraft/mod/Mod.h | 8 ++-- .../minecraft/mod/tasks/LocalModParseTask.cpp | 41 ++++++++++--------- .../minecraft/mod/tasks/LocalModParseTask.h | 4 +- 5 files changed, 55 insertions(+), 45 deletions(-) diff --git a/launcher/MTPixmapCache.h b/launcher/MTPixmapCache.h index b6bd13045..0ba9c5ac8 100644 --- a/launcher/MTPixmapCache.h +++ b/launcher/MTPixmapCache.h @@ -101,7 +101,7 @@ class PixmapCache final : public QObject { */ bool _markCacheMissByEviciton() { - static constexpr uint maxInt = static_cast(std::numeric_limits::max()); + static constexpr uint maxCache = static_cast(std::numeric_limits::max()) / 4; static constexpr uint step = 10240; static constexpr int oneSecond = 1000; @@ -118,8 +118,8 @@ class PixmapCache final : public QObject { if (m_consecutive_fast_evicitons >= m_consecutive_fast_evicitons_threshold) { // increase the cache size uint newSize = _cacheLimit() + step; - if (newSize >= maxInt) { // increase it until you overflow :D - newSize = maxInt; + if (newSize >= maxCache) { // increase it until you overflow :D + newSize = maxCache; qDebug() << m_consecutive_fast_evicitons << tr("pixmap cache misses by eviction happened too fast, doing nothing as the cache size reached it's limit"); } else { diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp index 5442df7fe..9663026cd 100644 --- a/launcher/minecraft/mod/Mod.cpp +++ b/launcher/minecraft/mod/Mod.cpp @@ -36,6 +36,7 @@ */ #include "Mod.h" +#include #include #include @@ -241,7 +242,7 @@ void Mod::finishResolvingWithDetails(ModDetails&& details) if (metadata) setMetadata(std::move(metadata)); if (!iconPath().isEmpty()) { - m_pack_image_cache_key.was_read_attempt = false; + m_packImageCacheKey.wasReadAttempt = false; } } @@ -290,45 +291,53 @@ auto Mod::issueTracker() const -> QString return details().issue_tracker; } -void Mod::setIcon(QImage new_image) const +QPixmap Mod::setIcon(QImage new_image) const { QMutexLocker locker(&m_data_lock); Q_ASSERT(!new_image.isNull()); - if (m_pack_image_cache_key.key.isValid()) - PixmapCache::remove(m_pack_image_cache_key.key); + if (m_packImageCacheKey.key.isValid()) + PixmapCache::remove(m_packImageCacheKey.key); // scale the image to avoid flooding the pixmapcache auto pixmap = QPixmap::fromImage(new_image.scaled({ 64, 64 }, Qt::AspectRatioMode::KeepAspectRatioByExpanding, Qt::SmoothTransformation)); - m_pack_image_cache_key.key = PixmapCache::insert(pixmap); - m_pack_image_cache_key.was_ever_used = true; - m_pack_image_cache_key.was_read_attempt = true; + m_packImageCacheKey.key = PixmapCache::insert(pixmap); + m_packImageCacheKey.wasEverUsed = true; + m_packImageCacheKey.wasReadAttempt = true; + return pixmap; } QPixmap Mod::icon(QSize size, Qt::AspectRatioMode mode) const { - QPixmap cached_image; - if (PixmapCache::find(m_pack_image_cache_key.key, &cached_image)) { + auto pixmap_transform = [&size, &mode](QPixmap pixmap) { if (size.isNull()) - return cached_image; - return cached_image.scaled(size, mode, Qt::SmoothTransformation); + return pixmap; + return pixmap.scaled(size, mode, Qt::SmoothTransformation); + }; + + QPixmap cached_image; + if (PixmapCache::find(m_packImageCacheKey.key, &cached_image)) { + return pixmap_transform(cached_image); } // No valid image we can get - if ((!m_pack_image_cache_key.was_ever_used && m_pack_image_cache_key.was_read_attempt) || iconPath().isEmpty()) + if ((!m_packImageCacheKey.wasEverUsed && m_packImageCacheKey.wasReadAttempt) || iconPath().isEmpty()) return {}; - if (m_pack_image_cache_key.was_ever_used) { + if (m_packImageCacheKey.wasEverUsed) { qDebug() << "Mod" << name() << "Had it's icon evicted from the cache. reloading..."; PixmapCache::markCacheMissByEviciton(); } // Image got evicted from the cache or an attempt to load it has not been made. load it and retry. - m_pack_image_cache_key.was_read_attempt = true; - ModUtils::loadIconFile(*this); - return icon(size); + m_packImageCacheKey.wasReadAttempt = true; + if (ModUtils::loadIconFile(*this, &cached_image)) { + return pixmap_transform(cached_image); + } + // Image failed to load + return {}; } bool Mod::valid() const diff --git a/launcher/minecraft/mod/Mod.h b/launcher/minecraft/mod/Mod.h index 9bd76c2fd..a0d9797ed 100644 --- a/launcher/minecraft/mod/Mod.h +++ b/launcher/minecraft/mod/Mod.h @@ -82,7 +82,7 @@ class Mod : public Resource { /** Gets the icon of the mod, converted to a QPixmap for drawing, and scaled to size. */ [[nodiscard]] QPixmap icon(QSize size, Qt::AspectRatioMode mode = Qt::AspectRatioMode::IgnoreAspectRatio) const; /** Thread-safe. */ - void setIcon(QImage new_image) const; + QPixmap setIcon(QImage new_image) const; auto metadata() -> std::shared_ptr; auto metadata() const -> const std::shared_ptr; @@ -111,7 +111,7 @@ class Mod : public Resource { struct { QPixmapCache::Key key; - bool was_ever_used = false; - bool was_read_attempt = false; - } mutable m_pack_image_cache_key; + bool wasEverUsed = false; + bool wasReadAttempt = false; + } mutable m_packImageCacheKey; }; diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp index 60257ce0c..d456211f8 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp @@ -647,11 +647,11 @@ bool validate(QFileInfo file) return ModUtils::process(mod, ProcessingLevel::BasicInfoOnly) && mod.valid(); } -bool processIconPNG(const Mod& mod, QByteArray&& raw_data) +bool processIconPNG(const Mod& mod, QByteArray&& raw_data, QPixmap* pixmap) { auto img = QImage::fromData(raw_data); if (!img.isNull()) { - mod.setIcon(img); + *pixmap = mod.setIcon(img); } else { qWarning() << "Failed to parse mod logo:" << mod.iconPath() << "from" << mod.name(); return false; @@ -659,15 +659,15 @@ bool processIconPNG(const Mod& mod, QByteArray&& raw_data) return true; } -bool loadIconFile(const Mod& mod) +bool loadIconFile(const Mod& mod, QPixmap* pixmap) { if (mod.iconPath().isEmpty()) { qWarning() << "No Iconfile set, be sure to parse the mod first"; return false; } - auto png_invalid = [&mod]() { - qWarning() << "Mod at" << mod.fileinfo().filePath() << "does not have a valid icon"; + auto png_invalid = [&mod](const QString& reason) { + qWarning() << "Mod at" << mod.fileinfo().filePath() << "does not have a valid icon:" << reason; return false; }; @@ -676,24 +676,26 @@ bool loadIconFile(const Mod& mod) QFileInfo icon_info(FS::PathCombine(mod.fileinfo().filePath(), mod.iconPath())); if (icon_info.exists() && icon_info.isFile()) { QFile icon(icon_info.filePath()); - if (!icon.open(QIODevice::ReadOnly)) - return false; + if (!icon.open(QIODevice::ReadOnly)) { + return png_invalid("failed to open file " + icon_info.filePath()); + } auto data = icon.readAll(); - bool icon_result = ModUtils::processIconPNG(mod, std::move(data)); + bool icon_result = ModUtils::processIconPNG(mod, std::move(data), pixmap); icon.close(); if (!icon_result) { - return png_invalid(); // icon invalid + return png_invalid("invalid png image"); // icon invalid } + return true; } - return false; + return png_invalid("file '" + icon_info.filePath() + "' does not exists or is not a file"); } case ResourceType::ZIPFILE: { QuaZip zip(mod.fileinfo().filePath()); if (!zip.open(QuaZip::mdUnzip)) - return false; + return png_invalid("failed to open '" + mod.fileinfo().filePath() + "' as a zip archive"); QuaZipFile file(&zip); @@ -701,28 +703,27 @@ bool loadIconFile(const Mod& mod) if (!file.open(QIODevice::ReadOnly)) { qCritical() << "Failed to open file in zip."; zip.close(); - return png_invalid(); + return png_invalid("Failed to open '" + mod.iconPath() + "' in zip archive"); } auto data = file.readAll(); - bool icon_result = ModUtils::processIconPNG(mod, std::move(data)); + bool icon_result = ModUtils::processIconPNG(mod, std::move(data), pixmap); file.close(); if (!icon_result) { - return png_invalid(); // icon png invalid + return png_invalid("invalid png image"); // icon png invalid } - } else { - return png_invalid(); // could not set icon as current file. + return true; } - return false; + return png_invalid("Failed to set '" + mod.iconPath() + + "' as current file in zip archive"); // could not set icon as current file. } case ResourceType::LITEMOD: { - return false; // can lightmods even have icons? + return png_invalid("litemods do not have icons"); // can lightmods even have icons? } default: - qWarning() << "Invalid type for mod, can not load icon."; - return false; + return png_invalid("Invalid type for mod, can not load icon."); } } diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.h b/launcher/minecraft/mod/tasks/LocalModParseTask.h index a03217093..91ee6f253 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.h +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.h @@ -26,8 +26,8 @@ bool processLitemod(Mod& mod, ProcessingLevel level = ProcessingLevel::Full); /** Checks whether a file is valid as a mod or not. */ bool validate(QFileInfo file); -bool processIconPNG(const Mod& mod, QByteArray&& raw_data); -bool loadIconFile(const Mod& mod); +bool processIconPNG(const Mod& mod, QByteArray&& raw_data, QPixmap* pixmap); +bool loadIconFile(const Mod& mod, QPixmap* pixmap); } // namespace ModUtils class LocalModParseTask : public Task { From 72cfad8fee7f81d85df7389ab9e32294d13a4707 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 11 Oct 2024 21:35:13 +0100 Subject: [PATCH 252/616] Continue deleting before failing Signed-off-by: TheKodeToad --- launcher/InstanceCreationTask.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/launcher/InstanceCreationTask.cpp b/launcher/InstanceCreationTask.cpp index d89a00d6c..3e7b3142f 100644 --- a/launcher/InstanceCreationTask.cpp +++ b/launcher/InstanceCreationTask.cpp @@ -38,6 +38,8 @@ void InstanceCreationTask::executeTask() // files scheduled to, and we'd better not let the user abort in the middle of it, since it'd // put the instance in an invalid state. if (shouldOverride()) { + bool deleteFailed = false; + setAbortable(false); setStatus(tr("Removing old conflicting files...")); qDebug() << "Removing old files"; @@ -45,13 +47,19 @@ void InstanceCreationTask::executeTask() for (const QString& path : m_files_to_remove) { if (!QFile::exists(path)) continue; + qDebug() << "Removing" << path; + if (!QFile::remove(path)) { - qCritical() << "Couldn't remove the old conflicting files."; - emitFailed(tr("Failed to remove old conflicting files.")); - return; + qCritical() << "Could not remove" << path; + deleteFailed = true; } } + + if (deleteFailed) { + emitFailed(tr("Failed to remove old conflicting files.")); + return; + } } emitSucceeded(); From 97f4ead0fbec5508f7ff6785f07dcf869ed663c2 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 12 Oct 2024 00:19:54 +0300 Subject: [PATCH 253/616] remove client overrides instead of double deleting the normal ones Signed-off-by: Trial97 --- launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index ba97c441f..3442fd19c 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -136,7 +136,7 @@ bool ModrinthCreationTask::updateInstance() } auto old_client_overrides = Override::readOverrides("client-overrides", old_index_folder); - for (const auto& entry : old_overrides) { + for (const auto& entry : old_client_overrides) { if (entry.isEmpty()) continue; qDebug() << "Scheduling" << entry << "for removal"; From 3a1c06de027ab2755c2a27624f41cbd445a156b4 Mon Sep 17 00:00:00 2001 From: Mia Moir <63592337+archessmn@users.noreply.github.com> Date: Sat, 12 Oct 2024 23:47:58 +0100 Subject: [PATCH 254/616] fix: Tab order on custom command inputs The tab order on the custom command UI in the instance settings is off, it goes 0 -> 2 -> 1, This re-orders the ui file to fix the order the inputs are in. Signed-off-by: Mia Moir <63592337+archessmn@users.noreply.github.com> --- launcher/ui/widgets/CustomCommands.ui | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/launcher/ui/widgets/CustomCommands.ui b/launcher/ui/widgets/CustomCommands.ui index 4a39ff7f7..b485c293e 100644 --- a/launcher/ui/widgets/CustomCommands.ui +++ b/launcher/ui/widgets/CustomCommands.ui @@ -38,19 +38,6 @@ false - - - - P&ost-exit command: - - - postExitCmdTextBox - - - - - - @@ -61,8 +48,8 @@ - - + + @@ -77,6 +64,19 @@ + + + + P&ost-exit command: + + + postExitCmdTextBox + + + + + + From 3c836ece71c61c19eacd7bb4f324940071c6e89a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 13 Oct 2024 00:24:52 +0000 Subject: [PATCH 255/616] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/bc947f541ae55e999ffdb4013441347d83b00feb?narHash=sha256-NOiTvBbRLIOe5F6RbHaAh6%2B%2BBNjsb149fGZd1T4%2BKBg%3D' (2024-10-04) → 'github:NixOS/nixpkgs/5633bcff0c6162b9e4b5f1264264611e950c8ec7?narHash=sha256-9UTxR8eukdg%2BXZeHgxW5hQA9fIKHsKCdOIUycTryeVw%3D' (2024-10-09) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 6897c162d..7bf13f75c 100644 --- a/flake.lock +++ b/flake.lock @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1728018373, - "narHash": "sha256-NOiTvBbRLIOe5F6RbHaAh6++BNjsb149fGZd1T4+KBg=", + "lastModified": 1728492678, + "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "bc947f541ae55e999ffdb4013441347d83b00feb", + "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7", "type": "github" }, "original": { From a108b5b420b7d2785c9850d4a0bcb9c628d073a4 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Mon, 14 Oct 2024 00:32:12 -0700 Subject: [PATCH 256/616] fix: ensure all connections to the ProgressDialogs's Task the dialog made are dissconnected Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/ui/dialogs/ProgressDialog.cpp | 21 ++++++++++++--------- launcher/ui/dialogs/ProgressDialog.h | 2 ++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/launcher/ui/dialogs/ProgressDialog.cpp b/launcher/ui/dialogs/ProgressDialog.cpp index 0ca3a1bd9..9897687e3 100644 --- a/launcher/ui/dialogs/ProgressDialog.cpp +++ b/launcher/ui/dialogs/ProgressDialog.cpp @@ -90,6 +90,9 @@ void ProgressDialog::on_skipButton_clicked(bool checked) ProgressDialog::~ProgressDialog() { + for (auto conn : this->m_taskConnections) { + disconnect(conn); + } delete ui; } @@ -140,15 +143,15 @@ int ProgressDialog::execWithTask(Task* task) } // Connect signals. - connect(task, &Task::started, this, &ProgressDialog::onTaskStarted); - connect(task, &Task::failed, this, &ProgressDialog::onTaskFailed); - connect(task, &Task::succeeded, this, &ProgressDialog::onTaskSucceeded); - connect(task, &Task::status, this, &ProgressDialog::changeStatus); - connect(task, &Task::details, this, &ProgressDialog::changeStatus); - connect(task, &Task::stepProgress, this, &ProgressDialog::changeStepProgress); - connect(task, &Task::progress, this, &ProgressDialog::changeProgress); - connect(task, &Task::aborted, this, &ProgressDialog::hide); - connect(task, &Task::abortStatusChanged, ui->skipButton, &QPushButton::setEnabled); + this->m_taskConnections.push_back(connect(task, &Task::started, this, &ProgressDialog::onTaskStarted)); + this->m_taskConnections.push_back(connect(task, &Task::failed, this, &ProgressDialog::onTaskFailed)); + this->m_taskConnections.push_back(connect(task, &Task::succeeded, this, &ProgressDialog::onTaskSucceeded)); + this->m_taskConnections.push_back(connect(task, &Task::status, this, &ProgressDialog::changeStatus)); + this->m_taskConnections.push_back(connect(task, &Task::details, this, &ProgressDialog::changeStatus)); + this->m_taskConnections.push_back(connect(task, &Task::stepProgress, this, &ProgressDialog::changeStepProgress)); + this->m_taskConnections.push_back(connect(task, &Task::progress, this, &ProgressDialog::changeProgress)); + this->m_taskConnections.push_back(connect(task, &Task::aborted, this, &ProgressDialog::hide)); + this->m_taskConnections.push_back(connect(task, &Task::abortStatusChanged, ui->skipButton, &QPushButton::setEnabled)); m_is_multi_step = task->isMultiStep(); ui->taskProgressScrollArea->setHidden(!m_is_multi_step); diff --git a/launcher/ui/dialogs/ProgressDialog.h b/launcher/ui/dialogs/ProgressDialog.h index 15eadf4e7..4a696a49d 100644 --- a/launcher/ui/dialogs/ProgressDialog.h +++ b/launcher/ui/dialogs/ProgressDialog.h @@ -93,6 +93,8 @@ class ProgressDialog : public QDialog { Ui::ProgressDialog* ui; Task* m_task; + + QList m_taskConnections; bool m_is_multi_step = false; QHash taskProgress; From ac13579b9963a312b909e712c372cb115f21f0db Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 14 Oct 2024 11:10:54 +0300 Subject: [PATCH 257/616] fix heap-use-after-free in modrinth creation task Signed-off-by: Trial97 --- .../modplatform/modrinth/ModrinthInstanceCreationTask.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index 3442fd19c..994dd774f 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -301,6 +301,13 @@ bool ModrinthCreationTask::createInstance() loop.exec(); + if (!ended_well) { + for (auto m : mods) { + delete m; + } + return ended_well; + } + QEventLoop ensureMetaLoop; QDir folder = FS::PathCombine(instance.modsRoot(), ".index"); auto ensureMetadataTask = makeShared(mods, folder, ModPlatform::ResourceProvider::MODRINTH); From 7519c63f2e8a5ebc9480a470a1e7702436178c51 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 19 Oct 2024 01:11:27 +0300 Subject: [PATCH 258/616] Replace http with https on skins Signed-off-by: Trial97 --- launcher/minecraft/auth/Parsers.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/auth/Parsers.cpp b/launcher/minecraft/auth/Parsers.cpp index 3aa458ace..f9d89baa2 100644 --- a/launcher/minecraft/auth/Parsers.cpp +++ b/launcher/minecraft/auth/Parsers.cpp @@ -180,6 +180,7 @@ bool parseMinecraftProfile(QByteArray& data, MinecraftProfile& output) if (!getString(skinObj.value("url"), skinOut.url)) { continue; } + skinOut.url.replace("http://textures.minecraft.net", "https://textures.minecraft.net"); if (!getString(skinObj.value("variant"), skinOut.variant)) { continue; } @@ -221,9 +222,9 @@ namespace { // these skin URLs are for the MHF_Steve and MHF_Alex accounts (made by a Mojang employee) // they are needed because the session server doesn't return skin urls for default skins static const QString SKIN_URL_STEVE = - "http://textures.minecraft.net/texture/1a4af718455d4aab528e7a61f86fa25e6a369d1768dcb13f7df319a713eb810b"; + "https://textures.minecraft.net/texture/1a4af718455d4aab528e7a61f86fa25e6a369d1768dcb13f7df319a713eb810b"; static const QString SKIN_URL_ALEX = - "http://textures.minecraft.net/texture/83cee5ca6afcdb171285aa00e8049c297b2dbeba0efb8ff970a5677a1b644032"; + "https://textures.minecraft.net/texture/83cee5ca6afcdb171285aa00e8049c297b2dbeba0efb8ff970a5677a1b644032"; bool isDefaultModelSteve(QString uuid) { From 522d105dbe50d6392e1d74dd9f1dec2a3ef7a357 Mon Sep 17 00:00:00 2001 From: seth Date: Sat, 19 Oct 2024 11:59:32 -0400 Subject: [PATCH 259/616] fix(nix): enable checks Signed-off-by: seth --- nix/unwrapped.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nix/unwrapped.nix b/nix/unwrapped.nix index f75acf1de..7fc383ff3 100644 --- a/nix/unwrapped.nix +++ b/nix/unwrapped.nix @@ -87,6 +87,8 @@ stdenv.mkDerivation { (lib.cmakeFeature "CMAKE_INSTALL_PREFIX" "${placeholder "out"}/Applications/") ]; + doCheck = true; + dontWrapQtApps = true; meta = { From 0bae14999f8e4997be96a8fadb4e4ed14dfd5b40 Mon Sep 17 00:00:00 2001 From: seth Date: Sat, 19 Oct 2024 12:33:40 -0400 Subject: [PATCH 260/616] chore(flatpak): don't bundle JREs After https://github.com/PrismLauncher/PrismLauncher/pull/2069, JREs can be managed at runtime. This is great for the Flatpak, as previously *all* JREs had to be installed and could not be updated independently of the launcher's Flatpak. It also makes using unsupported Java versions easier as the launcher can download any version in the sandbox We don't need to include these anymore Signed-off-by: seth --- flatpak/org.prismlauncher.PrismLauncher.yml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml index 71e6dd11e..f33432d23 100644 --- a/flatpak/org.prismlauncher.PrismLauncher.yml +++ b/flatpak/org.prismlauncher.PrismLauncher.yml @@ -3,9 +3,7 @@ runtime: org.kde.Platform runtime-version: 6.7 sdk: org.kde.Sdk sdk-extensions: - - org.freedesktop.Sdk.Extension.openjdk21 - org.freedesktop.Sdk.Extension.openjdk17 - - org.freedesktop.Sdk.Extension.openjdk8 command: prismlauncher finish-args: @@ -43,19 +41,6 @@ modules: - type: dir path: ../ - - name: openjdk - buildsystem: simple - build-commands: - - mkdir -p /app/jdk/ - - /usr/lib/sdk/openjdk21/install.sh - - mv /app/jre /app/jdk/21 - - /usr/lib/sdk/openjdk17/install.sh - - mv /app/jre /app/jdk/17 - - /usr/lib/sdk/openjdk8/install.sh - - mv /app/jre /app/jdk/8 - cleanup: - - /jre - - name: glfw buildsystem: cmake-ninja config-opts: From 01721b593b16bbbf9cd15c4f262176d0345681f8 Mon Sep 17 00:00:00 2001 From: seth Date: Sat, 19 Oct 2024 12:38:17 -0400 Subject: [PATCH 261/616] fix(flatpak): run tests for launcher Signed-off-by: seth --- flatpak/org.prismlauncher.PrismLauncher.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml index f33432d23..09dd8d73b 100644 --- a/flatpak/org.prismlauncher.PrismLauncher.yml +++ b/flatpak/org.prismlauncher.PrismLauncher.yml @@ -37,6 +37,7 @@ modules: env: JAVA_HOME: /usr/lib/sdk/openjdk17/jvm/openjdk-17 JAVA_COMPILER: /usr/lib/sdk/openjdk17/jvm/openjdk-17/bin/javac + run-tests: true sources: - type: dir path: ../ From 2030041fcc14aa9d56f59e0a61c8a26ba6522a0f Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 19 Oct 2024 01:10:04 +0300 Subject: [PATCH 262/616] Fix tests segfault Signed-off-by: Trial97 --- CMakeLists.txt | 12 ++++++------ launcher/Application.h | 6 ++++++ launcher/CMakeLists.txt | 10 +++------- launcher/minecraft/mod/ResourceFolderModel.cpp | 7 +++---- launcher/net/NetJob.cpp | 5 +++-- .../ui/pages/modplatform/ResourceModel.cpp | 18 +++++++++++------- 6 files changed, 32 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d70fe79b..4c1ad3373 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,7 +99,7 @@ if ((CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebI message(STATUS "Address Sanitizer enabled for Debug builds, Turn it off with -DDEBUG_ADDRESS_SANITIZER=off") if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") - # using clang with clang-cl front end + # using clang with clang-cl front end message(STATUS "Address Sanitizer available on Clang MSVC frontend") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address /Oy-") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /fsanitize=address /Oy-") @@ -225,7 +225,7 @@ set(Launcher_QT_VERSION_MAJOR "6" CACHE STRING "Major Qt version to build agains # Java downloader set(Launcher_ENABLE_JAVA_DOWNLOADER_DEFAULT ON) -# Although we recommend enabling this, we cannot guarantee binary compatibility on +# Although we recommend enabling this, we cannot guarantee binary compatibility on # differing Linux/BSD/etc distributions. Downstream packagers should be explicitly opt-ing into this # feature if they know it will work with their distribution. if(UNIX AND NOT APPLE) @@ -438,10 +438,10 @@ elseif(UNIX) set(PLUGIN_DEST_DIR "plugins") set(BUNDLE_DEST_DIR ".") set(RESOURCES_DEST_DIR ".") - + # Apps to bundle set(APPS "\${CMAKE_INSTALL_PREFIX}/bin/${Launcher_APP_BINARY_NAME}") - + # directories to look for dependencies set(DIRS ${QT_LIBS_DIR} ${QT_LIBEXECS_DIR} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) endif() @@ -495,7 +495,7 @@ if(FORCE_BUNDLED_ZLIB) set(SKIP_INSTALL_ALL ON) add_subdirectory(libraries/zlib EXCLUDE_FROM_ALL) - # On OS where unistd.h exists, zlib's generated header defines `Z_HAVE_UNISTD_H`, while the included header does not. + # On OS where unistd.h exists, zlib's generated header defines `Z_HAVE_UNISTD_H`, while the included header does not. # We cannot safely undo the rename on those systems, and they generally have packages for zlib anyway. check_include_file(unistd.h NEED_GENERATED_ZCONF) if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libraries/zlib/zconf.h.included" AND NOT NEED_GENERATED_ZCONF) @@ -533,7 +533,7 @@ endif() if(NOT cmark_FOUND) message(STATUS "Using bundled cmark") set(BUILD_TESTING 0) - set(BUILD_SHARED_LIBS 0) + set(BUILD_SHARED_LIBS 0) add_subdirectory(libraries/cmark EXCLUDE_FROM_ALL) # Markdown parser add_library(cmark::cmark ALIAS cmark) else() diff --git a/launcher/Application.h b/launcher/Application.h index 7432c9683..bd1cb2dea 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -81,6 +81,12 @@ class Index; #endif #define APPLICATION (static_cast(QCoreApplication::instance())) +// Used for checking if is a test +#if defined(APPLICATION_DYN) +#undef APPLICATION_DYN +#endif +#define APPLICATION_DYN (dynamic_cast(QCoreApplication::instance())) + class Application : public QApplication { // friends for the purpose of limiting access to deprecated stuff Q_OBJECT diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index dcbfe8fde..a70fe668a 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -608,7 +608,7 @@ set(PRISMUPDATER_SOURCES updater/prismupdater/UpdaterDialogs.cpp updater/prismupdater/GitHubRelease.h updater/prismupdater/GitHubRelease.cpp - + Json.h Json.cpp FileSystem.h @@ -625,7 +625,7 @@ set(PRISMUPDATER_SOURCES # Zip MMCZip.h MMCZip.cpp - + # Time MMCTime.h MMCTime.cpp @@ -1265,14 +1265,10 @@ include(CompilerWarnings) # Add executable add_library(Launcher_logic STATIC ${LOGIC_SOURCES} ${LAUNCHER_SOURCES} ${LAUNCHER_UI} ${LAUNCHER_RESOURCES}) -if(BUILD_TESTING) -target_compile_definitions(Launcher_logic PUBLIC LAUNCHER_TEST) -endif() set_project_warnings(Launcher_logic "${Launcher_MSVC_WARNINGS}" "${Launcher_CLANG_WARNINGS}" "${Launcher_GCC_WARNINGS}") -target_compile_definitions(Launcher_logic PUBLIC LAUNCHER_APPLICATION) target_include_directories(Launcher_logic PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_definitions(Launcher_logic PUBLIC LAUNCHER_APPLICATION) target_link_libraries(Launcher_logic @@ -1376,7 +1372,7 @@ if(Launcher_BUILD_UPDATER) add_executable("${Launcher_Name}_updater" WIN32 updater/prismupdater/updater_main.cpp) target_sources("${Launcher_Name}_updater" PRIVATE updater/prismupdater/updater.exe.manifest) target_link_libraries("${Launcher_Name}_updater" prism_updater_logic) - + if(DEFINED Launcher_APP_BINARY_NAME) set_target_properties("${Launcher_Name}_updater" PROPERTIES OUTPUT_NAME "${Launcher_APP_BINARY_NAME}_updater") endif() diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index 941e7ce58..ce3e16bce 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -35,10 +35,9 @@ ResourceFolderModel::ResourceFolderModel(QDir dir, BaseInstance* instance, QObje connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &ResourceFolderModel::directoryChanged); connect(&m_helper_thread_task, &ConcurrentTask::finished, this, [this] { m_helper_thread_task.clear(); }); -#ifndef LAUNCHER_TEST - // in tests the application macro doesn't work - m_helper_thread_task.setMaxConcurrent(APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); -#endif + if (APPLICATION_DYN) { // in tests the application macro doesn't work + m_helper_thread_task.setMaxConcurrent(APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); + } } ResourceFolderModel::~ResourceFolderModel() diff --git a/launcher/net/NetJob.cpp b/launcher/net/NetJob.cpp index e363c911d..3cd3958f7 100644 --- a/launcher/net/NetJob.cpp +++ b/launcher/net/NetJob.cpp @@ -48,7 +48,7 @@ NetJob::NetJob(QString job_name, shared_qobject_ptr netwo : ConcurrentTask(nullptr, job_name), m_network(network) { #if defined(LAUNCHER_APPLICATION) - if (max_concurrent < 0) + if (APPLICATION_DYN && max_concurrent < 0) max_concurrent = APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt(); #endif if (max_concurrent > 0) @@ -161,7 +161,8 @@ bool NetJob::isOnline() void NetJob::emitFailed(QString reason) { #if defined(LAUNCHER_APPLICATION) - if (m_ask_retry && m_manual_try < APPLICATION->settings()->get("NumberOfManualRetries").toInt() && isOnline()) { + + if (APPLICATION_DYN && m_ask_retry && m_manual_try < APPLICATION->settings()->get("NumberOfManualRetries").toInt() && isOnline()) { m_manual_try++; auto response = CustomMessageBox::selectable(nullptr, "Confirm retry", "The tasks failed.\n" diff --git a/launcher/ui/pages/modplatform/ResourceModel.cpp b/launcher/ui/pages/modplatform/ResourceModel.cpp index c8eb91570..50a170fff 100644 --- a/launcher/ui/pages/modplatform/ResourceModel.cpp +++ b/launcher/ui/pages/modplatform/ResourceModel.cpp @@ -31,9 +31,9 @@ QHash ResourceModel::s_running_models; ResourceModel::ResourceModel(ResourceAPI* api) : QAbstractListModel(), m_api(api) { s_running_models.insert(this, true); -#ifndef LAUNCHER_TEST - m_current_info_job.setMaxConcurrent(APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); -#endif + if (APPLICATION_DYN) { + m_current_info_job.setMaxConcurrent(APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + } } ResourceModel::~ResourceModel() @@ -60,11 +60,15 @@ auto ResourceModel::data(const QModelIndex& index, int role) const -> QVariant return pack->description; } case Qt::DecorationRole: { - if (auto icon_or_none = const_cast(this)->getIcon(const_cast(index), pack->logoUrl); - icon_or_none.has_value()) - return icon_or_none.value(); + if (APPLICATION_DYN) { + if (auto icon_or_none = const_cast(this)->getIcon(const_cast(index), pack->logoUrl); + icon_or_none.has_value()) + return icon_or_none.value(); - return APPLICATION->getThemedIcon("screenshot-placeholder"); + return APPLICATION->getThemedIcon("screenshot-placeholder"); + } else { + return {}; + } } case Qt::SizeHintRole: return QSize(0, 58); From 2d234b127b1561fcedd0beae5bd242d1012c7426 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 19 Oct 2024 22:07:31 +0300 Subject: [PATCH 263/616] make sure that tests are only disabled fro cmark Signed-off-by: Trial97 --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c1ad3373..b677b0b7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -532,10 +532,12 @@ else() endif() if(NOT cmark_FOUND) message(STATUS "Using bundled cmark") + set(ORIGINAL_BUILD_TESTING ${BUILD_TESTING}) set(BUILD_TESTING 0) set(BUILD_SHARED_LIBS 0) add_subdirectory(libraries/cmark EXCLUDE_FROM_ALL) # Markdown parser add_library(cmark::cmark ALIAS cmark) + set(BUILD_TESTING ${ORIGINAL_BUILD_TESTING}) else() message(STATUS "Using system cmark") endif() From 0501c1e17a75172b8c3b8c15da27a86cf64c420b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 20 Oct 2024 00:25:22 +0000 Subject: [PATCH 264/616] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/5633bcff0c6162b9e4b5f1264264611e950c8ec7?narHash=sha256-9UTxR8eukdg%2BXZeHgxW5hQA9fIKHsKCdOIUycTryeVw%3D' (2024-10-09) → 'github:NixOS/nixpkgs/4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0?narHash=sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c%2BcHUJwA%3D' (2024-10-18) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 7bf13f75c..a82e6f65f 100644 --- a/flake.lock +++ b/flake.lock @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1728492678, - "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=", + "lastModified": 1729256560, + "narHash": "sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c+cHUJwA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7", + "rev": "4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0", "type": "github" }, "original": { From 0586d38e03de6890bf5697c7e1a965aac9bd36fb Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 20 Oct 2024 23:14:05 +0300 Subject: [PATCH 265/616] fix sparkle signature Signed-off-by: Trial97 --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dc45252fa..a1ed0a25a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -410,9 +410,8 @@ jobs: if: matrix.name == 'macOS' run: | if [ '${{ secrets.SPARKLE_ED25519_KEY }}' != '' ]; then - brew install openssl@3 echo '${{ secrets.SPARKLE_ED25519_KEY }}' > ed25519-priv.pem - signature=$(/usr/local/opt/openssl@3/bin/openssl pkeyutl -sign -rawin -in ${{ github.workspace }}/PrismLauncher.zip -inkey ed25519-priv.pem | openssl base64 | tr -d \\n) + signature=$(/opt/homebrew/opt/openssl@3/bin/openssl pkeyutl -sign -rawin -in ${{ github.workspace }}/PrismLauncher.zip -inkey ed25519-priv.pem | openssl base64 | tr -d \\n) rm ed25519-priv.pem cat >> $GITHUB_STEP_SUMMARY << EOF ### Artifact Information :information_source: From fcadbbb739076096a9057ec340f7f6d39bc4b72f Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 21 Oct 2024 16:17:48 +0300 Subject: [PATCH 266/616] do not require java if auto-download is enabled Signed-off-by: Trial97 --- launcher/Application.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index b8dcc1099..cfae3a807 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1071,6 +1071,9 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) bool Application::createSetupWizard() { bool javaRequired = [&]() { + if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_settings->get("AutomaticJavaDownload").toBool()) { + return false; + } bool ignoreJavaWizard = m_settings->get("IgnoreJavaWizard").toBool(); if (ignoreJavaWizard) { return false; @@ -1083,10 +1086,7 @@ bool Application::createSetupWizard() } QString currentJavaPath = settings()->get("JavaPath").toString(); QString actualPath = FS::ResolveExecutable(currentJavaPath); - if (actualPath.isNull()) { - return true; - } - return false; + return actualPath.isNull(); }(); bool askjava = BuildConfig.JAVA_DOWNLOADER_ENABLED && !javaRequired && !m_settings->get("AutomaticJavaDownload").toBool() && !m_settings->get("AutomaticJavaSwitch").toBool() && !m_settings->get("UserAskedAboutAutomaticJavaDownload").toBool(); From 78e24962f93b5cc2350d04bebd7e5231d1bc4819 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 21 Oct 2024 14:41:48 +0100 Subject: [PATCH 267/616] Fix /norestart Signed-off-by: TheKodeToad --- program_info/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index ee2e336b1..e693d757a 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -57,7 +57,7 @@ Section "Visual Studio Runtime" Pop $0 ${If} $0 == "OK" DetailPrint "Download successful" - ExecWait "$INSTDIR\vc_redist\$vc_redist_exe /install /passive /norestart\" + ExecWait "$INSTDIR\vc_redist\$vc_redist_exe /install /passive /norestart" ${Else} DetailPrint "Download failed with error $0" ${EndIf} From f3f4c446206647b69b9c19e63617b163b99c6164 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 21 Oct 2024 16:30:08 +0100 Subject: [PATCH 268/616] Fix removing portable.txt on Linux portable build Signed-off-by: TheKodeToad --- launcher/Launcher.in | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/launcher/Launcher.in b/launcher/Launcher.in index 1a23f2555..706d7022b 100755 --- a/launcher/Launcher.in +++ b/launcher/Launcher.in @@ -39,8 +39,16 @@ if [ "x$DEPS_LIST" = "x" ]; then # Just to be sure... chmod +x "${LAUNCHER_DIR}/bin/${LAUNCHER_NAME}" + ARGS=("${LAUNCHER_DIR}/${LAUNCHER_NAME}" "${LAUNCHER_DIR}/bin/${LAUNCHER_NAME}") + + if [ -f portable.txt ]; then + ARGS+=("-d" "${LAUNCHER_DIR}") + fi + + ARGS+=("$@") + # Run the launcher - exec -a "${LAUNCHER_DIR}/${LAUNCHER_NAME}" "${LAUNCHER_DIR}/bin/${LAUNCHER_NAME}" -d "${LAUNCHER_DIR}" "$@" + exec -a "${ARGS[@]}" # Run the launcher in valgrind # valgrind --log-file="valgrind.log" --leak-check=full --track-origins=yes "${LAUNCHER_DIR}/bin/${LAUNCHER_NAME}" -d "${LAUNCHER_DIR}" "$@" From 9a5b773e69e7198cc37413ab7d69ba6d0a66f854 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 21 Oct 2024 19:28:34 +0300 Subject: [PATCH 269/616] do not try to import skin if path is empty Signed-off-by: Trial97 --- launcher/ui/dialogs/skins/SkinManageDialog.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/launcher/ui/dialogs/skins/SkinManageDialog.cpp b/launcher/ui/dialogs/skins/SkinManageDialog.cpp index 6c85ffa96..fbf4ef1f4 100644 --- a/launcher/ui/dialogs/skins/SkinManageDialog.cpp +++ b/launcher/ui/dialogs/skins/SkinManageDialog.cpp @@ -139,6 +139,9 @@ void SkinManageDialog::on_fileBtn_clicked() { auto filter = QMimeDatabase().mimeTypeForName("image/png").filterString(); QString raw_path = QFileDialog::getOpenFileName(this, tr("Select Skin Texture"), QString(), filter); + if (raw_path.isEmpty()) { + return; + } auto message = m_list.installSkin(raw_path, {}); if (!message.isEmpty()) { CustomMessageBox::selectable(this, tr("Selected file is not a valid skin"), message, QMessageBox::Critical)->show(); From 69028969f1a6c42b698b900256ad2e6d9ee208eb Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 21 Oct 2024 22:59:51 +0300 Subject: [PATCH 270/616] Update launcher/ui/dialogs/skins/SkinManageDialog.cpp Co-authored-by: TheKodeToad Signed-off-by: Alexandru Ionut Tripon --- launcher/ui/dialogs/skins/SkinManageDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/skins/SkinManageDialog.cpp b/launcher/ui/dialogs/skins/SkinManageDialog.cpp index fbf4ef1f4..65840eb08 100644 --- a/launcher/ui/dialogs/skins/SkinManageDialog.cpp +++ b/launcher/ui/dialogs/skins/SkinManageDialog.cpp @@ -139,7 +139,7 @@ void SkinManageDialog::on_fileBtn_clicked() { auto filter = QMimeDatabase().mimeTypeForName("image/png").filterString(); QString raw_path = QFileDialog::getOpenFileName(this, tr("Select Skin Texture"), QString(), filter); - if (raw_path.isEmpty()) { + if (raw_path.isNull()) { return; } auto message = m_list.installSkin(raw_path, {}); From 562c3013269dbb9cad411f58ded333dee1aea158 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 21 Oct 2024 23:53:23 +0300 Subject: [PATCH 271/616] skip QSaveFile temprary files Signed-off-by: Trial97 --- launcher/Application.cpp | 23 ++++++ launcher/Application.h | 11 +++ launcher/CMakeLists.txt | 1 + launcher/FileSystem.cpp | 22 +++--- launcher/PSaveFile.h | 70 +++++++++++++++++++ launcher/minecraft/World.cpp | 4 +- .../minecraft/mod/tasks/BasicFolderLoadTask.h | 4 ++ .../minecraft/mod/tasks/ModFolderLoadTask.cpp | 4 ++ launcher/modplatform/packwiz/Packwiz.cpp | 4 +- launcher/net/FileSink.cpp | 2 +- launcher/net/FileSink.h | 5 +- launcher/settings/INIFile.cpp | 1 - launcher/ui/dialogs/ExportInstanceDialog.cpp | 1 - 13 files changed, 129 insertions(+), 23 deletions(-) create mode 100644 launcher/PSaveFile.h diff --git a/launcher/Application.cpp b/launcher/Application.cpp index cfae3a807..686d934c2 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1883,3 +1883,26 @@ const QString Application::javaPath() { return m_settings->get("JavaDir").toString(); } + +void Application::addQSavePath(QString path) +{ + QMutexLocker locker(&m_qsaveResourcesMutex); + m_qsaveResources.insert(path); +} + +void Application::removeQSavePath(QString path) +{ + QMutexLocker locker(&m_qsaveResourcesMutex); + m_qsaveResources.remove(path); +} + +bool Application::checkQSavePath(QString path) +{ + QMutexLocker locker(&m_qsaveResourcesMutex); + for (auto r : m_qsaveResources) { + if (path.contains(r)) { + return true; + } + } + return false; +} \ No newline at end of file diff --git a/launcher/Application.h b/launcher/Application.h index bd1cb2dea..363130cdd 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -42,6 +42,8 @@ #include #include #include +#include +#include #include #include @@ -303,4 +305,13 @@ class Application : public QApplication { QList m_urlsToImport; QString m_instanceIdToShowWindowOf; std::unique_ptr logFile; + + public: + void addQSavePath(QString); + void removeQSavePath(QString); + bool checkQSavePath(QString); + + private: + QSet m_qsaveResources; + mutable QMutex m_qsaveResourcesMutex; }; diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index a70fe668a..0f0949a3a 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -30,6 +30,7 @@ set(CORE_SOURCES StringUtils.cpp QVariantUtils.h RuntimeContext.h + PSaveFile.h # Basic instance manipulation tasks (derived from InstanceTask) InstanceCreationTask.h diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 7f38cff04..512de28c2 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -45,7 +45,6 @@ #include #include #include -#include #include #include #include @@ -54,6 +53,7 @@ #include #include "DesktopServices.h" +#include "PSaveFile.h" #include "StringUtils.h" #if defined Q_OS_WIN32 @@ -191,8 +191,8 @@ void ensureExists(const QDir& dir) void write(const QString& filename, const QByteArray& data) { ensureExists(QFileInfo(filename).dir()); - QSaveFile file(filename); - if (!file.open(QSaveFile::WriteOnly)) { + PSaveFile file(filename); + if (!file.open(PSaveFile::WriteOnly)) { throw FileSystemException("Couldn't open " + filename + " for writing: " + file.errorString()); } if (data.size() != file.write(data)) { @@ -213,8 +213,8 @@ void appendSafe(const QString& filename, const QByteArray& data) buffer = QByteArray(); } buffer.append(data); - QSaveFile file(filename); - if (!file.open(QSaveFile::WriteOnly)) { + PSaveFile file(filename); + if (!file.open(PSaveFile::WriteOnly)) { throw FileSystemException("Couldn't open " + filename + " for writing: " + file.errorString()); } if (buffer.size() != file.write(buffer)) { @@ -971,8 +971,7 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri if (!args.empty()) argstring = " \"" + args.join("\" \"") + "\""; - stream << "#!/bin/bash" - << "\n"; + stream << "#!/bin/bash" << "\n"; stream << "\"" << target << "\" " << argstring << "\n"; stream.flush(); @@ -1016,12 +1015,9 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri if (!args.empty()) argstring = " '" + args.join("' '") + "'"; - stream << "[Desktop Entry]" - << "\n"; - stream << "Type=Application" - << "\n"; - stream << "Categories=Game;ActionGame;AdventureGame;Simulation" - << "\n"; + stream << "[Desktop Entry]" << "\n"; + stream << "Type=Application" << "\n"; + stream << "Categories=Game;ActionGame;AdventureGame;Simulation" << "\n"; stream << "Exec=\"" << target.toLocal8Bit() << "\"" << argstring.toLocal8Bit() << "\n"; stream << "Name=" << name.toLocal8Bit() << "\n"; if (!icon.isEmpty()) { diff --git a/launcher/PSaveFile.h b/launcher/PSaveFile.h new file mode 100644 index 000000000..e0b5a7a2c --- /dev/null +++ b/launcher/PSaveFile.h @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023-2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#pragma once + +#include +#include "Application.h" + +#if defined(LAUNCHER_APPLICATION) + +/* PSaveFile + * A class that mimics QSaveFile for Windows. + * + * When reading resources, we need to avoid accessing temporary files + * generated by QSaveFile. If we start reading such a file, we may + * inadvertently keep it open while QSaveFile is trying to remove it, + * or we might detect the file just before it is removed, leading to + * race conditions and errors. + * + * Unfortunately, QSaveFile doesn't provide a way to retrieve the + * temporary file name or to set a specific template for the temporary + * file name it uses. By default, QSaveFile appends a `.XXXXXX` suffix + * to the original file name, where the `XXXXXX` part is dynamically + * generated to ensure uniqueness. + * + * This class acts like a lock by adding and removing the target file + * name into/from a global string set, helping to manage access to + * files during critical operations. + * + * Note: Please do not use the `setFileName` function directly, as it + * is not virtual and cannot be overridden. + */ +class PSaveFile : public QSaveFile { + public: + PSaveFile(const QString& name) : QSaveFile(name) + { + if (auto app = APPLICATION_DYN) { + app->addQSavePath(name + "."); + } + } + PSaveFile(const QString& name, QObject* parent) : QSaveFile(name, parent) + { + if (auto app = APPLICATION_DYN) { + app->addQSavePath(name + "."); + } + } + virtual ~PSaveFile() + { + if (auto app = APPLICATION_DYN) { + app->removeQSavePath(fileName() + "."); + } + } +}; +#else +#define PSaveFile QSaveFile +#endif \ No newline at end of file diff --git a/launcher/minecraft/World.cpp b/launcher/minecraft/World.cpp index 1eba148a5..bd28f9e9a 100644 --- a/launcher/minecraft/World.cpp +++ b/launcher/minecraft/World.cpp @@ -38,7 +38,6 @@ #include #include #include -#include #include #include @@ -57,6 +56,7 @@ #include #include "FileSystem.h" +#include "PSaveFile.h" using std::nullopt; using std::optional; @@ -183,7 +183,7 @@ bool putLevelDatDataToFS(const QFileInfo& file, QByteArray& data) if (fullFilePath.isNull()) { return false; } - QSaveFile f(fullFilePath); + PSaveFile f(fullFilePath); if (!f.open(QIODevice::WriteOnly)) { return false; } diff --git a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h index 2bce2c137..fb2e22de6 100644 --- a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h +++ b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h @@ -7,6 +7,7 @@ #include +#include "Application.h" #include "FileSystem.h" #include "minecraft/mod/Resource.h" @@ -52,6 +53,9 @@ class BasicFolderLoadTask : public Task { m_dir.refresh(); for (auto entry : m_dir.entryInfoList()) { auto filePath = entry.absoluteFilePath(); + if (auto app = APPLICATION_DYN; app && app->checkQSavePath(filePath)) { + continue; + } auto newFilePath = FS::getUniqueResourceName(filePath); if (newFilePath != filePath) { FS::move(filePath, newFilePath); diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp index 501d5be13..63996e584 100644 --- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp +++ b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp @@ -36,6 +36,7 @@ #include "ModFolderLoadTask.h" +#include "Application.h" #include "FileSystem.h" #include "minecraft/mod/MetadataHandler.h" @@ -65,6 +66,9 @@ void ModFolderLoadTask::executeTask() m_mods_dir.refresh(); for (auto entry : m_mods_dir.entryInfoList()) { auto filePath = entry.absoluteFilePath(); + if (auto app = APPLICATION_DYN; app && app->checkQSavePath(filePath)) { + continue; + } auto newFilePath = FS::getUniqueResourceName(filePath); if (newFilePath != filePath) { FS::move(filePath, newFilePath); diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index 325b0a6e4..272900f0e 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -72,7 +72,7 @@ auto stringEntry(toml::table table, QString entry_name) -> QString { auto node = table[StringUtils::toStdString(entry_name)]; if (!node) { - qCritical() << "Failed to read str property '" + entry_name + "' in mod metadata."; + qWarning() << "Failed to read str property '" + entry_name + "' in mod metadata."; return {}; } @@ -83,7 +83,7 @@ auto intEntry(toml::table table, QString entry_name) -> int { auto node = table[StringUtils::toStdString(entry_name)]; if (!node) { - qCritical() << "Failed to read int property '" + entry_name + "' in mod metadata."; + qWarning() << "Failed to read int property '" + entry_name + "' in mod metadata."; return {}; } diff --git a/launcher/net/FileSink.cpp b/launcher/net/FileSink.cpp index 1ecb21fdf..95c1a8f44 100644 --- a/launcher/net/FileSink.cpp +++ b/launcher/net/FileSink.cpp @@ -55,7 +55,7 @@ Task::State FileSink::init(QNetworkRequest& request) } wroteAnyData = false; - m_output_file.reset(new QSaveFile(m_filename)); + m_output_file.reset(new PSaveFile(m_filename)); if (!m_output_file->open(QIODevice::WriteOnly)) { qCCritical(taskNetLogC) << "Could not open " + m_filename + " for writing"; return Task::State::Failed; diff --git a/launcher/net/FileSink.h b/launcher/net/FileSink.h index 816254ff9..272f8ddc3 100644 --- a/launcher/net/FileSink.h +++ b/launcher/net/FileSink.h @@ -35,8 +35,7 @@ #pragma once -#include - +#include "PSaveFile.h" #include "Sink.h" namespace Net { @@ -60,6 +59,6 @@ class FileSink : public Sink { protected: QString m_filename; bool wroteAnyData = false; - std::unique_ptr m_output_file; + std::unique_ptr m_output_file; }; } // namespace Net diff --git a/launcher/settings/INIFile.cpp b/launcher/settings/INIFile.cpp index e97741f20..2c7620e65 100644 --- a/launcher/settings/INIFile.cpp +++ b/launcher/settings/INIFile.cpp @@ -39,7 +39,6 @@ #include #include -#include #include #include #include diff --git a/launcher/ui/dialogs/ExportInstanceDialog.cpp b/launcher/ui/dialogs/ExportInstanceDialog.cpp index 9f2b3ac42..7e00f18f4 100644 --- a/launcher/ui/dialogs/ExportInstanceDialog.cpp +++ b/launcher/ui/dialogs/ExportInstanceDialog.cpp @@ -51,7 +51,6 @@ #include #include #include -#include #include #include #include From 73d33f93b30f658f9671358ac52bf4e03afeaefd Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 22 Oct 2024 09:41:00 +0300 Subject: [PATCH 272/616] Replaced QSet with QHash Signed-off-by: Trial97 --- launcher/Application.cpp | 13 +++++++++---- launcher/Application.h | 3 +-- launcher/PSaveFile.h | 27 ++++++++++++++------------- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 686d934c2..ea749ca4c 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1887,20 +1887,25 @@ const QString Application::javaPath() void Application::addQSavePath(QString path) { QMutexLocker locker(&m_qsaveResourcesMutex); - m_qsaveResources.insert(path); + m_qsaveResources[path] = m_qsaveResources.value(path, 0) + 1; } void Application::removeQSavePath(QString path) { QMutexLocker locker(&m_qsaveResourcesMutex); - m_qsaveResources.remove(path); + auto count = m_qsaveResources.value(path, 0) - 1; + if (count <= 0) { + m_qsaveResources.remove(path); + } else { + m_qsaveResources[path] = count; + } } bool Application::checkQSavePath(QString path) { QMutexLocker locker(&m_qsaveResourcesMutex); - for (auto r : m_qsaveResources) { - if (path.contains(r)) { + for (auto partialPath : m_qsaveResources.keys()) { + if (path.startsWith(partialPath) && m_qsaveResources.value(partialPath, 0) > 0) { return true; } } diff --git a/launcher/Application.h b/launcher/Application.h index 363130cdd..692625f4a 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -43,7 +43,6 @@ #include #include #include -#include #include #include @@ -312,6 +311,6 @@ class Application : public QApplication { bool checkQSavePath(QString); private: - QSet m_qsaveResources; + QHash m_qsaveResources; mutable QMutex m_qsaveResourcesMutex; }; diff --git a/launcher/PSaveFile.h b/launcher/PSaveFile.h index e0b5a7a2c..ba6154ad8 100644 --- a/launcher/PSaveFile.h +++ b/launcher/PSaveFile.h @@ -17,6 +17,7 @@ */ #pragma once +#include #include #include "Application.h" @@ -46,24 +47,24 @@ */ class PSaveFile : public QSaveFile { public: - PSaveFile(const QString& name) : QSaveFile(name) - { - if (auto app = APPLICATION_DYN) { - app->addQSavePath(name + "."); - } - } - PSaveFile(const QString& name, QObject* parent) : QSaveFile(name, parent) - { - if (auto app = APPLICATION_DYN) { - app->addQSavePath(name + "."); - } - } + PSaveFile(const QString& name) : QSaveFile(name) { addPath(name); } + PSaveFile(const QString& name, QObject* parent) : QSaveFile(name, parent) { addPath(name); } virtual ~PSaveFile() { if (auto app = APPLICATION_DYN) { - app->removeQSavePath(fileName() + "."); + app->removeQSavePath(m_absoluteFilePath); } } + + private: + void addPath(const QString& path) + { + m_absoluteFilePath = QFileInfo(path).absoluteFilePath() + "."; // add dot for tmp files only + if (auto app = APPLICATION_DYN) { + app->addQSavePath(m_absoluteFilePath); + } + } + QString m_absoluteFilePath; }; #else #define PSaveFile QSaveFile From 836aebc0d91fe8658052b8c4a5a4ab31da4a4b15 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 22 Oct 2024 13:43:16 +0300 Subject: [PATCH 273/616] fix small leak Signed-off-by: Trial97 --- launcher/ui/pages/instance/ModFolderPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index f2feb8c7f..a6fbf5088 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -124,7 +124,7 @@ ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr ui->actionsToolbar->addAction(ui->actionVisitItemPage); connect(ui->actionVisitItemPage, &QAction::triggered, this, &ModFolderPage::visitModPages); - auto changeVersion = new QAction(tr("Change Version")); + auto changeVersion = new QAction(tr("Change Version"), this); changeVersion->setToolTip(tr("Change mod version")); changeVersion->setEnabled(false); ui->actionsToolbar->insertActionAfter(ui->actionUpdateItem, changeVersion); From 210d0d8aa25578cbbf8250797504ae1652544600 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:48:29 +0000 Subject: [PATCH 274/616] chore(deps): update actions/cache action to v4.1.2 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a1ed0a25a..6c167d8f1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -173,7 +173,7 @@ jobs: - name: Retrieve ccache cache (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug' - uses: actions/cache@v4.1.1 + uses: actions/cache@v4.1.2 with: path: '${{ github.workspace }}\.ccache' key: ${{ matrix.os }}-mingw-w64-ccache-${{ github.run_id }} From f13e875f0d06c02803409dbb7be375691838d09d Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 22 Oct 2024 18:46:10 +0100 Subject: [PATCH 275/616] Try to fix ModrinthCheckUpdate (not working) Signed-off-by: TheKodeToad --- launcher/modplatform/CheckUpdateTask.h | 3 +- launcher/modplatform/flame/FlameCheckUpdate.h | 2 +- .../modrinth/ModrinthCheckUpdate.cpp | 109 ++++++++---------- .../modrinth/ModrinthCheckUpdate.h | 14 +-- 4 files changed, 59 insertions(+), 69 deletions(-) diff --git a/launcher/modplatform/CheckUpdateTask.h b/launcher/modplatform/CheckUpdateTask.h index 1ffcc97ce..540998287 100644 --- a/launcher/modplatform/CheckUpdateTask.h +++ b/launcher/modplatform/CheckUpdateTask.h @@ -21,7 +21,8 @@ class CheckUpdateTask : public Task { , m_resources(resources) , m_game_versions(mcVersions) , m_loaders_list(std::move(loadersList)) - , m_resource_model(resourceModel){}; + , m_resource_model(std::move(resourceModel)) + {} struct Update { QString name; diff --git a/launcher/modplatform/flame/FlameCheckUpdate.h b/launcher/modplatform/flame/FlameCheckUpdate.h index 0094bb13a..2b5c6ac17 100644 --- a/launcher/modplatform/flame/FlameCheckUpdate.h +++ b/launcher/modplatform/flame/FlameCheckUpdate.h @@ -12,7 +12,7 @@ class FlameCheckUpdate : public CheckUpdateTask { std::list& mcVersions, QList loadersList, std::shared_ptr resourceModel) - : CheckUpdateTask(resources, mcVersions, loadersList, resourceModel) + : CheckUpdateTask(resources, mcVersions, std::move(loadersList), std::move(resourceModel)) {} public slots: diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp index c004bd8f2..f77c5598a 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp @@ -29,7 +29,7 @@ bool ModrinthCheckUpdate::abort() void ModrinthCheckUpdate::executeTask() { setStatus(tr("Preparing resources for Modrinth...")); - setProgress(0, 9); + setProgress(0, (m_loaders_list.isEmpty() ? 1 : m_loaders_list.length()) * 2 + 1); auto hashing_task = makeShared(this, "MakeModrinthHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); @@ -54,10 +54,30 @@ void ModrinthCheckUpdate::executeTask() hashing_task->start(); } -void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr response, - ModPlatform::ModLoaderTypes loader, - bool forceModLoaderCheck) +void ModrinthCheckUpdate::getUpdateModsForLoader(std::optional loader) { + setStatus(tr("Waiting for the API response from Modrinth...")); + setProgress(m_progress + 1, m_progressTotal); + + auto response = std::make_shared(); + QStringList hashes = m_mappings.keys(); + auto job = api.latestVersions(hashes, m_hash_type, m_game_versions, loader, response); + + connect(job.get(), &Task::succeeded, this, + [this, response, loader] { checkVersionsResponse(response, loader); }); + + connect(job.get(), &Task::failed, this, &ModrinthCheckUpdate::checkNextLoader); + + m_job = job; + job->start(); +} + +void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr response, + std::optional loader) +{ + setStatus(tr("Parsing the API response from Modrinth...")); + setProgress(m_progress + 1, m_progressTotal); + QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); if (parse_error.error != QJsonParseError::NoError) { @@ -69,17 +89,11 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp return; } - setStatus(tr("Parsing the API response from Modrinth...")); - setProgress(m_next_loader_idx * 2, 9); - try { for (auto iter = m_mappings.begin(); iter != m_mappings.end(); iter++) { const QString& hash = iter.key(); Resource* resource = iter.value(); - if (forceModLoaderCheck && !(resource->metadata()->loaders & loader)) - continue; - auto project_obj = doc[hash].toObject(); // If the returned project is empty, but we have Modrinth metadata, @@ -97,7 +111,7 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp static auto flags = { ModPlatform::ModLoaderType::NeoForge, ModPlatform::ModLoaderType::Forge, ModPlatform::ModLoaderType::Quilt, ModPlatform::ModLoaderType::Fabric }; for (auto flag : flags) { - if (loader.testFlag(flag)) { + if (loader.has_value() && loader->testFlag(flag)) { loader_filter = ModPlatform::getModLoaderAsString(flag); break; } @@ -153,63 +167,38 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp checkNextLoader(); } -void ModrinthCheckUpdate::getUpdateModsForLoader(ModPlatform::ModLoaderTypes loader, bool forceModLoaderCheck) -{ - auto response = std::make_shared(); - QStringList hashes; - if (forceModLoaderCheck) { - for (auto hash : m_mappings.keys()) { - if (m_mappings[hash]->metadata()->loaders & loader) { - hashes.append(hash); - } - } - } else { - hashes = m_mappings.keys(); - } - auto job = api.latestVersions(hashes, m_hash_type, m_game_versions, loader, response); - - connect(job.get(), &Task::succeeded, this, - [this, response, loader, forceModLoaderCheck] { checkVersionsResponse(response, loader, forceModLoaderCheck); }); - - connect(job.get(), &Task::failed, this, &ModrinthCheckUpdate::checkNextLoader); - - setStatus(tr("Waiting for the API response from Modrinth...")); - setProgress(m_next_loader_idx * 2 - 1, 9); - - m_job = job; - job->start(); -} - void ModrinthCheckUpdate::checkNextLoader() { if (m_mappings.isEmpty()) { emitSucceeded(); return; } - if (m_next_loader_idx < m_loaders_list.size()) { - getUpdateModsForLoader(m_loaders_list.at(m_next_loader_idx)); - m_next_loader_idx++; - return; - } - static auto flags = { ModPlatform::ModLoaderType::NeoForge, ModPlatform::ModLoaderType::Forge, ModPlatform::ModLoaderType::Quilt, - ModPlatform::ModLoaderType::Fabric }; - for (auto flag : flags) { - if (!m_loaders_list.contains(flag)) { - m_loaders_list.append(flag); - m_next_loader_idx++; - setProgress(m_next_loader_idx * 2 - 1, 9); - for (auto resource : m_mappings) { - if (resource->metadata()->loaders & flag) { - getUpdateModsForLoader(flag, true); - return; - } - } - setProgress(m_next_loader_idx * 2, 9); + + if (m_loaders_list.size() == 0) { + if (m_loader_idx == 0) { + getUpdateModsForLoader({}); + m_loader_idx++; + return; } } - for (auto m : m_mappings) { - emit checkFailed(m, - tr("No valid version found for this mod. It's probably unavailable for the current game version / mod loader.")); + if (m_loader_idx < m_loaders_list.size()) { + getUpdateModsForLoader(m_loaders_list.at(m_loader_idx)); + m_loader_idx++; + return; } + + for (auto resource : m_mappings) { + QString reason; + + if (dynamic_cast(resource) != nullptr) + reason = + tr("No valid version found for this resource. It's probably unavailable for the current game " + "version / mod loader."); + else + reason = tr("No valid version found for this resource. It's probably unavailable for the current game version."); + + emit checkFailed(resource, reason); + } + emitSucceeded(); } diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.h b/launcher/modplatform/modrinth/ModrinthCheckUpdate.h index 0bbd21321..204b24784 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.h +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.h @@ -7,10 +7,10 @@ class ModrinthCheckUpdate : public CheckUpdateTask { public: ModrinthCheckUpdate(QList& resources, - std::list& mcVersions, - QList loadersList, - std::shared_ptr resourceModel) - : CheckUpdateTask(resources, mcVersions, loadersList, resourceModel) + std::list& mcVersions, + QList loadersList, + std::shared_ptr resourceModel) + : CheckUpdateTask(resources, mcVersions, std::move(loadersList), std::move(resourceModel)) , m_hash_type(ModPlatform::ProviderCapabilities::hashType(ModPlatform::ResourceProvider::MODRINTH).first()) {} @@ -19,13 +19,13 @@ class ModrinthCheckUpdate : public CheckUpdateTask { protected slots: void executeTask() override; - void getUpdateModsForLoader(ModPlatform::ModLoaderTypes loader, bool forceModLoaderCheck = false); - void checkVersionsResponse(std::shared_ptr response, ModPlatform::ModLoaderTypes loader, bool forceModLoaderCheck = false); + void getUpdateModsForLoader(std::optional loader); + void checkVersionsResponse(std::shared_ptr response, std::optional loader); void checkNextLoader(); private: Task::Ptr m_job = nullptr; QHash m_mappings; QString m_hash_type; - int m_next_loader_idx = 0; + int m_loader_idx = 0; }; From 3d82bc37af193acab7341ac1f48e3897952dfc6e Mon Sep 17 00:00:00 2001 From: Kaiyang Wu Date: Mon, 17 Jun 2024 22:41:46 -0700 Subject: [PATCH 276/616] javautils: add a filter for detecting Java paths on AOSC OS Signed-off-by: Kaiyang Wu --- launcher/java/JavaUtils.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index bc8026348..627f0c789 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -440,9 +440,15 @@ QList JavaUtils::FindJavaPaths() QString fileName = info.fileName(); return fileName.startsWith("openjdk-") || fileName.startsWith("openj9-"); }; + // AOSC OS's locations for openjdk + auto aoscFilter = [](const QFileInfo& info) { + QString fileName = info.fileName(); + return fileName == "java" || fileName.startsWith("java-"); + }; scanJavaDir("/usr/lib64", gentooFilter); scanJavaDir("/usr/lib", gentooFilter); scanJavaDir("/opt", gentooFilter); + scanJavaDir("/usr/lib", aoscFilter); // javas stored in Prism Launcher's folder scanJavaDirs("java"); // manually installed JDKs in /opt From e7cd8fe078e3a68bd3179816020a9ed08f1b2847 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 23 Oct 2024 13:44:39 +0100 Subject: [PATCH 277/616] Fix CleanEnviroment()'s usage of stripVariableEntries Signed-off-by: TheKodeToad --- launcher/java/JavaUtils.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index bc8026348..f3200428e 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -102,6 +102,8 @@ QProcessEnvironment CleanEnviroment() QString newValue = stripVariableEntries(key, value, rawenv.value("LAUNCHER_" + key)); qDebug() << "Env: stripped" << key << value << "to" << newValue; + + value = newValue; } #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) // Strip IBus From 24cecf7b63f91766d1b941c3b2f8e7e5d0971f36 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 23 Oct 2024 14:42:54 +0100 Subject: [PATCH 278/616] Fix compile Signed-off-by: TheKodeToad --- .../modplatform/modrinth/ModrinthInstanceCreationTask.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index f34fccfc5..4494f9371 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -303,8 +303,8 @@ bool ModrinthCreationTask::createInstance() loop.exec(); if (!ended_well) { - for (auto m : mods) { - delete m; + for (auto resource : resources) { + delete resource; } return ended_well; } @@ -324,8 +324,8 @@ bool ModrinthCreationTask::createInstance() m_task = ensureMetadataTask; ensureMetaLoop.exec(); - for (auto m : resources) { - delete m; + for (auto resource : resources) { + delete resource; } resources.clear(); From 92a906e0d499e5d93f1796246aa3630ae5f1bbd0 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 23 Oct 2024 14:58:52 +0100 Subject: [PATCH 279/616] Move everything in CheckUpdateTask::Update Signed-off-by: TheKodeToad --- launcher/modplatform/CheckUpdateTask.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/launcher/modplatform/CheckUpdateTask.h b/launcher/modplatform/CheckUpdateTask.h index 540998287..9d0b1c51a 100644 --- a/launcher/modplatform/CheckUpdateTask.h +++ b/launcher/modplatform/CheckUpdateTask.h @@ -45,14 +45,14 @@ class CheckUpdateTask : public Task { ModPlatform::ResourceProvider p, shared_qobject_ptr t, bool enabled = true) - : name(name) - , old_hash(old_h) - , old_version(old_v) - , new_version(new_v) - , new_version_type(new_v_type) - , changelog(changelog) + : name(std::move(name)) + , old_hash(std::move(old_h)) + , old_version(std::move(old_v)) + , new_version(std::move(new_v)) + , new_version_type(std::move(new_v_type)) + , changelog(std::move(changelog)) , provider(p) - , download(t) + , download(std::move(t)) , enabled(enabled) {} }; From 7bd04ae928527b065174021fba98dc78d0d119a3 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Wed, 23 Oct 2024 16:23:10 -0700 Subject: [PATCH 280/616] fix don't hang the ui for a full version load Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/Component.cpp | 5 +++-- launcher/minecraft/Component.h | 2 +- launcher/ui/pages/instance/VersionPage.cpp | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 1073ef324..ad7ef545c 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -222,11 +222,12 @@ bool Component::isMoveable() return true; } -bool Component::isVersionChangeable() +bool Component::isVersionChangeable(bool wait) { auto list = getVersionList(); if (list) { - list->waitToLoad(); + if (wait) + list->waitToLoad(); return list->count() != 0; } return false; diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 7ff30889f..203cc2241 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -72,7 +72,7 @@ class Component : public QObject, public ProblemProvider { bool isRevertible(); bool isRemovable(); bool isCustom(); - bool isVersionChangeable(); + bool isVersionChangeable(bool wait = true); bool isKnownModloader(); QStringList knownConflictingComponents(); diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index 0c25b4c0c..cb04f9db1 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -243,7 +243,7 @@ void VersionPage::updateButtons(int row) ui->actionRemove->setEnabled(patch && patch->isRemovable()); ui->actionMove_down->setEnabled(patch && patch->isMoveable()); ui->actionMove_up->setEnabled(patch && patch->isMoveable()); - ui->actionChange_version->setEnabled(patch && patch->isVersionChangeable()); + ui->actionChange_version->setEnabled(patch && patch->isVersionChangeable(false)); ui->actionEdit->setEnabled(patch && patch->isCustom()); ui->actionCustomize->setEnabled(patch && patch->isCustomizable()); ui->actionRevert->setEnabled(patch && patch->isRevertible()); From 8e586c883c5da83f1c91404625f5030f6985920e Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 24 Oct 2024 01:16:06 +0100 Subject: [PATCH 281/616] Fix Modrinth update crashing Signed-off-by: TheKodeToad --- .../modrinth/ModrinthCheckUpdate.cpp | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp index f77c5598a..e38ca526f 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp @@ -63,8 +63,7 @@ void ModrinthCheckUpdate::getUpdateModsForLoader(std::optionalstart(); } -void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr response, - std::optional loader) +void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr response, std::optional loader) { setStatus(tr("Parsing the API response from Modrinth...")); setProgress(m_progress + 1, m_progressTotal); @@ -90,8 +88,10 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp } try { - for (auto iter = m_mappings.begin(); iter != m_mappings.end(); iter++) { - const QString& hash = iter.key(); + auto iter = m_mappings.begin(); + + while (iter != m_mappings.end()) { + const QString hash = iter.key(); Resource* resource = iter.value(); auto project_obj = doc[hash].toObject(); @@ -101,7 +101,7 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp if (project_obj.isEmpty()) { qDebug() << "Mod " << m_mappings.find(hash).value()->name() << " got an empty response." << "Hash: " << hash; - + ++iter; continue; } @@ -126,23 +126,15 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp auto project_ver = Modrinth::loadIndexedPackVersion(project_obj, m_hash_type, loader_filter); if (project_ver.downloadUrl.isEmpty()) { qCritical() << "Modrinth mod without download url!" << project_ver.fileName; - + ++iter; continue; } - auto mod_iter = m_mappings.find(hash); - if (mod_iter == m_mappings.end()) { - qCritical() << "Failed to remap mod from Modrinth!"; - continue; - } - auto mod = *mod_iter; - m_mappings.remove(hash); - // Fake pack with the necessary info to pass to the download task :) auto pack = std::make_shared(); - pack->name = mod->name(); - pack->slug = mod->metadata()->slug; - pack->addonId = mod->metadata()->project_id; + pack->name = resource->name(); + pack->slug = resource->metadata()->slug; + pack->addonId = resource->metadata()->project_id; pack->provider = ModPlatform::ResourceProvider::MODRINTH; if ((project_ver.hash != hash && project_ver.is_preferred) || (resource->status() == ResourceStatus::NOT_INSTALLED)) { auto download_task = makeShared(pack, project_ver, m_resource_model); @@ -159,6 +151,8 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp project_ver.changelog, ModPlatform::ResourceProvider::MODRINTH, download_task); } m_deps.append(std::make_shared(pack, project_ver)); + + iter = m_mappings.erase(iter); } } catch (Json::JsonException& e) { emitFailed(e.cause() + ": " + e.what()); @@ -184,7 +178,7 @@ void ModrinthCheckUpdate::checkNextLoader() if (m_loader_idx < m_loaders_list.size()) { getUpdateModsForLoader(m_loaders_list.at(m_loader_idx)); m_loader_idx++; - return; + return; } for (auto resource : m_mappings) { From 5eff9b093451f7c9248832cb9712d5a5fdac5b22 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 24 Oct 2024 01:23:11 +0100 Subject: [PATCH 282/616] Fix column crashes Signed-off-by: TheKodeToad --- launcher/minecraft/mod/ResourceFolderModel.h | 2 +- launcher/minecraft/mod/ResourcePackFolderModel.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index c3ce822c8..a92648de9 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -256,7 +256,7 @@ class ResourceFolderModel : public QAbstractListModel { QList m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::DATE, SortType::PROVIDER, SortType::SIZE }; QStringList m_column_names = { "Enable", "Name", "Last Modified", "Provider", "Size" }; QStringList m_column_names_translated = { tr("Enable"), tr("Name"), tr("Last Modified"), tr("Provider"), tr("Size") }; - QList m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive, + QList m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive, QHeaderView::Interactive }; QList m_columnsHideable = { false, false, true, true, true }; QList m_columnsHiddenByDefault = { false, false, false, false, true }; diff --git a/launcher/minecraft/mod/ResourcePackFolderModel.cpp b/launcher/minecraft/mod/ResourcePackFolderModel.cpp index d41420c5f..84c34582b 100644 --- a/launcher/minecraft/mod/ResourcePackFolderModel.cpp +++ b/launcher/minecraft/mod/ResourcePackFolderModel.cpp @@ -55,7 +55,7 @@ ResourcePackFolderModel::ResourcePackFolderModel(const QDir& dir, BaseInstance* QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Pack Format"), tr("Last Modified"), tr("Provider"), tr("Size") }); m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::PACK_FORMAT, SortType::DATE, SortType::PROVIDER, SortType::SIZE }; - m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, + m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive }; m_columnsHideable = { false, true, false, true, true, true, true }; } From d8702e1357d36423a0d40b916d49fd937284a204 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 24 Oct 2024 01:33:01 +0100 Subject: [PATCH 283/616] Use Launcher log level in AutoInstallJava Signed-off-by: TheKodeToad --- launcher/minecraft/launch/AutoInstallJava.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index b23b23ed2..1083b7efb 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -78,7 +78,7 @@ void AutoInstallJava::executeTask() auto java = std::dynamic_pointer_cast(javas->at(i)); if (java && packProfile->getProfile()->getCompatibleJavaMajors().contains(java->id.major())) { if (!java->is_64bit) { - emit logLine(tr("The automatic Java mechanism detected a 32-bit installation of Java."), MessageLevel::Info); + emit logLine(tr("The automatic Java mechanism detected a 32-bit installation of Java."), MessageLevel::Launcher); } setJavaPath(java->path); return; @@ -136,7 +136,7 @@ void AutoInstallJava::setJavaPath(QString path) settings->set("OverrideJavaLocation", true); settings->set("JavaPath", path); settings->set("AutomaticJava", true); - emit logLine(tr("Compatible Java found at: %1.").arg(path), MessageLevel::Info); + emit logLine(tr("Compatible Java found at: %1.").arg(path), MessageLevel::Launcher); emitSucceeded(); } From 4ce025c0a209a4eec20f7f1b9a7777bbe886be8c Mon Sep 17 00:00:00 2001 From: Arcitec <38923130+Arcitec@users.noreply.github.com> Date: Thu, 24 Oct 2024 09:52:40 +0200 Subject: [PATCH 284/616] fix: bring back Flathub manifest improvements to the repo - Brings back all manifest improvements, such as the incredibly important Mojang Java Downloader (without it, the Flatpak doesn't work), and important fixes for Wayland. Signed-off-by: Arcitec <38923130+Arcitec@users.noreply.github.com> --- flatpak/flite.json | 20 +++++++ flatpak/libdecor.json | 36 +++++------ flatpak/org.prismlauncher.PrismLauncher.yml | 27 +++++---- ...on-t-crash-on-calls-to-focus-or-icon.patch | 24 -------- ...ning-about-being-an-unofficial-patch.patch | 17 ------ ...007-Platform-Prefer-Wayland-over-X11.patch | 20 ------- ...rsor-position-until-the-cursor-is-lo.patch | 59 +++++++++++++++++++ flatpak/patches/weird_libdecor.patch | 40 ------------- 8 files changed, 112 insertions(+), 131 deletions(-) create mode 100644 flatpak/flite.json delete mode 100644 flatpak/patches/0003-Don-t-crash-on-calls-to-focus-or-icon.patch delete mode 100644 flatpak/patches/0005-Add-warning-about-being-an-unofficial-patch.patch delete mode 100644 flatpak/patches/0007-Platform-Prefer-Wayland-over-X11.patch create mode 100644 flatpak/patches/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch delete mode 100644 flatpak/patches/weird_libdecor.patch diff --git a/flatpak/flite.json b/flatpak/flite.json new file mode 100644 index 000000000..1bf280af1 --- /dev/null +++ b/flatpak/flite.json @@ -0,0 +1,20 @@ +{ + "name": "flite", + "config-opts": [ + "--enable-shared", + "--with-audio=pulseaudio" + ], + "no-parallel-make": true, + "sources": [ + { + "type": "git", + "url": "https://github.com/festvox/flite.git", + "tag": "v2.2", + "commit": "e9e2e37c329dbe98bfeb27a1828ef9a71fa84f88", + "x-checker-data": { + "type": "git", + "tag-pattern": "^v([\\d.]+)$" + } + } + ] +} diff --git a/flatpak/libdecor.json b/flatpak/libdecor.json index 589310a35..1652a2f04 100644 --- a/flatpak/libdecor.json +++ b/flatpak/libdecor.json @@ -1,22 +1,18 @@ { - "name": "libdecor", - "buildsystem": "meson", - "config-opts": [ - "-Ddemo=false" - ], - "sources": [ - { - "type": "git", - "url": "https://gitlab.freedesktop.org/libdecor/libdecor.git", - "commit": "73260393a97291c887e1074ab7f318e031be0ac6" - }, - { - "type": "patch", - "path": "patches/weird_libdecor.patch" - } - ], - "cleanup": [ - "/include", - "/lib/pkgconfig" - ] + "name": "libdecor", + "buildsystem": "meson", + "config-opts": [ + "-Ddemo=false" + ], + "sources": [ + { + "type": "git", + "url": "https://gitlab.freedesktop.org/libdecor/libdecor.git", + "commit": "c2bd8ad6fa42c0cb17553ce77ad8a87d1f543b1f" + } + ], + "cleanup": [ + "/include", + "/lib/pkgconfig" + ] } diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml index 09dd8d73b..7aaa4f379 100644 --- a/flatpak/org.prismlauncher.PrismLauncher.yml +++ b/flatpak/org.prismlauncher.PrismLauncher.yml @@ -1,6 +1,6 @@ id: org.prismlauncher.PrismLauncher runtime: org.kde.Platform -runtime-version: 6.7 +runtime-version: '6.7' sdk: org.kde.Sdk sdk-extensions: - org.freedesktop.Sdk.Extension.openjdk17 @@ -19,6 +19,12 @@ finish-args: - --filesystem=xdg-download:ro # FTBApp import - --filesystem=~/.ftba:ro + # Userspace visibility for manual hugepages configuration + # Required for -XX:+UseLargePages + - --filesystem=/sys/kernel/mm/hugepages:ro + # Userspace visibility for transparent hugepages configuration + # Required for -XX:+UseTransparentHugePages + - --filesystem=/sys/kernel/mm/transparent_hugepage:ro modules: # Might be needed by some Controller mods (see https://github.com/isXander/Controlify/issues/31) @@ -27,11 +33,16 @@ modules: # Needed for proper Wayland support - libdecor.json + # Text to Speech in the game + - flite.json + - name: prismlauncher buildsystem: cmake-ninja builddir: true config-opts: - -DLauncher_BUILD_PLATFORM=flatpak + # This allows us to manage and update Java independently of this Flatpak + - -DLauncher_ENABLE_JAVA_DOWNLOADER=ON - -DCMAKE_BUILD_TYPE=RelWithDebInfo build-options: env: @@ -47,18 +58,14 @@ modules: config-opts: - -DCMAKE_BUILD_TYPE=RelWithDebInfo - -DBUILD_SHARED_LIBS:BOOL=ON - - -DGLFW_USE_WAYLAND:BOOL=ON + - -DGLFW_BUILD_WAYLAND:BOOL=ON - -DGLFW_BUILD_DOCS:BOOL=OFF sources: - type: git url: https://github.com/glfw/glfw.git - commit: 3fa2360720eeba1964df3c0ecf4b5df8648a8e52 + commit: 7b6aead9fb88b3623e3b3725ebb42670cbe4c579 # 3.4 - type: patch - path: patches/0003-Don-t-crash-on-calls-to-focus-or-icon.patch - - type: patch - path: patches/0005-Add-warning-about-being-an-unofficial-patch.patch - - type: patch - path: patches/0007-Platform-Prefer-Wayland-over-X11.patch + path: patches/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch cleanup: - /include - /lib/cmake @@ -91,8 +98,8 @@ modules: sources: - type: archive dest-filename: gamemode.tar.gz - url: https://api.github.com/repos/FeralInteractive/gamemode/tarball/1.8.1 - sha256: 969cf85b5ca3944f3e315cd73a0ee9bea4f9c968cd7d485e9f4745bc1e679c4e + url: https://api.github.com/repos/FeralInteractive/gamemode/tarball/1.8.2 + sha256: 2886d4ce543c78bd2a364316d5e7fd59ef06b71de63f896b37c6d3dc97658f60 x-checker-data: type: json url: https://api.github.com/repos/FeralInteractive/gamemode/releases/latest diff --git a/flatpak/patches/0003-Don-t-crash-on-calls-to-focus-or-icon.patch b/flatpak/patches/0003-Don-t-crash-on-calls-to-focus-or-icon.patch deleted file mode 100644 index 9130e856c..000000000 --- a/flatpak/patches/0003-Don-t-crash-on-calls-to-focus-or-icon.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/src/wl_window.c b/src/wl_window.c -index 52d3b9eb..4ac4eb5d 100644 ---- a/src/wl_window.c -+++ b/src/wl_window.c -@@ -2117,8 +2117,7 @@ void _glfwSetWindowTitleWayland(_GLFWwindow* window, const char* title) - void _glfwSetWindowIconWayland(_GLFWwindow* window, - int count, const GLFWimage* images) - { -- _glfwInputError(GLFW_FEATURE_UNAVAILABLE, -- "Wayland: The platform does not support setting the window icon"); -+ fprintf(stderr, "!!! Ignoring Error: Wayland: The platform does not support setting the window icon\n"); - } - - void _glfwGetWindowPosWayland(_GLFWwindow* window, int* xpos, int* ypos) -@@ -2361,8 +2360,7 @@ void _glfwRequestWindowAttentionWayland(_GLFWwindow* window) - - void _glfwFocusWindowWayland(_GLFWwindow* window) - { -- _glfwInputError(GLFW_FEATURE_UNAVAILABLE, -- "Wayland: The platform does not support setting the input focus"); -+ fprintf(stderr, "!!! Ignoring Error: Wayland: The platform does not support setting the input focus\n"); - } - - void _glfwSetWindowMonitorWayland(_GLFWwindow* window, diff --git a/flatpak/patches/0005-Add-warning-about-being-an-unofficial-patch.patch b/flatpak/patches/0005-Add-warning-about-being-an-unofficial-patch.patch deleted file mode 100644 index b031d739f..000000000 --- a/flatpak/patches/0005-Add-warning-about-being-an-unofficial-patch.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/src/init.c b/src/init.c -index 06dbb3f2..a7c6da86 100644 ---- a/src/init.c -+++ b/src/init.c -@@ -449,6 +449,12 @@ GLFWAPI int glfwInit(void) - _glfw.initialized = GLFW_TRUE; - - glfwDefaultWindowHints(); -+ -+ fprintf(stderr, "!!! Patched GLFW from https://github.com/Admicos/minecraft-wayland\n" -+ "!!! If any issues with the window, or some issues with rendering, occur, " -+ "first try with the built-in GLFW, and if that solves the issue, report there first.\n" -+ "!!! Use outside Minecraft is untested, and things might break.\n"); -+ - return GLFW_TRUE; - } - diff --git a/flatpak/patches/0007-Platform-Prefer-Wayland-over-X11.patch b/flatpak/patches/0007-Platform-Prefer-Wayland-over-X11.patch deleted file mode 100644 index 4eeb81309..000000000 --- a/flatpak/patches/0007-Platform-Prefer-Wayland-over-X11.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/src/platform.c b/src/platform.c -index c5966ae7..3e7442f9 100644 ---- a/src/platform.c -+++ b/src/platform.c -@@ -49,12 +49,12 @@ static const struct - #if defined(_GLFW_COCOA) - { GLFW_PLATFORM_COCOA, _glfwConnectCocoa }, - #endif --#if defined(_GLFW_X11) -- { GLFW_PLATFORM_X11, _glfwConnectX11 }, --#endif - #if defined(_GLFW_WAYLAND) - { GLFW_PLATFORM_WAYLAND, _glfwConnectWayland }, - #endif -+#if defined(_GLFW_X11) -+ { GLFW_PLATFORM_X11, _glfwConnectX11 }, -+#endif - }; - - GLFWbool _glfwSelectPlatform(int desiredID, _GLFWplatform* platform) diff --git a/flatpak/patches/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch b/flatpak/patches/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch new file mode 100644 index 000000000..70cec9981 --- /dev/null +++ b/flatpak/patches/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch @@ -0,0 +1,59 @@ +From 9997ae55a47de469ea26f8437c30b51483abda5f Mon Sep 17 00:00:00 2001 +From: Dan Klishch +Date: Sat, 30 Sep 2023 23:38:05 -0400 +Subject: Defer setting cursor position until the cursor is locked + +--- + src/wl_platform.h | 3 +++ + src/wl_window.c | 14 ++++++++++++-- + 2 files changed, 15 insertions(+), 2 deletions(-) + +diff --git a/src/wl_platform.h b/src/wl_platform.h +index ca34f66e..cd1f227f 100644 +--- a/src/wl_platform.h ++++ b/src/wl_platform.h +@@ -403,6 +403,9 @@ typedef struct _GLFWwindowWayland + int scaleSize; + int compositorPreferredScale; + ++ double askedCursorPosX, askedCursorPosY; ++ GLFWbool didAskForSetCursorPos; ++ + struct zwp_relative_pointer_v1* relativePointer; + struct zwp_locked_pointer_v1* lockedPointer; + struct zwp_confined_pointer_v1* confinedPointer; +diff --git a/src/wl_window.c b/src/wl_window.c +index 1de26558..0df16747 100644 +--- a/src/wl_window.c ++++ b/src/wl_window.c +@@ -2586,8 +2586,9 @@ void _glfwGetCursorPosWayland(_GLFWwindow* window, double* xpos, double* ypos) + + void _glfwSetCursorPosWayland(_GLFWwindow* window, double x, double y) + { +- _glfwInputError(GLFW_FEATURE_UNAVAILABLE, +- "Wayland: The platform does not support setting the cursor position"); ++ window->wl.didAskForSetCursorPos = true; ++ window->wl.askedCursorPosX = x; ++ window->wl.askedCursorPosY = y; + } + + void _glfwSetCursorModeWayland(_GLFWwindow* window, int mode) +@@ -2819,6 +2820,15 @@ static const struct zwp_relative_pointer_v1_listener relativePointerListener = + static void lockedPointerHandleLocked(void* userData, + struct zwp_locked_pointer_v1* lockedPointer) + { ++ _GLFWwindow* window = userData; ++ ++ if (window->wl.didAskForSetCursorPos) ++ { ++ window->wl.didAskForSetCursorPos = false; ++ zwp_locked_pointer_v1_set_cursor_position_hint(window->wl.lockedPointer, ++ wl_fixed_from_double(window->wl.askedCursorPosX), ++ wl_fixed_from_double(window->wl.askedCursorPosY)); ++ } + } + + static void lockedPointerHandleUnlocked(void* userData, +-- +2.42.0 + diff --git a/flatpak/patches/weird_libdecor.patch b/flatpak/patches/weird_libdecor.patch deleted file mode 100644 index 3a400b820..000000000 --- a/flatpak/patches/weird_libdecor.patch +++ /dev/null @@ -1,40 +0,0 @@ -diff --git a/src/libdecor.c b/src/libdecor.c -index a9c1106..1aa38b3 100644 ---- a/src/libdecor.c -+++ b/src/libdecor.c -@@ -1391,22 +1391,32 @@ calculate_priority(const struct libdecor_plugin_description *plugin_description) - static bool - check_symbol_conflicts(const struct libdecor_plugin_description *plugin_description) - { -+ bool ret = true; - char * const *symbol; -+ void* main_prog = dlopen(NULL, RTLD_LAZY); -+ if (!main_prog) { -+ fprintf(stderr, "Plugin \"%s\" couldn't check conflicting symbols: \"%s\".\n", -+ plugin_description->description, dlerror()); -+ return false; -+ } -+ - - symbol = plugin_description->conflicting_symbols; - while (*symbol) { - dlerror(); -- dlsym (RTLD_DEFAULT, *symbol); -+ dlsym (main_prog, *symbol); - if (!dlerror()) { - fprintf(stderr, "Plugin \"%s\" uses conflicting symbol \"%s\".\n", - plugin_description->description, *symbol); -- return false; -+ ret = false; -+ break; - } - - symbol++; - } - -- return true; -+ dlclose(main_prog); -+ return ret; - } - - static struct plugin_loader * From 3bc40120cd0208812a8d1137b8f9989ee5d12dfb Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 25 Oct 2024 00:17:34 +0300 Subject: [PATCH 285/616] bump develop to 10 Signed-off-by: Trial97 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b677b0b7c..cec384b33 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,7 +180,7 @@ set(Launcher_LOGIN_CALLBACK_URL "https://prismlauncher.org/successful-login" CAC set(Launcher_FMLLIBS_BASE_URL "https://files.prismlauncher.org/fmllibs/" CACHE STRING "URL for FML Libraries.") ######## Set version numbers ######## -set(Launcher_VERSION_MAJOR 9) +set(Launcher_VERSION_MAJOR 10) set(Launcher_VERSION_MINOR 0) set(Launcher_VERSION_NAME "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}") From 8daa1219a508ddb37070c01046c78b731a277887 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 25 Oct 2024 01:05:58 +0300 Subject: [PATCH 286/616] add extra protection against empty download link Signed-off-by: Trial97 --- launcher/ui/pages/modplatform/ResourcePage.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index dea28d6d5..6d5966056 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -39,6 +39,7 @@ #include "ResourcePage.h" #include "modplatform/ModIndex.h" +#include "ui/dialogs/CustomMessageBox.h" #include "ui_ResourcePage.h" #include @@ -324,9 +325,9 @@ void ResourcePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI updateUi(); } -void ResourcePage::onVersionSelectionChanged(int index) +void ResourcePage::onVersionSelectionChanged(int) { - m_selected_version_index = index; + m_selected_version_index = m_ui->versionSelectionBox->currentData().toInt(); updateSelectionButton(); } @@ -358,10 +359,18 @@ void ResourcePage::onResourceSelected() return; auto current_pack = getCurrentPack(); - if (!current_pack || !current_pack->versionsLoaded) + if (!current_pack || !current_pack->versionsLoaded || current_pack->versions.size() < m_selected_version_index) return; auto& version = current_pack->versions[m_selected_version_index]; + if (version.downloadUrl.isNull()) { + CustomMessageBox::selectable(this, tr("How?"), + "You managed to select a resource that doesn't have a download link. Because of this missing " + "information prism will not try to download it.", + QMessageBox::Warning) + ->show(); + return; + } if (version.is_currently_selected) removeResourceFromDialog(current_pack->name); else From a5c554cf6ee32afa41c5a2af1ea8e8feb0087a49 Mon Sep 17 00:00:00 2001 From: seth Date: Fri, 25 Oct 2024 02:33:29 -0400 Subject: [PATCH 287/616] chore(nix): sync with nixpkgs Signed-off-by: seth --- nix/unwrapped.nix | 22 +++++---- nix/wrapper.nix | 115 ++++++++++++++++++++-------------------------- 2 files changed, 64 insertions(+), 73 deletions(-) diff --git a/nix/unwrapped.nix b/nix/unwrapped.nix index 7fc383ff3..237f36c1f 100644 --- a/nix/unwrapped.nix +++ b/nix/unwrapped.nix @@ -9,20 +9,21 @@ ghc_filesystem, jdk17, kdePackages, + libnbtplusplus, ninja, nix-filter, self, stripJavaArchivesHook, tomlplusplus, - zlib, - msaClientID ? null, - gamemodeSupport ? stdenv.isLinux, version, - libnbtplusplus, + zlib, + + msaClientID ? null, + gamemodeSupport ? stdenv.hostPlatform.isLinux, }: assert lib.assertMsg ( - gamemodeSupport -> stdenv.isLinux + gamemodeSupport -> stdenv.hostPlatform.isLinux ) "gamemodeSupport is only available on Linux."; stdenv.mkDerivation { @@ -66,20 +67,23 @@ stdenv.mkDerivation { tomlplusplus zlib ] - ++ lib.optionals stdenv.isDarwin [ darwin.apple_sdk.frameworks.Cocoa ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ darwin.apple_sdk.frameworks.Cocoa ] ++ lib.optional gamemodeSupport gamemode; - hardeningEnable = lib.optionals stdenv.isLinux [ "pie" ]; + hardeningEnable = lib.optionals stdenv.hostPlatform.isLinux [ "pie" ]; cmakeFlags = - [ (lib.cmakeFeature "Launcher_BUILD_PLATFORM" "nixpkgs") ] + [ + # downstream branding + (lib.cmakeFeature "Launcher_BUILD_PLATFORM" "nixpkgs") + ] ++ lib.optionals (msaClientID != null) [ (lib.cmakeFeature "Launcher_MSA_CLIENT_ID" (toString msaClientID)) ] ++ lib.optionals (lib.versionOlder kdePackages.qtbase.version "6") [ (lib.cmakeFeature "Launcher_QT_VERSION_MAJOR" "5") ] - ++ lib.optionals stdenv.isDarwin [ + ++ lib.optionals stdenv.hostPlatform.isDarwin [ # we wrap our binary manually (lib.cmakeFeature "INSTALL_BUNDLE" "nodeps") # disable built-in updater diff --git a/nix/wrapper.nix b/nix/wrapper.nix index 5632d483b..ab9b7144b 100644 --- a/nix/wrapper.nix +++ b/nix/wrapper.nix @@ -1,73 +1,65 @@ { - lib, - stdenv, - symlinkJoin, - prismlauncher-unwrapped, - addOpenGLRunpath, + addDriverRunpath, + alsa-lib, flite, gamemode, - glfw, - glfw-wayland-minecraft, - glxinfo, - jdk8, + glfw3-minecraft, jdk17, jdk21, + jdk8, kdePackages, + lib, libGL, + libX11, + libXcursor, + libXext, + libXrandr, + libXxf86vm, + libjack2, libpulseaudio, libusb1, - makeWrapper, + mesa-demos, openal, pciutils, + pipewire, + prismlauncher-unwrapped, + stdenv, + symlinkJoin, udev, vulkan-loader, - xorg, + xrandr, + additionalLibs ? [ ], additionalPrograms ? [ ], - controllerSupport ? stdenv.isLinux, - gamemodeSupport ? stdenv.isLinux, + controllerSupport ? stdenv.hostPlatform.isLinux, + gamemodeSupport ? stdenv.hostPlatform.isLinux, jdks ? [ jdk21 jdk17 jdk8 ], msaClientID ? null, - textToSpeechSupport ? stdenv.isLinux, - # Adds `glfw-wayland-minecraft` to `LD_LIBRARY_PATH` - # when launched on wayland, allowing for the game to be run natively. - # Make sure to enable "Use system installation of GLFW" in instance settings - # for this to take effect - # - # Warning: This build of glfw may be unstable, and the launcher - # itself can take slightly longer to start - withWaylandGLFW ? false, + textToSpeechSupport ? stdenv.hostPlatform.isLinux, }: assert lib.assertMsg ( - controllerSupport -> stdenv.isLinux + controllerSupport -> stdenv.hostPlatform.isLinux ) "controllerSupport only has an effect on Linux."; assert lib.assertMsg ( - textToSpeechSupport -> stdenv.isLinux + textToSpeechSupport -> stdenv.hostPlatform.isLinux ) "textToSpeechSupport only has an effect on Linux."; -assert lib.assertMsg ( - withWaylandGLFW -> stdenv.isLinux -) "withWaylandGLFW is only available on Linux."; - let prismlauncher' = prismlauncher-unwrapped.override { inherit msaClientID gamemodeSupport; }; in + symlinkJoin { name = "prismlauncher-${prismlauncher'.version}"; paths = [ prismlauncher' ]; - nativeBuildInputs = - [ kdePackages.wrapQtAppsHook ] - # purposefully using a shell wrapper here for variable expansion - # see https://github.com/NixOS/nixpkgs/issues/172583 - ++ lib.optional withWaylandGLFW makeWrapper; + nativeBuildInputs = [ kdePackages.wrapQtAppsHook ]; buildInputs = [ @@ -75,45 +67,39 @@ symlinkJoin { kdePackages.qtsvg ] ++ lib.optional ( - lib.versionAtLeast kdePackages.qtbase.version "6" && stdenv.isLinux + lib.versionAtLeast kdePackages.qtbase.version "6" && stdenv.hostPlatform.isLinux ) kdePackages.qtwayland; - env = { - waylandPreExec = lib.optionalString withWaylandGLFW '' - if [ -n "$WAYLAND_DISPLAY" ]; then - export LD_LIBRARY_PATH=${lib.getLib glfw-wayland-minecraft}/lib:"$LD_LIBRARY_PATH" - fi - ''; - }; - - postBuild = - lib.optionalString withWaylandGLFW '' - qtWrapperArgs+=(--run "$waylandPreExec") - '' - + '' - wrapQtAppsHook - ''; + postBuild = '' + wrapQtAppsHook + ''; qtWrapperArgs = let runtimeLibs = [ - # lwjgl - glfw - libpulseaudio - libGL - openal stdenv.cc.cc.lib + ## native versions + glfw3-minecraft + openal - vulkan-loader # VulkanMod's lwjgl + ## openal + alsa-lib + libjack2 + libpulseaudio + pipewire + + ## glfw + libGL + libX11 + libXcursor + libXext + libXrandr + libXxf86vm udev # oshi - xorg.libX11 - xorg.libXext - xorg.libXcursor - xorg.libXrandr - xorg.libXxf86vm + vulkan-loader # VulkanMod's lwjgl ] ++ lib.optional textToSpeechSupport flite ++ lib.optional gamemodeSupport gamemode.lib @@ -121,14 +107,15 @@ symlinkJoin { ++ additionalLibs; runtimePrograms = [ - glxinfo + mesa-demos pciutils # need lspci - xorg.xrandr # needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128 + xrandr # needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128 ] ++ additionalPrograms; + in [ "--prefix PRISMLAUNCHER_JAVA_PATHS : ${lib.makeSearchPath "bin/java" jdks}" ] - ++ lib.optionals stdenv.isLinux [ - "--set LD_LIBRARY_PATH ${addOpenGLRunpath.driverLink}/lib:${lib.makeLibraryPath runtimeLibs}" + ++ lib.optionals stdenv.hostPlatform.isLinux [ + "--set LD_LIBRARY_PATH ${addDriverRunpath.driverLink}/lib:${lib.makeLibraryPath runtimeLibs}" "--prefix PATH : ${lib.makeBinPath runtimePrograms}" ]; From 63b10738b2a1065d55077e729fcada6e7f64d10a Mon Sep 17 00:00:00 2001 From: seth Date: Fri, 25 Oct 2024 02:34:15 -0400 Subject: [PATCH 288/616] chore(nix): use `self` for version Signed-off-by: seth --- flake.nix | 26 ++++++++++---------------- nix/unwrapped.nix | 3 +-- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/flake.nix b/flake.nix index f4ca782ec..54add656d 100644 --- a/flake.nix +++ b/flake.nix @@ -85,24 +85,18 @@ formatter = forAllSystems (system: nixpkgsFor.${system}.nixfmt-rfc-style); - overlays.default = - final: prev: - let - version = builtins.substring 0 8 self.lastModifiedDate or "dirty"; - in - { - prismlauncher-unwrapped = prev.callPackage ./nix/unwrapped.nix { - inherit - libnbtplusplus - nix-filter - self - version - ; - }; - - prismlauncher = final.callPackage ./nix/wrapper.nix { }; + overlays.default = final: prev: { + prismlauncher-unwrapped = prev.callPackage ./nix/unwrapped.nix { + inherit + libnbtplusplus + nix-filter + self + ; }; + prismlauncher = final.callPackage ./nix/wrapper.nix { }; + }; + packages = forAllSystems ( system: let diff --git a/nix/unwrapped.nix b/nix/unwrapped.nix index 237f36c1f..1b14886ef 100644 --- a/nix/unwrapped.nix +++ b/nix/unwrapped.nix @@ -15,7 +15,6 @@ self, stripJavaArchivesHook, tomlplusplus, - version, zlib, msaClientID ? null, @@ -28,7 +27,7 @@ assert lib.assertMsg ( stdenv.mkDerivation { pname = "prismlauncher-unwrapped"; - inherit version; + version = self.shortRev or self.dirtyShortRev or "unknown"; src = nix-filter.lib { root = self; From 13e13ea8fcda9ae8c25b90f697b9f19172eb56cd Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 25 Oct 2024 19:13:41 +0100 Subject: [PATCH 289/616] Use non-mod metadata in ModrinthPackExportTask Signed-off-by: TheKodeToad --- launcher/minecraft/MinecraftInstance.cpp | 14 +- launcher/minecraft/MinecraftInstance.h | 1 + launcher/modplatform/helpers/HashUtils.cpp | 2 +- .../modrinth/ModrinthPackExportTask.cpp | 179 ++++++++++-------- .../modrinth/ModrinthPackExportTask.h | 13 +- launcher/ui/MainWindow.cpp | 27 ++- launcher/ui/dialogs/ExportPackDialog.cpp | 11 +- launcher/ui/dialogs/ExportPackDialog.h | 5 +- 8 files changed, 143 insertions(+), 109 deletions(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 2b24ec090..87bd1b703 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -522,7 +522,8 @@ QStringList MinecraftInstance::javaArguments() if (javaVersion.isModular() && shouldApplyOnlineFixes()) // allow reflective access to java.net - required by the skin fix - args << "--add-opens" << "java.base/java.net=ALL-UNNAMED"; + args << "--add-opens" + << "java.base/java.net=ALL-UNNAMED"; return args; } @@ -796,8 +797,10 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session, MinecraftT QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session, MinecraftTarget::Ptr targetToJoin) { QStringList out; - out << "Main Class:" << " " + getMainClass() << ""; - out << "Native path:" << " " + getNativePath() << ""; + out << "Main Class:" + << " " + getMainClass() << ""; + out << "Native path:" + << " " + getNativePath() << ""; auto profile = m_components->getProfile(); @@ -1227,6 +1230,11 @@ std::shared_ptr MinecraftInstance::shaderPackList() return m_shader_pack_list; } +QList> MinecraftInstance::resourceLists() +{ + return { loaderModList(), coreModList(), nilModList(), resourcePackList(), texturePackList(), shaderPackList() }; +} + std::shared_ptr MinecraftInstance::worldList() { if (!m_world_list) { diff --git a/launcher/minecraft/MinecraftInstance.h b/launcher/minecraft/MinecraftInstance.h index 75e97ae45..5d9bb45ef 100644 --- a/launcher/minecraft/MinecraftInstance.h +++ b/launcher/minecraft/MinecraftInstance.h @@ -116,6 +116,7 @@ class MinecraftInstance : public BaseInstance { std::shared_ptr resourcePackList(); std::shared_ptr texturePackList(); std::shared_ptr shaderPackList(); + QList> resourceLists(); std::shared_ptr worldList(); std::shared_ptr gameOptionsModel(); diff --git a/launcher/modplatform/helpers/HashUtils.cpp b/launcher/modplatform/helpers/HashUtils.cpp index a3b8d904c..1db7ca453 100644 --- a/launcher/modplatform/helpers/HashUtils.cpp +++ b/launcher/modplatform/helpers/HashUtils.cpp @@ -115,7 +115,7 @@ QString hash(QIODevice* device, Algorithm type) QCryptographicHash hash(alg); if (!hash.addData(device)) - qCritical() << "Failed to read JAR to create hash!"; + qCritical() << "Failed to read file to create hash!"; Q_ASSERT(hash.result().length() == hash.hashLength(alg)); auto result = hash.result().toHex(); diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp b/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp index d103170af..8df6405ad 100644 --- a/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp @@ -34,22 +34,21 @@ const QStringList ModrinthPackExportTask::PREFIXES({ "mods/", "coremods/", "resourcepacks/", "texturepacks/", "shaderpacks/" }); const QStringList ModrinthPackExportTask::FILE_EXTENSIONS({ "jar", "litemod", "zip" }); -ModrinthPackExportTask::ModrinthPackExportTask(const QString& name, - const QString& version, - const QString& summary, +ModrinthPackExportTask::ModrinthPackExportTask(QString name, + QString version, + QString summary, bool optionalFiles, - InstancePtr instance, - const QString& output, + MinecraftInstancePtr instance, + QString output, MMCZip::FilterFunction filter) - : name(name) - , version(version) - , summary(summary) + : name(std::move(name)) + , version(std::move(version)) + , summary(std::move(summary)) , optionalFiles(optionalFiles) - , instance(instance) - , mcInstance(dynamic_cast(instance.get())) - , gameRoot(instance->gameRoot()) - , output(output) - , filter(filter) + , instance(std::move(instance)) + , gameRoot(this->instance->gameRoot()) + , output(std::move(output)) + , filter(std::move(filter)) {} void ModrinthPackExportTask::executeTask() @@ -83,20 +82,86 @@ void ModrinthPackExportTask::collectFiles() pendingHashes.clear(); resolvedFiles.clear(); - if (mcInstance) { - mcInstance->loaderModList()->update(); - connect(mcInstance->loaderModList().get(), &ModFolderModel::updateFinished, this, &ModrinthPackExportTask::collectHashes); - } else - collectHashes(); + collectHashes(); } void ModrinthPackExportTask::collectHashes() { setStatus(tr("Finding file hashes...")); + + for (const auto& model : instance->resourceLists()) { + QCoreApplication::processEvents(); // TODO: maybe don't do this? + + QEventLoop loop; + connect(model.get(), &ModFolderModel::updateFinished, &loop, &QEventLoop::quit); + model->update(); + loop.exec(); + + for (const Resource* resource : model->allResources()) { + QCoreApplication::processEvents(); + + if (resource->metadata() == nullptr) + continue; + + const QUrl& url = resource->metadata()->url; + + if (url.isEmpty() || !BuildConfig.MODRINTH_MRPACK_HOSTS.contains(url.host())) + continue; + + const QFileInfo& fileInfo = resource->fileinfo(); + const QString relativePath = gameRoot.relativeFilePath(fileInfo.absoluteFilePath()); + + if (filter(relativePath)) + continue; + + qDebug() << "Resolving" << relativePath << "from index"; + + QString sha1; + QString sha512; + qint64 size; + + if (resource->metadata()->hash_format == "sha1") + sha1 = resource->metadata()->hash; + else if (resource->metadata()->hash_format == "sha512") + sha512 = resource->metadata()->hash; + + { + QFile file(fileInfo.absoluteFilePath()); + + if (!file.open(QFile::ReadOnly)) { + qWarning() << "Could not open" << relativePath << "for hashing"; + continue; + } + + const QByteArray data = file.readAll(); + + if (file.error() != QFileDevice::NoError) { + qWarning() << "Could not read" << relativePath; + continue; + } + + if (sha1.isEmpty()) + sha1 = Hashing::hash(data, Hashing::Algorithm::Sha1); + + if (sha512.isEmpty()) + sha512 = Hashing::hash(data, Hashing::Algorithm::Sha512); + + size = file.size(); + } + + ResolvedFile resolvedFile{ sha1, sha512, url.toEncoded(), size, resource->metadata()->side }; + resolvedFiles[relativePath] = resolvedFile; + } + } + for (const QFileInfo& file : files) { QCoreApplication::processEvents(); const QString relative = gameRoot.relativeFilePath(file.absoluteFilePath()); + + if (resolvedFiles.contains(relative)) + continue; + // require sensible file types if (!std::any_of(PREFIXES.begin(), PREFIXES.end(), [&relative](const QString& prefix) { return relative.startsWith(prefix); })) continue; @@ -105,42 +170,8 @@ void ModrinthPackExportTask::collectHashes() })) continue; - QFile openFile(file.absoluteFilePath()); - if (!openFile.open(QFile::ReadOnly)) { - qWarning() << "Could not open" << file << "for hashing"; - continue; - } - - const QByteArray data = openFile.readAll(); - if (openFile.error() != QFileDevice::NoError) { - qWarning() << "Could not read" << file; - continue; - } - auto sha512 = Hashing::hash(data, Hashing::Algorithm::Sha512); - - auto allMods = mcInstance->loaderModList()->allMods(); - if (auto modIter = std::find_if(allMods.begin(), allMods.end(), [&file](Mod* mod) { return mod->fileinfo() == file; }); - modIter != allMods.end()) { - const Mod* mod = *modIter; - if (mod->metadata() != nullptr) { - const QUrl& url = mod->metadata()->url; - // ensure the url is permitted on modrinth.com - if (!url.isEmpty() && BuildConfig.MODRINTH_MRPACK_HOSTS.contains(url.host())) { - qDebug() << "Resolving" << relative << "from index"; - - auto sha1 = Hashing::hash(data, Hashing::Algorithm::Sha1); - - ResolvedFile resolvedFile{ sha1, sha512, url.toEncoded(), openFile.size(), mod->metadata()->side }; - resolvedFiles[relative] = resolvedFile; - - // nice! we've managed to resolve based on local metadata! - // no need to enqueue it - continue; - } - } - } - qDebug() << "Enqueueing" << relative << "for Modrinth query"; + auto sha512 = Hashing::hash(file.absoluteFilePath(), Hashing::Algorithm::Sha512); pendingHashes[relative] = sha512; } @@ -241,30 +272,28 @@ QByteArray ModrinthPackExportTask::generateIndex() if (!summary.isEmpty()) out["summary"] = summary; - if (mcInstance) { - auto profile = mcInstance->getPackProfile(); - // collect all supported components - const ComponentPtr minecraft = profile->getComponent("net.minecraft"); - const ComponentPtr quilt = profile->getComponent("org.quiltmc.quilt-loader"); - const ComponentPtr fabric = profile->getComponent("net.fabricmc.fabric-loader"); - const ComponentPtr forge = profile->getComponent("net.minecraftforge"); - const ComponentPtr neoForge = profile->getComponent("net.neoforged"); + auto profile = instance->getPackProfile(); + // collect all supported components + const ComponentPtr minecraft = profile->getComponent("net.minecraft"); + const ComponentPtr quilt = profile->getComponent("org.quiltmc.quilt-loader"); + const ComponentPtr fabric = profile->getComponent("net.fabricmc.fabric-loader"); + const ComponentPtr forge = profile->getComponent("net.minecraftforge"); + const ComponentPtr neoForge = profile->getComponent("net.neoforged"); - // convert all available components to mrpack dependencies - QJsonObject dependencies; - if (minecraft != nullptr) - dependencies["minecraft"] = minecraft->m_version; - if (quilt != nullptr) - dependencies["quilt-loader"] = quilt->m_version; - if (fabric != nullptr) - dependencies["fabric-loader"] = fabric->m_version; - if (forge != nullptr) - dependencies["forge"] = forge->m_version; - if (neoForge != nullptr) - dependencies["neoforge"] = neoForge->m_version; + // convert all available components to mrpack dependencies + QJsonObject dependencies; + if (minecraft != nullptr) + dependencies["minecraft"] = minecraft->m_version; + if (quilt != nullptr) + dependencies["quilt-loader"] = quilt->m_version; + if (fabric != nullptr) + dependencies["fabric-loader"] = fabric->m_version; + if (forge != nullptr) + dependencies["forge"] = forge->m_version; + if (neoForge != nullptr) + dependencies["neoforge"] = neoForge->m_version; - out["dependencies"] = dependencies; - } + out["dependencies"] = dependencies; QJsonArray filesOut; for (auto iterator = resolvedFiles.constBegin(); iterator != resolvedFiles.constEnd(); iterator++) { diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.h b/launcher/modplatform/modrinth/ModrinthPackExportTask.h index ee740a456..14bc36009 100644 --- a/launcher/modplatform/modrinth/ModrinthPackExportTask.h +++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.h @@ -29,12 +29,12 @@ class ModrinthPackExportTask : public Task { Q_OBJECT public: - ModrinthPackExportTask(const QString& name, - const QString& version, - const QString& summary, + ModrinthPackExportTask(QString name, + QString version, + QString summary, bool optionalFiles, - InstancePtr instance, - const QString& output, + MinecraftInstancePtr instance, + QString output, MMCZip::FilterFunction filter); protected: @@ -54,8 +54,7 @@ class ModrinthPackExportTask : public Task { // inputs const QString name, version, summary; const bool optionalFiles; - const InstancePtr instance; - MinecraftInstance* mcInstance; + const MinecraftInstancePtr instance; const QDir gameRoot; const QString output; const MMCZip::FilterFunction filter; diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 96f1348d2..6134d9d31 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1403,27 +1403,26 @@ void MainWindow::on_actionExportInstanceZip_triggered() void MainWindow::on_actionExportInstanceMrPack_triggered() { - if (m_selectedInstance) { - ExportPackDialog dlg(m_selectedInstance, this); + auto instance = std::dynamic_pointer_cast(m_selectedInstance); + if (instance) { + ExportPackDialog dlg(std::move(instance), this); dlg.exec(); } } void MainWindow::on_actionExportInstanceFlamePack_triggered() { - if (m_selectedInstance) { - auto instance = dynamic_cast(m_selectedInstance.get()); - if (instance) { - if (auto cmp = instance->getPackProfile()->getComponent("net.minecraft"); - cmp && cmp->getVersionFile() && cmp->getVersionFile()->type == "snapshot") { - QMessageBox msgBox(this); - msgBox.setText("Snapshots are currently not supported by CurseForge modpacks."); - msgBox.exec(); - return; - } - ExportPackDialog dlg(m_selectedInstance, this, ModPlatform::ResourceProvider::FLAME); - dlg.exec(); + auto instance = std::dynamic_pointer_cast(m_selectedInstance); + if (instance) { + if (auto cmp = instance->getPackProfile()->getComponent("net.minecraft"); + cmp && cmp->getVersionFile() && cmp->getVersionFile()->type == "snapshot") { + QMessageBox msgBox(this); + msgBox.setText("Snapshots are currently not supported by CurseForge modpacks."); + msgBox.exec(); + return; } + ExportPackDialog dlg(std::move(instance), this, ModPlatform::ResourceProvider::FLAME); + dlg.exec(); } } diff --git a/launcher/ui/dialogs/ExportPackDialog.cpp b/launcher/ui/dialogs/ExportPackDialog.cpp index 0278c6cb0..c01b83f5c 100644 --- a/launcher/ui/dialogs/ExportPackDialog.cpp +++ b/launcher/ui/dialogs/ExportPackDialog.cpp @@ -34,7 +34,7 @@ #include "MMCZip.h" #include "modplatform/modrinth/ModrinthPackExportTask.h" -ExportPackDialog::ExportPackDialog(InstancePtr instance, QWidget* parent, ModPlatform::ResourceProvider provider) +ExportPackDialog::ExportPackDialog(const MinecraftInstancePtr& instance, QWidget* parent, ModPlatform::ResourceProvider provider) : QDialog(parent), instance(instance), ui(new Ui::ExportPackDialog), m_provider(provider) { Q_ASSERT(m_provider == ModPlatform::ResourceProvider::MODRINTH || m_provider == ModPlatform::ResourceProvider::FLAME); @@ -86,12 +86,9 @@ ExportPackDialog::ExportPackDialog(InstancePtr instance, QWidget* parent, ModPla proxy->blockedPaths().insert(file); } - MinecraftInstance* mcInstance = dynamic_cast(instance.get()); - if (mcInstance) { - const QDir index = mcInstance->loaderModList()->indexDir(); - if (index.exists()) - proxy->ignoreFilesWithPath().insert(root.relativeFilePath(index.absolutePath())); - } + for (auto& resourceModel : instance->resourceLists()) + if (resourceModel->indexDir().exists()) + proxy->ignoreFilesWithPath().insert(root.relativeFilePath(resourceModel->indexDir().absolutePath())); ui->files->setModel(proxy); ui->files->setRootIndex(proxy->mapFromSource(model->index(instance->gameRoot()))); diff --git a/launcher/ui/dialogs/ExportPackDialog.h b/launcher/ui/dialogs/ExportPackDialog.h index 830c24d25..ab20f44bd 100644 --- a/launcher/ui/dialogs/ExportPackDialog.h +++ b/launcher/ui/dialogs/ExportPackDialog.h @@ -18,6 +18,7 @@ #pragma once +#include #include #include "BaseInstance.h" #include "FastFileIconProvider.h" @@ -32,7 +33,7 @@ class ExportPackDialog : public QDialog { Q_OBJECT public: - explicit ExportPackDialog(InstancePtr instance, + explicit ExportPackDialog(const MinecraftInstancePtr& instance, QWidget* parent = nullptr, ModPlatform::ResourceProvider provider = ModPlatform::ResourceProvider::MODRINTH); ~ExportPackDialog(); @@ -41,7 +42,7 @@ class ExportPackDialog : public QDialog { void validate(); private: - const InstancePtr instance; + const MinecraftInstancePtr instance; Ui::ExportPackDialog* ui; FileIgnoreProxy* proxy; FastFileIconProvider icons; From b66d6b2812acbea33359a0deb8d68ef12aaf4084 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 26 Oct 2024 13:24:03 +0100 Subject: [PATCH 290/616] Unhardcode PREFIXES Signed-off-by: TheKodeToad --- .../modplatform/flame/FlamePackExportTask.cpp | 40 +++++++++---------- .../modplatform/flame/FlamePackExportTask.h | 13 +++--- .../modrinth/ModrinthPackExportTask.cpp | 11 +++-- .../modrinth/ModrinthPackExportTask.h | 1 - 4 files changed, 32 insertions(+), 33 deletions(-) diff --git a/launcher/modplatform/flame/FlamePackExportTask.cpp b/launcher/modplatform/flame/FlamePackExportTask.cpp index d661f1f05..61eaa826d 100644 --- a/launcher/modplatform/flame/FlamePackExportTask.cpp +++ b/launcher/modplatform/flame/FlamePackExportTask.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "Application.h" #include "Json.h" #include "MMCZip.h" @@ -39,24 +40,23 @@ #include "tasks/Task.h" const QString FlamePackExportTask::TEMPLATE = "
  • {name}{authors}
  • \n"; -const QStringList FlamePackExportTask::FILE_EXTENSIONS({ "jar", "zip" }); +const QStringList FlamePackExportTask::FILE_EXTENSIONS({ "jar", "litemod", "zip" }); -FlamePackExportTask::FlamePackExportTask(const QString& name, - const QString& version, - const QString& author, +FlamePackExportTask::FlamePackExportTask(QString name, + QString version, + QString author, bool optionalFiles, - InstancePtr instance, - const QString& output, + MinecraftInstancePtr instance, + QString output, MMCZip::FilterFunction filter) - : name(name) - , version(version) - , author(author) + : name(std::move(name)) + , version(std::move(version)) + , author(std::move(author)) , optionalFiles(optionalFiles) - , instance(instance) - , mcInstance(dynamic_cast(instance.get())) - , gameRoot(instance->gameRoot()) - , output(output) - , filter(filter) + , instance(std::move(instance)) + , gameRoot(this->instance->gameRoot()) + , output(std::move(output)) + , filter(std::move(filter)) {} void FlamePackExportTask::executeTask() @@ -90,11 +90,7 @@ void FlamePackExportTask::collectFiles() pendingHashes.clear(); resolvedFiles.clear(); - if (mcInstance != nullptr) { - mcInstance->loaderModList()->update(); - connect(mcInstance->loaderModList().get(), &ModFolderModel::updateFinished, this, &FlamePackExportTask::collectHashes); - } else - collectHashes(); + collectHashes(); } void FlamePackExportTask::collectHashes() @@ -102,7 +98,7 @@ void FlamePackExportTask::collectHashes() setAbortable(true); setStatus(tr("Finding file hashes...")); setProgress(1, 5); - auto allMods = mcInstance->loaderModList()->allMods(); + auto allMods = instance->loaderModList()->allMods(); ConcurrentTask::Ptr hashingTask( new ConcurrentTask(this, "MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); task.reset(hashingTask); @@ -379,9 +375,9 @@ QByteArray FlamePackExportTask::generateIndex() obj["version"] = version; obj["author"] = author; obj["overrides"] = "overrides"; - if (mcInstance) { + if (instance) { QJsonObject version; - auto profile = mcInstance->getPackProfile(); + auto profile = instance->getPackProfile(); // collect all supported components const ComponentPtr minecraft = profile->getComponent("net.minecraft"); const ComponentPtr quilt = profile->getComponent("org.quiltmc.quilt-loader"); diff --git a/launcher/modplatform/flame/FlamePackExportTask.h b/launcher/modplatform/flame/FlamePackExportTask.h index b11eb17fa..83d870b09 100644 --- a/launcher/modplatform/flame/FlamePackExportTask.h +++ b/launcher/modplatform/flame/FlamePackExportTask.h @@ -28,12 +28,12 @@ class FlamePackExportTask : public Task { Q_OBJECT public: - FlamePackExportTask(const QString& name, - const QString& version, - const QString& author, + FlamePackExportTask(QString name, + QString version, + QString author, bool optionalFiles, - InstancePtr instance, - const QString& output, + MinecraftInstancePtr instance, + QString output, MMCZip::FilterFunction filter); protected: @@ -47,8 +47,7 @@ class FlamePackExportTask : public Task { // inputs const QString name, version, author; const bool optionalFiles; - const InstancePtr instance; - MinecraftInstance* mcInstance; + const MinecraftInstancePtr instance; const QDir gameRoot; const QString output; const MMCZip::FilterFunction filter; diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp b/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp index 8df6405ad..c1333963e 100644 --- a/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp @@ -31,7 +31,6 @@ #include "modplatform/helpers/HashUtils.h" #include "tasks/Task.h" -const QStringList ModrinthPackExportTask::PREFIXES({ "mods/", "coremods/", "resourcepacks/", "texturepacks/", "shaderpacks/" }); const QStringList ModrinthPackExportTask::FILE_EXTENSIONS({ "jar", "litemod", "zip" }); ModrinthPackExportTask::ModrinthPackExportTask(QString name, @@ -87,16 +86,22 @@ void ModrinthPackExportTask::collectFiles() void ModrinthPackExportTask::collectHashes() { + // TODO make this just use EnsureMetadataTask + setStatus(tr("Finding file hashes...")); + QStringList prefixes; + for (const auto& model : instance->resourceLists()) { - QCoreApplication::processEvents(); // TODO: maybe don't do this? + QCoreApplication::processEvents(); QEventLoop loop; connect(model.get(), &ModFolderModel::updateFinished, &loop, &QEventLoop::quit); model->update(); loop.exec(); + prefixes.append(gameRoot.relativeFilePath(model->dir().absolutePath()) + '/'); + for (const Resource* resource : model->allResources()) { QCoreApplication::processEvents(); @@ -163,7 +168,7 @@ void ModrinthPackExportTask::collectHashes() continue; // require sensible file types - if (!std::any_of(PREFIXES.begin(), PREFIXES.end(), [&relative](const QString& prefix) { return relative.startsWith(prefix); })) + if (!std::any_of(prefixes.begin(), prefixes.end(), [&relative](const QString& prefix) { return relative.startsWith(prefix); })) continue; if (!std::any_of(FILE_EXTENSIONS.begin(), FILE_EXTENSIONS.end(), [&relative](const QString& extension) { return relative.endsWith('.' + extension) || relative.endsWith('.' + extension + ".disabled"); diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.h b/launcher/modplatform/modrinth/ModrinthPackExportTask.h index 14bc36009..d5dc08678 100644 --- a/launcher/modplatform/modrinth/ModrinthPackExportTask.h +++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.h @@ -48,7 +48,6 @@ class ModrinthPackExportTask : public Task { Metadata::ModSide side; }; - static const QStringList PREFIXES; static const QStringList FILE_EXTENSIONS; // inputs From 685d3c79ac78d7e41ab257de82dc743020189a33 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 03:02:13 +0300 Subject: [PATCH 291/616] fix unzipping typo Signed-off-by: Trial97 --- launcher/MMCZip.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index dcf3d566f..09dc23f0e 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -577,7 +577,7 @@ auto ExtractZipTask::extractZip() -> ZipResult auto relative_file_name = QDir::fromNativeSeparators(file_name.mid(m_subdirectory.size())); auto original_name = relative_file_name; - setStatus("Unziping: " + relative_file_name); + setStatus("Unzipping: " + relative_file_name); // Fix subdirs/files ending with a / getting transformed into absolute paths if (relative_file_name.startsWith('/')) From 44894a29b1784cfa8a04807c17d21169230ff922 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 03:05:30 +0200 Subject: [PATCH 292/616] rename snake_case to camelCase Signed-off-by: Trial97 --- launcher/ui/pages/modplatform/ModPage.cpp | 2 +- .../ui/pages/modplatform/ResourcePackPage.cpp | 2 +- .../ui/pages/modplatform/ResourcePage.cpp | 52 +++++++++---------- launcher/ui/pages/modplatform/ResourcePage.h | 14 ++--- .../ui/pages/modplatform/ShaderPackPage.cpp | 2 +- .../modplatform/flame/FlameResourcePages.cpp | 2 +- .../modrinth/ModrinthResourcePages.cpp | 2 +- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index c9817cdf7..f0cc2df54 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -99,7 +99,7 @@ void ModPage::triggerSearch() updateSelectionButton(); static_cast(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt(), changed); - m_fetch_progress.watch(m_model->activeSearchJob().get()); + m_fetchProgress.watch(m_model->activeSearchJob().get()); } QMap ModPage::urlHandlers() const diff --git a/launcher/ui/pages/modplatform/ResourcePackPage.cpp b/launcher/ui/pages/modplatform/ResourcePackPage.cpp index 849ea1111..99039476e 100644 --- a/launcher/ui/pages/modplatform/ResourcePackPage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePackPage.cpp @@ -30,7 +30,7 @@ void ResourcePackResourcePage::triggerSearch() updateSelectionButton(); static_cast(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt()); - m_fetch_progress.watch(m_model->activeSearchJob().get()); + m_fetchProgress.watch(m_model->activeSearchJob().get()); } QMap ResourcePackResourcePage::urlHandlers() const diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index 6d5966056..d1d27c1e6 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -55,7 +55,7 @@ namespace ResourceDownload { ResourcePage::ResourcePage(ResourceDownloadDialog* parent, BaseInstance& base_instance) - : QWidget(parent), m_base_instance(base_instance), m_ui(new Ui::ResourcePage), m_parent_dialog(parent), m_fetch_progress(this, false) + : QWidget(parent), m_baseInstance(base_instance), m_ui(new Ui::ResourcePage), m_parentDialog(parent), m_fetchProgress(this, false) { m_ui->setupUi(this); @@ -64,18 +64,18 @@ ResourcePage::ResourcePage(ResourceDownloadDialog* parent, BaseInstance& base_in m_ui->versionSelectionBox->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); m_ui->versionSelectionBox->view()->parentWidget()->setMaximumHeight(300); - m_search_timer.setTimerType(Qt::TimerType::CoarseTimer); - m_search_timer.setSingleShot(true); + m_searchTimer.setTimerType(Qt::TimerType::CoarseTimer); + m_searchTimer.setSingleShot(true); - connect(&m_search_timer, &QTimer::timeout, this, &ResourcePage::triggerSearch); + connect(&m_searchTimer, &QTimer::timeout, this, &ResourcePage::triggerSearch); // hide progress bar to prevent weird artifact - m_fetch_progress.hide(); - m_fetch_progress.hideIfInactive(true); - m_fetch_progress.setFixedHeight(24); - m_fetch_progress.progressFormat(""); + m_fetchProgress.hide(); + m_fetchProgress.hideIfInactive(true); + m_fetchProgress.setFixedHeight(24); + m_fetchProgress.progressFormat(""); - m_ui->verticalLayout->insertWidget(1, &m_fetch_progress); + m_ui->verticalLayout->insertWidget(1, &m_fetchProgress); m_ui->packView->setItemDelegate(new ProjectItemDelegate(this)); m_ui->packView->installEventFilter(this); @@ -121,10 +121,10 @@ auto ResourcePage::eventFilter(QObject* watched, QEvent* event) -> bool keyEvent->accept(); return true; } else { - if (m_search_timer.isActive()) - m_search_timer.stop(); + if (m_searchTimer.isActive()) + m_searchTimer.stop(); - m_search_timer.start(350); + m_searchTimer.start(350); } } else if (watched == m_ui->packView) { if (keyEvent->key() == Qt::Key_Return) { @@ -248,7 +248,7 @@ void ResourcePage::updateUi() void ResourcePage::updateSelectionButton() { - if (!isOpened || m_selected_version_index < 0) { + if (!isOpened || m_selectedVersionIndex < 0) { m_ui->resourceSelectionButton->setEnabled(false); return; } @@ -258,7 +258,7 @@ void ResourcePage::updateSelectionButton() if (current_pack->versionsLoaded && current_pack->versions.empty()) { m_ui->resourceSelectionButton->setEnabled(false); qWarning() << tr("No version available for the selected pack"); - } else if (!current_pack->isVersionSelected(m_selected_version_index)) + } else if (!current_pack->isVersionSelected(m_selectedVersionIndex)) m_ui->resourceSelectionButton->setText(tr("Select %1 for download").arg(resourceString())); else m_ui->resourceSelectionButton->setText(tr("Deselect %1 for download").arg(resourceString())); @@ -327,18 +327,18 @@ void ResourcePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI void ResourcePage::onVersionSelectionChanged(int) { - m_selected_version_index = m_ui->versionSelectionBox->currentData().toInt(); + m_selectedVersionIndex = m_ui->versionSelectionBox->currentData().toInt(); updateSelectionButton(); } void ResourcePage::addResourceToDialog(ModPlatform::IndexedPack::Ptr pack, ModPlatform::IndexedVersion& version) { - m_parent_dialog->addResource(pack, version); + m_parentDialog->addResource(pack, version); } void ResourcePage::removeResourceFromDialog(const QString& pack_name) { - m_parent_dialog->removeResource(pack_name); + m_parentDialog->removeResource(pack_name); } void ResourcePage::addResourceToPage(ModPlatform::IndexedPack::Ptr pack, @@ -355,14 +355,14 @@ void ResourcePage::removeResourceFromPage(const QString& name) void ResourcePage::onResourceSelected() { - if (m_selected_version_index < 0) + if (m_selectedVersionIndex < 0) return; auto current_pack = getCurrentPack(); - if (!current_pack || !current_pack->versionsLoaded || current_pack->versions.size() < m_selected_version_index) + if (!current_pack || !current_pack->versionsLoaded || current_pack->versions.size() < m_selectedVersionIndex) return; - auto& version = current_pack->versions[m_selected_version_index]; + auto& version = current_pack->versions[m_selectedVersionIndex]; if (version.downloadUrl.isNull()) { CustomMessageBox::selectable(this, tr("How?"), "You managed to select a resource that doesn't have a download link. Because of this missing " @@ -409,14 +409,14 @@ void ResourcePage::openUrl(const QUrl& url) } } - if (!page.isNull() && !m_do_not_jump_to_mod) { + if (!page.isNull() && !m_doNotJumpToMod) { const QString slug = match.captured(1); // ensure the user isn't opening the same mod if (auto current_pack = getCurrentPack(); current_pack && slug != current_pack->slug) { - m_parent_dialog->selectPage(page); + m_parentDialog->selectPage(page); - auto newPage = m_parent_dialog->selectedPage(); + auto newPage = m_parentDialog->selectedPage(); QLineEdit* searchEdit = newPage->m_ui->searchEdit; auto model = newPage->m_model; @@ -460,7 +460,7 @@ void ResourcePage::openProject(QVariant projectID) m_ui->resourceFilterButton->hide(); m_ui->packView->hide(); m_ui->resourceSelectionButton->hide(); - m_do_not_jump_to_mod = true; + m_doNotJumpToMod = true; auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); @@ -477,10 +477,10 @@ void ResourcePage::openProject(QVariant projectID) connect(okBtn, &QPushButton::clicked, this, [this] { onResourceSelected(); - m_parent_dialog->accept(); + m_parentDialog->accept(); }); - connect(cancelBtn, &QPushButton::clicked, m_parent_dialog, &ResourceDownloadDialog::reject); + connect(cancelBtn, &QPushButton::clicked, m_parentDialog, &ResourceDownloadDialog::reject); m_ui->gridLayout_4->addWidget(buttonBox, 1, 2); auto jump = [this, okBtn] { diff --git a/launcher/ui/pages/modplatform/ResourcePage.h b/launcher/ui/pages/modplatform/ResourcePage.h index b625240eb..09c512df4 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.h +++ b/launcher/ui/pages/modplatform/ResourcePage.h @@ -62,7 +62,7 @@ class ResourcePage : public QWidget, public BasePage { [[nodiscard]] bool setCurrentPack(ModPlatform::IndexedPack::Ptr); [[nodiscard]] auto getCurrentPack() const -> ModPlatform::IndexedPack::Ptr; - [[nodiscard]] auto getDialog() const -> const ResourceDownloadDialog* { return m_parent_dialog; } + [[nodiscard]] auto getDialog() const -> const ResourceDownloadDialog* { return m_parentDialog; } [[nodiscard]] auto getModel() const -> ResourceModel* { return m_model; } protected: @@ -99,22 +99,22 @@ class ResourcePage : public QWidget, public BasePage { virtual void openUrl(const QUrl&); public: - BaseInstance& m_base_instance; + BaseInstance& m_baseInstance; protected: Ui::ResourcePage* m_ui; - ResourceDownloadDialog* m_parent_dialog = nullptr; + ResourceDownloadDialog* m_parentDialog = nullptr; ResourceModel* m_model = nullptr; - int m_selected_version_index = -1; + int m_selectedVersionIndex = -1; - ProgressWidget m_fetch_progress; + ProgressWidget m_fetchProgress; // Used to do instant searching with a delay to cache quick changes - QTimer m_search_timer; + QTimer m_searchTimer; - bool m_do_not_jump_to_mod = false; + bool m_doNotJumpToMod = false; }; } // namespace ResourceDownload diff --git a/launcher/ui/pages/modplatform/ShaderPackPage.cpp b/launcher/ui/pages/modplatform/ShaderPackPage.cpp index ebd8d4ea2..cedf985fb 100644 --- a/launcher/ui/pages/modplatform/ShaderPackPage.cpp +++ b/launcher/ui/pages/modplatform/ShaderPackPage.cpp @@ -31,7 +31,7 @@ void ShaderPackResourcePage::triggerSearch() updateSelectionButton(); static_cast(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt()); - m_fetch_progress.watch(m_model->activeSearchJob().get()); + m_fetchProgress.watch(m_model->activeSearchJob().get()); } QMap ShaderPackResourcePage::urlHandlers() const diff --git a/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp b/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp index ce8c03fa1..4e01f3a65 100644 --- a/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp @@ -209,7 +209,7 @@ auto FlameShaderPackPage::shouldDisplay() const -> bool unique_qobject_ptr FlameModPage::createFilterWidget() { - return ModFilterWidget::create(&static_cast(m_base_instance), false, this); + return ModFilterWidget::create(&static_cast(m_baseInstance), false, this); } void FlameModPage::prepareProviderCategories() diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthResourcePages.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthResourcePages.cpp index 85dcde471..4ee620677 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthResourcePages.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthResourcePages.cpp @@ -144,7 +144,7 @@ auto ModrinthShaderPackPage::shouldDisplay() const -> bool unique_qobject_ptr ModrinthModPage::createFilterWidget() { - return ModFilterWidget::create(&static_cast(m_base_instance), true, this); + return ModFilterWidget::create(&static_cast(m_baseInstance), true, this); } void ModrinthModPage::prepareProviderCategories() From b593ff09e9c4b5fa30ca082eea4cd69f12a286e5 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 03:05:56 +0200 Subject: [PATCH 293/616] fix #3001 Signed-off-by: Trial97 --- launcher/ui/pages/modplatform/ResourcePage.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index d1d27c1e6..fe566cd7a 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -483,11 +483,13 @@ void ResourcePage::openProject(QVariant projectID) connect(cancelBtn, &QPushButton::clicked, m_parentDialog, &ResourceDownloadDialog::reject); m_ui->gridLayout_4->addWidget(buttonBox, 1, 2); - auto jump = [this, okBtn] { + connect(m_ui->versionSelectionBox, QOverload::of(&QComboBox::currentIndexChanged), this, + [this, okBtn] { okBtn->setEnabled(m_ui->versionSelectionBox->currentData().toInt() >= 0); }); + + auto jump = [this] { for (int row = 0; row < m_model->rowCount({}); row++) { const QModelIndex index = m_model->index(row); m_ui->packView->setCurrentIndex(index); - okBtn->setEnabled(true); return; } m_ui->packDescription->setText(tr("The resource was not found")); From b1c8ab9350a51822fae1d53d3e0c832e66deb159 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 10:56:14 +0200 Subject: [PATCH 294/616] add installed text to version select Signed-off-by: Trial97 --- launcher/ui/pages/modplatform/ResourcePage.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index fe566cd7a..48f658abd 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -283,11 +283,15 @@ void ResourcePage::updateVersionList() if (!m_model->checkVersionFilters(version)) continue; - auto release_type = current_pack->versions[i].version_type.isValid() - ? QString(" [%1]").arg(current_pack->versions[i].version_type.toString()) - : ""; + auto versionText = version.version; + if (version.version_type.isValid()) { + versionText += QString(" [%1]").arg(version.version_type.toString()); + } + if (version.fileId == installedVersion) { + versionText += tr(" [installed]", "Mod version select"); + } - m_ui->versionSelectionBox->addItem(QString("%1%2").arg(version.version, release_type), QVariant(i)); + m_ui->versionSelectionBox->addItem(versionText, QVariant(i)); } } if (m_ui->versionSelectionBox->count() == 0) { From 935b2e8fb20741b14472a745a5720ef7da9a86ec Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 11:56:48 +0200 Subject: [PATCH 295/616] add open source filter Signed-off-by: Trial97 --- launcher/modplatform/ResourceAPI.h | 1 + launcher/modplatform/modrinth/ModrinthAPI.h | 2 ++ launcher/ui/pages/modplatform/ModModel.cpp | 4 +++- launcher/ui/pages/modplatform/flame/FlameModel.cpp | 2 +- .../pages/modplatform/modrinth/ModrinthModel.cpp | 2 +- launcher/ui/widgets/ModFilterWidget.cpp | 14 +++++++++++++- launcher/ui/widgets/ModFilterWidget.h | 4 +++- launcher/ui/widgets/ModFilterWidget.ui | 7 +++++++ 8 files changed, 31 insertions(+), 5 deletions(-) diff --git a/launcher/modplatform/ResourceAPI.h b/launcher/modplatform/ResourceAPI.h index b7364d9ab..502d1c301 100644 --- a/launcher/modplatform/ResourceAPI.h +++ b/launcher/modplatform/ResourceAPI.h @@ -76,6 +76,7 @@ class ResourceAPI { std::optional > versions; std::optional side; std::optional categoryIds; + bool openSource; }; struct SearchCallbacks { std::function on_succeed; diff --git a/launcher/modplatform/modrinth/ModrinthAPI.h b/launcher/modplatform/modrinth/ModrinthAPI.h index 070f59dad..3a5c21ed1 100644 --- a/launcher/modplatform/modrinth/ModrinthAPI.h +++ b/launcher/modplatform/modrinth/ModrinthAPI.h @@ -116,6 +116,8 @@ class ModrinthAPI : public NetworkResourceAPI { } if (args.categoryIds.has_value() && !args.categoryIds->empty()) facets_list.append(QString("[%1]").arg(getCategoriesFilters(args.categoryIds.value()))); + if (args.openSource) + facets_list.append("[\"open_source:true\"]"); facets_list.append(QString("[\"project_type:%1\"]").arg(resourceTypeParameter(args.type))); diff --git a/launcher/ui/pages/modplatform/ModModel.cpp b/launcher/ui/pages/modplatform/ModModel.cpp index 1f0329321..cfc262b62 100644 --- a/launcher/ui/pages/modplatform/ModModel.cpp +++ b/launcher/ui/pages/modplatform/ModModel.cpp @@ -39,7 +39,9 @@ ResourceAPI::SearchArgs ModModel::createSearchArguments() auto sort = getCurrentSortingMethodByIndex(); - return { ModPlatform::ResourceType::MOD, m_next_search_offset, m_search_term, sort, loaders, versions, side, categories }; + return { + ModPlatform::ResourceType::MOD, m_next_search_offset, m_search_term, sort, loaders, versions, side, categories, m_filter->openSource + }; } ResourceAPI::VersionSearchArgs ModModel::createVersionsArguments(QModelIndex& entry) diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.cpp b/launcher/ui/pages/modplatform/flame/FlameModel.cpp index cfdb185ff..18a2adc49 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModel.cpp @@ -189,7 +189,7 @@ void ListModel::performPaginatedSearch() auto netJob = makeShared("Flame::Search", APPLICATION->network()); auto searchUrl = FlameAPI().getSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, - m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); + m_filter->loaders, m_filter->versions, "", m_filter->categoryIds, m_filter->openSource }); netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl.value()), response)); jobPtr = netJob; diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp index 417ff4080..416c69d28 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp @@ -155,7 +155,7 @@ void ModpackListModel::performPaginatedSearch() ResourceAPI::SortingMethod sort{}; sort.name = currentSort; auto searchUrl = ModrinthAPI().getSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, - m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); + m_filter->loaders, m_filter->versions, "", m_filter->categoryIds, m_filter->openSource }); auto netJob = makeShared("Modrinth::SearchModpack", APPLICATION->network()); netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl.value()), m_allResponse)); diff --git a/launcher/ui/widgets/ModFilterWidget.cpp b/launcher/ui/widgets/ModFilterWidget.cpp index 68adcdb71..89d9bdb61 100644 --- a/launcher/ui/widgets/ModFilterWidget.cpp +++ b/launcher/ui/widgets/ModFilterWidget.cpp @@ -134,6 +134,7 @@ ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended, QWi ui->versions->hide(); ui->showAllVersions->hide(); ui->environmentGroup->hide(); + ui->openSource->hide(); } ui->versions->setStyleSheet("combobox-popup: 0;"); @@ -159,6 +160,7 @@ ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended, QWi } connect(ui->hideInstalled, &QCheckBox::stateChanged, this, &ModFilterWidget::onHideInstalledFilterChanged); + connect(ui->openSource, &QCheckBox::stateChanged, this, &ModFilterWidget::onOpenSourceFilterChanged); setHidden(true); loadVersionList(); @@ -208,6 +210,7 @@ void ModFilterWidget::loadVersionList() void ModFilterWidget::prepareBasicFilter() { + m_filter->openSource = false; if (m_instance) { m_filter->hideInstalled = false; m_filter->side = ""; // or "both" @@ -337,4 +340,13 @@ void ModFilterWidget::setCategories(const QList& categori } } -#include "ModFilterWidget.moc" \ No newline at end of file +void ModFilterWidget::onOpenSourceFilterChanged() +{ + auto open = ui->openSource->isChecked(); + m_filter_changed = open != m_filter->openSource; + m_filter->openSource = open; + if (m_filter_changed) + emit filterChanged(); +} + +#include "ModFilterWidget.moc" diff --git a/launcher/ui/widgets/ModFilterWidget.h b/launcher/ui/widgets/ModFilterWidget.h index 50f0e06c9..76668db92 100644 --- a/launcher/ui/widgets/ModFilterWidget.h +++ b/launcher/ui/widgets/ModFilterWidget.h @@ -64,11 +64,12 @@ class ModFilterWidget : public QTabWidget { QString side; bool hideInstalled; QStringList categoryIds; + bool openSource; bool operator==(const Filter& other) const { return hideInstalled == other.hideInstalled && side == other.side && loaders == other.loaders && versions == other.versions && - releases == other.releases && categoryIds == other.categoryIds; + releases == other.releases && categoryIds == other.categoryIds && openSource == other.openSource; } bool operator!=(const Filter& other) const { return !(*this == other); } @@ -107,6 +108,7 @@ class ModFilterWidget : public QTabWidget { void onSideFilterChanged(); void onHideInstalledFilterChanged(); void onShowAllVersionsChanged(); + void onOpenSourceFilterChanged(); private: Ui::ModFilterWidget* ui; diff --git a/launcher/ui/widgets/ModFilterWidget.ui b/launcher/ui/widgets/ModFilterWidget.ui index 236847094..604c35ef5 100644 --- a/launcher/ui/widgets/ModFilterWidget.ui +++ b/launcher/ui/widgets/ModFilterWidget.ui @@ -188,6 +188,13 @@
    + + + + Open Source only + + + From f373a5cea0e816158cdabca3423107989aed0a85 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 11:58:34 +0200 Subject: [PATCH 296/616] change contributors name Signed-off-by: Trial97 --- launcher/ui/dialogs/AboutDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/AboutDialog.cpp b/launcher/ui/dialogs/AboutDialog.cpp index b652ba991..84bae70d0 100644 --- a/launcher/ui/dialogs/AboutDialog.cpp +++ b/launcher/ui/dialogs/AboutDialog.cpp @@ -101,7 +101,7 @@ QString getCreditsHtml() stream << "

    " << QObject::tr("With thanks to", "About Credits") << "

    \n"; stream << QString("

    Boba %1

    \n").arg(getWebsite("https://bobaonline.neocities.org/")); - stream << QString("

    Davi Rafael %1

    \n").arg(getWebsite("https://auti.one/")); + stream << QString("

    AutiOne %1

    \n").arg(getWebsite("https://auti.one/")); stream << QString("

    Fulmine %1

    \n").arg(getWebsite("https://fulmine.xyz/")); stream << QString("

    ely %1

    \n").arg(getGitHub("elyrodso")); stream << QString("

    gon sawa %1

    \n").arg(getGitHub("gonsawa")); From 61448a61ea400eebd91f97aa07e9419cc2f35823 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 12:06:45 +0200 Subject: [PATCH 297/616] swap search with filter button for modpacks Signed-off-by: Trial97 --- launcher/ui/pages/modplatform/flame/FlamePage.ui | 12 ++++++------ .../ui/pages/modplatform/modrinth/ModrinthPage.ui | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.ui b/launcher/ui/pages/modplatform/flame/FlamePage.ui index b028e7569..cf882ef1c 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.ui +++ b/launcher/ui/pages/modplatform/flame/FlamePage.ui @@ -32,16 +32,16 @@ - - - Search and filter... + + + Filter options - - - Filter + + + Search and filter... diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui index ef44abb52..d6e983929 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui @@ -14,16 +14,16 @@ - - - Search and filter... + + + Filter options - - - Filter + + + Search and filter... From 11d4d948aa1a1ba67cee59193eb98a7fdad2d909 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 12:36:14 +0200 Subject: [PATCH 298/616] lock m_instanceExtras Signed-off-by: Trial97 --- launcher/Application.cpp | 11 ++++++++++- launcher/Application.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index ea749ca4c..b64b9decb 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -48,6 +48,7 @@ #include "net/PasteUpload.h" #include "pathmatcher/MultiMatcher.h" #include "pathmatcher/SimplePrefixMatcher.h" +#include "tasks/Task.h" #include "tools/GenericProfiler.h" #include "ui/InstanceWindow.h" #include "ui/MainWindow.h" @@ -1380,6 +1381,7 @@ bool Application::launch(InstancePtr instance, bool online, bool demo, Minecraft if (m_updateRunning) { qDebug() << "Cannot launch instances while an update is running. Please try again when updates are completed."; } else if (instance->canLaunch()) { + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[instance->id()]; auto window = extras.window; if (window) { @@ -1404,7 +1406,7 @@ bool Application::launch(InstancePtr instance, bool online, bool demo, Minecraft connect(controller.get(), &LaunchController::failed, this, &Application::controllerFailed); connect(controller.get(), &LaunchController::aborted, this, [this] { controllerFailed(tr("Aborted")); }); addRunningInstance(); - controller->start(); + QMetaObject::invokeMethod(controller.get(), &Task::start, Qt::QueuedConnection); return true; } else if (instance->isRunning()) { showInstanceWindow(instance, "console"); @@ -1422,9 +1424,11 @@ bool Application::kill(InstancePtr instance) qWarning() << "Attempted to kill instance" << instance->id() << ", which isn't running."; return false; } + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[instance->id()]; // NOTE: copy of the shared pointer keeps it alive auto controller = extras.controller; + locker.unlock(); if (controller) { return controller->abort(); } @@ -1478,6 +1482,8 @@ void Application::controllerSucceeded() if (!controller) return; auto id = controller->id(); + + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[id]; // on success, do... @@ -1503,6 +1509,7 @@ void Application::controllerFailed(const QString& error) if (!controller) return; auto id = controller->id(); + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[id]; // on failure, do... nothing @@ -1560,6 +1567,7 @@ InstanceWindow* Application::showInstanceWindow(InstancePtr instance, QString pa if (!instance) return nullptr; auto id = instance->id(); + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[id]; auto& window = extras.window; @@ -1597,6 +1605,7 @@ void Application::on_windowClose() m_openWindows--; auto instWindow = qobject_cast(QObject::sender()); if (instWindow) { + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[instWindow->instanceId()]; extras.window = nullptr; if (extras.controller) { diff --git a/launcher/Application.h b/launcher/Application.h index 692625f4a..164ec3a4f 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -279,6 +279,7 @@ class Application : public QApplication { shared_qobject_ptr controller; }; std::map m_instanceExtras; + mutable QMutex m_instanceExtrasMutex; // main state variables size_t m_openWindows = 0; From c4cd7cf6c173b7052f31614b4641d2172defa91a Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 13:17:58 +0200 Subject: [PATCH 299/616] change ZekeZ name Signed-off-by: Trial97 --- launcher/ui/dialogs/AboutDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/AboutDialog.cpp b/launcher/ui/dialogs/AboutDialog.cpp index 84bae70d0..a8d60aef1 100644 --- a/launcher/ui/dialogs/AboutDialog.cpp +++ b/launcher/ui/dialogs/AboutDialog.cpp @@ -77,7 +77,7 @@ QString getCreditsHtml() stream << QString("

    d-513 %1

    \n").arg(getGitHub("d-513")); stream << QString("

    txtsd %1

    \n").arg(getWebsite("https://ihavea.quest")); stream << QString("

    timoreo %1

    \n").arg(getGitHub("timoreo22")); - stream << QString("

    Ezekiel Smith (ZekeSmith) %1

    \n").arg(getGitHub("ZekeSmith")); + stream << QString("

    ZekeZ %1

    \n").arg(getGitHub("ZekeZDev")); stream << QString("

    cozyGalvinism %1

    \n").arg(getGitHub("cozyGalvinism")); stream << QString("

    DioEgizio %1

    \n").arg(getGitHub("DioEgizio")); stream << QString("

    flowln %1

    \n").arg(getGitHub("flowln")); From 6338e2b3626e8ef6b17e8d9c3aa0a083586b3d4e Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 28 Oct 2024 00:34:41 +0200 Subject: [PATCH 300/616] Update launcher/ui/widgets/ModFilterWidget.ui Co-authored-by: TheKodeToad Signed-off-by: Alexandru Ionut Tripon --- launcher/ui/widgets/ModFilterWidget.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/widgets/ModFilterWidget.ui b/launcher/ui/widgets/ModFilterWidget.ui index 604c35ef5..c4d921e96 100644 --- a/launcher/ui/widgets/ModFilterWidget.ui +++ b/launcher/ui/widgets/ModFilterWidget.ui @@ -191,7 +191,7 @@ - Open Source only + Open source only From 6a6fe60a5beddd29de48939d5726ca5671d3d01f Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 28 Oct 2024 10:29:49 +0000 Subject: [PATCH 301/616] Revert "Use non-mod metadata in ModrinthPackExportTask" Out-of-scope Signed-off-by: TheKodeToad --- launcher/minecraft/MinecraftInstance.cpp | 14 +- launcher/minecraft/MinecraftInstance.h | 1 - .../modplatform/flame/FlamePackExportTask.cpp | 40 ++-- .../modplatform/flame/FlamePackExportTask.h | 13 +- launcher/modplatform/helpers/HashUtils.cpp | 2 +- .../modrinth/ModrinthPackExportTask.cpp | 188 +++++++----------- .../modrinth/ModrinthPackExportTask.h | 14 +- launcher/ui/MainWindow.cpp | 27 +-- launcher/ui/dialogs/ExportPackDialog.cpp | 11 +- launcher/ui/dialogs/ExportPackDialog.h | 5 +- 10 files changed, 141 insertions(+), 174 deletions(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 87bd1b703..2b24ec090 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -522,8 +522,7 @@ QStringList MinecraftInstance::javaArguments() if (javaVersion.isModular() && shouldApplyOnlineFixes()) // allow reflective access to java.net - required by the skin fix - args << "--add-opens" - << "java.base/java.net=ALL-UNNAMED"; + args << "--add-opens" << "java.base/java.net=ALL-UNNAMED"; return args; } @@ -797,10 +796,8 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session, MinecraftT QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session, MinecraftTarget::Ptr targetToJoin) { QStringList out; - out << "Main Class:" - << " " + getMainClass() << ""; - out << "Native path:" - << " " + getNativePath() << ""; + out << "Main Class:" << " " + getMainClass() << ""; + out << "Native path:" << " " + getNativePath() << ""; auto profile = m_components->getProfile(); @@ -1230,11 +1227,6 @@ std::shared_ptr MinecraftInstance::shaderPackList() return m_shader_pack_list; } -QList> MinecraftInstance::resourceLists() -{ - return { loaderModList(), coreModList(), nilModList(), resourcePackList(), texturePackList(), shaderPackList() }; -} - std::shared_ptr MinecraftInstance::worldList() { if (!m_world_list) { diff --git a/launcher/minecraft/MinecraftInstance.h b/launcher/minecraft/MinecraftInstance.h index 5d9bb45ef..75e97ae45 100644 --- a/launcher/minecraft/MinecraftInstance.h +++ b/launcher/minecraft/MinecraftInstance.h @@ -116,7 +116,6 @@ class MinecraftInstance : public BaseInstance { std::shared_ptr resourcePackList(); std::shared_ptr texturePackList(); std::shared_ptr shaderPackList(); - QList> resourceLists(); std::shared_ptr worldList(); std::shared_ptr gameOptionsModel(); diff --git a/launcher/modplatform/flame/FlamePackExportTask.cpp b/launcher/modplatform/flame/FlamePackExportTask.cpp index 61eaa826d..d661f1f05 100644 --- a/launcher/modplatform/flame/FlamePackExportTask.cpp +++ b/launcher/modplatform/flame/FlamePackExportTask.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include "Application.h" #include "Json.h" #include "MMCZip.h" @@ -40,23 +39,24 @@ #include "tasks/Task.h" const QString FlamePackExportTask::TEMPLATE = "
  • {name}{authors}
  • \n"; -const QStringList FlamePackExportTask::FILE_EXTENSIONS({ "jar", "litemod", "zip" }); +const QStringList FlamePackExportTask::FILE_EXTENSIONS({ "jar", "zip" }); -FlamePackExportTask::FlamePackExportTask(QString name, - QString version, - QString author, +FlamePackExportTask::FlamePackExportTask(const QString& name, + const QString& version, + const QString& author, bool optionalFiles, - MinecraftInstancePtr instance, - QString output, + InstancePtr instance, + const QString& output, MMCZip::FilterFunction filter) - : name(std::move(name)) - , version(std::move(version)) - , author(std::move(author)) + : name(name) + , version(version) + , author(author) , optionalFiles(optionalFiles) - , instance(std::move(instance)) - , gameRoot(this->instance->gameRoot()) - , output(std::move(output)) - , filter(std::move(filter)) + , instance(instance) + , mcInstance(dynamic_cast(instance.get())) + , gameRoot(instance->gameRoot()) + , output(output) + , filter(filter) {} void FlamePackExportTask::executeTask() @@ -90,7 +90,11 @@ void FlamePackExportTask::collectFiles() pendingHashes.clear(); resolvedFiles.clear(); - collectHashes(); + if (mcInstance != nullptr) { + mcInstance->loaderModList()->update(); + connect(mcInstance->loaderModList().get(), &ModFolderModel::updateFinished, this, &FlamePackExportTask::collectHashes); + } else + collectHashes(); } void FlamePackExportTask::collectHashes() @@ -98,7 +102,7 @@ void FlamePackExportTask::collectHashes() setAbortable(true); setStatus(tr("Finding file hashes...")); setProgress(1, 5); - auto allMods = instance->loaderModList()->allMods(); + auto allMods = mcInstance->loaderModList()->allMods(); ConcurrentTask::Ptr hashingTask( new ConcurrentTask(this, "MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); task.reset(hashingTask); @@ -375,9 +379,9 @@ QByteArray FlamePackExportTask::generateIndex() obj["version"] = version; obj["author"] = author; obj["overrides"] = "overrides"; - if (instance) { + if (mcInstance) { QJsonObject version; - auto profile = instance->getPackProfile(); + auto profile = mcInstance->getPackProfile(); // collect all supported components const ComponentPtr minecraft = profile->getComponent("net.minecraft"); const ComponentPtr quilt = profile->getComponent("org.quiltmc.quilt-loader"); diff --git a/launcher/modplatform/flame/FlamePackExportTask.h b/launcher/modplatform/flame/FlamePackExportTask.h index 83d870b09..b11eb17fa 100644 --- a/launcher/modplatform/flame/FlamePackExportTask.h +++ b/launcher/modplatform/flame/FlamePackExportTask.h @@ -28,12 +28,12 @@ class FlamePackExportTask : public Task { Q_OBJECT public: - FlamePackExportTask(QString name, - QString version, - QString author, + FlamePackExportTask(const QString& name, + const QString& version, + const QString& author, bool optionalFiles, - MinecraftInstancePtr instance, - QString output, + InstancePtr instance, + const QString& output, MMCZip::FilterFunction filter); protected: @@ -47,7 +47,8 @@ class FlamePackExportTask : public Task { // inputs const QString name, version, author; const bool optionalFiles; - const MinecraftInstancePtr instance; + const InstancePtr instance; + MinecraftInstance* mcInstance; const QDir gameRoot; const QString output; const MMCZip::FilterFunction filter; diff --git a/launcher/modplatform/helpers/HashUtils.cpp b/launcher/modplatform/helpers/HashUtils.cpp index 1db7ca453..a3b8d904c 100644 --- a/launcher/modplatform/helpers/HashUtils.cpp +++ b/launcher/modplatform/helpers/HashUtils.cpp @@ -115,7 +115,7 @@ QString hash(QIODevice* device, Algorithm type) QCryptographicHash hash(alg); if (!hash.addData(device)) - qCritical() << "Failed to read file to create hash!"; + qCritical() << "Failed to read JAR to create hash!"; Q_ASSERT(hash.result().length() == hash.hashLength(alg)); auto result = hash.result().toHex(); diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp b/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp index c1333963e..d103170af 100644 --- a/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp @@ -31,23 +31,25 @@ #include "modplatform/helpers/HashUtils.h" #include "tasks/Task.h" +const QStringList ModrinthPackExportTask::PREFIXES({ "mods/", "coremods/", "resourcepacks/", "texturepacks/", "shaderpacks/" }); const QStringList ModrinthPackExportTask::FILE_EXTENSIONS({ "jar", "litemod", "zip" }); -ModrinthPackExportTask::ModrinthPackExportTask(QString name, - QString version, - QString summary, +ModrinthPackExportTask::ModrinthPackExportTask(const QString& name, + const QString& version, + const QString& summary, bool optionalFiles, - MinecraftInstancePtr instance, - QString output, + InstancePtr instance, + const QString& output, MMCZip::FilterFunction filter) - : name(std::move(name)) - , version(std::move(version)) - , summary(std::move(summary)) + : name(name) + , version(version) + , summary(summary) , optionalFiles(optionalFiles) - , instance(std::move(instance)) - , gameRoot(this->instance->gameRoot()) - , output(std::move(output)) - , filter(std::move(filter)) + , instance(instance) + , mcInstance(dynamic_cast(instance.get())) + , gameRoot(instance->gameRoot()) + , output(output) + , filter(filter) {} void ModrinthPackExportTask::executeTask() @@ -81,102 +83,64 @@ void ModrinthPackExportTask::collectFiles() pendingHashes.clear(); resolvedFiles.clear(); - collectHashes(); + if (mcInstance) { + mcInstance->loaderModList()->update(); + connect(mcInstance->loaderModList().get(), &ModFolderModel::updateFinished, this, &ModrinthPackExportTask::collectHashes); + } else + collectHashes(); } void ModrinthPackExportTask::collectHashes() { - // TODO make this just use EnsureMetadataTask - setStatus(tr("Finding file hashes...")); - - QStringList prefixes; - - for (const auto& model : instance->resourceLists()) { - QCoreApplication::processEvents(); - - QEventLoop loop; - connect(model.get(), &ModFolderModel::updateFinished, &loop, &QEventLoop::quit); - model->update(); - loop.exec(); - - prefixes.append(gameRoot.relativeFilePath(model->dir().absolutePath()) + '/'); - - for (const Resource* resource : model->allResources()) { - QCoreApplication::processEvents(); - - if (resource->metadata() == nullptr) - continue; - - const QUrl& url = resource->metadata()->url; - - if (url.isEmpty() || !BuildConfig.MODRINTH_MRPACK_HOSTS.contains(url.host())) - continue; - - const QFileInfo& fileInfo = resource->fileinfo(); - const QString relativePath = gameRoot.relativeFilePath(fileInfo.absoluteFilePath()); - - if (filter(relativePath)) - continue; - - qDebug() << "Resolving" << relativePath << "from index"; - - QString sha1; - QString sha512; - qint64 size; - - if (resource->metadata()->hash_format == "sha1") - sha1 = resource->metadata()->hash; - else if (resource->metadata()->hash_format == "sha512") - sha512 = resource->metadata()->hash; - - { - QFile file(fileInfo.absoluteFilePath()); - - if (!file.open(QFile::ReadOnly)) { - qWarning() << "Could not open" << relativePath << "for hashing"; - continue; - } - - const QByteArray data = file.readAll(); - - if (file.error() != QFileDevice::NoError) { - qWarning() << "Could not read" << relativePath; - continue; - } - - if (sha1.isEmpty()) - sha1 = Hashing::hash(data, Hashing::Algorithm::Sha1); - - if (sha512.isEmpty()) - sha512 = Hashing::hash(data, Hashing::Algorithm::Sha512); - - size = file.size(); - } - - ResolvedFile resolvedFile{ sha1, sha512, url.toEncoded(), size, resource->metadata()->side }; - resolvedFiles[relativePath] = resolvedFile; - } - } - for (const QFileInfo& file : files) { QCoreApplication::processEvents(); const QString relative = gameRoot.relativeFilePath(file.absoluteFilePath()); - - if (resolvedFiles.contains(relative)) - continue; - // require sensible file types - if (!std::any_of(prefixes.begin(), prefixes.end(), [&relative](const QString& prefix) { return relative.startsWith(prefix); })) + if (!std::any_of(PREFIXES.begin(), PREFIXES.end(), [&relative](const QString& prefix) { return relative.startsWith(prefix); })) continue; if (!std::any_of(FILE_EXTENSIONS.begin(), FILE_EXTENSIONS.end(), [&relative](const QString& extension) { return relative.endsWith('.' + extension) || relative.endsWith('.' + extension + ".disabled"); })) continue; + QFile openFile(file.absoluteFilePath()); + if (!openFile.open(QFile::ReadOnly)) { + qWarning() << "Could not open" << file << "for hashing"; + continue; + } + + const QByteArray data = openFile.readAll(); + if (openFile.error() != QFileDevice::NoError) { + qWarning() << "Could not read" << file; + continue; + } + auto sha512 = Hashing::hash(data, Hashing::Algorithm::Sha512); + + auto allMods = mcInstance->loaderModList()->allMods(); + if (auto modIter = std::find_if(allMods.begin(), allMods.end(), [&file](Mod* mod) { return mod->fileinfo() == file; }); + modIter != allMods.end()) { + const Mod* mod = *modIter; + if (mod->metadata() != nullptr) { + const QUrl& url = mod->metadata()->url; + // ensure the url is permitted on modrinth.com + if (!url.isEmpty() && BuildConfig.MODRINTH_MRPACK_HOSTS.contains(url.host())) { + qDebug() << "Resolving" << relative << "from index"; + + auto sha1 = Hashing::hash(data, Hashing::Algorithm::Sha1); + + ResolvedFile resolvedFile{ sha1, sha512, url.toEncoded(), openFile.size(), mod->metadata()->side }; + resolvedFiles[relative] = resolvedFile; + + // nice! we've managed to resolve based on local metadata! + // no need to enqueue it + continue; + } + } + } + qDebug() << "Enqueueing" << relative << "for Modrinth query"; - auto sha512 = Hashing::hash(file.absoluteFilePath(), Hashing::Algorithm::Sha512); pendingHashes[relative] = sha512; } @@ -277,28 +241,30 @@ QByteArray ModrinthPackExportTask::generateIndex() if (!summary.isEmpty()) out["summary"] = summary; - auto profile = instance->getPackProfile(); - // collect all supported components - const ComponentPtr minecraft = profile->getComponent("net.minecraft"); - const ComponentPtr quilt = profile->getComponent("org.quiltmc.quilt-loader"); - const ComponentPtr fabric = profile->getComponent("net.fabricmc.fabric-loader"); - const ComponentPtr forge = profile->getComponent("net.minecraftforge"); - const ComponentPtr neoForge = profile->getComponent("net.neoforged"); + if (mcInstance) { + auto profile = mcInstance->getPackProfile(); + // collect all supported components + const ComponentPtr minecraft = profile->getComponent("net.minecraft"); + const ComponentPtr quilt = profile->getComponent("org.quiltmc.quilt-loader"); + const ComponentPtr fabric = profile->getComponent("net.fabricmc.fabric-loader"); + const ComponentPtr forge = profile->getComponent("net.minecraftforge"); + const ComponentPtr neoForge = profile->getComponent("net.neoforged"); - // convert all available components to mrpack dependencies - QJsonObject dependencies; - if (minecraft != nullptr) - dependencies["minecraft"] = minecraft->m_version; - if (quilt != nullptr) - dependencies["quilt-loader"] = quilt->m_version; - if (fabric != nullptr) - dependencies["fabric-loader"] = fabric->m_version; - if (forge != nullptr) - dependencies["forge"] = forge->m_version; - if (neoForge != nullptr) - dependencies["neoforge"] = neoForge->m_version; + // convert all available components to mrpack dependencies + QJsonObject dependencies; + if (minecraft != nullptr) + dependencies["minecraft"] = minecraft->m_version; + if (quilt != nullptr) + dependencies["quilt-loader"] = quilt->m_version; + if (fabric != nullptr) + dependencies["fabric-loader"] = fabric->m_version; + if (forge != nullptr) + dependencies["forge"] = forge->m_version; + if (neoForge != nullptr) + dependencies["neoforge"] = neoForge->m_version; - out["dependencies"] = dependencies; + out["dependencies"] = dependencies; + } QJsonArray filesOut; for (auto iterator = resolvedFiles.constBegin(); iterator != resolvedFiles.constEnd(); iterator++) { diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.h b/launcher/modplatform/modrinth/ModrinthPackExportTask.h index d5dc08678..ee740a456 100644 --- a/launcher/modplatform/modrinth/ModrinthPackExportTask.h +++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.h @@ -29,12 +29,12 @@ class ModrinthPackExportTask : public Task { Q_OBJECT public: - ModrinthPackExportTask(QString name, - QString version, - QString summary, + ModrinthPackExportTask(const QString& name, + const QString& version, + const QString& summary, bool optionalFiles, - MinecraftInstancePtr instance, - QString output, + InstancePtr instance, + const QString& output, MMCZip::FilterFunction filter); protected: @@ -48,12 +48,14 @@ class ModrinthPackExportTask : public Task { Metadata::ModSide side; }; + static const QStringList PREFIXES; static const QStringList FILE_EXTENSIONS; // inputs const QString name, version, summary; const bool optionalFiles; - const MinecraftInstancePtr instance; + const InstancePtr instance; + MinecraftInstance* mcInstance; const QDir gameRoot; const QString output; const MMCZip::FilterFunction filter; diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 6134d9d31..96f1348d2 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1403,26 +1403,27 @@ void MainWindow::on_actionExportInstanceZip_triggered() void MainWindow::on_actionExportInstanceMrPack_triggered() { - auto instance = std::dynamic_pointer_cast(m_selectedInstance); - if (instance) { - ExportPackDialog dlg(std::move(instance), this); + if (m_selectedInstance) { + ExportPackDialog dlg(m_selectedInstance, this); dlg.exec(); } } void MainWindow::on_actionExportInstanceFlamePack_triggered() { - auto instance = std::dynamic_pointer_cast(m_selectedInstance); - if (instance) { - if (auto cmp = instance->getPackProfile()->getComponent("net.minecraft"); - cmp && cmp->getVersionFile() && cmp->getVersionFile()->type == "snapshot") { - QMessageBox msgBox(this); - msgBox.setText("Snapshots are currently not supported by CurseForge modpacks."); - msgBox.exec(); - return; + if (m_selectedInstance) { + auto instance = dynamic_cast(m_selectedInstance.get()); + if (instance) { + if (auto cmp = instance->getPackProfile()->getComponent("net.minecraft"); + cmp && cmp->getVersionFile() && cmp->getVersionFile()->type == "snapshot") { + QMessageBox msgBox(this); + msgBox.setText("Snapshots are currently not supported by CurseForge modpacks."); + msgBox.exec(); + return; + } + ExportPackDialog dlg(m_selectedInstance, this, ModPlatform::ResourceProvider::FLAME); + dlg.exec(); } - ExportPackDialog dlg(std::move(instance), this, ModPlatform::ResourceProvider::FLAME); - dlg.exec(); } } diff --git a/launcher/ui/dialogs/ExportPackDialog.cpp b/launcher/ui/dialogs/ExportPackDialog.cpp index c01b83f5c..0278c6cb0 100644 --- a/launcher/ui/dialogs/ExportPackDialog.cpp +++ b/launcher/ui/dialogs/ExportPackDialog.cpp @@ -34,7 +34,7 @@ #include "MMCZip.h" #include "modplatform/modrinth/ModrinthPackExportTask.h" -ExportPackDialog::ExportPackDialog(const MinecraftInstancePtr& instance, QWidget* parent, ModPlatform::ResourceProvider provider) +ExportPackDialog::ExportPackDialog(InstancePtr instance, QWidget* parent, ModPlatform::ResourceProvider provider) : QDialog(parent), instance(instance), ui(new Ui::ExportPackDialog), m_provider(provider) { Q_ASSERT(m_provider == ModPlatform::ResourceProvider::MODRINTH || m_provider == ModPlatform::ResourceProvider::FLAME); @@ -86,9 +86,12 @@ ExportPackDialog::ExportPackDialog(const MinecraftInstancePtr& instance, QWidget proxy->blockedPaths().insert(file); } - for (auto& resourceModel : instance->resourceLists()) - if (resourceModel->indexDir().exists()) - proxy->ignoreFilesWithPath().insert(root.relativeFilePath(resourceModel->indexDir().absolutePath())); + MinecraftInstance* mcInstance = dynamic_cast(instance.get()); + if (mcInstance) { + const QDir index = mcInstance->loaderModList()->indexDir(); + if (index.exists()) + proxy->ignoreFilesWithPath().insert(root.relativeFilePath(index.absolutePath())); + } ui->files->setModel(proxy); ui->files->setRootIndex(proxy->mapFromSource(model->index(instance->gameRoot()))); diff --git a/launcher/ui/dialogs/ExportPackDialog.h b/launcher/ui/dialogs/ExportPackDialog.h index ab20f44bd..830c24d25 100644 --- a/launcher/ui/dialogs/ExportPackDialog.h +++ b/launcher/ui/dialogs/ExportPackDialog.h @@ -18,7 +18,6 @@ #pragma once -#include #include #include "BaseInstance.h" #include "FastFileIconProvider.h" @@ -33,7 +32,7 @@ class ExportPackDialog : public QDialog { Q_OBJECT public: - explicit ExportPackDialog(const MinecraftInstancePtr& instance, + explicit ExportPackDialog(InstancePtr instance, QWidget* parent = nullptr, ModPlatform::ResourceProvider provider = ModPlatform::ResourceProvider::MODRINTH); ~ExportPackDialog(); @@ -42,7 +41,7 @@ class ExportPackDialog : public QDialog { void validate(); private: - const MinecraftInstancePtr instance; + const InstancePtr instance; Ui::ExportPackDialog* ui; FileIgnoreProxy* proxy; FastFileIconProvider icons; From 9eb1ce3ad7dde0b2ca551b0b281081724e6fd58e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 28 Oct 2024 12:39:26 +0200 Subject: [PATCH 302/616] replace unzipping with unpacking Signed-off-by: Trial97 --- launcher/MMCZip.cpp | 8 ++++---- launcher/modplatform/legacy_ftb/PackInstallTask.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index 09dc23f0e..b38aca17a 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -378,7 +378,7 @@ std::optional extractDir(QString fileCompressed, QString dir) if (fileInfo.size() == 22) { return QStringList(); } - qWarning() << "Could not open archive for unzipping:" << fileCompressed << "Error:" << zip.getZipError(); + qWarning() << "Could not open archive for unpacking:" << fileCompressed << "Error:" << zip.getZipError(); ; return std::nullopt; } @@ -395,7 +395,7 @@ std::optional extractDir(QString fileCompressed, QString subdir, QS if (fileInfo.size() == 22) { return QStringList(); } - qWarning() << "Could not open archive for unzipping:" << fileCompressed << "Error:" << zip.getZipError(); + qWarning() << "Could not open archive for unpacking:" << fileCompressed << "Error:" << zip.getZipError(); ; return std::nullopt; } @@ -412,7 +412,7 @@ bool extractFile(QString fileCompressed, QString file, QString target) if (fileInfo.size() == 22) { return true; } - qWarning() << "Could not open archive for unzipping:" << fileCompressed << "Error:" << zip.getZipError(); + qWarning() << "Could not open archive for unpacking:" << fileCompressed << "Error:" << zip.getZipError(); return false; } return extractRelFile(&zip, file, target); @@ -577,7 +577,7 @@ auto ExtractZipTask::extractZip() -> ZipResult auto relative_file_name = QDir::fromNativeSeparators(file_name.mid(m_subdirectory.size())); auto original_name = relative_file_name; - setStatus("Unzipping: " + relative_file_name); + setStatus("Unpacking: " + relative_file_name); // Fix subdirs/files ending with a / getting transformed into absolute paths if (relative_file_name.startsWith('/')) diff --git a/launcher/modplatform/legacy_ftb/PackInstallTask.cpp b/launcher/modplatform/legacy_ftb/PackInstallTask.cpp index 7157f7f2d..d6252663f 100644 --- a/launcher/modplatform/legacy_ftb/PackInstallTask.cpp +++ b/launcher/modplatform/legacy_ftb/PackInstallTask.cpp @@ -138,7 +138,7 @@ void PackInstallTask::install() if (unzipMcDir.exists()) { // ok, found minecraft dir, move contents to instance dir if (!FS::move(m_stagingPath + "/unzip/minecraft", m_stagingPath + "/minecraft")) { - emitFailed(tr("Failed to move unzipped Minecraft!")); + emitFailed(tr("Failed to move unpacked Minecraft!")); return; } } From 0cafac84ac6328fefb8992de2c6a2385b1c0053c Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 28 Oct 2024 12:54:21 +0200 Subject: [PATCH 303/616] replace currentData with itemData on QComboBox::currentIndexChanged slots Signed-off-by: Trial97 --- launcher/ui/pages/modplatform/ResourcePage.cpp | 14 +++++++------- launcher/ui/pages/modplatform/flame/FlamePage.cpp | 2 +- .../ui/pages/modplatform/modrinth/ModrinthPage.cpp | 2 +- launcher/ui/widgets/ThemeCustomizationWidget.cpp | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index fe566cd7a..481fbc1f4 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -325,9 +325,9 @@ void ResourcePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI updateUi(); } -void ResourcePage::onVersionSelectionChanged(int) +void ResourcePage::onVersionSelectionChanged(int index) { - m_selectedVersionIndex = m_ui->versionSelectionBox->currentData().toInt(); + m_selectedVersionIndex = m_ui->versionSelectionBox->itemData(index).toInt(); updateSelectionButton(); } @@ -364,10 +364,10 @@ void ResourcePage::onResourceSelected() auto& version = current_pack->versions[m_selectedVersionIndex]; if (version.downloadUrl.isNull()) { - CustomMessageBox::selectable(this, tr("How?"), - "You managed to select a resource that doesn't have a download link. Because of this missing " - "information prism will not try to download it.", - QMessageBox::Warning) + CustomMessageBox::selectable( + this, tr("Download Link Missing"), + tr("It looks like the resource you selected doesn't have a download link, so Prism won't attempt to download it."), + QMessageBox::Warning) ->show(); return; } @@ -484,7 +484,7 @@ void ResourcePage::openProject(QVariant projectID) m_ui->gridLayout_4->addWidget(buttonBox, 1, 2); connect(m_ui->versionSelectionBox, QOverload::of(&QComboBox::currentIndexChanged), this, - [this, okBtn] { okBtn->setEnabled(m_ui->versionSelectionBox->currentData().toInt() >= 0); }); + [this, okBtn](int index) { okBtn->setEnabled(m_ui->versionSelectionBox->itemData(index).toInt() >= 0); }); auto jump = [this] { for (int row = 0; row < m_model->rowCount({}); row++) { diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.cpp b/launcher/ui/pages/modplatform/flame/FlamePage.cpp index 9abf4a9c6..de6b3d633 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlamePage.cpp @@ -273,7 +273,7 @@ void FlamePage::suggestCurrent() void FlamePage::onVersionSelectionChanged(int index) { bool is_blocked = false; - ui->versionSelectionBox->currentData().toInt(&is_blocked); + ui->versionSelectionBox->itemData(index).toInt(&is_blocked); if (index == -1 || is_blocked) { m_selected_version_index = -1; diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp index 8803c6dd9..7d70abec4 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp @@ -375,7 +375,7 @@ void ModrinthPage::onVersionSelectionChanged(int index) selectedVersion = ""; return; } - selectedVersion = ui->versionSelectionBox->currentData().toString(); + selectedVersion = ui->versionSelectionBox->itemData(index).toString(); suggestCurrent(); } diff --git a/launcher/ui/widgets/ThemeCustomizationWidget.cpp b/launcher/ui/widgets/ThemeCustomizationWidget.cpp index 7a54bd390..097678b8d 100644 --- a/launcher/ui/widgets/ThemeCustomizationWidget.cpp +++ b/launcher/ui/widgets/ThemeCustomizationWidget.cpp @@ -87,7 +87,7 @@ void ThemeCustomizationWidget::applyIconTheme(int index) { auto settings = APPLICATION->settings(); auto originalIconTheme = settings->get("IconTheme").toString(); - auto newIconTheme = ui->iconsComboBox->currentData().toString(); + auto newIconTheme = ui->iconsComboBox->itemData(index).toString(); if (originalIconTheme != newIconTheme) { settings->set("IconTheme", newIconTheme); APPLICATION->themeManager()->applyCurrentlySelectedTheme(); @@ -100,7 +100,7 @@ void ThemeCustomizationWidget::applyWidgetTheme(int index) { auto settings = APPLICATION->settings(); auto originalAppTheme = settings->get("ApplicationTheme").toString(); - auto newAppTheme = ui->widgetStyleComboBox->currentData().toString(); + auto newAppTheme = ui->widgetStyleComboBox->itemData(index).toString(); if (originalAppTheme != newAppTheme) { settings->set("ApplicationTheme", newAppTheme); APPLICATION->themeManager()->applyCurrentlySelectedTheme(); @@ -113,7 +113,7 @@ void ThemeCustomizationWidget::applyCatTheme(int index) { auto settings = APPLICATION->settings(); auto originalCat = settings->get("BackgroundCat").toString(); - auto newCat = ui->backgroundCatComboBox->currentData().toString(); + auto newCat = ui->backgroundCatComboBox->itemData(index).toString(); if (originalCat != newCat) { settings->set("BackgroundCat", newCat); } From 1809858fc7d550713730750e238d9cfc57e0e0f5 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 28 Oct 2024 11:01:30 +0000 Subject: [PATCH 304/616] Ignore .index in ExportPackDialog Signed-off-by: TheKodeToad --- launcher/minecraft/MinecraftInstance.cpp | 5 +++++ launcher/minecraft/MinecraftInstance.h | 1 + launcher/ui/dialogs/ExportPackDialog.cpp | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 2b24ec090..0888714c8 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -1227,6 +1227,11 @@ std::shared_ptr MinecraftInstance::shaderPackList() return m_shader_pack_list; } +QList> MinecraftInstance::resourceLists() +{ + return { loaderModList(), coreModList(), nilModList(), resourcePackList(), texturePackList(), shaderPackList() }; +} + std::shared_ptr MinecraftInstance::worldList() { if (!m_world_list) { diff --git a/launcher/minecraft/MinecraftInstance.h b/launcher/minecraft/MinecraftInstance.h index 75e97ae45..5d9bb45ef 100644 --- a/launcher/minecraft/MinecraftInstance.h +++ b/launcher/minecraft/MinecraftInstance.h @@ -116,6 +116,7 @@ class MinecraftInstance : public BaseInstance { std::shared_ptr resourcePackList(); std::shared_ptr texturePackList(); std::shared_ptr shaderPackList(); + QList> resourceLists(); std::shared_ptr worldList(); std::shared_ptr gameOptionsModel(); diff --git a/launcher/ui/dialogs/ExportPackDialog.cpp b/launcher/ui/dialogs/ExportPackDialog.cpp index 0278c6cb0..8368d7bb7 100644 --- a/launcher/ui/dialogs/ExportPackDialog.cpp +++ b/launcher/ui/dialogs/ExportPackDialog.cpp @@ -88,9 +88,9 @@ ExportPackDialog::ExportPackDialog(InstancePtr instance, QWidget* parent, ModPla MinecraftInstance* mcInstance = dynamic_cast(instance.get()); if (mcInstance) { - const QDir index = mcInstance->loaderModList()->indexDir(); - if (index.exists()) - proxy->ignoreFilesWithPath().insert(root.relativeFilePath(index.absolutePath())); + for (auto& resourceModel : mcInstance->resourceLists()) + if (resourceModel->indexDir().exists()) + proxy->ignoreFilesWithPath().insert(root.relativeFilePath(resourceModel->indexDir().absolutePath())); } ui->files->setModel(proxy); From f75e049675e00abd71b350e388aa5dd1ebe465bf Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 11:37:16 +0200 Subject: [PATCH 305/616] add release_type filer for mod/modpacks Signed-off-by: Trial97 --- launcher/ui/widgets/ModFilterWidget.cpp | 22 +++++++++++++ launcher/ui/widgets/ModFilterWidget.h | 1 + launcher/ui/widgets/ModFilterWidget.ui | 41 +++++++++++++++++++++++-- 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/launcher/ui/widgets/ModFilterWidget.cpp b/launcher/ui/widgets/ModFilterWidget.cpp index 89d9bdb61..5ae49d3a5 100644 --- a/launcher/ui/widgets/ModFilterWidget.cpp +++ b/launcher/ui/widgets/ModFilterWidget.cpp @@ -162,6 +162,11 @@ ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended, QWi connect(ui->hideInstalled, &QCheckBox::stateChanged, this, &ModFilterWidget::onHideInstalledFilterChanged); connect(ui->openSource, &QCheckBox::stateChanged, this, &ModFilterWidget::onOpenSourceFilterChanged); + connect(ui->releaseCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onReleaseFilterChanged); + connect(ui->betaCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onReleaseFilterChanged); + connect(ui->alphaCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onReleaseFilterChanged); + connect(ui->unknownCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onReleaseFilterChanged); + setHidden(true); loadVersionList(); prepareBasicFilter(); @@ -349,4 +354,21 @@ void ModFilterWidget::onOpenSourceFilterChanged() emit filterChanged(); } +void ModFilterWidget::onReleaseFilterChanged() +{ + std::list releases; + if (ui->releaseCb->isChecked()) + releases.push_back(ModPlatform::IndexedVersionType(ModPlatform::IndexedVersionType::VersionType::Release)); + if (ui->betaCb->isChecked()) + releases.push_back(ModPlatform::IndexedVersionType(ModPlatform::IndexedVersionType::VersionType::Beta)); + if (ui->alphaCb->isChecked()) + releases.push_back(ModPlatform::IndexedVersionType(ModPlatform::IndexedVersionType::VersionType::Alpha)); + if (ui->unknownCb->isChecked()) + releases.push_back(ModPlatform::IndexedVersionType(ModPlatform::IndexedVersionType::VersionType::Unknown)); + m_filter_changed = releases != m_filter->releases; + m_filter->releases = releases; + if (m_filter_changed) + emit filterChanged(); +} + #include "ModFilterWidget.moc" diff --git a/launcher/ui/widgets/ModFilterWidget.h b/launcher/ui/widgets/ModFilterWidget.h index 76668db92..41a2f1bbd 100644 --- a/launcher/ui/widgets/ModFilterWidget.h +++ b/launcher/ui/widgets/ModFilterWidget.h @@ -109,6 +109,7 @@ class ModFilterWidget : public QTabWidget { void onHideInstalledFilterChanged(); void onShowAllVersionsChanged(); void onOpenSourceFilterChanged(); + void onReleaseFilterChanged(); private: Ui::ModFilterWidget* ui; diff --git a/launcher/ui/widgets/ModFilterWidget.ui b/launcher/ui/widgets/ModFilterWidget.ui index c4d921e96..807a0019a 100644 --- a/launcher/ui/widgets/ModFilterWidget.ui +++ b/launcher/ui/widgets/ModFilterWidget.ui @@ -63,8 +63,8 @@ 0 0 - 308 - 598 + 294 + 781
    @@ -195,6 +195,43 @@
    + + + + Release type + + + + + + Release + + + + + + + Beta + + + + + + + Alpha + + + + + + + Unknown + + + + + + From bd82737efbb99dfc488d6d073046e5fe62693a9e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 18 Sep 2024 21:01:34 +0300 Subject: [PATCH 306/616] translate standard buttons Signed-off-by: Trial97 --- launcher/ui/dialogs/BlockedModsDialog.cpp | 2 ++ launcher/ui/dialogs/CopyInstanceDialog.cpp | 3 +++ launcher/ui/dialogs/EditAccountDialog.cpp | 4 ++++ launcher/ui/dialogs/ExportInstanceDialog.cpp | 5 +++++ launcher/ui/dialogs/ExportPackDialog.cpp | 3 +++ launcher/ui/dialogs/ExportToModListDialog.cpp | 3 +++ launcher/ui/dialogs/IconPickerDialog.cpp | 3 +++ launcher/ui/dialogs/ImportResourceDialog.cpp | 3 +++ launcher/ui/dialogs/InstallLoaderDialog.cpp | 2 ++ launcher/ui/dialogs/MSALoginDialog.cpp | 2 ++ launcher/ui/dialogs/NewComponentDialog.cpp | 3 +++ launcher/ui/dialogs/NewInstanceDialog.cpp | 3 +++ launcher/ui/dialogs/OfflineLoginDialog.cpp | 3 +++ launcher/ui/dialogs/ProfileSelectDialog.cpp | 4 ++++ launcher/ui/dialogs/ProfileSetupDialog.cpp | 3 +++ launcher/ui/dialogs/ReviewMessageBox.cpp | 3 +++ launcher/ui/dialogs/ScrollMessageBox.cpp | 4 ++++ launcher/ui/dialogs/VersionSelectDialog.cpp | 3 +++ launcher/ui/dialogs/skins/SkinManageDialog.cpp | 3 +++ launcher/ui/java/InstallJavaDialog.cpp | 1 + launcher/ui/pagedialog/PageDialog.cpp | 2 ++ launcher/ui/pages/modplatform/OptionalModDialog.cpp | 3 +++ launcher/ui/pages/modplatform/ResourcePage.cpp | 1 + launcher/updater/prismupdater/UpdaterDialogs.cpp | 4 ++++ 24 files changed, 70 insertions(+) diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index 5c93053d1..a02f527de 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -51,6 +51,8 @@ BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, cons ui->setupUi(this); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); m_openMissingButton = ui->buttonBox->addButton(tr("Open Missing"), QDialogButtonBox::ActionRole); connect(m_openMissingButton, &QPushButton::clicked, this, [this]() { openAll(true); }); diff --git a/launcher/ui/dialogs/CopyInstanceDialog.cpp b/launcher/ui/dialogs/CopyInstanceDialog.cpp index 770741a61..e5c2c301b 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.cpp +++ b/launcher/ui/dialogs/CopyInstanceDialog.cpp @@ -109,6 +109,9 @@ CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget* parent) auto HelpButton = ui->buttonBox->button(QDialogButtonBox::Help); connect(HelpButton, &QPushButton::clicked, this, &CopyInstanceDialog::help); + HelpButton->setText(tr("Help")); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } CopyInstanceDialog::~CopyInstanceDialog() diff --git a/launcher/ui/dialogs/EditAccountDialog.cpp b/launcher/ui/dialogs/EditAccountDialog.cpp index 58036fd82..9d0175bbc 100644 --- a/launcher/ui/dialogs/EditAccountDialog.cpp +++ b/launcher/ui/dialogs/EditAccountDialog.cpp @@ -15,6 +15,7 @@ #include "EditAccountDialog.h" #include +#include #include #include "ui_EditAccountDialog.h" @@ -27,6 +28,9 @@ EditAccountDialog::EditAccountDialog(const QString& text, QWidget* parent, int f ui->userTextBox->setEnabled(flags & UsernameField); ui->passTextBox->setEnabled(flags & PasswordField); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } EditAccountDialog::~EditAccountDialog() diff --git a/launcher/ui/dialogs/ExportInstanceDialog.cpp b/launcher/ui/dialogs/ExportInstanceDialog.cpp index 7e00f18f4..d25cd32b6 100644 --- a/launcher/ui/dialogs/ExportInstanceDialog.cpp +++ b/launcher/ui/dialogs/ExportInstanceDialog.cpp @@ -51,6 +51,8 @@ #include #include #include +#include +#include #include #include #include @@ -84,6 +86,9 @@ ExportInstanceDialog::ExportInstanceDialog(InstancePtr instance, QWidget* parent auto headerView = ui->treeView->header(); headerView->setSectionResizeMode(QHeaderView::ResizeToContents); headerView->setSectionResizeMode(0, QHeaderView::Stretch); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ExportInstanceDialog::~ExportInstanceDialog() diff --git a/launcher/ui/dialogs/ExportPackDialog.cpp b/launcher/ui/dialogs/ExportPackDialog.cpp index 0278c6cb0..ed79a741f 100644 --- a/launcher/ui/dialogs/ExportPackDialog.cpp +++ b/launcher/ui/dialogs/ExportPackDialog.cpp @@ -103,6 +103,9 @@ ExportPackDialog::ExportPackDialog(InstancePtr instance, QWidget* parent, ModPla QHeaderView* headerView = ui->files->header(); headerView->setSectionResizeMode(QHeaderView::ResizeToContents); headerView->setSectionResizeMode(0, QHeaderView::Stretch); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ExportPackDialog::~ExportPackDialog() diff --git a/launcher/ui/dialogs/ExportToModListDialog.cpp b/launcher/ui/dialogs/ExportToModListDialog.cpp index 908743ab0..c2ba68f7a 100644 --- a/launcher/ui/dialogs/ExportToModListDialog.cpp +++ b/launcher/ui/dialogs/ExportToModListDialog.cpp @@ -64,6 +64,9 @@ ExportToModListDialog::ExportToModListDialog(QString name, QList mods, QWi this->ui->finalText->selectAll(); this->ui->finalText->copy(); }); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Save)->setText(tr("Save")); triggerImp(); } diff --git a/launcher/ui/dialogs/IconPickerDialog.cpp b/launcher/ui/dialogs/IconPickerDialog.cpp index a196fd587..a7b44eab0 100644 --- a/launcher/ui/dialogs/IconPickerDialog.cpp +++ b/launcher/ui/dialogs/IconPickerDialog.cpp @@ -63,6 +63,9 @@ IconPickerDialog::IconPickerDialog(QWidget* parent) : QDialog(parent), ui(new Ui auto buttonAdd = ui->buttonBox->addButton(tr("Add Icon"), QDialogButtonBox::ResetRole); buttonRemove = ui->buttonBox->addButton(tr("Remove Icon"), QDialogButtonBox::ResetRole); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); + connect(buttonAdd, SIGNAL(clicked(bool)), SLOT(addNewIcon())); connect(buttonRemove, SIGNAL(clicked(bool)), SLOT(removeSelectedIcon())); diff --git a/launcher/ui/dialogs/ImportResourceDialog.cpp b/launcher/ui/dialogs/ImportResourceDialog.cpp index 84b692730..e3a1e9a6c 100644 --- a/launcher/ui/dialogs/ImportResourceDialog.cpp +++ b/launcher/ui/dialogs/ImportResourceDialog.cpp @@ -45,6 +45,9 @@ ImportResourceDialog::ImportResourceDialog(QString file_path, PackedResourceType ui->label->setText( tr("Choose the instance you would like to import this %1 to.").arg(ResourceUtils::getPackedTypeName(m_resource_type))); ui->label_file_path->setText(tr("File: %1").arg(m_file_path)); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } void ImportResourceDialog::activated(QModelIndex index) diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp index 8e5463b31..7082125f2 100644 --- a/launcher/ui/dialogs/InstallLoaderDialog.cpp +++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp @@ -104,6 +104,8 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr profile, c buttons->setOrientation(Qt::Horizontal); buttons->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); + buttons->button(QDialogButtonBox::Ok)->setText(tr("Ok")); + buttons->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); buttonLayout->addWidget(buttons); diff --git a/launcher/ui/dialogs/MSALoginDialog.cpp b/launcher/ui/dialogs/MSALoginDialog.cpp index 4e38b4187..2f6c6d9b2 100644 --- a/launcher/ui/dialogs/MSALoginDialog.cpp +++ b/launcher/ui/dialogs/MSALoginDialog.cpp @@ -68,6 +68,8 @@ MSALoginDialog::MSALoginDialog(QWidget* parent) : QDialog(parent), ui(new Ui::MS } } }); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); } int MSALoginDialog::exec() diff --git a/launcher/ui/dialogs/NewComponentDialog.cpp b/launcher/ui/dialogs/NewComponentDialog.cpp index b47b85ff1..b5f8ff889 100644 --- a/launcher/ui/dialogs/NewComponentDialog.cpp +++ b/launcher/ui/dialogs/NewComponentDialog.cpp @@ -68,6 +68,9 @@ NewComponentDialog::NewComponentDialog(const QString& initialName, const QString ui->nameTextBox->setFocus(); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); + originalPlaceholderText = ui->uidTextBox->placeholderText(); updateDialogState(); } diff --git a/launcher/ui/dialogs/NewInstanceDialog.cpp b/launcher/ui/dialogs/NewInstanceDialog.cpp index f16c50860..d9ea0aafb 100644 --- a/launcher/ui/dialogs/NewInstanceDialog.cpp +++ b/launcher/ui/dialogs/NewInstanceDialog.cpp @@ -109,16 +109,19 @@ NewInstanceDialog::NewInstanceDialog(const QString& initialGroup, auto OkButton = m_buttons->button(QDialogButtonBox::Ok); OkButton->setDefault(true); OkButton->setAutoDefault(true); + OkButton->setText(tr("OK")); connect(OkButton, &QPushButton::clicked, this, &NewInstanceDialog::accept); auto CancelButton = m_buttons->button(QDialogButtonBox::Cancel); CancelButton->setDefault(false); CancelButton->setAutoDefault(false); + CancelButton->setText(tr("Cancel")); connect(CancelButton, &QPushButton::clicked, this, &NewInstanceDialog::reject); auto HelpButton = m_buttons->button(QDialogButtonBox::Help); HelpButton->setDefault(false); HelpButton->setAutoDefault(false); + HelpButton->setText(tr("Help")); connect(HelpButton, &QPushButton::clicked, m_container, &PageContainer::help); if (!url.isEmpty()) { diff --git a/launcher/ui/dialogs/OfflineLoginDialog.cpp b/launcher/ui/dialogs/OfflineLoginDialog.cpp index b9d1c2915..d8fbc04fd 100644 --- a/launcher/ui/dialogs/OfflineLoginDialog.cpp +++ b/launcher/ui/dialogs/OfflineLoginDialog.cpp @@ -9,6 +9,9 @@ OfflineLoginDialog::OfflineLoginDialog(QWidget* parent) : QDialog(parent), ui(ne ui->progressBar->setVisible(false); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); + connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); } diff --git a/launcher/ui/dialogs/ProfileSelectDialog.cpp b/launcher/ui/dialogs/ProfileSelectDialog.cpp index fe03e1b6b..95bdf99a9 100644 --- a/launcher/ui/dialogs/ProfileSelectDialog.cpp +++ b/launcher/ui/dialogs/ProfileSelectDialog.cpp @@ -18,6 +18,7 @@ #include #include +#include #include "Application.h" @@ -70,6 +71,9 @@ ProfileSelectDialog::ProfileSelectDialog(const QString& message, int flags, QWid ui->listView->setCurrentIndex(ui->listView->model()->index(0, 0)); connect(ui->listView, SIGNAL(doubleClicked(QModelIndex)), SLOT(on_buttonBox_accepted())); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ProfileSelectDialog::~ProfileSelectDialog() diff --git a/launcher/ui/dialogs/ProfileSetupDialog.cpp b/launcher/ui/dialogs/ProfileSetupDialog.cpp index 385094e23..a6512784f 100644 --- a/launcher/ui/dialogs/ProfileSetupDialog.cpp +++ b/launcher/ui/dialogs/ProfileSetupDialog.cpp @@ -70,6 +70,9 @@ ProfileSetupDialog::ProfileSetupDialog(MinecraftAccountPtr accountToSetup, QWidg connect(&checkStartTimer, &QTimer::timeout, this, &ProfileSetupDialog::startCheck); setNameStatus(NameStatus::NotSet, QString()); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ProfileSetupDialog::~ProfileSetupDialog() diff --git a/launcher/ui/dialogs/ReviewMessageBox.cpp b/launcher/ui/dialogs/ReviewMessageBox.cpp index 66c36d400..fa79e4ed1 100644 --- a/launcher/ui/dialogs/ReviewMessageBox.cpp +++ b/launcher/ui/dialogs/ReviewMessageBox.cpp @@ -20,6 +20,9 @@ ReviewMessageBox::ReviewMessageBox(QWidget* parent, [[maybe_unused]] QString con connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &ReviewMessageBox::accept); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &ReviewMessageBox::reject); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ReviewMessageBox::~ReviewMessageBox() diff --git a/launcher/ui/dialogs/ScrollMessageBox.cpp b/launcher/ui/dialogs/ScrollMessageBox.cpp index c04d87842..1cfb848f4 100644 --- a/launcher/ui/dialogs/ScrollMessageBox.cpp +++ b/launcher/ui/dialogs/ScrollMessageBox.cpp @@ -1,4 +1,5 @@ #include "ScrollMessageBox.h" +#include #include "ui_ScrollMessageBox.h" ScrollMessageBox::ScrollMessageBox(QWidget* parent, const QString& title, const QString& text, const QString& body) @@ -8,6 +9,9 @@ ScrollMessageBox::ScrollMessageBox(QWidget* parent, const QString& title, const this->setWindowTitle(title); ui->label->setText(text); ui->textBrowser->setText(body); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ScrollMessageBox::~ScrollMessageBox() diff --git a/launcher/ui/dialogs/VersionSelectDialog.cpp b/launcher/ui/dialogs/VersionSelectDialog.cpp index 876d7470e..30377288b 100644 --- a/launcher/ui/dialogs/VersionSelectDialog.cpp +++ b/launcher/ui/dialogs/VersionSelectDialog.cpp @@ -68,6 +68,9 @@ VersionSelectDialog::VersionSelectDialog(BaseVersionList* vlist, QString title, m_buttonBox->setObjectName(QStringLiteral("buttonBox")); m_buttonBox->setOrientation(Qt::Horizontal); m_buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); + + m_buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Ok")); + m_buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); m_horizontalLayout->addWidget(m_buttonBox); m_verticalLayout->addLayout(m_horizontalLayout); diff --git a/launcher/ui/dialogs/skins/SkinManageDialog.cpp b/launcher/ui/dialogs/skins/SkinManageDialog.cpp index 65840eb08..f112e1acf 100644 --- a/launcher/ui/dialogs/skins/SkinManageDialog.cpp +++ b/launcher/ui/dialogs/skins/SkinManageDialog.cpp @@ -93,6 +93,9 @@ SkinManageDialog::SkinManageDialog(QWidget* parent, MinecraftAccountPtr acct) setupCapes(); ui->listView->setCurrentIndex(m_list.index(m_list.getSelectedAccountSkin())); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } SkinManageDialog::~SkinManageDialog() diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index 0ece3220b..d38670d05 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -212,6 +212,7 @@ InstallDialog::InstallDialog(const QString& uid, BaseInstance* instance, QWidget buttons->setOrientation(Qt::Horizontal); buttons->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); buttons->button(QDialogButtonBox::Ok)->setText(tr("Download")); + buttons->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); buttonLayout->addWidget(buttons); diff --git a/launcher/ui/pagedialog/PageDialog.cpp b/launcher/ui/pagedialog/PageDialog.cpp index 6514217cd..d211cb4d3 100644 --- a/launcher/ui/pagedialog/PageDialog.cpp +++ b/launcher/ui/pagedialog/PageDialog.cpp @@ -39,6 +39,8 @@ PageDialog::PageDialog(BasePageProvider* pageProvider, QString defaultId, QWidge QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Help | QDialogButtonBox::Close); buttons->button(QDialogButtonBox::Close)->setDefault(true); + buttons->button(QDialogButtonBox::Close)->setText(tr("Close")); + buttons->button(QDialogButtonBox::Help)->setText(tr("Help")); buttons->setContentsMargins(6, 0, 6, 0); m_container->addButtons(buttons); diff --git a/launcher/ui/pages/modplatform/OptionalModDialog.cpp b/launcher/ui/pages/modplatform/OptionalModDialog.cpp index fc1c8b3cb..5dc53d9dc 100644 --- a/launcher/ui/pages/modplatform/OptionalModDialog.cpp +++ b/launcher/ui/pages/modplatform/OptionalModDialog.cpp @@ -43,6 +43,9 @@ OptionalModDialog::OptionalModDialog(QWidget* parent, const QStringList& mods) : else item->setCheckState(Qt::Checked); }); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } OptionalModDialog::~OptionalModDialog() diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index dea28d6d5..817079439 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -465,6 +465,7 @@ void ResourcePage::openProject(QVariant projectID) auto cancelBtn = buttonBox->button(QDialogButtonBox::Cancel); cancelBtn->setDefault(false); cancelBtn->setAutoDefault(false); + cancelBtn->setText(tr("Cancel")); connect(okBtn, &QPushButton::clicked, this, [this] { onResourceSelected(); diff --git a/launcher/updater/prismupdater/UpdaterDialogs.cpp b/launcher/updater/prismupdater/UpdaterDialogs.cpp index 06dc161b1..eab3e6bbb 100644 --- a/launcher/updater/prismupdater/UpdaterDialogs.cpp +++ b/launcher/updater/prismupdater/UpdaterDialogs.cpp @@ -24,6 +24,7 @@ #include "ui_SelectReleaseDialog.h" +#include #include #include "Markdown.h" #include "StringUtils.h" @@ -55,6 +56,9 @@ SelectReleaseDialog::SelectReleaseDialog(const Version& current_version, const Q connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &SelectReleaseDialog::accept); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &SelectReleaseDialog::reject); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } SelectReleaseDialog::~SelectReleaseDialog() From 0ee5665c95c4e0461f23986f0f5f43b4bf36c0fd Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 14 Dec 2023 00:02:53 +0200 Subject: [PATCH 307/616] Revert "Removed auto reauthenticate" This reverts commit 400b518bc21b8a56131384fd4a56988d31bceb9f. Signed-off-by: Trial97 --- launcher/LaunchController.cpp | 35 +++++++++++++++++++++++++++++++---- launcher/LaunchController.h | 1 + 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index 687da1322..d49e9e8ba 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -43,6 +43,7 @@ #include "ui/InstanceWindow.h" #include "ui/MainWindow.h" #include "ui/dialogs/CustomMessageBox.h" +#include "ui/dialogs/MSALoginDialog.h" #include "ui/dialogs/ProfileSelectDialog.h" #include "ui/dialogs/ProfileSetupDialog.h" #include "ui/dialogs/ProgressDialog.h" @@ -287,10 +288,8 @@ void LaunchController::login() continue; } case AccountState::Expired: { - auto errorString = tr("The account has expired and needs to be logged into manually again."); - QMessageBox::warning(m_parentWidget, tr("Account refresh failed"), errorString, QMessageBox::StandardButton::Ok, - QMessageBox::StandardButton::Ok); - emitFailed(errorString); + if (reauthenticateCurrentAccount()) + continue; return; } case AccountState::Disabled: { @@ -314,6 +313,34 @@ void LaunchController::login() emitFailed(tr("Failed to launch.")); } +bool LaunchController::reauthenticateCurrentAccount() +{ + auto button = + QMessageBox::warning(m_parentWidget, tr("Account refresh failed"), + tr("The account has expired and needs to be reauthenticated. Do you want to reauthenticate this account?"), + QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No, QMessageBox::StandardButton::Yes); + if (button == QMessageBox::StandardButton::Yes) { + auto accounts = APPLICATION->accounts(); + bool isDefault = accounts->defaultAccount() == m_accountToUse; + accounts->removeAccount(accounts->index(accounts->findAccountByProfileId(m_accountToUse->profileId()))); + if (m_accountToUse->accountType() == AccountType::MSA) { + auto newAccount = + MSALoginDialog::newAccount(m_parentWidget, tr("Please enter your Mojang account email and password to add your account.")); + accounts->addAccount(newAccount); + if (isDefault) { + accounts->setDefaultAccount(newAccount); + } + m_accountToUse = nullptr; + decideAccount(); + return true; + } + emitFailed(tr("Account expired and re-login attempt failed")); + } else { + emitFailed(tr("The account has expired and needs to be reauthenticated")); + } + return false; +} + void LaunchController::launchInstance() { Q_ASSERT_X(m_instance != NULL, "launchInstance", "instance is NULL"); diff --git a/launcher/LaunchController.h b/launcher/LaunchController.h index 6e2a94258..08fd19cae 100644 --- a/launcher/LaunchController.h +++ b/launcher/LaunchController.h @@ -76,6 +76,7 @@ class LaunchController : public Task { void decideAccount(); bool askPlayDemo(); QString askOfflineName(QString playerName, bool demo, bool& ok); + bool reauthenticateCurrentAccount(); private slots: void readyForLaunch(); From 14ad720c5899300bfaa13d34bf2ca8e416d26b77 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 21:58:09 +0300 Subject: [PATCH 308/616] fix conflict Signed-off-by: Trial97 --- launcher/LaunchController.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index d49e9e8ba..e736135fa 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -324,8 +324,7 @@ bool LaunchController::reauthenticateCurrentAccount() bool isDefault = accounts->defaultAccount() == m_accountToUse; accounts->removeAccount(accounts->index(accounts->findAccountByProfileId(m_accountToUse->profileId()))); if (m_accountToUse->accountType() == AccountType::MSA) { - auto newAccount = - MSALoginDialog::newAccount(m_parentWidget, tr("Please enter your Mojang account email and password to add your account.")); + auto newAccount = MSALoginDialog::newAccount(m_parentWidget); accounts->addAccount(newAccount); if (isDefault) { accounts->setDefaultAccount(newAccount); From 08f5148a9a4e574dd3ef4e7dc1e46a05ffd9dd5e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 6 Oct 2023 09:17:03 +0300 Subject: [PATCH 309/616] Added mouse interactions for labels in ProgressDialog Signed-off-by: Trial97 --- launcher/ui/dialogs/ProfileSetupDialog.ui | 3 +++ launcher/ui/widgets/SubTaskProgressBar.ui | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/launcher/ui/dialogs/ProfileSetupDialog.ui b/launcher/ui/dialogs/ProfileSetupDialog.ui index 9dbabb4b3..947110da7 100644 --- a/launcher/ui/dialogs/ProfileSetupDialog.ui +++ b/launcher/ui/dialogs/ProfileSetupDialog.ui @@ -30,6 +30,9 @@ Choose your name carefully: true + + Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + nameEdit diff --git a/launcher/ui/widgets/SubTaskProgressBar.ui b/launcher/ui/widgets/SubTaskProgressBar.ui index 5431eab60..aabb68329 100644 --- a/launcher/ui/widgets/SubTaskProgressBar.ui +++ b/launcher/ui/widgets/SubTaskProgressBar.ui @@ -47,6 +47,9 @@ true + + Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + @@ -68,6 +71,9 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse +
    From c12beb43a0f3dad6e66fd42192dbbf1f78fb6c53 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 21 Aug 2023 19:47:47 +0300 Subject: [PATCH 310/616] correctly expand env vars Signed-off-by: Trial97 --- launcher/launch/LaunchTask.cpp | 62 +++++++++++++++++---- launcher/launch/LaunchTask.h | 3 +- launcher/launch/steps/PostLaunchCommand.cpp | 12 ++-- launcher/launch/steps/PreLaunchCommand.cpp | 13 ++--- 4 files changed, 60 insertions(+), 30 deletions(-) diff --git a/launcher/launch/LaunchTask.cpp b/launcher/launch/LaunchTask.cpp index 0251b302d..976221471 100644 --- a/launcher/launch/LaunchTask.cpp +++ b/launcher/launch/LaunchTask.cpp @@ -254,20 +254,60 @@ void LaunchTask::emitFailed(QString reason) Task::emitFailed(reason); } -void LaunchTask::substituteVariables(QStringList& args) const +QString expandVariables(const QString& input, QProcessEnvironment dict) { - auto env = m_instance->createEnvironment(); + QString result = input; - for (auto key : env.keys()) { - args.replaceInStrings("$" + key, env.value(key)); + enum { base, maybeBrace, variable, brace } state = base; + int startIdx = -1; + for (int i = 0; i < result.length();) { + QChar c = result.at(i++); + switch (state) { + case base: + if (c == '$') + state = maybeBrace; + break; + case maybeBrace: + if (c == '{') { + state = brace; + startIdx = i; + } else if (c.isLetterOrNumber() || c == '_') { + state = variable; + startIdx = i - 1; + } else { + state = base; + } + break; + case brace: + if (c == '}') { + const auto res = dict.value(result.mid(startIdx, i - 1 - startIdx), ""); + if (!res.isEmpty()) { + result.replace(startIdx - 2, i - startIdx + 2, res); + i = startIdx - 2 + res.length(); + } + state = base; + } + break; + case variable: + if (!c.isLetterOrNumber() && c != '_') { + const auto res = dict.value(result.mid(startIdx, i - startIdx - 1), ""); + if (!res.isEmpty()) { + result.replace(startIdx - 1, i - startIdx, res); + i = startIdx - 1 + res.length(); + } + state = base; + } + break; + } } + if (state == variable) { + if (const auto res = dict.value(result.mid(startIdx), ""); !res.isEmpty()) + result.replace(startIdx - 1, result.length() - startIdx + 1, res); + } + return result; } -void LaunchTask::substituteVariables(QString& cmd) const +QString LaunchTask::substituteVariables(QString& cmd) const { - auto env = m_instance->createEnvironment(); - - for (auto key : env.keys()) { - cmd.replace("$" + key, env.value(key)); - } -} + return expandVariables(cmd, m_instance->createEnvironment()); +} \ No newline at end of file diff --git a/launcher/launch/LaunchTask.h b/launcher/launch/LaunchTask.h index 56065af5b..1f1b5222b 100644 --- a/launcher/launch/LaunchTask.h +++ b/launcher/launch/LaunchTask.h @@ -87,8 +87,7 @@ class LaunchTask : public Task { shared_qobject_ptr getLogModel(); public: - void substituteVariables(QStringList& args) const; - void substituteVariables(QString& cmd) const; + QString substituteVariables(QString& cmd) const; QString censorPrivateInfo(QString in); protected: /* methods */ diff --git a/launcher/launch/steps/PostLaunchCommand.cpp b/launcher/launch/steps/PostLaunchCommand.cpp index 725101224..946560c10 100644 --- a/launcher/launch/steps/PostLaunchCommand.cpp +++ b/launcher/launch/steps/PostLaunchCommand.cpp @@ -47,19 +47,15 @@ PostLaunchCommand::PostLaunchCommand(LaunchTask* parent) : LaunchStep(parent) void PostLaunchCommand::executeTask() { - // FIXME: where to put this? + auto cmd = m_parent->substituteVariables(m_command); + emit logLine(tr("Running Post-Launch command: %1").arg(cmd), MessageLevel::Launcher); #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) - auto args = QProcess::splitCommand(m_command); - m_parent->substituteVariables(args); + auto args = QProcess::splitCommand(cmd); - emit logLine(tr("Running Post-Launch command: %1").arg(args.join(' ')), MessageLevel::Launcher); const QString program = args.takeFirst(); m_process.start(program, args); #else - m_parent->substituteVariables(m_command); - - emit logLine(tr("Running Post-Launch command: %1").arg(m_command), MessageLevel::Launcher); - m_process.start(m_command); + m_process.start(cmd); #endif } diff --git a/launcher/launch/steps/PreLaunchCommand.cpp b/launcher/launch/steps/PreLaunchCommand.cpp index 6d071a66e..3505febf7 100644 --- a/launcher/launch/steps/PreLaunchCommand.cpp +++ b/launcher/launch/steps/PreLaunchCommand.cpp @@ -47,19 +47,14 @@ PreLaunchCommand::PreLaunchCommand(LaunchTask* parent) : LaunchStep(parent) void PreLaunchCommand::executeTask() { - // FIXME: where to put this? + auto cmd = m_parent->substituteVariables(m_command); + emit logLine(tr("Running Pre-Launch command: %1").arg(cmd), MessageLevel::Launcher); #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) - auto args = QProcess::splitCommand(m_command); - m_parent->substituteVariables(args); - - emit logLine(tr("Running Pre-Launch command: %1").arg(args.join(' ')), MessageLevel::Launcher); + auto args = QProcess::splitCommand(cmd); const QString program = args.takeFirst(); m_process.start(program, args); #else - m_parent->substituteVariables(m_command); - - emit logLine(tr("Running Pre-Launch command: %1").arg(m_command), MessageLevel::Launcher); - m_process.start(m_command); + m_process.start(cmd); #endif } From 09a118e85e3646ded9d7b2704d2f95a589ca19b9 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 18 Nov 2023 11:18:50 +0200 Subject: [PATCH 311/616] expand env from wrapped cmd Signed-off-by: Trial97 --- launcher/launch/LaunchTask.cpp | 6 +++--- launcher/launch/LaunchTask.h | 2 +- launcher/minecraft/launch/LauncherPartLaunch.cpp | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/launcher/launch/LaunchTask.cpp b/launcher/launch/LaunchTask.cpp index 976221471..4b93d2077 100644 --- a/launcher/launch/LaunchTask.cpp +++ b/launcher/launch/LaunchTask.cpp @@ -307,7 +307,7 @@ QString expandVariables(const QString& input, QProcessEnvironment dict) return result; } -QString LaunchTask::substituteVariables(QString& cmd) const +QString LaunchTask::substituteVariables(QString& cmd, bool isLaunch) const { - return expandVariables(cmd, m_instance->createEnvironment()); -} \ No newline at end of file + return expandVariables(cmd, isLaunch ? m_instance->createLaunchEnvironment() : m_instance->createEnvironment()); +} diff --git a/launcher/launch/LaunchTask.h b/launcher/launch/LaunchTask.h index 1f1b5222b..2e87ece95 100644 --- a/launcher/launch/LaunchTask.h +++ b/launcher/launch/LaunchTask.h @@ -87,7 +87,7 @@ class LaunchTask : public Task { shared_qobject_ptr getLogModel(); public: - QString substituteVariables(QString& cmd) const; + QString substituteVariables(QString& cmd, bool isLaunch = false) const; QString censorPrivateInfo(QString in); protected: /* methods */ diff --git a/launcher/minecraft/launch/LauncherPartLaunch.cpp b/launcher/minecraft/launch/LauncherPartLaunch.cpp index d9a2b9b6b..2e842632a 100644 --- a/launcher/minecraft/launch/LauncherPartLaunch.cpp +++ b/launcher/minecraft/launch/LauncherPartLaunch.cpp @@ -131,6 +131,7 @@ void LauncherPartLaunch::executeTask() QString wrapperCommandStr = instance->getWrapperCommand().trimmed(); if (!wrapperCommandStr.isEmpty()) { + wrapperCommandStr = m_parent->substituteVariables(wrapperCommandStr); auto wrapperArgs = Commandline::splitArgs(wrapperCommandStr); auto wrapperCommand = wrapperArgs.takeFirst(); auto realWrapperCommand = QStandardPaths::findExecutable(wrapperCommand); From 3c17f606edf8a4231fb2bde667db75cdc0feeea5 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 25 Nov 2023 10:55:47 +0200 Subject: [PATCH 312/616] Patched the maximized option on the newer Minecraft versions Signed-off-by: Trial97 --- .../launcher/impl/StandardLauncher.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index dc518be64..618524a6e 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -57,6 +57,13 @@ package org.prismlauncher.launcher.impl; import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.ReflectionUtils; +import java.awt.Dimension; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.Toolkit; import java.lang.invoke.MethodHandle; import java.util.Collections; import java.util.List; @@ -82,6 +89,18 @@ public final class StandardLauncher extends AbstractLauncher { gameArgs.add(Integer.toString(width)); gameArgs.add("--height"); gameArgs.add(Integer.toString(height)); + } else { + try { + // Dimension rct = Toolkit.getDefaultToolkit().getScreenSize(); + Rectangle rct = getDefaultDeviceBounds(); + + gameArgs.add("--width"); + gameArgs.add(Integer.toString(rct.width)); + gameArgs.add("--height"); + gameArgs.add(Integer.toString(rct.height)); + } catch (Exception e) { + // If for some reason the get fails just continue without seting the dimensions + } } if (serverAddress != null) { @@ -104,4 +123,18 @@ public final class StandardLauncher extends AbstractLauncher { MethodHandle method = ReflectionUtils.findMainMethod(mainClassName); method.invokeExact(gameArgs.toArray(new String[0])); } + + private static Rectangle getDefaultDeviceBounds() { + GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); + GraphicsConfiguration gc = gd.getDefaultConfiguration(); + + Rectangle bounds = gc.getBounds(); + Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc); + bounds.x += insets.left; + bounds.y += insets.top; + bounds.width -= (insets.left + insets.right); + bounds.height -= (insets.top + insets.bottom); + + return bounds; + } } From 1be29076ea246a637d326f9738babe54bb46b298 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 25 Nov 2023 16:01:36 +0200 Subject: [PATCH 313/616] When java disappoints try C++ Signed-off-by: Trial97 --- launcher/minecraft/MinecraftInstance.cpp | 27 ++++++++++-- .../launcher/impl/StandardLauncher.java | 44 ++----------------- 2 files changed, 28 insertions(+), 43 deletions(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 98ac7647f..fc0ea6789 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -91,6 +91,9 @@ #include "tools/BaseProfiler.h" #include +#include +#include +#include #ifdef Q_OS_LINUX #include "MangoHud.h" @@ -752,11 +755,29 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session, MinecraftT // window size, title and state, legacy { QString windowParams; - if (settings()->get("LaunchMaximized").toBool()) - windowParams = "maximized"; - else + if (settings()->get("LaunchMaximized").toBool()) { + // FIXME doesn't support maximisation + if (getLauncher() == "standard") { + auto screen = QGuiApplication::primaryScreen(); + auto screenGeometry = screen->availableSize(); + + // small hack to get the widow decorations + for (auto w : QApplication::topLevelWidgets()) { + auto mainWindow = qobject_cast(w); + if (mainWindow) { + screenGeometry = screenGeometry.shrunkBy(mainWindow->windowHandle()->frameMargins()); + break; + } + } + + windowParams = QString("%1x%2").arg(screenGeometry.width()).arg(screenGeometry.height()); + } else { + windowParams = "maximized"; + } + } else { windowParams = QString("%1x%2").arg(settings()->get("MinecraftWinWidth").toInt()).arg(settings()->get("MinecraftWinHeight").toInt()); + } launchScript += "windowTitle " + windowTitle() + "\n"; launchScript += "windowParams " + windowParams + "\n"; } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index 618524a6e..084fbc849 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -57,13 +57,6 @@ package org.prismlauncher.launcher.impl; import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.ReflectionUtils; -import java.awt.Dimension; -import java.awt.GraphicsConfiguration; -import java.awt.GraphicsDevice; -import java.awt.GraphicsEnvironment; -import java.awt.Insets; -import java.awt.Rectangle; -import java.awt.Toolkit; import java.lang.invoke.MethodHandle; import java.util.Collections; import java.util.List; @@ -83,25 +76,10 @@ public final class StandardLauncher extends AbstractLauncher { @Override public void launch() throws Throwable { // window size, title and state - // FIXME doesn't support maximisation - if (!maximize) { - gameArgs.add("--width"); - gameArgs.add(Integer.toString(width)); - gameArgs.add("--height"); - gameArgs.add(Integer.toString(height)); - } else { - try { - // Dimension rct = Toolkit.getDefaultToolkit().getScreenSize(); - Rectangle rct = getDefaultDeviceBounds(); - - gameArgs.add("--width"); - gameArgs.add(Integer.toString(rct.width)); - gameArgs.add("--height"); - gameArgs.add(Integer.toString(rct.height)); - } catch (Exception e) { - // If for some reason the get fails just continue without seting the dimensions - } - } + gameArgs.add("--width"); + gameArgs.add(Integer.toString(width)); + gameArgs.add("--height"); + gameArgs.add(Integer.toString(height)); if (serverAddress != null) { if (quickPlayMultiplayerSupported) { @@ -123,18 +101,4 @@ public final class StandardLauncher extends AbstractLauncher { MethodHandle method = ReflectionUtils.findMainMethod(mainClassName); method.invokeExact(gameArgs.toArray(new String[0])); } - - private static Rectangle getDefaultDeviceBounds() { - GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); - GraphicsConfiguration gc = gd.getDefaultConfiguration(); - - Rectangle bounds = gc.getBounds(); - Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc); - bounds.x += insets.left; - bounds.y += insets.top; - bounds.width -= (insets.left + insets.right); - bounds.height -= (insets.top + insets.bottom); - - return bounds; - } } From 81c5866fa9cd22f788730e1664e9b011f0cf3c55 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 25 Nov 2023 16:08:12 +0200 Subject: [PATCH 314/616] Made sure that the qt version check is in place Signed-off-by: Trial97 --- launcher/minecraft/MinecraftInstance.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index fc0ea6789..d3f7cc20e 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -765,7 +765,12 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session, MinecraftT for (auto w : QApplication::topLevelWidgets()) { auto mainWindow = qobject_cast(w); if (mainWindow) { - screenGeometry = screenGeometry.shrunkBy(mainWindow->windowHandle()->frameMargins()); + auto m = mainWindow->windowHandle()->frameMargins(); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) + screenGeometry = screenGeometry.shrunkBy(m); +#else + screenGeometry = { screenGeometry.width() - m.left() - m.right(), screenGeometry.height() - m.top() - m.bottom() }; +#endif break; } } From 0f42f3cc5ca269b4e4002d74299e9aa9713a08c5 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 25 Nov 2023 16:48:51 +0200 Subject: [PATCH 315/616] Added warning regarding maximized option Signed-off-by: Trial97 --- launcher/BaseInstance.cpp | 5 +++++ launcher/BaseInstance.h | 2 ++ launcher/minecraft/MinecraftInstance.cpp | 4 ++-- launcher/ui/pages/global/MinecraftPage.ui | 10 ++++++++++ launcher/ui/pages/instance/InstanceSettingsPage.cpp | 1 + launcher/ui/pages/instance/InstanceSettingsPage.ui | 12 +++++++++++- 6 files changed, 31 insertions(+), 3 deletions(-) diff --git a/launcher/BaseInstance.cpp b/launcher/BaseInstance.cpp index 69cf95e3c..ccfd0b847 100644 --- a/launcher/BaseInstance.cpp +++ b/launcher/BaseInstance.cpp @@ -411,3 +411,8 @@ void BaseInstance::updateRuntimeContext() { // NOOP } + +bool BaseInstance::isLegacy() +{ + return traits().contains("legacyLaunch") || traits().contains("alphaLaunch"); +} diff --git a/launcher/BaseInstance.h b/launcher/BaseInstance.h index 2be28d1ec..9827a08b4 100644 --- a/launcher/BaseInstance.h +++ b/launcher/BaseInstance.h @@ -269,6 +269,8 @@ class BaseInstance : public QObject, public std::enable_shared_from_thisget("LaunchMaximized").toBool()) { // FIXME doesn't support maximisation - if (getLauncher() == "standard") { + if (!isLegacy()) { auto screen = QGuiApplication::primaryScreen(); auto screenGeometry = screen->availableSize(); diff --git a/launcher/ui/pages/global/MinecraftPage.ui b/launcher/ui/pages/global/MinecraftPage.ui index 7d2741250..3a28c92c7 100644 --- a/launcher/ui/pages/global/MinecraftPage.ui +++ b/launcher/ui/pages/global/MinecraftPage.ui @@ -55,6 +55,16 @@
    + + + + On newer versions the game only supports resolution. In order to simulate the maximized behaviour the current implementation approximates the maximum display size. + + + <html><head/><body><p><span style=" font-weight:600; color:#f5c211;">Warning</span><span style=" color:#f5c211;">: On the newer Minecraft versions the start maximized option is not fully supported.</span></p></body></html> + + + diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index cf8d86cd4..1a5be050f 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -323,6 +323,7 @@ void InstanceSettingsPage::loadSettings() // Window Size ui->windowSizeGroupBox->setChecked(m_settings->get("OverrideWindow").toBool()); ui->maximizedCheckBox->setChecked(m_settings->get("LaunchMaximized").toBool()); + ui->maximizedWarning->setVisible(m_settings->get("LaunchMaximized").toBool() && !m_instance->isLegacy()); ui->windowWidthSpinBox->setValue(m_settings->get("MinecraftWinWidth").toInt()); ui->windowHeightSpinBox->setValue(m_settings->get("MinecraftWinHeight").toInt()); diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.ui b/launcher/ui/pages/instance/InstanceSettingsPage.ui index 4905eae87..e5ef98b00 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.ui +++ b/launcher/ui/pages/instance/InstanceSettingsPage.ui @@ -36,7 +36,7 @@ - 0 + 1 @@ -285,6 +285,16 @@ + + + + The base game only supports resolution. In order to simulate the maximized behaviour the current implementation approximates the maximum display size.. + + + <html><head/><body><p><span style=" font-weight:600; color:#f5c211;">Warning</span><span style=" color:#f5c211;">: The maximized option may not be fully supported for the current minecraft version.</span></p></body></html> + + + From f57ca1e79e277cdfd91e3b71d13b5ec97c1870ea Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 28 Oct 2024 16:07:41 +0000 Subject: [PATCH 316/616] Add Change Version action to all pages Signed-off-by: TheKodeToad --- .../ui/dialogs/ResourceDownloadDialog.cpp | 2 +- launcher/ui/dialogs/ResourceDownloadDialog.h | 4 +- .../pages/instance/ExternalResourcesPage.cpp | 4 ++ .../pages/instance/ExternalResourcesPage.ui | 13 +++-- launcher/ui/pages/instance/ModFolderPage.cpp | 2 +- .../ui/pages/instance/ResourcePackPage.cpp | 57 +++++++++++++++++++ launcher/ui/pages/instance/ResourcePackPage.h | 1 + launcher/ui/pages/instance/ShaderPackPage.cpp | 57 +++++++++++++++++++ launcher/ui/pages/instance/ShaderPackPage.h | 1 + .../ui/pages/instance/TexturePackPage.cpp | 57 +++++++++++++++++++ launcher/ui/pages/instance/TexturePackPage.h | 1 + 11 files changed, 190 insertions(+), 9 deletions(-) diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.cpp b/launcher/ui/dialogs/ResourceDownloadDialog.cpp index 02a8454b4..f9b6716af 100644 --- a/launcher/ui/dialogs/ResourceDownloadDialog.cpp +++ b/launcher/ui/dialogs/ResourceDownloadDialog.cpp @@ -377,7 +377,7 @@ QList ShaderPackDownloadDialog::getPages() return pages; } -void ModDownloadDialog::setModMetadata(std::shared_ptr meta) +void ResourceDownloadDialog::setResourceMetadata(const std::shared_ptr& meta) { switch (meta->provider) { case ModPlatform::ResourceProvider::MODRINTH: diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.h b/launcher/ui/dialogs/ResourceDownloadDialog.h index 7a0d6e895..0c3e314bc 100644 --- a/launcher/ui/dialogs/ResourceDownloadDialog.h +++ b/launcher/ui/dialogs/ResourceDownloadDialog.h @@ -69,6 +69,8 @@ class ResourceDownloadDialog : public QDialog, public BasePageProvider { const QList getTasks(); [[nodiscard]] const std::shared_ptr getBaseModel() const { return m_base_model; } + void setResourceMetadata(const std::shared_ptr& meta); + public slots: void accept() override; void reject() override; @@ -107,8 +109,6 @@ class ModDownloadDialog final : public ResourceDownloadDialog { QList getPages() override; GetModDependenciesTask::Ptr getModDependenciesTask() override; - void setModMetadata(std::shared_ptr); - private: BaseInstance* m_instance; }; diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index 62bd6ac04..132297849 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -316,6 +316,10 @@ void ExternalResourcesPage::updateActions() const bool hasSelection = ui->treeView->selectionModel()->hasSelection(); ui->actionUpdateItem->setEnabled(!m_model->empty()); ui->actionResetItemMetadata->setEnabled(hasSelection); + + const QModelIndexList rows = ui->treeView->selectionModel()->selectedRows(); + ui->actionChangeVersion->setEnabled(rows.count() == 1 && m_model->at(m_filterModel->mapToSource(rows[0]).row()).metadata() != nullptr); + ui->actionRemoveItem->setEnabled(hasSelection); ui->actionEnableItem->setEnabled(hasSelection); ui->actionDisableItem->setEnabled(hasSelection); diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.ui b/launcher/ui/pages/instance/ExternalResourcesPage.ui index c33df2c26..b7b219717 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.ui +++ b/launcher/ui/pages/instance/ExternalResourcesPage.ui @@ -60,7 +60,7 @@ true - QAbstractItemView::DragDropMode::DropOnly + QAbstractItemView::NoDragDrop true @@ -74,7 +74,7 @@ Actions - Qt::ToolButtonStyle::ToolButtonTextOnly + Qt::ToolButtonIconOnly true @@ -177,7 +177,7 @@ Reset Update Metadata - QAction::MenuRole::NoRole + QAction::NoRole @@ -185,7 +185,7 @@ Verify Dependencies - QAction::MenuRole::NoRole + QAction::NoRole @@ -200,6 +200,9 @@ + + false + Change Version @@ -207,7 +210,7 @@ Change a resource's version. - QAction::MenuRole::NoRole + QAction::NoRole diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 1ede31d49..40bf01f9a 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -308,7 +308,7 @@ void ModFolderPage::changeModVersion() return; ResourceDownload::ModDownloadDialog mdownload(this, m_model, m_instance); - mdownload.setModMetadata((*mods_list.begin())->metadata()); + mdownload.setResourceMetadata((*mods_list.begin())->metadata()); if (mdownload.exec()) { auto tasks = new ConcurrentTask(this, "Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { diff --git a/launcher/ui/pages/instance/ResourcePackPage.cpp b/launcher/ui/pages/instance/ResourcePackPage.cpp index d03511ca4..97d61058e 100644 --- a/launcher/ui/pages/instance/ResourcePackPage.cpp +++ b/launcher/ui/pages/instance/ResourcePackPage.cpp @@ -67,6 +67,10 @@ ResourcePackPage::ResourcePackPage(MinecraftInstance* instance, std::shared_ptr< connect(ui->actionResetItemMetadata, &QAction::triggered, this, &ResourcePackPage::deleteResourcePackMetadata); ui->actionUpdateItem->setMenu(updateMenu); + + ui->actionChangeVersion->setToolTip(tr("Change a mod's version.")); + connect(ui->actionChangeVersion, &QAction::triggered, this, &ResourcePackPage::changeResourcePackVersion); + ui->actionsToolbar->insertActionAfter(ui->actionUpdateItem, ui->actionChangeVersion); } void ResourcePackPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) @@ -214,3 +218,56 @@ void ResourcePackPage::deleteResourcePackMetadata() m_model->deleteMetadata(selection); } + +void ResourcePackPage::changeResourcePackVersion() +{ + if (m_instance->typeName() != "Minecraft") + return; // this is a null instance or a legacy instance + + if (APPLICATION->settings()->get("ModMetadataDisabled").toBool()) { + QMessageBox::critical(this, tr("Error"), tr("Resource pack updates are unavailable when metadata is disabled!")); + return; + } + + const QModelIndexList rows = ui->treeView->selectionModel()->selectedRows(); + + if (rows.count() != 1) + return; + + Resource &resource = m_model->at(m_filterModel->mapToSource(rows[0]).row()); + + if (resource.metadata() == nullptr) + return; + + ResourceDownload::ResourcePackDownloadDialog mdownload(this, m_model, m_instance); + mdownload.setResourceMetadata(resource.metadata()); + if (mdownload.exec()) { + auto tasks = + new ConcurrentTask(this, "Download Resource Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + connect(tasks, &Task::failed, [this, tasks](QString reason) { + CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::aborted, [this, tasks]() { + CustomMessageBox::selectable(this, tr("Aborted"), tr("Download stopped by user."), QMessageBox::Information)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::succeeded, [this, tasks]() { + QStringList warnings = tasks->warnings(); + if (warnings.count()) + CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show(); + + tasks->deleteLater(); + }); + + for (auto& task : mdownload.getTasks()) { + tasks->addTask(task); + } + + ProgressDialog loadDialog(this); + loadDialog.setSkipButton(true, tr("Abort")); + loadDialog.execWithTask(tasks); + + m_model->update(); + } +} \ No newline at end of file diff --git a/launcher/ui/pages/instance/ResourcePackPage.h b/launcher/ui/pages/instance/ResourcePackPage.h index e95809cf8..55abe007c 100644 --- a/launcher/ui/pages/instance/ResourcePackPage.h +++ b/launcher/ui/pages/instance/ResourcePackPage.h @@ -64,6 +64,7 @@ class ResourcePackPage : public ExternalResourcesPage { void downloadResourcePacks(); void updateResourcePacks(); void deleteResourcePackMetadata(); + void changeResourcePackVersion(); protected: std::shared_ptr m_model; diff --git a/launcher/ui/pages/instance/ShaderPackPage.cpp b/launcher/ui/pages/instance/ShaderPackPage.cpp index 768d7c710..c734f539e 100644 --- a/launcher/ui/pages/instance/ShaderPackPage.cpp +++ b/launcher/ui/pages/instance/ShaderPackPage.cpp @@ -70,6 +70,10 @@ ShaderPackPage::ShaderPackPage(MinecraftInstance* instance, std::shared_ptractionResetItemMetadata, &QAction::triggered, this, &ShaderPackPage::deleteShaderPackMetadata); ui->actionUpdateItem->setMenu(updateMenu); + + ui->actionChangeVersion->setToolTip(tr("Change a shader pack's version.")); + connect(ui->actionChangeVersion, &QAction::triggered, this, &ShaderPackPage::changeShaderPackVersion); + ui->actionsToolbar->insertActionAfter(ui->actionUpdateItem, ui->actionChangeVersion); } void ShaderPackPage::downloadShaderPack() @@ -207,3 +211,56 @@ void ShaderPackPage::deleteShaderPackMetadata() m_model->deleteMetadata(selection); } + +void ShaderPackPage::changeShaderPackVersion() +{ + if (m_instance->typeName() != "Minecraft") + return; // this is a null instance or a legacy instance + + if (APPLICATION->settings()->get("ModMetadataDisabled").toBool()) { + QMessageBox::critical(this, tr("Error"), tr("Shader pack updates are unavailable when metadata is disabled!")); + return; + } + + const QModelIndexList rows = ui->treeView->selectionModel()->selectedRows(); + + if (rows.count() != 1) + return; + + Resource &resource = m_model->at(m_filterModel->mapToSource(rows[0]).row()); + + if (resource.metadata() == nullptr) + return; + + ResourceDownload::ShaderPackDownloadDialog mdownload(this, m_model, m_instance); + mdownload.setResourceMetadata(resource.metadata()); + if (mdownload.exec()) { + auto tasks = + new ConcurrentTask(this, "Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + connect(tasks, &Task::failed, [this, tasks](QString reason) { + CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::aborted, [this, tasks]() { + CustomMessageBox::selectable(this, tr("Aborted"), tr("Download stopped by user."), QMessageBox::Information)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::succeeded, [this, tasks]() { + QStringList warnings = tasks->warnings(); + if (warnings.count()) + CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show(); + + tasks->deleteLater(); + }); + + for (auto& task : mdownload.getTasks()) { + tasks->addTask(task); + } + + ProgressDialog loadDialog(this); + loadDialog.setSkipButton(true, tr("Abort")); + loadDialog.execWithTask(tasks); + + m_model->update(); + } +} diff --git a/launcher/ui/pages/instance/ShaderPackPage.h b/launcher/ui/pages/instance/ShaderPackPage.h index f35a4b79f..ebf7f1d58 100644 --- a/launcher/ui/pages/instance/ShaderPackPage.h +++ b/launcher/ui/pages/instance/ShaderPackPage.h @@ -56,6 +56,7 @@ class ShaderPackPage : public ExternalResourcesPage { void downloadShaderPack(); void updateShaderPacks(); void deleteShaderPackMetadata(); + void changeShaderPackVersion(); private: std::shared_ptr m_model; diff --git a/launcher/ui/pages/instance/TexturePackPage.cpp b/launcher/ui/pages/instance/TexturePackPage.cpp index cdd2b0964..648cd2ec7 100644 --- a/launcher/ui/pages/instance/TexturePackPage.cpp +++ b/launcher/ui/pages/instance/TexturePackPage.cpp @@ -69,6 +69,11 @@ TexturePackPage::TexturePackPage(MinecraftInstance* instance, std::shared_ptractionResetItemMetadata, &QAction::triggered, this, &TexturePackPage::deleteTexturePackMetadata); ui->actionUpdateItem->setMenu(updateMenu); + + ui->actionChangeVersion->setToolTip(tr("Change a texture pack's version.")); + connect(ui->actionChangeVersion, &QAction::triggered, this, &TexturePackPage::changeTexturePackVersion); + ui->actionsToolbar->insertActionAfter(ui->actionUpdateItem, ui->actionChangeVersion); + } void TexturePackPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) @@ -216,3 +221,55 @@ void TexturePackPage::deleteTexturePackMetadata() m_model->deleteMetadata(selection); } + +void TexturePackPage::changeTexturePackVersion() { + if (m_instance->typeName() != "Minecraft") + return; // this is a null instance or a legacy instance + + if (APPLICATION->settings()->get("ModMetadataDisabled").toBool()) { + QMessageBox::critical(this, tr("Error"), tr("Texture pack updates are unavailable when metadata is disabled!")); + return; + } + + const QModelIndexList rows = ui->treeView->selectionModel()->selectedRows(); + + if (rows.count() != 1) + return; + + Resource &resource = m_model->at(m_filterModel->mapToSource(rows[0]).row()); + + if (resource.metadata() == nullptr) + return; + + ResourceDownload::TexturePackDownloadDialog mdownload(this, m_model, m_instance); + mdownload.setResourceMetadata(resource.metadata()); + if (mdownload.exec()) { + auto tasks = + new ConcurrentTask(this, "Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + connect(tasks, &Task::failed, [this, tasks](QString reason) { + CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::aborted, [this, tasks]() { + CustomMessageBox::selectable(this, tr("Aborted"), tr("Download stopped by user."), QMessageBox::Information)->show(); + tasks->deleteLater(); + }); + connect(tasks, &Task::succeeded, [this, tasks]() { + QStringList warnings = tasks->warnings(); + if (warnings.count()) + CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show(); + + tasks->deleteLater(); + }); + + for (auto& task : mdownload.getTasks()) { + tasks->addTask(task); + } + + ProgressDialog loadDialog(this); + loadDialog.setSkipButton(true, tr("Abort")); + loadDialog.execWithTask(tasks); + + m_model->update(); + } +} diff --git a/launcher/ui/pages/instance/TexturePackPage.h b/launcher/ui/pages/instance/TexturePackPage.h index 4dc2c16c2..28d7ba209 100644 --- a/launcher/ui/pages/instance/TexturePackPage.h +++ b/launcher/ui/pages/instance/TexturePackPage.h @@ -59,6 +59,7 @@ class TexturePackPage : public ExternalResourcesPage { void downloadTexturePacks(); void updateTexturePacks(); void deleteTexturePackMetadata(); + void changeTexturePackVersion(); private: std::shared_ptr m_model; From 49044e23de491e09119d620c6cad02a9d0f4f8e7 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 28 Oct 2024 16:21:00 +0000 Subject: [PATCH 317/616] Fix Export List placement Signed-off-by: TheKodeToad --- launcher/ui/pages/instance/ExternalResourcesPage.cpp | 2 ++ launcher/ui/pages/instance/ExternalResourcesPage.ui | 2 +- launcher/ui/pages/instance/ModFolderPage.cpp | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index 132297849..c455045b5 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -323,6 +323,8 @@ void ExternalResourcesPage::updateActions() ui->actionRemoveItem->setEnabled(hasSelection); ui->actionEnableItem->setEnabled(hasSelection); ui->actionDisableItem->setEnabled(hasSelection); + + ui->actionExportMetadata->setEnabled(!m_model->empty()); } void ExternalResourcesPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.ui b/launcher/ui/pages/instance/ExternalResourcesPage.ui index b7b219717..22ab556b9 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.ui +++ b/launcher/ui/pages/instance/ExternalResourcesPage.ui @@ -190,7 +190,7 @@ - true + false Export List diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 40bf01f9a..17bbb3bbc 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -107,11 +107,11 @@ ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr connect(ui->actionChangeVersion, &QAction::triggered, this, &ModFolderPage::changeModVersion); ui->actionsToolbar->insertActionAfter(ui->actionUpdateItem, ui->actionChangeVersion); - ui->actionsToolbar->addSeparator(); - ui->actionExportMetadata->setToolTip(tr("Export mod's metadata to text.")); connect(ui->actionExportMetadata, &QAction::triggered, this, &ModFolderPage::exportModMetadata); - ui->actionsToolbar->addAction(ui->actionExportMetadata); + ui->actionsToolbar->insertActionAfter(ui->actionDisableItem, ui->actionExportMetadata); + + ui->actionsToolbar->insertSeparator(ui->actionExportMetadata); } bool ModFolderPage::shouldDisplay() const From 9cdda4377b0090a035e286a86fd78f126f995356 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 28 Oct 2024 19:19:06 +0200 Subject: [PATCH 318/616] remove message box Signed-off-by: Trial97 --- launcher/ui/pages/modplatform/ResourcePage.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index 481fbc1f4..049dff644 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -364,11 +364,7 @@ void ResourcePage::onResourceSelected() auto& version = current_pack->versions[m_selectedVersionIndex]; if (version.downloadUrl.isNull()) { - CustomMessageBox::selectable( - this, tr("Download Link Missing"), - tr("It looks like the resource you selected doesn't have a download link, so Prism won't attempt to download it."), - QMessageBox::Warning) - ->show(); + qCritical() << tr("It looks like the resource you selected doesn't have a download link, so Prism won't attempt to download it."); return; } if (version.is_currently_selected) From 354a0ed46e02c72fcef0ad5703fc5b31c8382917 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 28 Oct 2024 18:01:01 +0000 Subject: [PATCH 319/616] Fix column sizes Signed-off-by: TheKodeToad --- launcher/minecraft/mod/ResourceFolderModel.h | 2 +- launcher/minecraft/mod/ResourcePackFolderModel.cpp | 2 +- launcher/minecraft/mod/TexturePackFolderModel.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index a92648de9..3fd366385 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -256,7 +256,7 @@ class ResourceFolderModel : public QAbstractListModel { QList m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::DATE, SortType::PROVIDER, SortType::SIZE }; QStringList m_column_names = { "Enable", "Name", "Last Modified", "Provider", "Size" }; QStringList m_column_names_translated = { tr("Enable"), tr("Name"), tr("Last Modified"), tr("Provider"), tr("Size") }; - QList m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive, + QList m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive }; QList m_columnsHideable = { false, false, true, true, true }; QList m_columnsHiddenByDefault = { false, false, false, false, true }; diff --git a/launcher/minecraft/mod/ResourcePackFolderModel.cpp b/launcher/minecraft/mod/ResourcePackFolderModel.cpp index 84c34582b..9850bd22d 100644 --- a/launcher/minecraft/mod/ResourcePackFolderModel.cpp +++ b/launcher/minecraft/mod/ResourcePackFolderModel.cpp @@ -55,7 +55,7 @@ ResourcePackFolderModel::ResourcePackFolderModel(const QDir& dir, BaseInstance* QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Pack Format"), tr("Last Modified"), tr("Provider"), tr("Size") }); m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::PACK_FORMAT, SortType::DATE, SortType::PROVIDER, SortType::SIZE }; - m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, + m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive }; m_columnsHideable = { false, true, false, true, true, true, true }; } diff --git a/launcher/minecraft/mod/TexturePackFolderModel.cpp b/launcher/minecraft/mod/TexturePackFolderModel.cpp index 293567cc8..073ea7ca7 100644 --- a/launcher/minecraft/mod/TexturePackFolderModel.cpp +++ b/launcher/minecraft/mod/TexturePackFolderModel.cpp @@ -47,8 +47,8 @@ TexturePackFolderModel::TexturePackFolderModel(const QDir& dir, BaseInstance* in { m_column_names = QStringList({ "Enable", "Image", "Name", "Last Modified", "Provider", "Size" }); m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Last Modified"), tr("Provider"), tr("Size") }); - m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::DATE, SortType::SIZE }; - m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive, QHeaderView::Interactive }; + m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::DATE, SortType::PROVIDER, SortType::SIZE }; + m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive }; m_columnsHideable = { false, true, false, true, true, true }; m_columnsHiddenByDefault = { false, false, false, false, false, true }; } From 2b22a1aebea12d95456791fce88695bcb856cec2 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 28 Oct 2024 20:14:56 +0000 Subject: [PATCH 320/616] Reimplement View Homepage I removed it for some reason, but now it's back for all pages! Signed-off-by: TheKodeToad --- launcher/minecraft/mod/Mod.cpp | 14 ++++------ launcher/minecraft/mod/Mod.h | 3 +- launcher/minecraft/mod/Resource.cpp | 8 ++++++ launcher/minecraft/mod/Resource.h | 1 + .../modplatform/helpers/ExportToModList.cpp | 12 ++++---- .../pages/instance/ExternalResourcesPage.cpp | 26 ++++++++++++++++- .../ui/pages/instance/ExternalResourcesPage.h | 2 ++ .../pages/instance/ExternalResourcesPage.ui | 13 +++++++++ launcher/ui/pages/instance/ModFolderPage.cpp | 6 ++-- .../ui/pages/instance/TexturePackPage.cpp | 1 + launcher/ui/widgets/InfoFrame.cpp | 28 ++++++++++++++++--- 11 files changed, 90 insertions(+), 24 deletions(-) diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp index c5b13ddd3..8d998f586 100644 --- a/launcher/minecraft/mod/Mod.cpp +++ b/launcher/minecraft/mod/Mod.cpp @@ -141,16 +141,14 @@ auto Mod::version() const -> QString return details().version; } -auto Mod::homeurl() const -> QString +auto Mod::homepage() const -> QString { - return details().homeurl; -} + QString metaUrl = Resource::homepage(); -auto Mod::metaurl() const -> QString -{ - if (metadata() == nullptr) - return homeurl(); - return ModPlatform::getMetaURL(metadata()->provider, metadata()->project_id); + if (metaUrl.isEmpty()) + return details().homeurl; + else + return metaUrl; } auto Mod::loaders() const -> QString diff --git a/launcher/minecraft/mod/Mod.h b/launcher/minecraft/mod/Mod.h index a86a2fad0..228686bec 100644 --- a/launcher/minecraft/mod/Mod.h +++ b/launcher/minecraft/mod/Mod.h @@ -61,12 +61,11 @@ class Mod : public Resource { auto details() const -> const ModDetails&; auto name() const -> QString override; auto version() const -> QString; - auto homeurl() const -> QString; + auto homepage() const -> QString override; auto description() const -> QString; auto authors() const -> QStringList; auto licenses() const -> const QList&; auto issueTracker() const -> QString; - auto metaurl() const -> QString; auto side() const -> QString; auto loaders() const -> QString; auto mcVersions() const -> QString; diff --git a/launcher/minecraft/mod/Resource.cpp b/launcher/minecraft/mod/Resource.cpp index c7ef145b6..d1a7b8f9c 100644 --- a/launcher/minecraft/mod/Resource.cpp +++ b/launcher/minecraft/mod/Resource.cpp @@ -95,6 +95,14 @@ auto Resource::provider() const -> QString return tr("Unknown"); } +auto Resource::homepage() const -> QString +{ + if (metadata()) + return ModPlatform::getMetaURL(metadata()->provider, metadata()->project_id); + + return {}; +} + void Resource::setMetadata(std::shared_ptr&& metadata) { if (status() == ResourceStatus::NO_METADATA) diff --git a/launcher/minecraft/mod/Resource.h b/launcher/minecraft/mod/Resource.h index f6667871a..269f65859 100644 --- a/launcher/minecraft/mod/Resource.h +++ b/launcher/minecraft/mod/Resource.h @@ -100,6 +100,7 @@ class Resource : public QObject { [[nodiscard]] auto metadata() -> std::shared_ptr { return m_metadata; } [[nodiscard]] auto metadata() const -> std::shared_ptr { return m_metadata; } [[nodiscard]] auto provider() const -> QString; + [[nodiscard]] virtual auto homepage() const -> QString; void setStatus(ResourceStatus status) { m_status = status; } void setMetadata(std::shared_ptr&& metadata); diff --git a/launcher/modplatform/helpers/ExportToModList.cpp b/launcher/modplatform/helpers/ExportToModList.cpp index aea16ab50..bddc7e320 100644 --- a/launcher/modplatform/helpers/ExportToModList.cpp +++ b/launcher/modplatform/helpers/ExportToModList.cpp @@ -28,7 +28,7 @@ QString toHTML(QList mods, OptionalData extraData) auto meta = mod->metadata(); auto modName = mod->name().toHtmlEscaped(); if (extraData & Url) { - auto url = mod->metaurl().toHtmlEscaped(); + auto url = mod->homepage().toHtmlEscaped(); if (!url.isEmpty()) modName = QString("%2").arg(url, modName); } @@ -65,7 +65,7 @@ QString toMarkdown(QList mods, OptionalData extraData) auto meta = mod->metadata(); auto modName = toMarkdownEscaped(mod->name()); if (extraData & Url) { - auto url = mod->metaurl(); + auto url = mod->homepage(); if (!url.isEmpty()) modName = QString("[%1](%2)").arg(modName, url); } @@ -95,7 +95,7 @@ QString toPlainTXT(QList mods, OptionalData extraData) auto line = modName; if (extraData & Url) { - auto url = mod->metaurl(); + auto url = mod->homepage(); if (!url.isEmpty()) line += QString(" (%1)").arg(url); } @@ -124,7 +124,7 @@ QString toJSON(QList mods, OptionalData extraData) QJsonObject line; line["name"] = modName; if (extraData & Url) { - auto url = mod->metaurl(); + auto url = mod->homepage(); if (!url.isEmpty()) line["url"] = url; } @@ -156,7 +156,7 @@ QString toCSV(QList mods, OptionalData extraData) data << modName; if (extraData & Url) - data << mod->metaurl(); + data << mod->homepage(); if (extraData & Version) { auto ver = mod->version(); if (ver.isEmpty() && meta != nullptr) @@ -203,7 +203,7 @@ QString exportToModList(QList mods, QString lineTemplate) for (auto mod : mods) { auto meta = mod->metadata(); auto modName = mod->name(); - auto url = mod->metaurl(); + auto url = mod->homepage(); auto ver = mod->version(); if (ver.isEmpty() && meta != nullptr) ver = meta->version().toString(); diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index c455045b5..0e6c5131b 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -74,6 +74,7 @@ ExternalResourcesPage::ExternalResourcesPage(BaseInstance* instance, std::shared connect(ui->actionRemoveItem, &QAction::triggered, this, &ExternalResourcesPage::removeItem); connect(ui->actionEnableItem, &QAction::triggered, this, &ExternalResourcesPage::enableItem); connect(ui->actionDisableItem, &QAction::triggered, this, &ExternalResourcesPage::disableItem); + connect(ui->actionViewHomepage, &QAction::triggered, this, &ExternalResourcesPage::viewHomepage); connect(ui->actionViewConfigs, &QAction::triggered, this, &ExternalResourcesPage::viewConfigs); connect(ui->actionViewFolder, &QAction::triggered, this, &ExternalResourcesPage::viewFolder); @@ -301,6 +302,27 @@ void ExternalResourcesPage::disableItem() m_model->setResourceEnabled(selection.indexes(), EnableAction::DISABLE); } +void ExternalResourcesPage::viewHomepage() +{ + auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); + bool openedAny = false; + for (auto resource : m_model->selectedResources(selection)) { + auto url = resource->homepage(); + if (!url.isEmpty()) { + DesktopServices::openUrl(url); + openedAny = true; + } + } + + // TODO: just disable button + // just doing this for now to prevent race conditions which may be worse with implementation changes + if (!openedAny) { + CustomMessageBox::selectable(this, tr("No homepages found"), tr("None of the selected resources had an available homepage."), + QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok) + ->exec(); + } +} + void ExternalResourcesPage::viewConfigs() { DesktopServices::openPath(m_instance->instanceConfigFolder(), true); @@ -314,16 +336,18 @@ void ExternalResourcesPage::viewFolder() void ExternalResourcesPage::updateActions() { const bool hasSelection = ui->treeView->selectionModel()->hasSelection(); + const QModelIndexList rows = ui->treeView->selectionModel()->selectedRows(); + ui->actionUpdateItem->setEnabled(!m_model->empty()); ui->actionResetItemMetadata->setEnabled(hasSelection); - const QModelIndexList rows = ui->treeView->selectionModel()->selectedRows(); ui->actionChangeVersion->setEnabled(rows.count() == 1 && m_model->at(m_filterModel->mapToSource(rows[0]).row()).metadata() != nullptr); ui->actionRemoveItem->setEnabled(hasSelection); ui->actionEnableItem->setEnabled(hasSelection); ui->actionDisableItem->setEnabled(hasSelection); + ui->actionViewHomepage->setEnabled(hasSelection); ui->actionExportMetadata->setEnabled(!m_model->empty()); } diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.h b/launcher/ui/pages/instance/ExternalResourcesPage.h index 9bbd13984..00bb5d17d 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.h +++ b/launcher/ui/pages/instance/ExternalResourcesPage.h @@ -56,6 +56,8 @@ class ExternalResourcesPage : public QMainWindow, public BasePage { virtual void enableItem(); virtual void disableItem(); + virtual void viewHomepage(); + virtual void viewFolder(); virtual void viewConfigs(); diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.ui b/launcher/ui/pages/instance/ExternalResourcesPage.ui index 22ab556b9..9c41f3a71 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.ui +++ b/launcher/ui/pages/instance/ExternalResourcesPage.ui @@ -90,6 +90,8 @@ + + @@ -213,6 +215,17 @@ QAction::NoRole + + + false + + + View Homepage + + + View the homepages of all selected items. + + diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 17bbb3bbc..b9e0cfeef 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -107,11 +107,11 @@ ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr connect(ui->actionChangeVersion, &QAction::triggered, this, &ModFolderPage::changeModVersion); ui->actionsToolbar->insertActionAfter(ui->actionUpdateItem, ui->actionChangeVersion); + ui->actionViewHomepage->setToolTip(tr("View the homepages of all selected mods.")); + ui->actionExportMetadata->setToolTip(tr("Export mod's metadata to text.")); connect(ui->actionExportMetadata, &QAction::triggered, this, &ModFolderPage::exportModMetadata); - ui->actionsToolbar->insertActionAfter(ui->actionDisableItem, ui->actionExportMetadata); - - ui->actionsToolbar->insertSeparator(ui->actionExportMetadata); + ui->actionsToolbar->insertActionAfter(ui->actionViewHomepage, ui->actionExportMetadata); } bool ModFolderPage::shouldDisplay() const diff --git a/launcher/ui/pages/instance/TexturePackPage.cpp b/launcher/ui/pages/instance/TexturePackPage.cpp index 648cd2ec7..990ee2b2e 100644 --- a/launcher/ui/pages/instance/TexturePackPage.cpp +++ b/launcher/ui/pages/instance/TexturePackPage.cpp @@ -74,6 +74,7 @@ TexturePackPage::TexturePackPage(MinecraftInstance* instance, std::shared_ptractionChangeVersion, &QAction::triggered, this, &TexturePackPage::changeTexturePackVersion); ui->actionsToolbar->insertActionAfter(ui->actionUpdateItem, ui->actionChangeVersion); + ui->actionViewHomepage->setToolTip(tr("View the homepages of all selected texture packs.")); } void TexturePackPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous) diff --git a/launcher/ui/widgets/InfoFrame.cpp b/launcher/ui/widgets/InfoFrame.cpp index 44f702659..2ae5d939b 100644 --- a/launcher/ui/widgets/InfoFrame.cpp +++ b/launcher/ui/widgets/InfoFrame.cpp @@ -84,7 +84,7 @@ void InfoFrame::updateWithMod(Mod const& m) QString text = ""; QString name = ""; - QString link = m.metaurl(); + QString link = m.homepage(); if (m.name().isEmpty()) name = m.internal_id(); else @@ -93,7 +93,7 @@ void InfoFrame::updateWithMod(Mod const& m) if (link.isEmpty()) text = name; else { - text = "" + name + ""; + text = "" + name + ""; } if (!m.authors().isEmpty()) text += " by " + m.authors().join(", "); @@ -145,6 +145,12 @@ void InfoFrame::updateWithMod(Mod const& m) void InfoFrame::updateWithResource(const Resource& resource) { + const QString homepage = resource.homepage(); + + if (!homepage.isEmpty()) { + + } + setName(resource.name()); setImage(); } @@ -209,14 +215,28 @@ QString InfoFrame::renderColorCodes(QString input) void InfoFrame::updateWithResourcePack(ResourcePack& resource_pack) { - setName(renderColorCodes(resource_pack.name())); + QString name = renderColorCodes(resource_pack.name()); + + const QString homepage = resource_pack.homepage(); + if (!homepage.isEmpty()) { + name = "" + name + ""; + } + + setName(name); setDescription(renderColorCodes(resource_pack.description())); setImage(resource_pack.image({ 64, 64 })); } void InfoFrame::updateWithTexturePack(TexturePack& texture_pack) { - setName(renderColorCodes(texture_pack.name())); + QString name = renderColorCodes(texture_pack.name()); + + const QString homepage = texture_pack.homepage(); + if (!homepage.isEmpty()) { + name = "" + name + ""; + } + + setName(name); setDescription(renderColorCodes(texture_pack.description())); setImage(texture_pack.image({ 64, 64 })); } From 94f65f8727bfd12cc50eb8b62d52bca308cef9b5 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 28 Oct 2024 22:27:40 +0200 Subject: [PATCH 321/616] add qassert Signed-off-by: Trial97 --- launcher/ui/pages/modplatform/ResourcePage.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index 049dff644..a20dc19bf 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -363,10 +363,7 @@ void ResourcePage::onResourceSelected() return; auto& version = current_pack->versions[m_selectedVersionIndex]; - if (version.downloadUrl.isNull()) { - qCritical() << tr("It looks like the resource you selected doesn't have a download link, so Prism won't attempt to download it."); - return; - } + Q_ASSERT(!version.downloadUrl.isNull()); if (version.is_currently_selected) removeResourceFromDialog(current_pack->name); else From ad1d5ddcdfc86328490c05359d58cfd68de72aad Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 28 Oct 2024 20:42:59 +0000 Subject: [PATCH 322/616] Revert unwise refactor Signed-off-by: TheKodeToad --- .../minecraft/mod/ResourceFolderModel.cpp | 34 +++++++++---------- launcher/minecraft/mod/ResourceFolderModel.h | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index 4c7af3c02..9bc9cd9a9 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -483,19 +483,19 @@ QVariant ResourceFolderModel::data(const QModelIndex& index, int role) const switch (role) { case Qt::DisplayRole: switch (column) { - case NAME_COLUMN: + case NameColumn: return m_resources[row]->name(); - case DATE_COLUMN: + case DateColumn: return m_resources[row]->dateTimeChanged(); - case PROVIDER_COLUMN: + case ProviderColumn: return m_resources[row]->provider(); - case SIZE_COLUMN: + case SizeColumn: return m_resources[row]->sizeStr(); default: return {}; } case Qt::ToolTipRole: - if (column == NAME_COLUMN) { + if (column == NameColumn) { if (at(row).isSymLinkUnder(instDirPath())) { return m_resources[row]->internal_id() + tr("\nWarning: This resource is symbolically linked from elsewhere. Editing it will also change the original." @@ -511,14 +511,14 @@ QVariant ResourceFolderModel::data(const QModelIndex& index, int role) const return m_resources[row]->internal_id(); case Qt::DecorationRole: { - if (column == NAME_COLUMN && (at(row).isSymLinkUnder(instDirPath()) || at(row).isMoreThanOneHardLink())) + if (column == NameColumn && (at(row).isSymLinkUnder(instDirPath()) || at(row).isMoreThanOneHardLink())) return APPLICATION->getThemedIcon("status-yellow"); return {}; } case Qt::CheckStateRole: switch (column) { - case ACTIVE_COLUMN: + case ActiveColumn: return m_resources[row]->enabled() ? Qt::Checked : Qt::Unchecked; default: return {}; @@ -557,11 +557,11 @@ QVariant ResourceFolderModel::headerData(int section, [[maybe_unused]] Qt::Orien switch (role) { case Qt::DisplayRole: switch (section) { - case ACTIVE_COLUMN: - case NAME_COLUMN: - case DATE_COLUMN: - case PROVIDER_COLUMN: - case SIZE_COLUMN: + case ActiveColumn: + case NameColumn: + case DateColumn: + case ProviderColumn: + case SizeColumn: return columnNames().at(section); default: return {}; @@ -569,15 +569,15 @@ QVariant ResourceFolderModel::headerData(int section, [[maybe_unused]] Qt::Orien case Qt::ToolTipRole: { //: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc. switch (section) { - case ACTIVE_COLUMN: + case ActiveColumn: return tr("Is the resource enabled?"); - case NAME_COLUMN: + case NameColumn: return tr("The name of the resource."); - case DATE_COLUMN: + case DateColumn: return tr("The date and time this resource was last changed (or added)."); - case PROVIDER_COLUMN: + case ProviderColumn: return tr("The source provider of the resource."); - case SIZE_COLUMN: + case SizeColumn: return tr("The size of the resource."); default: return {}; diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index 3fd366385..80698eac5 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -151,7 +151,7 @@ class ResourceFolderModel : public QAbstractListModel { /* Qt behavior */ /* Basic columns */ - enum Columns { ACTIVE_COLUMN = 0, NAME_COLUMN, DATE_COLUMN, PROVIDER_COLUMN, SIZE_COLUMN, NUM_COLUMNS }; + enum Columns { ActiveColumn = 0, NameColumn, DateColumn, ProviderColumn, SizeColumn, NUM_COLUMNS }; QStringList columnNames(bool translated = true) const { return translated ? m_column_names_translated : m_column_names; } From f3cae427f197c614cc05ad55084edc32051093bd Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 28 Oct 2024 21:09:45 +0000 Subject: [PATCH 323/616] Fix tests (make them green) Signed-off-by: TheKodeToad --- launcher/minecraft/mod/ModFolderModel.h | 1 - tests/ResourceFolderModel_test.cpp | 16 ++++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/launcher/minecraft/mod/ModFolderModel.h b/launcher/minecraft/mod/ModFolderModel.h index 629a2621c..c9a5fc226 100644 --- a/launcher/minecraft/mod/ModFolderModel.h +++ b/launcher/minecraft/mod/ModFolderModel.h @@ -75,7 +75,6 @@ class ModFolderModel : public ResourceFolderModel { ReleaseTypeColumn, NUM_COLUMNS }; - enum ModStatusAction { Disable, Enable, Toggle }; ModFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent = nullptr); virtual QString id() const override { return "mods"; } diff --git a/tests/ResourceFolderModel_test.cpp b/tests/ResourceFolderModel_test.cpp index 350ab615e..f2201a5e9 100644 --- a/tests/ResourceFolderModel_test.cpp +++ b/tests/ResourceFolderModel_test.cpp @@ -87,7 +87,7 @@ class ResourceFolderModelTest : public QObject { QEventLoop loop; - ModFolderModel m(tempDir.path(), nullptr, true); + ModFolderModel m(tempDir.path(), nullptr, true, true); connect(&m, &ModFolderModel::updateFinished, &loop, &QEventLoop::quit); @@ -96,7 +96,7 @@ class ResourceFolderModelTest : public QObject { expire_timer.setSingleShot(true); expire_timer.start(4000); - m.installMod(folder); + m.installResource(folder); loop.exec(); @@ -111,7 +111,7 @@ class ResourceFolderModelTest : public QObject { QString folder = source + '/'; QTemporaryDir tempDir; QEventLoop loop; - ModFolderModel m(tempDir.path(), nullptr, true); + ModFolderModel m(tempDir.path(), nullptr, true, true); connect(&m, &ModFolderModel::updateFinished, &loop, &QEventLoop::quit); @@ -120,7 +120,7 @@ class ResourceFolderModelTest : public QObject { expire_timer.setSingleShot(true); expire_timer.start(4000); - m.installMod(folder); + m.installResource(folder); loop.exec(); @@ -134,7 +134,7 @@ class ResourceFolderModelTest : public QObject { void test_addFromWatch() { QString source = QFINDTESTDATA("testdata/ResourceFolderModel"); - ModFolderModel model(source, nullptr); + ModFolderModel model(source, nullptr, false, true); QCOMPARE(model.size(), 0); @@ -154,7 +154,7 @@ class ResourceFolderModelTest : public QObject { QString file_mod = QFINDTESTDATA("testdata/ResourceFolderModel/supercoolmod.jar"); QTemporaryDir tmp; - ResourceFolderModel model(QDir(tmp.path()), nullptr); + ResourceFolderModel model(QDir(tmp.path()), nullptr, false, false); QCOMPARE(model.size(), 0); @@ -199,7 +199,7 @@ class ResourceFolderModelTest : public QObject { QString file_mod = QFINDTESTDATA("testdata/ResourceFolderModel/supercoolmod.jar"); QTemporaryDir tmp; - ResourceFolderModel model(tmp.path(), nullptr); + ResourceFolderModel model(tmp.path(), nullptr, false, false); QCOMPARE(model.size(), 0); @@ -210,7 +210,7 @@ class ResourceFolderModelTest : public QObject { EXEC_UPDATE_TASK(model.installResource(file_mod), QVERIFY) } - for (auto res : model.all()) + for (auto res : model.allResources()) qDebug() << res->name(); QCOMPARE(model.size(), 2); From bd8b30c606dda9532e50477fb05bf7513c4837e6 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 28 Oct 2024 22:17:16 +0000 Subject: [PATCH 324/616] Implement link for InfoFrame::updateWithResource Signed-off-by: TheKodeToad --- launcher/ui/widgets/InfoFrame.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/launcher/ui/widgets/InfoFrame.cpp b/launcher/ui/widgets/InfoFrame.cpp index 2ae5d939b..3ef5dcb88 100644 --- a/launcher/ui/widgets/InfoFrame.cpp +++ b/launcher/ui/widgets/InfoFrame.cpp @@ -147,11 +147,11 @@ void InfoFrame::updateWithResource(const Resource& resource) { const QString homepage = resource.homepage(); - if (!homepage.isEmpty()) { + if (!homepage.isEmpty()) + setName("" + resource.name() + ""); + else + setName(resource.name()); - } - - setName(resource.name()); setImage(); } From d157159106df4ec8108309b3e0928f1589274f34 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 28 Oct 2024 22:29:43 +0000 Subject: [PATCH 325/616] Fix license headers and formatting Signed-off-by: TheKodeToad --- launcher/CMakeLists.txt | 8 ++++---- launcher/minecraft/mod/MetadataHandler.h | 1 + launcher/minecraft/mod/Mod.cpp | 1 + launcher/minecraft/mod/Mod.h | 1 + launcher/minecraft/mod/ModFolderModel.cpp | 1 + 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index db3762a8b..486aaff3e 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -349,8 +349,8 @@ set(MINECRAFT_SOURCES minecraft/mod/tasks/ResourceFolderLoadTask.cpp minecraft/mod/tasks/LocalModParseTask.h minecraft/mod/tasks/LocalModParseTask.cpp - minecraft/mod/tasks/LocalResourceUpdateTask.h - minecraft/mod/tasks/LocalResourceUpdateTask.cpp + minecraft/mod/tasks/LocalResourceUpdateTask.h + minecraft/mod/tasks/LocalResourceUpdateTask.cpp minecraft/mod/tasks/LocalDataPackParseTask.h minecraft/mod/tasks/LocalDataPackParseTask.cpp minecraft/mod/tasks/LocalResourcePackParseTask.h @@ -1068,8 +1068,8 @@ SET(LAUNCHER_SOURCES ui/dialogs/BlockedModsDialog.h ui/dialogs/ChooseProviderDialog.h ui/dialogs/ChooseProviderDialog.cpp - ui/dialogs/ResourceUpdateDialog.cpp - ui/dialogs/ResourceUpdateDialog.h + ui/dialogs/ResourceUpdateDialog.cpp + ui/dialogs/ResourceUpdateDialog.h ui/dialogs/InstallLoaderDialog.cpp ui/dialogs/InstallLoaderDialog.h diff --git a/launcher/minecraft/mod/MetadataHandler.h b/launcher/minecraft/mod/MetadataHandler.h index 653c3c1ee..0b8cb124d 100644 --- a/launcher/minecraft/mod/MetadataHandler.h +++ b/launcher/minecraft/mod/MetadataHandler.h @@ -2,6 +2,7 @@ /* * Prism Launcher - Minecraft Launcher * Copyright (c) 2022 flowln + * Copyright (c) 2023 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp index 8d998f586..4986d8ee1 100644 --- a/launcher/minecraft/mod/Mod.cpp +++ b/launcher/minecraft/mod/Mod.cpp @@ -3,6 +3,7 @@ * Prism Launcher - Minecraft Launcher * Copyright (c) 2022 flowln * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (c) 2023 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/minecraft/mod/Mod.h b/launcher/minecraft/mod/Mod.h index 228686bec..8a352c66c 100644 --- a/launcher/minecraft/mod/Mod.h +++ b/launcher/minecraft/mod/Mod.h @@ -2,6 +2,7 @@ /* * Prism Launcher - Minecraft Launcher * Copyright (c) 2022 flowln + * Copyright (c) 2023 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp index 11c784b96..8fe68203c 100644 --- a/launcher/minecraft/mod/ModFolderModel.cpp +++ b/launcher/minecraft/mod/ModFolderModel.cpp @@ -3,6 +3,7 @@ * Prism Launcher - Minecraft Launcher * Copyright (c) 2022 flowln * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (c) 2023 Trial97 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by From 8e7d84d05beffac492522f4b2c0d9e638b15146b Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 29 Oct 2024 00:40:13 +0200 Subject: [PATCH 326/616] fix leak on resource search Signed-off-by: Trial97 --- .../helpers/NetworkResourceAPI.cpp | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/launcher/modplatform/helpers/NetworkResourceAPI.cpp b/launcher/modplatform/helpers/NetworkResourceAPI.cpp index 974e732a7..7a234a8f8 100644 --- a/launcher/modplatform/helpers/NetworkResourceAPI.cpp +++ b/launcher/modplatform/helpers/NetworkResourceAPI.cpp @@ -43,11 +43,16 @@ Task::Ptr NetworkResourceAPI::searchProjects(SearchArgs&& args, SearchCallbacks& callbacks.on_succeed(doc); }); - QObject::connect(netJob.get(), &NetJob::failed, [netJob, callbacks](const QString& reason) { + // Capture a weak_ptr instead of a shared_ptr to avoid circular dependency issues. + // This prevents the lambda from extending the lifetime of the shared resource, + // as it only temporarily locks the resource when needed. + auto weak = netJob.toWeakRef(); + QObject::connect(netJob.get(), &NetJob::failed, [weak, callbacks](const QString& reason) { int network_error_code = -1; - if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) - network_error_code = failed_action->replyStatusCode(); - + if (auto netJob = weak.lock()) { + if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) + network_error_code = failed_action->replyStatusCode(); + } callbacks.on_fail(reason, network_error_code); }); QObject::connect(netJob.get(), &NetJob::aborted, [callbacks] { callbacks.on_abort(); }); @@ -102,11 +107,17 @@ Task::Ptr NetworkResourceAPI::getProjectVersions(VersionSearchArgs&& args, Versi callbacks.on_succeed(doc, args.pack); }); - QObject::connect(netJob.get(), &NetJob::failed, [netJob, callbacks](const QString& reason) { - int network_error_code = -1; - if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) - network_error_code = failed_action->replyStatusCode(); + // Capture a weak_ptr instead of a shared_ptr to avoid circular dependency issues. + // This prevents the lambda from extending the lifetime of the shared resource, + // as it only temporarily locks the resource when needed. + auto weak = netJob.toWeakRef(); + QObject::connect(netJob.get(), &NetJob::failed, [weak, callbacks](const QString& reason) { + int network_error_code = -1; + if (auto netJob = weak.lock()) { + if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) + network_error_code = failed_action->replyStatusCode(); + } callbacks.on_fail(reason, network_error_code); }); @@ -153,11 +164,17 @@ Task::Ptr NetworkResourceAPI::getDependencyVersion(DependencySearchArgs&& args, callbacks.on_succeed(doc, args.dependency); }); - QObject::connect(netJob.get(), &NetJob::failed, [netJob, callbacks](const QString& reason) { - int network_error_code = -1; - if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) - network_error_code = failed_action->replyStatusCode(); + // Capture a weak_ptr instead of a shared_ptr to avoid circular dependency issues. + // This prevents the lambda from extending the lifetime of the shared resource, + // as it only temporarily locks the resource when needed. + auto weak = netJob.toWeakRef(); + QObject::connect(netJob.get(), &NetJob::failed, [weak, callbacks](const QString& reason) { + int network_error_code = -1; + if (auto netJob = weak.lock()) { + if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) + network_error_code = failed_action->replyStatusCode(); + } callbacks.on_fail(reason, network_error_code); }); return netJob; From c1c198b84b65ebac576354381c56c45fe18320a7 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 29 Oct 2024 15:45:30 +0000 Subject: [PATCH 327/616] Combine if statements Signed-off-by: TheKodeToad --- launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp index e38ca526f..ead8238ff 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp @@ -168,13 +168,12 @@ void ModrinthCheckUpdate::checkNextLoader() return; } - if (m_loaders_list.size() == 0) { - if (m_loader_idx == 0) { - getUpdateModsForLoader({}); - m_loader_idx++; - return; - } + if (m_loaders_list.isEmpty() && m_loader_idx == 0) { + getUpdateModsForLoader({}); + m_loader_idx++; + return; } + if (m_loader_idx < m_loaders_list.size()) { getUpdateModsForLoader(m_loaders_list.at(m_loader_idx)); m_loader_idx++; From d49e6187cdccfc35ae5a670a7c8445399146dfec Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 29 Oct 2024 17:14:59 +0000 Subject: [PATCH 328/616] Make requested changes Signed-off-by: TheKodeToad --- .../minecraft/mod/ResourceFolderModel.cpp | 2 +- launcher/minecraft/mod/ResourceFolderModel.h | 2 +- launcher/modplatform/CheckUpdateTask.h | 2 +- launcher/modplatform/ModIndex.h | 1 - .../modrinth/ModrinthCheckUpdate.cpp | 4 ++-- launcher/ui/MainWindow.cpp | 2 +- .../pages/instance/ExternalResourcesPage.cpp | 21 ++++++------------- 7 files changed, 12 insertions(+), 22 deletions(-) diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index 9bc9cd9a9..d349b2c56 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -166,7 +166,7 @@ bool ResourceFolderModel::installResource(QString original_path) return false; } -bool ResourceFolderModel::installResource(QString path, ModPlatform::IndexedVersion& vers) +bool ResourceFolderModel::installResourceWithFlameMetadata(QString path, ModPlatform::IndexedVersion& vers) { if (vers.addonId.isValid()) { ModPlatform::IndexedPack pack{ diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index 80698eac5..1da748e05 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -113,7 +113,7 @@ class ResourceFolderModel : public QAbstractListModel { */ virtual bool installResource(QString path); - virtual bool installResource(QString path, ModPlatform::IndexedVersion& vers); + virtual bool installResourceWithFlameMetadata(QString path, ModPlatform::IndexedVersion& vers); /** Uninstall (i.e. remove all data about it) a resource, given its file name. * diff --git a/launcher/modplatform/CheckUpdateTask.h b/launcher/modplatform/CheckUpdateTask.h index 9d0b1c51a..1ee820a63 100644 --- a/launcher/modplatform/CheckUpdateTask.h +++ b/launcher/modplatform/CheckUpdateTask.h @@ -17,7 +17,7 @@ class CheckUpdateTask : public Task { std::list& mcVersions, QList loadersList, std::shared_ptr resourceModel) - : Task(nullptr) + : Task() , m_resources(resources) , m_game_versions(mcVersions) , m_loaders_list(std::move(loadersList)) diff --git a/launcher/modplatform/ModIndex.h b/launcher/modplatform/ModIndex.h index 11a230798..d5ee12473 100644 --- a/launcher/modplatform/ModIndex.h +++ b/launcher/modplatform/ModIndex.h @@ -25,7 +25,6 @@ #include #include #include -#include class QIODevice; diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp index ead8238ff..52db95077 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp @@ -148,7 +148,7 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp } m_updates.emplace_back(pack->name, hash, old_version, project_ver.version_number, project_ver.version_type, - project_ver.changelog, ModPlatform::ResourceProvider::MODRINTH, download_task); + project_ver.changelog, ModPlatform::ResourceProvider::MODRINTH, download_task, resource->enabled()); } m_deps.append(std::make_shared(pack, project_ver)); @@ -177,7 +177,7 @@ void ModrinthCheckUpdate::checkNextLoader() if (m_loader_idx < m_loaders_list.size()) { getUpdateModsForLoader(m_loaders_list.at(m_loader_idx)); m_loader_idx++; - return; + return; } for (auto resource : m_mappings) { diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 96f1348d2..a0bc83171 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1048,7 +1048,7 @@ void MainWindow::processURLs(QList urls) qWarning() << "Importing of Data Packs not supported at this time. Ignoring" << localFileName; break; case PackedResourceType::Mod: - minecraftInst->loaderModList()->installResource(localFileName, version); + minecraftInst->loaderModList()->installResourceWithFlameMetadata(localFileName, version); break; case PackedResourceType::ShaderPack: minecraftInst->shaderPackList()->installResource(localFileName); diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index 0e6c5131b..d85726eb8 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -305,21 +305,10 @@ void ExternalResourcesPage::disableItem() void ExternalResourcesPage::viewHomepage() { auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); - bool openedAny = false; for (auto resource : m_model->selectedResources(selection)) { auto url = resource->homepage(); - if (!url.isEmpty()) { + if (!url.isEmpty()) DesktopServices::openUrl(url); - openedAny = true; - } - } - - // TODO: just disable button - // just doing this for now to prevent race conditions which may be worse with implementation changes - if (!openedAny) { - CustomMessageBox::selectable(this, tr("No homepages found"), tr("None of the selected resources had an available homepage."), - QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok) - ->exec(); } } @@ -336,18 +325,20 @@ void ExternalResourcesPage::viewFolder() void ExternalResourcesPage::updateActions() { const bool hasSelection = ui->treeView->selectionModel()->hasSelection(); - const QModelIndexList rows = ui->treeView->selectionModel()->selectedRows(); + const QModelIndexList selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); + const QList selectedResources = m_model->selectedResources(selection); ui->actionUpdateItem->setEnabled(!m_model->empty()); ui->actionResetItemMetadata->setEnabled(hasSelection); - ui->actionChangeVersion->setEnabled(rows.count() == 1 && m_model->at(m_filterModel->mapToSource(rows[0]).row()).metadata() != nullptr); + ui->actionChangeVersion->setEnabled(selectedResources.size() == 1 && selectedResources[0]->metadata() != nullptr); ui->actionRemoveItem->setEnabled(hasSelection); ui->actionEnableItem->setEnabled(hasSelection); ui->actionDisableItem->setEnabled(hasSelection); - ui->actionViewHomepage->setEnabled(hasSelection); + ui->actionViewHomepage->setEnabled(hasSelection && std::any_of(selectedResources.begin(), selectedResources.end(), + [](Resource* resource) { return !resource->homepage().isEmpty() })); ui->actionExportMetadata->setEnabled(!m_model->empty()); } From 2368521a9ae7cd1dbc2c3bae3edaa914924ebcff Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 29 Oct 2024 17:53:57 +0000 Subject: [PATCH 329/616] Add missing semicolon Signed-off-by: TheKodeToad --- launcher/ui/pages/instance/ExternalResourcesPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index d85726eb8..4ea12cb6d 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -338,7 +338,7 @@ void ExternalResourcesPage::updateActions() ui->actionDisableItem->setEnabled(hasSelection); ui->actionViewHomepage->setEnabled(hasSelection && std::any_of(selectedResources.begin(), selectedResources.end(), - [](Resource* resource) { return !resource->homepage().isEmpty() })); + [](Resource* resource) { return !resource->homepage().isEmpty(); })); ui->actionExportMetadata->setEnabled(!m_model->empty()); } From fd109c47401c755e35da9c2884e9b38532bed56c Mon Sep 17 00:00:00 2001 From: Ben Westover Date: Tue, 29 Oct 2024 18:20:00 +0000 Subject: [PATCH 330/616] Shorten metainfo.xml app summary Signed-off-by: Ben Westover --- program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in b/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in index a482f0e38..3c542c060 100644 --- a/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in +++ b/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in @@ -4,7 +4,7 @@ org.prismlauncher.PrismLauncher.desktop Prism Launcher Prism Launcher Contributors - A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once + Custom Minecraft Launcher to easily manage multiple Minecraft installations at once CC0-1.0 GPL-3.0-only https://prismlauncher.org/ From f6511c601e1fd63a864f1681beef0f85adfe6f7e Mon Sep 17 00:00:00 2001 From: Ben Westover Date: Tue, 29 Oct 2024 18:24:19 +0000 Subject: [PATCH 331/616] Fix some typos Signed-off-by: Ben Westover --- .../auth/steps/MSADeviceCodeStep.cpp | 20 +++++++++---------- .../minecraft/auth/steps/MSADeviceCodeStep.h | 2 +- launcher/ui/java/InstallJavaDialog.cpp | 10 +++++----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/launcher/minecraft/auth/steps/MSADeviceCodeStep.cpp b/launcher/minecraft/auth/steps/MSADeviceCodeStep.cpp index c283b153e..38ff90a47 100644 --- a/launcher/minecraft/auth/steps/MSADeviceCodeStep.cpp +++ b/launcher/minecraft/auth/steps/MSADeviceCodeStep.cpp @@ -74,12 +74,12 @@ void MSADeviceCodeStep::perform() m_task->setAskRetry(false); m_task->addNetAction(m_request); - connect(m_task.get(), &Task::finished, this, &MSADeviceCodeStep::deviceAutorizationFinished); + connect(m_task.get(), &Task::finished, this, &MSADeviceCodeStep::deviceAuthorizationFinished); m_task->start(); } -struct DeviceAutorizationResponse { +struct DeviceAuthorizationResponse { QString device_code; QString user_code; QString verification_uri; @@ -90,17 +90,17 @@ struct DeviceAutorizationResponse { QString error_description; }; -DeviceAutorizationResponse parseDeviceAutorizationResponse(const QByteArray& data) +DeviceAuthorizationResponse parseDeviceAuthorizationResponse(const QByteArray& data) { QJsonParseError err; QJsonDocument doc = QJsonDocument::fromJson(data, &err); if (err.error != QJsonParseError::NoError) { - qWarning() << "Failed to parse device autorization response due to err:" << err.errorString(); + qWarning() << "Failed to parse device authorization response due to err:" << err.errorString(); return {}; } if (!doc.isObject()) { - qWarning() << "Device autorization response is not an object"; + qWarning() << "Device authorization response is not an object"; return {}; } auto obj = doc.object(); @@ -111,9 +111,9 @@ DeviceAutorizationResponse parseDeviceAutorizationResponse(const QByteArray& dat }; } -void MSADeviceCodeStep::deviceAutorizationFinished() +void MSADeviceCodeStep::deviceAuthorizationFinished() { - auto rsp = parseDeviceAutorizationResponse(*m_response); + auto rsp = parseDeviceAuthorizationResponse(*m_response); if (!rsp.error.isEmpty() || !rsp.error_description.isEmpty()) { qWarning() << "Device authorization failed:" << rsp.error; emit finished(AccountTaskState::STATE_FAILED_HARD, @@ -208,12 +208,12 @@ AuthenticationResponse parseAuthenticationResponse(const QByteArray& data) QJsonParseError err; QJsonDocument doc = QJsonDocument::fromJson(data, &err); if (err.error != QJsonParseError::NoError) { - qWarning() << "Failed to parse device autorization response due to err:" << err.errorString(); + qWarning() << "Failed to parse device authorization response due to err:" << err.errorString(); return {}; } if (!doc.isObject()) { - qWarning() << "Device autorization response is not an object"; + qWarning() << "Device authorization response is not an object"; return {}; } auto obj = doc.object(); @@ -274,4 +274,4 @@ void MSADeviceCodeStep::authenticationFinished() m_data->msaToken.refresh_token = rsp.refresh_token; m_data->msaToken.token = rsp.access_token; emit finished(AccountTaskState::STATE_WORKING, tr("Got")); -} \ No newline at end of file +} diff --git a/launcher/minecraft/auth/steps/MSADeviceCodeStep.h b/launcher/minecraft/auth/steps/MSADeviceCodeStep.h index 616008def..7f755563f 100644 --- a/launcher/minecraft/auth/steps/MSADeviceCodeStep.h +++ b/launcher/minecraft/auth/steps/MSADeviceCodeStep.h @@ -58,7 +58,7 @@ class MSADeviceCodeStep : public AuthStep { void authorizeWithBrowser(QString url, QString code, int expiresIn); private slots: - void deviceAutorizationFinished(); + void deviceAuthorizationFinished(); void startPoolTimer(); void authenticateUser(); void authenticationFinished(); diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index d38670d05..dc43ea4c9 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -132,9 +132,9 @@ class InstallJavaPage : public QWidget, public BasePage { m_recommended_majors = majors; recommendedFilterChanged(); } - void setRecomend(bool recomend) + void setRecommend(bool recommend) { - m_recommend = recomend; + m_recommend = recommend; recommendedFilterChanged(); } void recommendedFilterChanged() @@ -202,7 +202,7 @@ InstallDialog::InstallDialog(const QString& uid, BaseInstance* instance, QWidget recommendedCheckBox->setCheckState(Qt::CheckState::Checked); connect(recommendedCheckBox, &QCheckBox::stateChanged, this, [this](int state) { for (BasePage* page : container->getPages()) { - pageCast(page)->setRecomend(state == Qt::Checked); + pageCast(page)->setRecommend(state == Qt::Checked); } }); @@ -261,7 +261,7 @@ InstallDialog::InstallDialog(const QString& uid, BaseInstance* instance, QWidget container->selectPage(page->id()); auto cast = pageCast(page); - cast->setRecomend(true); + cast->setRecommend(true); connect(cast, &InstallJavaPage::selectionChanged, this, [this, cast] { validate(cast); }); if (!recommendedJavas.isEmpty()) { cast->setRecommendedMajors(recommendedJavas); @@ -344,4 +344,4 @@ void InstallDialog::done(int result) } // namespace Java -#include "InstallJavaDialog.moc" \ No newline at end of file +#include "InstallJavaDialog.moc" From 43e4481b7093cb84c22cc54906fc2bf41208481e Mon Sep 17 00:00:00 2001 From: Michael Tyson Date: Tue, 23 Apr 2024 14:23:53 +1000 Subject: [PATCH 332/616] Support for launching from command line in offline mode This allows launching an offline instance with --offline --name=OfflineName. This is useful for playing split screen by creating two side-by-side instances, which is impossible online, unless one is using two separate paid accounts. With this PR, it makes it possible to launch from a script - otherwise, one has to launch manually, which is a pain, or create offline profiles for each instance, which interferes with some functionality like skins (my autistic son takes great issue with his skin not being visible, when using offline profiles!). Implementation is based on MultiMC, which supports this feature. See also https://github.com/PrismLauncher/PrismLauncher/issues/1059 for discussion. Signed-off-by: Michael Tyson --- launcher/Application.cpp | 28 +++++++++++++++++++++++----- launcher/Application.h | 5 ++++- launcher/LaunchController.cpp | 13 +++++++++---- launcher/LaunchController.h | 3 +++ 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index ea749ca4c..5fa9da4ce 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -242,6 +242,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) { { "s", "server" }, "Join the specified server on launch (only valid in combination with --launch)", "address" }, { { "w", "world" }, "Join the specified world on launch (only valid in combination with --launch)", "world" }, { { "a", "profile" }, "Use the account specified by its profile name (only valid in combination with --launch)", "profile" }, + { { "o", "offline" }, "Launch offline (only valid in combination with --launch)", "offline" }, + { { "n", "name" }, "When launching offline, use specified name (only makes sense in combination with --launch and --offline)", "name" }, { "alive", "Write a small '" + liveCheckFile + "' file after the launcher starts" }, { { "I", "import" }, "Import instance or resource from specified local path or URL", "url" }, { "show", "Opens the window for the specified instance (by instance ID)", "show" } }); @@ -257,6 +259,10 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_serverToJoin = parser.value("server"); m_worldToJoin = parser.value("world"); m_profileToUse = parser.value("profile"); + if (parser.isSet("offline")) { + m_offline = true; + m_offlineName = parser.value("name"); + } m_liveCheck = parser.isSet("alive"); m_instanceIdToShowWindowOf = parser.value("show"); @@ -271,8 +277,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) } // error if --launch is missing with --server or --profile - if (((!m_serverToJoin.isEmpty() || !m_worldToJoin.isEmpty()) || !m_profileToUse.isEmpty()) && m_instanceIdToLaunch.isEmpty()) { - std::cerr << "--server and --profile can only be used in combination with --launch!" << std::endl; + if ((!m_serverToJoin.isEmpty() || !m_worldToJoin.isEmpty() || !m_profileToUse.isEmpty() || m_offline || !m_offlineName.isEmpty()) && m_instanceIdToLaunch.isEmpty()) { + std::cerr << "--server, --profile, --offline and --name can only be used in combination with --launch!" << std::endl; m_status = Application::Failed; return; } @@ -397,6 +403,10 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) if (!m_profileToUse.isEmpty()) { launch.args["profile"] = m_profileToUse; } + if (m_offline) { + launch.args["offline_enabled"] = "true"; + launch.args["offline_name"] = m_offlineName; + } m_peerInstance->sendMessage(launch.serialize(), timeout); } m_status = Application::Succeeded; @@ -1209,7 +1219,7 @@ void Application::performMainStartupAction() qDebug() << " Launching with account" << m_profileToUse; } - launch(inst, true, false, targetToJoin, accountToUse); + launch(inst, !m_offline, false, targetToJoin, accountToUse, m_offlineName); return; } } @@ -1308,6 +1318,8 @@ void Application::messageReceived(const QByteArray& message) QString server = received.args["server"]; QString world = received.args["world"]; QString profile = received.args["profile"]; + bool offline = received.args["offline_enabled"] == "true"; + QString offlineName = received.args["offline_name"]; InstancePtr instance; if (!id.isEmpty()) { @@ -1337,7 +1349,7 @@ void Application::messageReceived(const QByteArray& message) } } - launch(instance, true, false, serverObject, accountObject); + launch(instance, !offline, false, serverObject, accountObject, offlineName); } else { qWarning() << "Received invalid message" << message; } @@ -1375,7 +1387,12 @@ bool Application::openJsonEditor(const QString& filename) } } -bool Application::launch(InstancePtr instance, bool online, bool demo, MinecraftTarget::Ptr targetToJoin, MinecraftAccountPtr accountToUse) +bool Application::launch(InstancePtr instance, + bool online, + bool demo, + MinecraftTarget::Ptr targetToJoin, + MinecraftAccountPtr accountToUse, + const QString& offlineName) { if (m_updateRunning) { qDebug() << "Cannot launch instances while an update is running. Please try again when updates are completed."; @@ -1395,6 +1412,7 @@ bool Application::launch(InstancePtr instance, bool online, bool demo, Minecraft controller->setProfiler(profilers().value(instance->settings()->get("Profiler").toString(), nullptr).get()); controller->setTargetToJoin(targetToJoin); controller->setAccountToUse(accountToUse); + controller->setOfflineName(offlineName); if (window) { controller->setParentWidget(window); } else if (m_mainWindow) { diff --git a/launcher/Application.h b/launcher/Application.h index 692625f4a..5d672a148 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -211,7 +211,8 @@ class Application : public QApplication { bool online = true, bool demo = false, MinecraftTarget::Ptr targetToJoin = nullptr, - MinecraftAccountPtr accountToUse = nullptr); + MinecraftAccountPtr accountToUse = nullptr, + const QString &offlineName = QString()); bool kill(InstancePtr instance); void closeCurrentWindow(); @@ -300,6 +301,8 @@ class Application : public QApplication { QString m_serverToJoin; QString m_worldToJoin; QString m_profileToUse; + bool m_offline = false; + QString m_offlineName; bool m_liveCheck = false; QList m_urlsToImport; QString m_instanceIdToShowWindowOf; diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index e736135fa..dcec62e9e 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -235,10 +235,15 @@ void LaunchController::login() if (!m_session->wants_online) { // we ask the user for a player name bool ok = false; - auto name = askOfflineName(m_session->player_name, m_session->demo, ok); - if (!ok) { - tryagain = false; - break; + QString name; + if (m_offlineName.isEmpty()) { + name = askOfflineName(m_session->player_name, m_session->demo, ok); + if (!ok) { + tryagain = false; + break; + } + } else { + name = m_offlineName; } m_session->MakeOffline(name); // offline flavored game from here :3 diff --git a/launcher/LaunchController.h b/launcher/LaunchController.h index 08fd19cae..82cd2e23d 100644 --- a/launcher/LaunchController.h +++ b/launcher/LaunchController.h @@ -56,6 +56,8 @@ class LaunchController : public Task { void setOnline(bool online) { m_online = online; } + void setOfflineName(const QString &offlineName) { m_offlineName = offlineName; } + void setDemo(bool demo) { m_demo = demo; } void setProfiler(BaseProfilerFactory* profiler) { m_profiler = profiler; } @@ -88,6 +90,7 @@ class LaunchController : public Task { private: BaseProfilerFactory* m_profiler = nullptr; bool m_online = true; + QString m_offlineName; bool m_demo = false; InstancePtr m_instance; QWidget* m_parentWidget = nullptr; From afa1e0599a5c0f1f5276f86b3709ff07c43879bc Mon Sep 17 00:00:00 2001 From: Michael Tyson Date: Tue, 23 Apr 2024 16:05:26 +1000 Subject: [PATCH 333/616] Improved formatting Signed-off-by: Michael Tyson --- launcher/Application.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 5fa9da4ce..e48ed73f0 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -243,7 +243,9 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) { { "w", "world" }, "Join the specified world on launch (only valid in combination with --launch)", "world" }, { { "a", "profile" }, "Use the account specified by its profile name (only valid in combination with --launch)", "profile" }, { { "o", "offline" }, "Launch offline (only valid in combination with --launch)", "offline" }, - { { "n", "name" }, "When launching offline, use specified name (only makes sense in combination with --launch and --offline)", "name" }, + { { "n", "name" }, + "When launching offline, use specified name (only makes sense in combination with --launch and --offline)", + "name" }, { "alive", "Write a small '" + liveCheckFile + "' file after the launcher starts" }, { { "I", "import" }, "Import instance or resource from specified local path or URL", "url" }, { "show", "Opens the window for the specified instance (by instance ID)", "show" } }); From 56614444147afa9379877e591174a4ece7a54f32 Mon Sep 17 00:00:00 2001 From: Michael Tyson Date: Tue, 23 Apr 2024 16:53:29 +1000 Subject: [PATCH 334/616] =?UTF-8?q?Removed=20=E2=80=9C--name=E2=80=9D=20fl?= =?UTF-8?q?ag=20in=20favour=20of=20specifying=20offline=20player=20name=20?= =?UTF-8?q?via=20=E2=80=9C--offline=E2=80=9D=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michael Tyson --- launcher/Application.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index e48ed73f0..7e85938ce 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -242,10 +242,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) { { "s", "server" }, "Join the specified server on launch (only valid in combination with --launch)", "address" }, { { "w", "world" }, "Join the specified world on launch (only valid in combination with --launch)", "world" }, { { "a", "profile" }, "Use the account specified by its profile name (only valid in combination with --launch)", "profile" }, - { { "o", "offline" }, "Launch offline (only valid in combination with --launch)", "offline" }, - { { "n", "name" }, - "When launching offline, use specified name (only makes sense in combination with --launch and --offline)", - "name" }, + { { "o", "offline" }, "Launch offline, with given player name (only valid in combination with --launch)", "offline" }, { "alive", "Write a small '" + liveCheckFile + "' file after the launcher starts" }, { { "I", "import" }, "Import instance or resource from specified local path or URL", "url" }, { "show", "Opens the window for the specified instance (by instance ID)", "show" } }); @@ -263,7 +260,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_profileToUse = parser.value("profile"); if (parser.isSet("offline")) { m_offline = true; - m_offlineName = parser.value("name"); + m_offlineName = parser.value("offline"); } m_liveCheck = parser.isSet("alive"); @@ -279,8 +276,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) } // error if --launch is missing with --server or --profile - if ((!m_serverToJoin.isEmpty() || !m_worldToJoin.isEmpty() || !m_profileToUse.isEmpty() || m_offline || !m_offlineName.isEmpty()) && m_instanceIdToLaunch.isEmpty()) { - std::cerr << "--server, --profile, --offline and --name can only be used in combination with --launch!" << std::endl; + if ((!m_serverToJoin.isEmpty() || !m_worldToJoin.isEmpty() || !m_profileToUse.isEmpty() || m_offline) && m_instanceIdToLaunch.isEmpty()) { + std::cerr << "--server, --profile and --offline can only be used in combination with --launch!" << std::endl; m_status = Application::Failed; return; } From ced2f9d1a0c9ef65eb0f42efbf57c149362e88b9 Mon Sep 17 00:00:00 2001 From: Michael Tyson Date: Wed, 30 Oct 2024 12:51:34 +1100 Subject: [PATCH 335/616] Applied clang formatting Signed-off-by: Michael Tyson --- launcher/Application.cpp | 3 ++- launcher/Application.h | 2 +- launcher/LaunchController.h | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 7e85938ce..9a1ed440e 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -276,7 +276,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) } // error if --launch is missing with --server or --profile - if ((!m_serverToJoin.isEmpty() || !m_worldToJoin.isEmpty() || !m_profileToUse.isEmpty() || m_offline) && m_instanceIdToLaunch.isEmpty()) { + if ((!m_serverToJoin.isEmpty() || !m_worldToJoin.isEmpty() || !m_profileToUse.isEmpty() || m_offline) && + m_instanceIdToLaunch.isEmpty()) { std::cerr << "--server, --profile and --offline can only be used in combination with --launch!" << std::endl; m_status = Application::Failed; return; diff --git a/launcher/Application.h b/launcher/Application.h index 5d672a148..6b218f9f8 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -212,7 +212,7 @@ class Application : public QApplication { bool demo = false, MinecraftTarget::Ptr targetToJoin = nullptr, MinecraftAccountPtr accountToUse = nullptr, - const QString &offlineName = QString()); + const QString& offlineName = QString()); bool kill(InstancePtr instance); void closeCurrentWindow(); diff --git a/launcher/LaunchController.h b/launcher/LaunchController.h index 82cd2e23d..0abdeeb15 100644 --- a/launcher/LaunchController.h +++ b/launcher/LaunchController.h @@ -56,7 +56,7 @@ class LaunchController : public Task { void setOnline(bool online) { m_online = online; } - void setOfflineName(const QString &offlineName) { m_offlineName = offlineName; } + void setOfflineName(const QString& offlineName) { m_offlineName = offlineName; } void setDemo(bool demo) { m_demo = demo; } From 14c95b9d376975144faddc33e7154cca86621804 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 30 Oct 2024 17:15:42 +0200 Subject: [PATCH 336/616] fix macos system detection Signed-off-by: Trial97 --- launcher/SysInfo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/SysInfo.cpp b/launcher/SysInfo.cpp index 0dfa74de7..cfcf63805 100644 --- a/launcher/SysInfo.cpp +++ b/launcher/SysInfo.cpp @@ -81,9 +81,9 @@ QString getSupportedJavaArchitecture() if (arch == "arm64") return "mac-os-arm64"; if (arch.contains("64")) - return "mac-os-64"; + return "mac-os-x64"; if (arch.contains("86")) - return "mac-os-86"; + return "mac-os-x86"; // Unknown, maybe something new, appending arch return "mac-os-" + arch; } else if (sys == "linux") { From 82bffabb69d2443f241c763f1812fb2c167f749d Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 30 Oct 2024 17:55:02 +0200 Subject: [PATCH 337/616] do not capture by default all values in lambdas Signed-off-by: Trial97 --- launcher/Application.cpp | 12 +- launcher/DataMigrationTask.cpp | 4 +- launcher/FileSystem.cpp | 10 +- launcher/InstanceCopyTask.cpp | 2 +- launcher/InstanceList.cpp | 2 +- launcher/Version.cpp | 2 +- launcher/filelink/FileLink.cpp | 6 +- launcher/java/JavaUtils.cpp | 8 +- launcher/launch/steps/PostLaunchCommand.cpp | 2 +- launcher/launch/steps/PreLaunchCommand.cpp | 2 +- launcher/meta/VersionList.cpp | 4 +- launcher/minecraft/Library.cpp | 8 +- launcher/minecraft/MinecraftInstance.cpp | 4 +- launcher/minecraft/OneSixVersionFormat.cpp | 2 +- launcher/minecraft/PackProfile.cpp | 2 +- .../minecraft/launch/LauncherPartLaunch.cpp | 4 +- .../minecraft/mod/ResourceFolderModel.cpp | 11 +- launcher/minecraft/mod/ResourceFolderModel.h | 56 ++++----- .../minecraft/mod/tasks/LocalModParseTask.cpp | 2 +- launcher/minecraft/update/LibrariesTask.cpp | 2 +- launcher/modplatform/EnsureMetadataTask.cpp | 4 +- .../atlauncher/ATLPackInstallTask.cpp | 12 +- .../flame/FlameInstanceCreationTask.cpp | 4 +- .../helpers/NetworkResourceAPI.cpp | 2 +- .../modrinth/ModrinthInstanceCreationTask.cpp | 10 +- launcher/translations/TranslationsModel.cpp | 2 +- launcher/ui/GuiUtil.cpp | 2 +- launcher/ui/MainWindow.cpp | 2 +- launcher/ui/dialogs/ModUpdateDialog.cpp | 16 ++- .../ui/dialogs/ResourceDownloadDialog.cpp | 10 +- launcher/ui/pages/instance/LogPage.cpp | 2 +- launcher/ui/pages/instance/OtherLogsPage.cpp | 4 +- .../ui/pages/modplatform/ResourceModel.cpp | 4 +- launcher/ui/setupwizard/SetupWizard.cpp | 2 +- launcher/ui/themes/CustomTheme.cpp | 6 +- tests/DummyResourceAPI.h | 2 +- tests/FileSystem_test.cpp | 113 +++++++----------- tests/Task_test.cpp | 14 +-- 38 files changed, 170 insertions(+), 186 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index ea749ca4c..8933586fc 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -835,7 +835,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) ":/icons/multimc/128x128/instances/", ":/icons/multimc/scalable/instances/" }; m_icons.reset(new IconList(instFolders, setting->get().toString())); connect(setting.get(), &Setting::SettingChanged, - [&](const Setting&, QVariant value) { m_icons->directoryChanged(value.toString()); }); + [this](const Setting&, QVariant value) { m_icons->directoryChanged(value.toString()); }); qDebug() << "<> Instance icons initialized."; } @@ -1070,11 +1070,11 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) bool Application::createSetupWizard() { - bool javaRequired = [&]() { - if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_settings->get("AutomaticJavaDownload").toBool()) { + bool javaRequired = [this]() { + if (BuildConfig.JAVA_DOWNLOADER_ENABLED && settings()->get("AutomaticJavaDownload").toBool()) { return false; } - bool ignoreJavaWizard = m_settings->get("IgnoreJavaWizard").toBool(); + bool ignoreJavaWizard = settings()->get("IgnoreJavaWizard").toBool(); if (ignoreJavaWizard) { return false; } @@ -1088,8 +1088,8 @@ bool Application::createSetupWizard() QString actualPath = FS::ResolveExecutable(currentJavaPath); return actualPath.isNull(); }(); - bool askjava = BuildConfig.JAVA_DOWNLOADER_ENABLED && !javaRequired && !m_settings->get("AutomaticJavaDownload").toBool() && - !m_settings->get("AutomaticJavaSwitch").toBool() && !m_settings->get("UserAskedAboutAutomaticJavaDownload").toBool(); + bool askjava = BuildConfig.JAVA_DOWNLOADER_ENABLED && !javaRequired && !settings()->get("AutomaticJavaDownload").toBool() && + !settings()->get("AutomaticJavaSwitch").toBool() && !settings()->get("UserAskedAboutAutomaticJavaDownload").toBool(); bool languageRequired = settings()->get("Language").toString().isEmpty(); bool pasteInterventionRequired = settings()->get("PastebinURL") != ""; bool validWidgets = m_themeManager->isValidApplicationTheme(settings()->get("ApplicationTheme").toString()); diff --git a/launcher/DataMigrationTask.cpp b/launcher/DataMigrationTask.cpp index 27ce5f01b..30f3a32e6 100644 --- a/launcher/DataMigrationTask.cpp +++ b/launcher/DataMigrationTask.cpp @@ -27,7 +27,7 @@ void DataMigrationTask::executeTask() // 1. Scan // Check how many files we gotta copy - m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), [&] { + m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), [this] { return m_copy(true); // dry run to collect amount of files }); connect(&m_copyFutureWatcher, &QFutureWatcher::finished, this, &DataMigrationTask::dryRunFinished); @@ -60,7 +60,7 @@ void DataMigrationTask::dryRunFinished() setProgress(m_copy.totalCopied(), m_toCopy); setStatus(tr("Copying %1…").arg(shortenedName)); }); - m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), [&] { + m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), [this] { return m_copy(false); // actually copy now }); connect(&m_copyFutureWatcher, &QFutureWatcher::finished, this, &DataMigrationTask::copyFinished); diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 512de28c2..954e7936e 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -341,7 +341,7 @@ bool copy::operator()(const QString& offset, bool dryRun) opt |= copy_opts::overwrite_existing; // Function that'll do the actual copying - auto copy_file = [&](QString src_path, QString relative_dst_path) { + auto copy_file = [this, dryRun, src, dst, opt, &err](QString src_path, QString relative_dst_path) { if (m_matcher && (m_matcher->matches(relative_dst_path) != m_whitelist)) return; @@ -428,7 +428,7 @@ void create_link::make_link_list(const QString& offset) m_recursive = true; // Function that'll do the actual linking - auto link_file = [&](QString src_path, QString relative_dst_path) { + auto link_file = [this, dst](QString src_path, QString relative_dst_path) { if (m_matcher && (m_matcher->matches(relative_dst_path) != m_whitelist)) { qDebug() << "path" << relative_dst_path << "in black list or not in whitelist"; return; @@ -523,7 +523,7 @@ void create_link::runPrivileged(const QString& offset) QString serverName = BuildConfig.LAUNCHER_APP_BINARY_NAME + "_filelink_server" + StringUtils::getRandomAlphaNumeric(); - connect(&m_linkServer, &QLocalServer::newConnection, this, [&]() { + connect(&m_linkServer, &QLocalServer::newConnection, this, [this, &gotResults]() { qDebug() << "Client connected, sending out pairs"; // construct block of data to send QByteArray block; @@ -605,7 +605,7 @@ void create_link::runPrivileged(const QString& offset) } ExternalLinkFileProcess* linkFileProcess = new ExternalLinkFileProcess(serverName, m_useHardLinks, this); - connect(linkFileProcess, &ExternalLinkFileProcess::processExited, this, [&]() { emit finishedPrivileged(gotResults); }); + connect(linkFileProcess, &ExternalLinkFileProcess::processExited, this, [this, gotResults]() { emit finishedPrivileged(gotResults); }); connect(linkFileProcess, &ExternalLinkFileProcess::finished, linkFileProcess, &QObject::deleteLater); linkFileProcess->start(); @@ -1295,7 +1295,7 @@ bool clone::operator()(const QString& offset, bool dryRun) std::error_code err; // Function that'll do the actual cloneing - auto cloneFile = [&](QString src_path, QString relative_dst_path) { + auto cloneFile = [this, dryRun, dst, &err](QString src_path, QString relative_dst_path) { if (m_matcher && (m_matcher->matches(relative_dst_path) != m_whitelist)) return; diff --git a/launcher/InstanceCopyTask.cpp b/launcher/InstanceCopyTask.cpp index 0220a4144..d335b11c4 100644 --- a/launcher/InstanceCopyTask.cpp +++ b/launcher/InstanceCopyTask.cpp @@ -91,7 +91,7 @@ void InstanceCopyTask::executeTask() QEventLoop loop; bool got_priv_results = false; - connect(&folderLink, &FS::create_link::finishedPrivileged, this, [&](bool gotResults) { + connect(&folderLink, &FS::create_link::finishedPrivileged, this, [&got_priv_results, &loop](bool gotResults) { if (!gotResults) { qDebug() << "Privileged run exited without results!"; } diff --git a/launcher/InstanceList.cpp b/launcher/InstanceList.cpp index e1fa755dd..918fa1073 100644 --- a/launcher/InstanceList.cpp +++ b/launcher/InstanceList.cpp @@ -487,7 +487,7 @@ InstanceList::InstListError InstanceList::loadList() int front_bookmark = -1; int back_bookmark = -1; int currentItem = -1; - auto removeNow = [&]() { + auto removeNow = [this, &front_bookmark, &back_bookmark, ¤tItem]() { beginRemoveRows(QModelIndex(), front_bookmark, back_bookmark); m_instances.erase(m_instances.begin() + front_bookmark, m_instances.begin() + back_bookmark + 1); endRemoveRows(); diff --git a/launcher/Version.cpp b/launcher/Version.cpp index 2edb17e72..03a16e8a0 100644 --- a/launcher/Version.cpp +++ b/launcher/Version.cpp @@ -79,7 +79,7 @@ void Version::parse() if (m_string.isEmpty()) return; - auto classChange = [&](QChar lastChar, QChar currentChar) { + auto classChange = [¤tSection](QChar lastChar, QChar currentChar) { if (lastChar.isNull()) return false; if (lastChar.isDigit() != currentChar.isDigit()) diff --git a/launcher/filelink/FileLink.cpp b/launcher/filelink/FileLink.cpp index bdf173ebc..b641b41d5 100644 --- a/launcher/filelink/FileLink.cpp +++ b/launcher/filelink/FileLink.cpp @@ -104,11 +104,11 @@ void FileLinkApp::joinServer(QString server) in.setDevice(&socket); - connect(&socket, &QLocalSocket::connected, this, [&]() { qDebug() << "connected to server"; }); + connect(&socket, &QLocalSocket::connected, this, []() { qDebug() << "connected to server"; }); connect(&socket, &QLocalSocket::readyRead, this, &FileLinkApp::readPathPairs); - connect(&socket, &QLocalSocket::errorOccurred, this, [&](QLocalSocket::LocalSocketError socketError) { + connect(&socket, &QLocalSocket::errorOccurred, this, [this](QLocalSocket::LocalSocketError socketError) { m_status = Failed; switch (socketError) { case QLocalSocket::ServerNotFoundError: @@ -132,7 +132,7 @@ void FileLinkApp::joinServer(QString server) } }); - connect(&socket, &QLocalSocket::disconnected, this, [&]() { + connect(&socket, &QLocalSocket::disconnected, this, [this]() { qDebug() << "disconnected from server, should exit"; m_status = Succeeded; exit(); diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index f3200428e..4e5f32115 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -405,7 +405,7 @@ QList JavaUtils::FindJavaPaths() { QList javas; javas.append(this->GetDefaultJava()->path); - auto scanJavaDir = [&]( + auto scanJavaDir = [&javas]( const QString& dirPath, const std::function& filter = [](const QFileInfo&) { return true; }) { QDir dir(dirPath); @@ -424,7 +424,7 @@ QList JavaUtils::FindJavaPaths() }; // java installed in a snap is installed in the standard directory, but underneath $SNAP auto snap = qEnvironmentVariable("SNAP"); - auto scanJavaDirs = [&](const QString& dirPath) { + auto scanJavaDirs = [scanJavaDir, snap](const QString& dirPath) { scanJavaDir(dirPath); if (!snap.isNull()) { scanJavaDir(snap + dirPath); @@ -546,12 +546,12 @@ QStringList getPrismJavaBundle() { QList javas; - auto scanDir = [&](QString prefix) { + auto scanDir = [&javas](QString prefix) { javas.append(FS::PathCombine(prefix, "jre", "bin", JavaUtils::javaExecutable)); javas.append(FS::PathCombine(prefix, "bin", JavaUtils::javaExecutable)); javas.append(FS::PathCombine(prefix, JavaUtils::javaExecutable)); }; - auto scanJavaDir = [&](const QString& dirPath) { + auto scanJavaDir = [scanDir](const QString& dirPath) { QDir dir(dirPath); if (!dir.exists()) return; diff --git a/launcher/launch/steps/PostLaunchCommand.cpp b/launcher/launch/steps/PostLaunchCommand.cpp index 725101224..b3985bbac 100644 --- a/launcher/launch/steps/PostLaunchCommand.cpp +++ b/launcher/launch/steps/PostLaunchCommand.cpp @@ -65,7 +65,7 @@ void PostLaunchCommand::executeTask() void PostLaunchCommand::on_state(LoggedProcess::State state) { - auto getError = [&]() { return tr("Post-Launch command failed with code %1.\n\n").arg(m_process.exitCode()); }; + auto getError = [this]() { return tr("Post-Launch command failed with code %1.\n\n").arg(m_process.exitCode()); }; switch (state) { case LoggedProcess::Aborted: case LoggedProcess::Crashed: diff --git a/launcher/launch/steps/PreLaunchCommand.cpp b/launcher/launch/steps/PreLaunchCommand.cpp index 6d071a66e..0c22d5c16 100644 --- a/launcher/launch/steps/PreLaunchCommand.cpp +++ b/launcher/launch/steps/PreLaunchCommand.cpp @@ -65,7 +65,7 @@ void PreLaunchCommand::executeTask() void PreLaunchCommand::on_state(LoggedProcess::State state) { - auto getError = [&]() { return tr("Pre-Launch command failed with code %1.\n\n").arg(m_process.exitCode()); }; + auto getError = [this]() { return tr("Pre-Launch command failed with code %1.\n\n").arg(m_process.exitCode()); }; switch (state) { case LoggedProcess::Aborted: case LoggedProcess::Crashed: diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 6856b5f8d..a832c675c 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -159,8 +159,8 @@ Version::Ptr VersionList::getVersion(const QString& version) bool VersionList::hasVersion(QString version) const { - auto ver = - std::find_if(m_versions.constBegin(), m_versions.constEnd(), [&](Meta::Version::Ptr const& a) { return a->version() == version; }); + auto ver = std::find_if(m_versions.constBegin(), m_versions.constEnd(), + [version](Meta::Version::Ptr const& a) { return a->version() == version; }); return (ver != m_versions.constEnd()); } diff --git a/launcher/minecraft/Library.cpp b/launcher/minecraft/Library.cpp index 4f04f0eb9..0bc462474 100644 --- a/launcher/minecraft/Library.cpp +++ b/launcher/minecraft/Library.cpp @@ -65,7 +65,7 @@ void Library::getApplicableFiles(const RuntimeContext& runtimeContext, { bool local = isLocal(); // Lambda function to get the absolute file path - auto actualPath = [&](QString relPath) { + auto actualPath = [this, local, overridePath](QString relPath) { relPath = FS::RemoveInvalidPathChars(relPath); QFileInfo out(FS::PathCombine(storagePrefix(), relPath)); if (local && !overridePath.isEmpty()) { @@ -115,7 +115,7 @@ QList Library::getDownloads(const RuntimeContext& runtimeC bool local = isLocal(); // Lambda function to check if a local file exists - auto check_local_file = [&](QString storage) { + auto check_local_file = [overridePath, &failedLocalFiles](QString storage) { QFileInfo fileinfo(storage); QString fileName = fileinfo.fileName(); auto fullPath = FS::PathCombine(overridePath, fileName); @@ -128,7 +128,7 @@ QList Library::getDownloads(const RuntimeContext& runtimeC }; // Lambda function to add a download request - auto add_download = [&](QString storage, QString url, QString sha1) { + auto add_download = [this, local, check_local_file, cache, stale, &out](QString storage, QString url, QString sha1) { if (local) { return check_local_file(storage); } @@ -198,7 +198,7 @@ QList Library::getDownloads(const RuntimeContext& runtimeC } } } else { - auto raw_dl = [&]() { + auto raw_dl = [this, raw_storage]() { if (!m_absoluteURL.isEmpty()) { return m_absoluteURL; } diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 5be3802bc..2b607b948 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -854,7 +854,7 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session, Minecr out << "Libraries:"; QStringList jars, nativeJars; profile->getLibraryFiles(runtimeContext(), jars, nativeJars, getLocalLibraryPath(), binRoot()); - auto printLibFile = [&](const QString& path) { + auto printLibFile = [&out](const QString& path) { QFileInfo info(path); if (info.exists()) { out << " " + path; @@ -874,7 +874,7 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session, Minecr } // mods and core mods - auto printModList = [&](const QString& label, ModFolderModel& model) { + auto printModList = [&out](const QString& label, ModFolderModel& model) { if (model.size()) { out << QString("%1:").arg(label); auto modList = model.allMods(); diff --git a/launcher/minecraft/OneSixVersionFormat.cpp b/launcher/minecraft/OneSixVersionFormat.cpp index bd587beb2..684869c8d 100644 --- a/launcher/minecraft/OneSixVersionFormat.cpp +++ b/launcher/minecraft/OneSixVersionFormat.cpp @@ -176,7 +176,7 @@ VersionFilePtr OneSixVersionFormat::versionFileFromJson(const QJsonDocument& doc } } - auto readLibs = [&](const char* which, QList& outList) { + auto readLibs = [&root, &out, &filename](const char* which, QList& outList) { for (auto libVal : requireArray(root.value(which))) { QJsonObject libObj = requireObject(libVal); // parse the library diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index f1d2473c2..1acc87166 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -746,7 +746,7 @@ bool PackProfile::removeComponent_internal(ComponentPtr patch) } // FIXME: we need a generic way of removing local resources, not just jar mods... - auto preRemoveJarMod = [&](LibraryPtr jarMod) -> bool { + auto preRemoveJarMod = [this](LibraryPtr jarMod) -> bool { if (!jarMod->isLocal()) { return true; } diff --git a/launcher/minecraft/launch/LauncherPartLaunch.cpp b/launcher/minecraft/launch/LauncherPartLaunch.cpp index d9a2b9b6b..7f0edbdab 100644 --- a/launcher/minecraft/launch/LauncherPartLaunch.cpp +++ b/launcher/minecraft/launch/LauncherPartLaunch.cpp @@ -54,8 +54,8 @@ LauncherPartLaunch::LauncherPartLaunch(LaunchTask* parent) { if (parent->instance()->settings()->get("CloseAfterLaunch").toBool()) { std::shared_ptr connection{ new QMetaObject::Connection }; - *connection = - connect(&m_process, &LoggedProcess::log, this, [=](const QStringList& lines, [[maybe_unused]] MessageLevel::Enum level) { + *connection = connect( + &m_process, &LoggedProcess::log, this, [connection](const QStringList& lines, [[maybe_unused]] MessageLevel::Enum level) { qDebug() << lines; if (lines.filter(QRegularExpression(".*Setting user.+", QRegularExpression::CaseInsensitiveOption)).length() != 0) { APPLICATION->closeAllWindows(); diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index ce3e16bce..40ea3adab 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -245,7 +245,7 @@ bool ResourceFolderModel::update() connect(m_current_update_task.get(), &Task::failed, this, &ResourceFolderModel::onUpdateFailed, Qt::ConnectionType::QueuedConnection); connect( m_current_update_task.get(), &Task::finished, this, - [=] { + [this] { m_current_update_task.reset(); if (m_scheduled_update) { m_scheduled_update = false; @@ -277,11 +277,14 @@ void ResourceFolderModel::resolveResource(Resource* res) m_active_parse_tasks.insert(ticket, task); connect( - task.get(), &Task::succeeded, this, [=] { onParseSucceeded(ticket, res->internal_id()); }, Qt::ConnectionType::QueuedConnection); - connect(task.get(), &Task::failed, this, [=] { onParseFailed(ticket, res->internal_id()); }, Qt::ConnectionType::QueuedConnection); + task.get(), &Task::succeeded, this, [this, ticket, res] { onParseSucceeded(ticket, res->internal_id()); }, + Qt::ConnectionType::QueuedConnection); + connect( + task.get(), &Task::failed, this, [this, ticket, res] { onParseFailed(ticket, res->internal_id()); }, + Qt::ConnectionType::QueuedConnection); connect( task.get(), &Task::finished, this, - [=] { + [this, ticket] { m_active_parse_tasks.remove(ticket); emit parseFinished(); }, diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index ca919d3e3..5e67ca9c3 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -222,34 +222,34 @@ class ResourceFolderModel : public QAbstractListModel { }; /* A macro to define useful functions to handle Resource* -> T* more easily on derived classes */ -#define RESOURCE_HELPERS(T) \ - [[nodiscard]] T* operator[](int index) \ - { \ - return static_cast(m_resources[index].get()); \ - } \ - [[nodiscard]] T* at(int index) \ - { \ - return static_cast(m_resources[index].get()); \ - } \ - [[nodiscard]] const T* at(int index) const \ - { \ - return static_cast(m_resources.at(index).get()); \ - } \ - [[nodiscard]] T* first() \ - { \ - return static_cast(m_resources.first().get()); \ - } \ - [[nodiscard]] T* last() \ - { \ - return static_cast(m_resources.last().get()); \ - } \ - [[nodiscard]] T* find(QString id) \ - { \ - auto iter = std::find_if(m_resources.constBegin(), m_resources.constEnd(), \ - [&](Resource::Ptr const& r) { return r->internal_id() == id; }); \ - if (iter == m_resources.constEnd()) \ - return nullptr; \ - return static_cast((*iter).get()); \ +#define RESOURCE_HELPERS(T) \ + [[nodiscard]] T* operator[](int index) \ + { \ + return static_cast(m_resources[index].get()); \ + } \ + [[nodiscard]] T* at(int index) \ + { \ + return static_cast(m_resources[index].get()); \ + } \ + [[nodiscard]] const T* at(int index) const \ + { \ + return static_cast(m_resources.at(index).get()); \ + } \ + [[nodiscard]] T* first() \ + { \ + return static_cast(m_resources.first().get()); \ + } \ + [[nodiscard]] T* last() \ + { \ + return static_cast(m_resources.last().get()); \ + } \ + [[nodiscard]] T* find(QString id) \ + { \ + auto iter = std::find_if(m_resources.constBegin(), m_resources.constEnd(), \ + [id](Resource::Ptr const& r) { return r->internal_id() == id; }); \ + if (iter == m_resources.constEnd()) \ + return nullptr; \ + return static_cast((*iter).get()); \ } /* Template definition to avoid some code duplication */ diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp index d456211f8..de62ffdde 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp @@ -24,7 +24,7 @@ namespace ModUtils { // https://github.com/MinecraftForge/FML/wiki/FML-mod-information-file/5bf6a2d05145ec79387acc0d45c958642fb049fc ModDetails ReadMCModInfo(QByteArray contents) { - auto getInfoFromArray = [&](QJsonArray arr) -> ModDetails { + auto getInfoFromArray = [](QJsonArray arr) -> ModDetails { if (!arr.at(0).isObject()) { return {}; } diff --git a/launcher/minecraft/update/LibrariesTask.cpp b/launcher/minecraft/update/LibrariesTask.cpp index 1581b32ee..e64691d51 100644 --- a/launcher/minecraft/update/LibrariesTask.cpp +++ b/launcher/minecraft/update/LibrariesTask.cpp @@ -25,7 +25,7 @@ void LibrariesTask::executeTask() auto metacache = APPLICATION->metacache(); - auto processArtifactPool = [&](const QList& pool, QStringList& errors, const QString& localPath) { + auto processArtifactPool = [this, inst, metacache](const QList& pool, QStringList& errors, const QString& localPath) { for (auto lib : pool) { if (!lib) { emitFailed(tr("Null jar is specified in the metadata, aborting.")); diff --git a/launcher/modplatform/EnsureMetadataTask.cpp b/launcher/modplatform/EnsureMetadataTask.cpp index f6f49f38d..6aa83da10 100644 --- a/launcher/modplatform/EnsureMetadataTask.cpp +++ b/launcher/modplatform/EnsureMetadataTask.cpp @@ -144,7 +144,7 @@ void EnsureMetadataTask::executeTask() return; } - connect(project_task.get(), &Task::finished, this, [=] { + connect(project_task.get(), &Task::finished, this, [this, invalidade_leftover, project_task] { invalidade_leftover(); project_task->deleteLater(); if (m_current_task) @@ -156,7 +156,7 @@ void EnsureMetadataTask::executeTask() project_task->start(); }); - connect(version_task.get(), &Task::finished, [=] { + connect(version_task.get(), &Task::finished, [this, version_task] { version_task->deleteLater(); if (m_current_task) m_current_task.reset(); diff --git a/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp b/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp index abe7d0177..a0898edbd 100644 --- a/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp +++ b/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp @@ -641,22 +641,22 @@ void PackInstallTask::installConfigs() jobPtr->addNetAction(dl); archivePath = entry->getFullPath(); - connect(jobPtr.get(), &NetJob::succeeded, this, [&]() { + connect(jobPtr.get(), &NetJob::succeeded, this, [this]() { abortable = false; jobPtr.reset(); extractConfigs(); }); - connect(jobPtr.get(), &NetJob::failed, [&](QString reason) { + connect(jobPtr.get(), &NetJob::failed, [this](QString reason) { abortable = false; jobPtr.reset(); emitFailed(reason); }); - connect(jobPtr.get(), &NetJob::progress, [&](qint64 current, qint64 total) { + connect(jobPtr.get(), &NetJob::progress, [this](qint64 current, qint64 total) { abortable = true; setProgress(current, total); }); connect(jobPtr.get(), &NetJob::stepProgress, this, &PackInstallTask::propagateStepProgress); - connect(jobPtr.get(), &NetJob::aborted, [&] { + connect(jobPtr.get(), &NetJob::aborted, [this] { abortable = false; jobPtr.reset(); emitAborted(); @@ -685,8 +685,8 @@ void PackInstallTask::extractConfigs() m_extractFuture = QtConcurrent::run(QThreadPool::globalInstance(), MMCZip::extractDir, archivePath, extractDir.absolutePath() + "/minecraft"); #endif - connect(&m_extractFutureWatcher, &QFutureWatcher::finished, this, [&]() { downloadMods(); }); - connect(&m_extractFutureWatcher, &QFutureWatcher::canceled, this, [&]() { emitAborted(); }); + connect(&m_extractFutureWatcher, &QFutureWatcher::finished, this, [this]() { downloadMods(); }); + connect(&m_extractFutureWatcher, &QFutureWatcher::canceled, this, [this]() { emitAborted(); }); m_extractFutureWatcher.setFuture(m_extractFuture); } diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index b8c40ee42..381d91d22 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -439,7 +439,7 @@ bool FlameCreationTask::createInstance() m_mod_id_resolver.reset(new Flame::FileResolvingTask(APPLICATION->network(), m_pack)); connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::succeeded, this, [this, &loop] { idResolverSucceeded(loop); }); - connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::failed, [&](QString reason) { + connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::failed, [this, &loop](QString reason) { m_mod_id_resolver.reset(); setError(tr("Unable to resolve mod IDs:\n") + reason); loop.quit(); @@ -561,7 +561,7 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop) m_files_job.reset(); validateZIPResources(loop); }); - connect(m_files_job.get(), &NetJob::failed, [&](QString reason) { + connect(m_files_job.get(), &NetJob::failed, [this](QString reason) { m_files_job.reset(); setError(reason); }); diff --git a/launcher/modplatform/helpers/NetworkResourceAPI.cpp b/launcher/modplatform/helpers/NetworkResourceAPI.cpp index 974e732a7..d56e39782 100644 --- a/launcher/modplatform/helpers/NetworkResourceAPI.cpp +++ b/launcher/modplatform/helpers/NetworkResourceAPI.cpp @@ -141,7 +141,7 @@ Task::Ptr NetworkResourceAPI::getDependencyVersion(DependencySearchArgs&& args, netJob->addNetAction(Net::ApiDownload::makeByteArray(versions_url, response)); - QObject::connect(netJob.get(), &NetJob::succeeded, [=] { + QObject::connect(netJob.get(), &NetJob::succeeded, [response, callbacks, args] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); if (parse_error.error != QJsonParseError::NoError) { diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index 994dd774f..a9298b443 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -283,13 +283,13 @@ bool ModrinthCreationTask::createInstance() bool ended_well = false; - connect(downloadMods.get(), &NetJob::succeeded, this, [&]() { ended_well = true; }); - connect(downloadMods.get(), &NetJob::failed, [&](const QString& reason) { + connect(downloadMods.get(), &NetJob::succeeded, this, [&ended_well]() { ended_well = true; }); + connect(downloadMods.get(), &NetJob::failed, [this, &ended_well](const QString& reason) { ended_well = false; setError(reason); }); connect(downloadMods.get(), &NetJob::finished, &loop, &QEventLoop::quit); - connect(downloadMods.get(), &NetJob::progress, [&](qint64 current, qint64 total) { + connect(downloadMods.get(), &NetJob::progress, [this](qint64 current, qint64 total) { setDetails(tr("%1 out of %2 complete").arg(current).arg(total)); setProgress(current, total); }); @@ -311,9 +311,9 @@ bool ModrinthCreationTask::createInstance() QEventLoop ensureMetaLoop; QDir folder = FS::PathCombine(instance.modsRoot(), ".index"); auto ensureMetadataTask = makeShared(mods, folder, ModPlatform::ResourceProvider::MODRINTH); - connect(ensureMetadataTask.get(), &Task::succeeded, this, [&]() { ended_well = true; }); + connect(ensureMetadataTask.get(), &Task::succeeded, this, [&ended_well]() { ended_well = true; }); connect(ensureMetadataTask.get(), &Task::finished, &ensureMetaLoop, &QEventLoop::quit); - connect(ensureMetadataTask.get(), &Task::progress, [&](qint64 current, qint64 total) { + connect(ensureMetadataTask.get(), &Task::progress, [this](qint64 current, qint64 total) { setDetails(tr("%1 out of %2 complete").arg(current).arg(total)); setProgress(current, total); }); diff --git a/launcher/translations/TranslationsModel.cpp b/launcher/translations/TranslationsModel.cpp index d03469b78..429ead47d 100644 --- a/launcher/translations/TranslationsModel.cpp +++ b/launcher/translations/TranslationsModel.cpp @@ -419,7 +419,7 @@ int TranslationsModel::columnCount([[maybe_unused]] const QModelIndex& parent) c QVector::Iterator TranslationsModel::findLanguage(const QString& key) { - return std::find_if(d->m_languages.begin(), d->m_languages.end(), [&](Language& lang) { return lang.key == key; }); + return std::find_if(d->m_languages.begin(), d->m_languages.end(), [key](Language& lang) { return lang.key == key; }); } std::optional TranslationsModel::findLanguageAsOptional(const QString& key) diff --git a/launcher/ui/GuiUtil.cpp b/launcher/ui/GuiUtil.cpp index 584a34710..93b9a452b 100644 --- a/launcher/ui/GuiUtil.cpp +++ b/launcher/ui/GuiUtil.cpp @@ -112,7 +112,7 @@ static QStringList BrowseForFileInternal(QString context, QFileDialog w(parentWidget, caption); QSet locations; - auto f = [&](QStandardPaths::StandardLocation l) { + auto f = [&locations](QStandardPaths::StandardLocation l) { QString location = QStandardPaths::writableLocation(l); QFileInfo finfo(location); if (!finfo.exists()) { diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 09c47b609..075dbf7a2 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -154,7 +154,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi // Qt doesn't like vertical moving toolbars, so we have to force them... // See https://github.com/PolyMC/PolyMC/issues/493 connect(ui->instanceToolBar, &QToolBar::orientationChanged, - [=](Qt::Orientation) { ui->instanceToolBar->setOrientation(Qt::Vertical); }); + [this](Qt::Orientation) { ui->instanceToolBar->setOrientation(Qt::Vertical); }); // if you try to add a widget to a toolbar in a .ui file // qt designer will delete it when you save the file >:( diff --git a/launcher/ui/dialogs/ModUpdateDialog.cpp b/launcher/ui/dialogs/ModUpdateDialog.cpp index f906cfcea..bbceab379 100644 --- a/launcher/ui/dialogs/ModUpdateDialog.cpp +++ b/launcher/ui/dialogs/ModUpdateDialog.cpp @@ -106,9 +106,9 @@ void ModUpdateDialog::checkCandidates() } connect(&check_task, &Task::failed, this, - [&](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); + [this](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); - connect(&check_task, &Task::succeeded, this, [&]() { + connect(&check_task, &Task::succeeded, this, [this, &check_task]() { QStringList warnings = check_task.warnings(); if (warnings.count()) { CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->exec(); @@ -190,10 +190,14 @@ void ModUpdateDialog::checkCandidates() auto depTask = makeShared(this, m_instance, m_mod_model.get(), selectedVers); connect(depTask.get(), &Task::failed, this, - [&](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); + [this](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); - connect(depTask.get(), &Task::succeeded, this, [&]() { - QStringList warnings = depTask->warnings(); + auto weak = depTask.toWeakRef(); + connect(depTask.get(), &Task::succeeded, this, [this, weak]() { + QStringList warnings; + if (auto depTask = weak.lock()) { + warnings = depTask->warnings(); + } if (warnings.count()) { CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->exec(); } @@ -273,7 +277,7 @@ auto ModUpdateDialog::ensureMetadata() -> bool bool skip_rest = false; ModPlatform::ResourceProvider provider_rest = ModPlatform::ResourceProvider::MODRINTH; - auto addToTmp = [&](Mod* m, ModPlatform::ResourceProvider p) { + auto addToTmp = [&modrinth_tmp, &flame_tmp](Mod* m, ModPlatform::ResourceProvider p) { switch (p) { case ModPlatform::ResourceProvider::MODRINTH: modrinth_tmp.push_back(m); diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.cpp b/launcher/ui/dialogs/ResourceDownloadDialog.cpp index 02a8454b4..2e8af8d94 100644 --- a/launcher/ui/dialogs/ResourceDownloadDialog.cpp +++ b/launcher/ui/dialogs/ResourceDownloadDialog.cpp @@ -148,10 +148,14 @@ void ResourceDownloadDialog::confirm() QStringList depNames; if (auto task = getModDependenciesTask(); task) { connect(task.get(), &Task::failed, this, - [&](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); + [this](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); - connect(task.get(), &Task::succeeded, this, [&]() { - QStringList warnings = task->warnings(); + auto weak = task.toWeakRef(); + connect(task.get(), &Task::succeeded, this, [this, weak]() { + QStringList warnings; + if (auto task = weak.lock()) { + warnings = task->warnings(); + } if (warnings.count()) { CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->exec(); } diff --git a/launcher/ui/pages/instance/LogPage.cpp b/launcher/ui/pages/instance/LogPage.cpp index 6a4888f9c..4962f90ce 100644 --- a/launcher/ui/pages/instance/LogPage.cpp +++ b/launcher/ui/pages/instance/LogPage.cpp @@ -90,7 +90,7 @@ class LogFormatProxyModel : public QIdentityProxyModel { QModelIndex find(const QModelIndex& start, const QString& value, bool reverse) const { QModelIndex parentIndex = parent(start); - auto compare = [&](int r) -> QModelIndex { + auto compare = [this, start, parentIndex, value](int r) -> QModelIndex { QModelIndex idx = index(r, start.column(), parentIndex); if (!idx.isValid() || idx == start) { return QModelIndex(); diff --git a/launcher/ui/pages/instance/OtherLogsPage.cpp b/launcher/ui/pages/instance/OtherLogsPage.cpp index ab5d98289..ed8ef68d9 100644 --- a/launcher/ui/pages/instance/OtherLogsPage.cpp +++ b/launcher/ui/pages/instance/OtherLogsPage.cpp @@ -138,7 +138,7 @@ void OtherLogsPage::on_btnReload_clicked() m_currentFile = QString(); QMessageBox::critical(this, tr("Error"), tr("Unable to open %1 for reading: %2").arg(m_currentFile, file.errorString())); } else { - auto setPlainText = [&](const QString& text) { + auto setPlainText = [this](const QString& text) { QString fontFamily = APPLICATION->settings()->get("ConsoleFont").toString(); bool conversionOk = false; int fontSize = APPLICATION->settings()->get("ConsoleFontSize").toInt(&conversionOk); @@ -149,7 +149,7 @@ void OtherLogsPage::on_btnReload_clicked() doc->setDefaultFont(QFont(fontFamily, fontSize)); ui->text->setPlainText(text); }; - auto showTooBig = [&]() { + auto showTooBig = [setPlainText, &file]() { setPlainText(tr("The file (%1) is too big. You may want to open it in a viewer optimized " "for large files.") .arg(file.fileName())); diff --git a/launcher/ui/pages/modplatform/ResourceModel.cpp b/launcher/ui/pages/modplatform/ResourceModel.cpp index 50a170fff..6b8309fb7 100644 --- a/launcher/ui/pages/modplatform/ResourceModel.cpp +++ b/launcher/ui/pages/modplatform/ResourceModel.cpp @@ -337,7 +337,7 @@ std::optional ResourceModel::getIcon(QModelIndex& index, const QUrl& url) auto icon_fetch_action = Net::ApiDownload::makeCached(url, cache_entry); auto full_file_path = cache_entry->getFullPath(); - connect(icon_fetch_action.get(), &Task::succeeded, this, [=] { + connect(icon_fetch_action.get(), &Task::succeeded, this, [this, url, full_file_path, index] { auto icon = QIcon(full_file_path); QPixmapCache::insert(url.toString(), icon.pixmap(icon.actualSize({ 64, 64 }))); @@ -345,7 +345,7 @@ std::optional ResourceModel::getIcon(QModelIndex& index, const QUrl& url) emit dataChanged(index, index, { Qt::DecorationRole }); }); - connect(icon_fetch_action.get(), &Task::failed, this, [=] { + connect(icon_fetch_action.get(), &Task::failed, this, [this, url] { m_currently_running_icon_actions.remove(url); m_failed_icon_actions.insert(url); }); diff --git a/launcher/ui/setupwizard/SetupWizard.cpp b/launcher/ui/setupwizard/SetupWizard.cpp index 4e5bd1dca..f2e51ee41 100644 --- a/launcher/ui/setupwizard/SetupWizard.cpp +++ b/launcher/ui/setupwizard/SetupWizard.cpp @@ -57,7 +57,7 @@ void SetupWizard::pageChanged(int id) if (basePagePtr->wantsRefreshButton()) { setButtonLayout({ QWizard::CustomButton1, QWizard::Stretch, QWizard::BackButton, QWizard::NextButton, QWizard::FinishButton }); auto customButton = button(QWizard::CustomButton1); - connect(customButton, &QAbstractButton::clicked, [&]() { + connect(customButton, &QAbstractButton::clicked, [this]() { auto basePagePtr = getCurrentBasePage(); if (basePagePtr) { basePagePtr->refresh(); diff --git a/launcher/ui/themes/CustomTheme.cpp b/launcher/ui/themes/CustomTheme.cpp index 081ba1900..b8c5738b7 100644 --- a/launcher/ui/themes/CustomTheme.cpp +++ b/launcher/ui/themes/CustomTheme.cpp @@ -181,7 +181,7 @@ bool CustomTheme::read(const QString& path, bool& hasCustomLogColors) m_widgets = Json::requireString(root, "widgets", "Qt widget theme"); m_qssFilePath = Json::ensureString(root, "qssFilePath", "themeStyle.css"); - auto readColor = [&](const QJsonObject& colors, const QString& colorName) -> QColor { + auto readColor = [](const QJsonObject& colors, const QString& colorName) -> QColor { auto colorValue = Json::ensureString(colors, colorName, QString()); if (!colorValue.isEmpty()) { QColor color(colorValue); @@ -196,7 +196,7 @@ bool CustomTheme::read(const QString& path, bool& hasCustomLogColors) if (root.contains("colors")) { auto colorsRoot = Json::requireObject(root, "colors"); - auto readAndSetPaletteColor = [&](QPalette::ColorRole role, const QString& colorName) { + auto readAndSetPaletteColor = [this, readColor, colorsRoot](QPalette::ColorRole role, const QString& colorName) { auto color = readColor(colorsRoot, colorName); if (color.isValid()) { m_palette.setColor(role, color); @@ -229,7 +229,7 @@ bool CustomTheme::read(const QString& path, bool& hasCustomLogColors) hasCustomLogColors = true; auto logColorsRoot = Json::requireObject(root, "logColors"); - auto readAndSetLogColor = [&](MessageLevel::Enum level, bool fg, const QString& colorName) { + auto readAndSetLogColor = [this, readColor, logColorsRoot](MessageLevel::Enum level, bool fg, const QString& colorName) { auto color = readColor(logColorsRoot, colorName); if (color.isValid()) { if (fg) diff --git a/tests/DummyResourceAPI.h b/tests/DummyResourceAPI.h index 35de95151..f8ab71e59 100644 --- a/tests/DummyResourceAPI.h +++ b/tests/DummyResourceAPI.h @@ -37,7 +37,7 @@ class DummyResourceAPI : public ResourceAPI { [[nodiscard]] Task::Ptr searchProjects(SearchArgs&&, SearchCallbacks&& callbacks) const override { auto task = makeShared(); - QObject::connect(task.get(), &Task::succeeded, [=] { + QObject::connect(task.get(), &Task::succeeded, [callbacks] { auto json = searchRequestResult(); callbacks.on_succeed(json); }); diff --git a/tests/FileSystem_test.cpp b/tests/FileSystem_test.cpp index 1d3cee85f..ca0313bb4 100644 --- a/tests/FileSystem_test.cpp +++ b/tests/FileSystem_test.cpp @@ -63,7 +63,7 @@ class LinkTask : public Task { qDebug() << "EXPECTED: Link failure, Windows requires permissions for symlinks"; qDebug() << "atempting to run with privelage"; - connect(m_lnk, &FS::create_link::finishedPrivileged, this, [&](bool gotResults) { + connect(m_lnk, &FS::create_link::finishedPrivileged, this, [this](bool gotResults) { if (gotResults) { emitSucceeded(); } else { @@ -113,22 +113,12 @@ class FileSystemTest : public QObject { QTest::addColumn("path1"); QTest::addColumn("path2"); - QTest::newRow("qt 1") << "/abc/def/ghi/jkl" - << "/abc/def" - << "ghi/jkl"; - QTest::newRow("qt 2") << "/abc/def/ghi/jkl" - << "/abc/def/" - << "ghi/jkl"; + QTest::newRow("qt 1") << "/abc/def/ghi/jkl" << "/abc/def" << "ghi/jkl"; + QTest::newRow("qt 2") << "/abc/def/ghi/jkl" << "/abc/def/" << "ghi/jkl"; #if defined(Q_OS_WIN) - QTest::newRow("win native, from C:") << "C:/abc" - << "C:" - << "abc"; - QTest::newRow("win native 1") << "C:/abc/def/ghi/jkl" - << "C:\\abc\\def" - << "ghi\\jkl"; - QTest::newRow("win native 2") << "C:/abc/def/ghi/jkl" - << "C:\\abc\\def\\" - << "ghi\\jkl"; + QTest::newRow("win native, from C:") << "C:/abc" << "C:" << "abc"; + QTest::newRow("win native 1") << "C:/abc/def/ghi/jkl" << "C:\\abc\\def" << "ghi\\jkl"; + QTest::newRow("win native 2") << "C:/abc/def/ghi/jkl" << "C:\\abc\\def\\" << "ghi\\jkl"; #endif } @@ -148,39 +138,15 @@ class FileSystemTest : public QObject { QTest::addColumn("path2"); QTest::addColumn("path3"); - QTest::newRow("qt 1") << "/abc/def/ghi/jkl" - << "/abc" - << "def" - << "ghi/jkl"; - QTest::newRow("qt 2") << "/abc/def/ghi/jkl" - << "/abc/" - << "def" - << "ghi/jkl"; - QTest::newRow("qt 3") << "/abc/def/ghi/jkl" - << "/abc" - << "def/" - << "ghi/jkl"; - QTest::newRow("qt 4") << "/abc/def/ghi/jkl" - << "/abc/" - << "def/" - << "ghi/jkl"; + QTest::newRow("qt 1") << "/abc/def/ghi/jkl" << "/abc" << "def" << "ghi/jkl"; + QTest::newRow("qt 2") << "/abc/def/ghi/jkl" << "/abc/" << "def" << "ghi/jkl"; + QTest::newRow("qt 3") << "/abc/def/ghi/jkl" << "/abc" << "def/" << "ghi/jkl"; + QTest::newRow("qt 4") << "/abc/def/ghi/jkl" << "/abc/" << "def/" << "ghi/jkl"; #if defined(Q_OS_WIN) - QTest::newRow("win 1") << "C:/abc/def/ghi/jkl" - << "C:\\abc" - << "def" - << "ghi\\jkl"; - QTest::newRow("win 2") << "C:/abc/def/ghi/jkl" - << "C:\\abc\\" - << "def" - << "ghi\\jkl"; - QTest::newRow("win 3") << "C:/abc/def/ghi/jkl" - << "C:\\abc" - << "def\\" - << "ghi\\jkl"; - QTest::newRow("win 4") << "C:/abc/def/ghi/jkl" - << "C:\\abc\\" - << "def" - << "ghi\\jkl"; + QTest::newRow("win 1") << "C:/abc/def/ghi/jkl" << "C:\\abc" << "def" << "ghi\\jkl"; + QTest::newRow("win 2") << "C:/abc/def/ghi/jkl" << "C:\\abc\\" << "def" << "ghi\\jkl"; + QTest::newRow("win 3") << "C:/abc/def/ghi/jkl" << "C:\\abc" << "def\\" << "ghi\\jkl"; + QTest::newRow("win 4") << "C:/abc/def/ghi/jkl" << "C:\\abc\\" << "def" << "ghi\\jkl"; #endif } @@ -369,11 +335,12 @@ class FileSystemTest : public QObject { LinkTask lnk_tsk(folder, target_dir.path()); lnk_tsk.linkRecursively(false); - QObject::connect(&lnk_tsk, &Task::finished, - [&] { QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); }); + QObject::connect(&lnk_tsk, &Task::finished, [&lnk_tsk] { + QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); + }); lnk_tsk.start(); - QVERIFY2(QTest::qWaitFor([&]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&lnk_tsk]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); for (auto entry : target_dir.entryList()) { qDebug() << entry; @@ -465,11 +432,12 @@ class FileSystemTest : public QObject { RegexpMatcher re("[.]?mcmeta"); lnk_tsk.matcher(&re); lnk_tsk.linkRecursively(true); - QObject::connect(&lnk_tsk, &Task::finished, - [&] { QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); }); + QObject::connect(&lnk_tsk, &Task::finished, [&lnk_tsk] { + QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); + }); lnk_tsk.start(); - QVERIFY2(QTest::qWaitFor([&]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&lnk_tsk]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); for (auto entry : target_dir.entryList()) { qDebug() << entry; @@ -512,11 +480,12 @@ class FileSystemTest : public QObject { lnk_tsk.matcher(&re); lnk_tsk.linkRecursively(true); lnk_tsk.whitelist(true); - QObject::connect(&lnk_tsk, &Task::finished, - [&] { QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); }); + QObject::connect(&lnk_tsk, &Task::finished, [&lnk_tsk] { + QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); + }); lnk_tsk.start(); - QVERIFY2(QTest::qWaitFor([&]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&lnk_tsk]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); for (auto entry : target_dir.entryList()) { qDebug() << entry; @@ -556,11 +525,12 @@ class FileSystemTest : public QObject { LinkTask lnk_tsk(folder, target_dir.path()); lnk_tsk.linkRecursively(true); - QObject::connect(&lnk_tsk, &Task::finished, - [&] { QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); }); + QObject::connect(&lnk_tsk, &Task::finished, [&lnk_tsk] { + QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); + }); lnk_tsk.start(); - QVERIFY2(QTest::qWaitFor([&]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&lnk_tsk]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); auto filter = QDir::Filter::Files | QDir::Filter::Dirs | QDir::Filter::Hidden; @@ -604,11 +574,12 @@ class FileSystemTest : public QObject { qDebug() << target_dir.path(); LinkTask lnk_tsk(file, target_dir.filePath("pack.mcmeta")); - QObject::connect(&lnk_tsk, &Task::finished, - [&] { QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); }); + QObject::connect(&lnk_tsk, &Task::finished, [&lnk_tsk] { + QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); + }); lnk_tsk.start(); - QVERIFY2(QTest::qWaitFor([&]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&lnk_tsk]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); auto filter = QDir::Filter::Files; @@ -639,11 +610,12 @@ class FileSystemTest : public QObject { LinkTask lnk_tsk(folder, target_dir.path()); lnk_tsk.linkRecursively(true); lnk_tsk.setMaxDepth(0); - QObject::connect(&lnk_tsk, &Task::finished, - [&] { QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); }); + QObject::connect(&lnk_tsk, &Task::finished, [&lnk_tsk] { + QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); + }); lnk_tsk.start(); - QVERIFY2(QTest::qWaitFor([&]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&lnk_tsk]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); QVERIFY(!QFileInfo(target_dir.path()).isSymLink()); @@ -689,13 +661,14 @@ class FileSystemTest : public QObject { LinkTask lnk_tsk(folder, target_dir.path()); lnk_tsk.linkRecursively(true); lnk_tsk.setMaxDepth(-1); - QObject::connect(&lnk_tsk, &Task::finished, - [&] { QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); }); + QObject::connect(&lnk_tsk, &Task::finished, [&lnk_tsk] { + QVERIFY2(lnk_tsk.wasSuccessful(), "Task finished but was not successful when it should have been."); + }); lnk_tsk.start(); - QVERIFY2(QTest::qWaitFor([&]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&lnk_tsk]() { return lnk_tsk.isFinished(); }, 100000), "Task didn't finish as it should."); - std::function verify_check = [&](QString check_path) { + std::function verify_check = [&verify_check](QString check_path) { QDir check_dir(check_path); auto filter = QDir::Filter::Files | QDir::Filter::Dirs | QDir::Filter::Hidden; for (auto entry : check_dir.entryList(filter)) { diff --git a/tests/Task_test.cpp b/tests/Task_test.cpp index 0740ba0a3..5b938293e 100644 --- a/tests/Task_test.cpp +++ b/tests/Task_test.cpp @@ -66,7 +66,7 @@ class BigConcurrentTaskThread : public QThread { } connect(&big_task, &Task::finished, this, &QThread::quit); - connect(&m_deadline, &QTimer::timeout, this, [&] { + connect(&m_deadline, &QTimer::timeout, this, [this] { passed_the_deadline = true; quit(); }); @@ -128,10 +128,10 @@ class TaskTest : public QObject { { BasicTask t; QObject::connect(&t, &Task::finished, - [&] { QVERIFY2(t.wasSuccessful(), "Task finished but was not successful when it should have been."); }); + [&t] { QVERIFY2(t.wasSuccessful(), "Task finished but was not successful when it should have been."); }); t.start(); - QVERIFY2(QTest::qWaitFor([&]() { return t.isFinished(); }, 1000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&t]() { return t.isFinished(); }, 1000), "Task didn't finish as it should."); } void test_basicConcurrentRun() @@ -154,7 +154,7 @@ class TaskTest : public QObject { }); t.start(); - QVERIFY2(QTest::qWaitFor([&]() { return t.isFinished(); }, 1000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&t]() { return t.isFinished(); }, 1000), "Task didn't finish as it should."); } // Tests if starting new tasks after the 6 initial ones is working @@ -196,7 +196,7 @@ class TaskTest : public QObject { }); t.start(); - QVERIFY2(QTest::qWaitFor([&]() { return t.isFinished(); }, 1000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&t]() { return t.isFinished(); }, 1000), "Task didn't finish as it should."); } void test_basicSequentialRun() @@ -219,7 +219,7 @@ class TaskTest : public QObject { }); t.start(); - QVERIFY2(QTest::qWaitFor([&]() { return t.isFinished(); }, 1000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&t]() { return t.isFinished(); }, 1000), "Task didn't finish as it should."); } void test_basicMultipleOptionsRun() @@ -242,7 +242,7 @@ class TaskTest : public QObject { }); t.start(); - QVERIFY2(QTest::qWaitFor([&]() { return t.isFinished(); }, 1000), "Task didn't finish as it should."); + QVERIFY2(QTest::qWaitFor([&t]() { return t.isFinished(); }, 1000), "Task didn't finish as it should."); } void test_stackOverflowInConcurrentTask() From 9ae16921bce00f38d7e83c4a14fe56f63edd03d4 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 30 Oct 2024 21:10:43 +0000 Subject: [PATCH 338/616] Remove BasicFolderLoadTask Signed-off-by: TheKodeToad --- .../minecraft/mod/tasks/BasicFolderLoadTask.h | 85 ------------------- 1 file changed, 85 deletions(-) delete mode 100644 launcher/minecraft/mod/tasks/BasicFolderLoadTask.h diff --git a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h deleted file mode 100644 index fb2e22de6..000000000 --- a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h +++ /dev/null @@ -1,85 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include - -#include "Application.h" -#include "FileSystem.h" -#include "minecraft/mod/Resource.h" - -#include "tasks/Task.h" - -/** Very simple task that just loads a folder's contents directly. - */ -class BasicFolderLoadTask : public Task { - Q_OBJECT - public: - struct Result { - QMap resources; - }; - using ResultPtr = std::shared_ptr; - - [[nodiscard]] ResultPtr result() const { return m_result; } - - public: - BasicFolderLoadTask(QDir dir) : Task(nullptr, false), m_dir(dir), m_result(new Result), m_thread_to_spawn_into(thread()) - { - m_create_func = [](QFileInfo const& entry) -> Resource::Ptr { return makeShared(entry); }; - } - BasicFolderLoadTask(QDir dir, std::function create_function) - : Task(nullptr, false) - , m_dir(dir) - , m_result(new Result) - , m_create_func(std::move(create_function)) - , m_thread_to_spawn_into(thread()) - {} - - [[nodiscard]] bool canAbort() const override { return true; } - bool abort() override - { - m_aborted.store(true); - return true; - } - - void executeTask() override - { - if (thread() != m_thread_to_spawn_into) - connect(this, &Task::finished, this->thread(), &QThread::quit); - - m_dir.refresh(); - for (auto entry : m_dir.entryInfoList()) { - auto filePath = entry.absoluteFilePath(); - if (auto app = APPLICATION_DYN; app && app->checkQSavePath(filePath)) { - continue; - } - auto newFilePath = FS::getUniqueResourceName(filePath); - if (newFilePath != filePath) { - FS::move(filePath, newFilePath); - entry = QFileInfo(newFilePath); - } - auto resource = m_create_func(entry); - resource->moveToThread(m_thread_to_spawn_into); - m_result->resources.insert(resource->internal_id(), resource); - } - - if (m_aborted) - emit finished(); - else - emitSucceeded(); - } - - private: - QDir m_dir; - ResultPtr m_result; - - std::atomic m_aborted = false; - - std::function m_create_func; - - /** This is the thread in which we should put new mod objects */ - QThread* m_thread_to_spawn_into; -}; From 670c932f32753fd67979f95810b052d7a62a0006 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 31 Oct 2024 14:51:18 +0200 Subject: [PATCH 339/616] Fix installed typo Signed-off-by: Trial97 --- launcher/ui/dialogs/ResourceUpdateDialog.cpp | 2 +- launcher/ui/dialogs/ReviewMessageBox.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/ui/dialogs/ResourceUpdateDialog.cpp b/launcher/ui/dialogs/ResourceUpdateDialog.cpp index 958bc9683..6d5ef7569 100644 --- a/launcher/ui/dialogs/ResourceUpdateDialog.cpp +++ b/launcher/ui/dialogs/ResourceUpdateDialog.cpp @@ -422,7 +422,7 @@ void ResourceUpdateDialog::appendResource(CheckUpdateTask::Update const& info, Q auto item_top = new QTreeWidgetItem(ui->modTreeWidget); item_top->setCheckState(0, info.enabled ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); if (!info.enabled) { - item_top->setToolTip(0, tr("Mod was disabled as it may be already instaled.")); + item_top->setToolTip(0, tr("Mod was disabled as it may be already installed.")); } item_top->setText(0, info.name); item_top->setExpanded(true); diff --git a/launcher/ui/dialogs/ReviewMessageBox.cpp b/launcher/ui/dialogs/ReviewMessageBox.cpp index fa79e4ed1..96cc8149f 100644 --- a/launcher/ui/dialogs/ReviewMessageBox.cpp +++ b/launcher/ui/dialogs/ReviewMessageBox.cpp @@ -41,7 +41,7 @@ void ReviewMessageBox::appendResource(ResourceInformation&& info) itemTop->setCheckState(0, info.enabled ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); itemTop->setText(0, info.name); if (!info.enabled) { - itemTop->setToolTip(0, tr("Mod was disabled as it may be already instaled.")); + itemTop->setToolTip(0, tr("Mod was disabled as it may be already installed.")); } auto filenameItem = new QTreeWidgetItem(itemTop); From 2b590f24edb156ab3ff9ce9846908f1f2906738e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 28 Oct 2024 19:13:14 +0200 Subject: [PATCH 340/616] remove task parent from constuctor Signed-off-by: Trial97 --- launcher/Application.cpp | 2 +- launcher/DataMigrationTask.cpp | 7 ++----- launcher/DataMigrationTask.h | 2 +- launcher/JavaCommon.cpp | 4 ++-- launcher/LaunchController.cpp | 2 +- launcher/LaunchController.h | 2 +- launcher/java/JavaChecker.cpp | 4 ++-- launcher/java/JavaChecker.h | 3 +-- launcher/java/JavaInstallList.cpp | 4 ++-- launcher/launch/LaunchStep.cpp | 2 +- launcher/launch/steps/CheckJava.cpp | 2 +- launcher/meta/Index.cpp | 4 ++-- launcher/meta/VersionList.cpp | 3 +-- launcher/minecraft/ComponentUpdateTask.cpp | 2 +- launcher/minecraft/ComponentUpdateTask.h | 2 +- launcher/minecraft/MinecraftInstance.cpp | 2 +- launcher/minecraft/MinecraftLoadAndCheck.cpp | 4 +--- launcher/minecraft/MinecraftLoadAndCheck.h | 2 +- launcher/minecraft/auth/AuthFlow.cpp | 2 +- launcher/minecraft/auth/AuthFlow.h | 2 +- launcher/minecraft/auth/MinecraftAccount.cpp | 4 ++-- launcher/minecraft/launch/AutoInstallJava.cpp | 6 ++---- .../minecraft/mod/tasks/GetModDependenciesTask.cpp | 7 +++---- .../minecraft/mod/tasks/GetModDependenciesTask.h | 5 +---- .../minecraft/mod/tasks/LocalDataPackParseTask.cpp | 2 +- launcher/minecraft/mod/tasks/LocalModParseTask.cpp | 2 +- .../mod/tasks/LocalResourcePackParseTask.cpp | 4 +--- .../mod/tasks/LocalShaderPackParseTask.cpp | 2 +- .../mod/tasks/LocalTexturePackParseTask.cpp | 3 +-- .../mod/tasks/LocalWorldSaveParseTask.cpp | 2 +- .../minecraft/mod/tasks/ResourceFolderLoadTask.cpp | 2 +- launcher/modplatform/EnsureMetadataTask.cpp | 8 ++++---- .../flame/FlameInstanceCreationTask.cpp | 2 +- launcher/modplatform/flame/FlamePackExportTask.cpp | 3 +-- .../modplatform/modrinth/ModrinthCheckUpdate.cpp | 7 +++---- launcher/net/NetJob.cpp | 2 +- launcher/tasks/ConcurrentTask.cpp | 2 +- launcher/tasks/ConcurrentTask.h | 2 +- launcher/tasks/MultipleOptionsTask.cpp | 2 +- launcher/tasks/MultipleOptionsTask.h | 2 +- launcher/tasks/SequentialTask.cpp | 2 +- launcher/tasks/SequentialTask.h | 2 +- launcher/tasks/Task.cpp | 2 +- launcher/tasks/Task.h | 2 +- launcher/ui/dialogs/BlockedModsDialog.cpp | 2 +- launcher/ui/dialogs/MSALoginDialog.cpp | 2 +- launcher/ui/dialogs/ResourceDownloadDialog.cpp | 2 +- launcher/ui/dialogs/ResourceUpdateDialog.cpp | 9 ++++----- launcher/ui/java/InstallJavaDialog.cpp | 2 +- launcher/ui/pages/instance/ModFolderPage.cpp | 6 +++--- launcher/ui/pages/instance/ResourcePackPage.cpp | 13 ++++--------- launcher/ui/pages/instance/ShaderPackPage.cpp | 9 ++++----- launcher/ui/pages/instance/TexturePackPage.cpp | 14 ++++++-------- launcher/ui/pages/instance/VersionPage.cpp | 2 +- launcher/ui/widgets/JavaSettingsWidget.cpp | 2 +- tests/Task_test.cpp | 2 +- 56 files changed, 86 insertions(+), 113 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 11b80a006..b8fdb7def 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1871,7 +1871,7 @@ bool Application::handleDataMigration(const QString& currentData, matcher->add(std::make_shared("themes/")); ProgressDialog diag; - DataMigrationTask task(nullptr, oldData, currentData, matcher); + DataMigrationTask task(oldData, currentData, matcher); if (diag.execWithTask(&task)) { qDebug() << "<> Migration succeeded"; setDoNotMigrate(); diff --git a/launcher/DataMigrationTask.cpp b/launcher/DataMigrationTask.cpp index 27ce5f01b..4ffa26fd4 100644 --- a/launcher/DataMigrationTask.cpp +++ b/launcher/DataMigrationTask.cpp @@ -12,11 +12,8 @@ #include -DataMigrationTask::DataMigrationTask(QObject* parent, - const QString& sourcePath, - const QString& targetPath, - const IPathMatcher::Ptr pathMatcher) - : Task(parent), m_sourcePath(sourcePath), m_targetPath(targetPath), m_pathMatcher(pathMatcher), m_copy(sourcePath, targetPath) +DataMigrationTask::DataMigrationTask(const QString& sourcePath, const QString& targetPath, const IPathMatcher::Ptr pathMatcher) + : Task(), m_sourcePath(sourcePath), m_targetPath(targetPath), m_pathMatcher(pathMatcher), m_copy(sourcePath, targetPath) { m_copy.matcher(m_pathMatcher.get()).whitelist(true); } diff --git a/launcher/DataMigrationTask.h b/launcher/DataMigrationTask.h index aba9f2399..fc613cd5e 100644 --- a/launcher/DataMigrationTask.h +++ b/launcher/DataMigrationTask.h @@ -18,7 +18,7 @@ class DataMigrationTask : public Task { Q_OBJECT public: - explicit DataMigrationTask(QObject* parent, const QString& sourcePath, const QString& targetPath, IPathMatcher::Ptr pathmatcher); + explicit DataMigrationTask(const QString& sourcePath, const QString& targetPath, IPathMatcher::Ptr pathmatcher); ~DataMigrationTask() override = default; protected: diff --git a/launcher/JavaCommon.cpp b/launcher/JavaCommon.cpp index 3cbf9f9d5..188edb943 100644 --- a/launcher/JavaCommon.cpp +++ b/launcher/JavaCommon.cpp @@ -116,7 +116,7 @@ void JavaCommon::TestCheck::run() emit finished(); return; } - checker.reset(new JavaChecker(m_path, "", 0, 0, 0, 0, this)); + checker.reset(new JavaChecker(m_path, "", 0, 0, 0, 0)); connect(checker.get(), &JavaChecker::checkFinished, this, &JavaCommon::TestCheck::checkFinished); checker->start(); } @@ -128,7 +128,7 @@ void JavaCommon::TestCheck::checkFinished(const JavaChecker::Result& result) emit finished(); return; } - checker.reset(new JavaChecker(m_path, m_args, m_maxMem, m_maxMem, result.javaVersion.requiresPermGen() ? m_permGen : 0, 0, this)); + checker.reset(new JavaChecker(m_path, m_args, m_maxMem, m_maxMem, result.javaVersion.requiresPermGen() ? m_permGen : 0, 0)); connect(checker.get(), &JavaChecker::checkFinished, this, &JavaCommon::TestCheck::checkFinishedWithArgs); checker->start(); } diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index dcec62e9e..0aded4a95 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -62,7 +62,7 @@ #include "launch/steps/TextPrint.h" #include "tasks/Task.h" -LaunchController::LaunchController(QObject* parent) : Task(parent) {} +LaunchController::LaunchController() : Task() {} void LaunchController::executeTask() { diff --git a/launcher/LaunchController.h b/launcher/LaunchController.h index 0abdeeb15..7e6a27d91 100644 --- a/launcher/LaunchController.h +++ b/launcher/LaunchController.h @@ -47,7 +47,7 @@ class LaunchController : public Task { public: void executeTask() override; - LaunchController(QObject* parent = nullptr); + LaunchController(); virtual ~LaunchController() = default; void setInstance(InstancePtr instance) { m_instance = instance; } diff --git a/launcher/java/JavaChecker.cpp b/launcher/java/JavaChecker.cpp index c54a5b04b..772c90e42 100644 --- a/launcher/java/JavaChecker.cpp +++ b/launcher/java/JavaChecker.cpp @@ -44,8 +44,8 @@ #include "FileSystem.h" #include "java/JavaUtils.h" -JavaChecker::JavaChecker(QString path, QString args, int minMem, int maxMem, int permGen, int id, QObject* parent) - : Task(parent), m_path(path), m_args(args), m_minMem(minMem), m_maxMem(maxMem), m_permGen(permGen), m_id(id) +JavaChecker::JavaChecker(QString path, QString args, int minMem, int maxMem, int permGen, int id) + : Task(), m_path(path), m_args(args), m_minMem(minMem), m_maxMem(maxMem), m_permGen(permGen), m_id(id) {} void JavaChecker::executeTask() diff --git a/launcher/java/JavaChecker.h b/launcher/java/JavaChecker.h index 171a18b76..a04b68170 100644 --- a/launcher/java/JavaChecker.h +++ b/launcher/java/JavaChecker.h @@ -1,7 +1,6 @@ #pragma once #include #include -#include #include "JavaVersion.h" #include "QObjectPtr.h" @@ -26,7 +25,7 @@ class JavaChecker : public Task { enum class Validity { Errored, ReturnedInvalidData, Valid } validity = Validity::Errored; }; - explicit JavaChecker(QString path, QString args, int minMem = 0, int maxMem = 0, int permGen = 0, int id = 0, QObject* parent = 0); + explicit JavaChecker(QString path, QString args, int minMem = 0, int maxMem = 0, int permGen = 0, int id = 0); signals: void checkFinished(const Result& result); diff --git a/launcher/java/JavaInstallList.cpp b/launcher/java/JavaInstallList.cpp index 569fda306..aa7fab8a0 100644 --- a/launcher/java/JavaInstallList.cpp +++ b/launcher/java/JavaInstallList.cpp @@ -163,7 +163,7 @@ void JavaListLoadTask::executeTask() JavaUtils ju; QList candidate_paths = m_only_managed_versions ? getPrismJavaBundle() : ju.FindJavaPaths(); - ConcurrentTask::Ptr job(new ConcurrentTask(this, "Java detection", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); + ConcurrentTask::Ptr job(new ConcurrentTask("Java detection", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); m_job.reset(job); connect(m_job.get(), &Task::finished, this, &JavaListLoadTask::javaCheckerFinished); connect(m_job.get(), &Task::progress, this, &Task::setProgress); @@ -171,7 +171,7 @@ void JavaListLoadTask::executeTask() qDebug() << "Probing the following Java paths: "; int id = 0; for (QString candidate : candidate_paths) { - auto checker = new JavaChecker(candidate, "", 0, 0, 0, id, this); + auto checker = new JavaChecker(candidate, "", 0, 0, 0, id); connect(checker, &JavaChecker::checkFinished, [this](const JavaChecker::Result& result) { m_results << result; }); job->addTask(Task::Ptr(checker)); id++; diff --git a/launcher/launch/LaunchStep.cpp b/launcher/launch/LaunchStep.cpp index f3e9dfce0..0b352ea9f 100644 --- a/launcher/launch/LaunchStep.cpp +++ b/launcher/launch/LaunchStep.cpp @@ -16,7 +16,7 @@ #include "LaunchStep.h" #include "LaunchTask.h" -LaunchStep::LaunchStep(LaunchTask* parent) : Task(parent), m_parent(parent) +LaunchStep::LaunchStep(LaunchTask* parent) : Task(), m_parent(parent) { connect(this, &LaunchStep::readyForLaunch, parent, &LaunchTask::onReadyForLaunch); connect(this, &LaunchStep::logLine, parent, &LaunchTask::onLogLine); diff --git a/launcher/launch/steps/CheckJava.cpp b/launcher/launch/steps/CheckJava.cpp index 55d13b58c..0f8d27e94 100644 --- a/launcher/launch/steps/CheckJava.cpp +++ b/launcher/launch/steps/CheckJava.cpp @@ -94,7 +94,7 @@ void CheckJava::executeTask() // if timestamps are not the same, or something is missing, check! if (m_javaSignature != storedSignature || storedVersion.size() == 0 || storedArchitecture.size() == 0 || storedRealArchitecture.size() == 0 || storedVendor.size() == 0) { - m_JavaChecker.reset(new JavaChecker(realJavaPath, "", 0, 0, 0, 0, this)); + m_JavaChecker.reset(new JavaChecker(realJavaPath, "", 0, 0, 0, 0)); emit logLine(QString("Checking Java version..."), MessageLevel::Launcher); connect(m_JavaChecker.get(), &JavaChecker::checkFinished, this, &CheckJava::checkJavaFinished); m_JavaChecker->start(); diff --git a/launcher/meta/Index.cpp b/launcher/meta/Index.cpp index bd0745b6b..1707854be 100644 --- a/launcher/meta/Index.cpp +++ b/launcher/meta/Index.cpp @@ -140,8 +140,8 @@ Task::Ptr Index::loadVersion(const QString& uid, const QString& version, Net::Mo } auto versionList = get(uid); - auto loadTask = makeShared( - this, tr("Load meta for %1:%2", "This is for the task name that loads the meta index.").arg(uid, version)); + auto loadTask = + makeShared(tr("Load meta for %1:%2", "This is for the task name that loads the meta index.").arg(uid, version)); if (status() != BaseEntity::LoadStatus::Remote || force) { loadTask->addTask(this->loadTask(mode)); } diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 6856b5f8d..f96355658 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -34,8 +34,7 @@ VersionList::VersionList(const QString& uid, QObject* parent) : BaseVersionList( Task::Ptr VersionList::getLoadTask() { - auto loadTask = - makeShared(this, tr("Load meta for %1", "This is for the task name that loads the meta index.").arg(m_uid)); + auto loadTask = makeShared(tr("Load meta for %1", "This is for the task name that loads the meta index.").arg(m_uid)); loadTask->addTask(APPLICATION->metadataIndex()->loadTask(Net::Mode::Online)); loadTask->addTask(this->loadTask(Net::Mode::Online)); return loadTask; diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 6656a84f8..36a07ee72 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -38,7 +38,7 @@ * If the component list changes, start over. */ -ComponentUpdateTask::ComponentUpdateTask(Mode mode, Net::Mode netmode, PackProfile* list, QObject* parent) : Task(parent) +ComponentUpdateTask::ComponentUpdateTask(Mode mode, Net::Mode netmode, PackProfile* list) : Task() { d.reset(new ComponentUpdateTaskData); d->m_profile = list; diff --git a/launcher/minecraft/ComponentUpdateTask.h b/launcher/minecraft/ComponentUpdateTask.h index 484c0bedd..64c55877b 100644 --- a/launcher/minecraft/ComponentUpdateTask.h +++ b/launcher/minecraft/ComponentUpdateTask.h @@ -14,7 +14,7 @@ class ComponentUpdateTask : public Task { enum class Mode { Launch, Resolution }; public: - explicit ComponentUpdateTask(Mode mode, Net::Mode netmode, PackProfile* list, QObject* parent = 0); + explicit ComponentUpdateTask(Mode mode, Net::Mode netmode, PackProfile* list); virtual ~ComponentUpdateTask(); protected: diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index a1a6a6c7b..7470bef06 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -1119,7 +1119,7 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt // load meta { auto mode = session->status != AuthSession::PlayableOffline ? Net::Mode::Online : Net::Mode::Offline; - process->appendStep(makeShared(pptr, makeShared(this, mode, pptr))); + process->appendStep(makeShared(pptr, makeShared(this, mode))); } // check java diff --git a/launcher/minecraft/MinecraftLoadAndCheck.cpp b/launcher/minecraft/MinecraftLoadAndCheck.cpp index a9dcdf067..b9fb7eb0c 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.cpp +++ b/launcher/minecraft/MinecraftLoadAndCheck.cpp @@ -2,9 +2,7 @@ #include "MinecraftInstance.h" #include "PackProfile.h" -MinecraftLoadAndCheck::MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode, QObject* parent) - : Task(parent), m_inst(inst), m_netmode(netmode) -{} +MinecraftLoadAndCheck::MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode) : m_inst(inst), m_netmode(netmode) {} void MinecraftLoadAndCheck::executeTask() { diff --git a/launcher/minecraft/MinecraftLoadAndCheck.h b/launcher/minecraft/MinecraftLoadAndCheck.h index 72e9e0caa..c05698bca 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.h +++ b/launcher/minecraft/MinecraftLoadAndCheck.h @@ -23,7 +23,7 @@ class MinecraftInstance; class MinecraftLoadAndCheck : public Task { Q_OBJECT public: - explicit MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode, QObject* parent = nullptr); + explicit MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode); virtual ~MinecraftLoadAndCheck() = default; void executeTask() override; diff --git a/launcher/minecraft/auth/AuthFlow.cpp b/launcher/minecraft/auth/AuthFlow.cpp index 45926206c..19fbe15dd 100644 --- a/launcher/minecraft/auth/AuthFlow.cpp +++ b/launcher/minecraft/auth/AuthFlow.cpp @@ -19,7 +19,7 @@ #include -AuthFlow::AuthFlow(AccountData* data, Action action, QObject* parent) : Task(parent), m_data(data) +AuthFlow::AuthFlow(AccountData* data, Action action) : Task(), m_data(data) { if (data->type == AccountType::MSA) { if (action == Action::DeviceCode) { diff --git a/launcher/minecraft/auth/AuthFlow.h b/launcher/minecraft/auth/AuthFlow.h index 4d18ac845..bff4c04e4 100644 --- a/launcher/minecraft/auth/AuthFlow.h +++ b/launcher/minecraft/auth/AuthFlow.h @@ -17,7 +17,7 @@ class AuthFlow : public Task { public: enum class Action { Refresh, Login, DeviceCode }; - explicit AuthFlow(AccountData* data, Action action = Action::Refresh, QObject* parent = 0); + explicit AuthFlow(AccountData* data, Action action = Action::Refresh); virtual ~AuthFlow() = default; void executeTask() override; diff --git a/launcher/minecraft/auth/MinecraftAccount.cpp b/launcher/minecraft/auth/MinecraftAccount.cpp index 5b063604c..1ed39b5ca 100644 --- a/launcher/minecraft/auth/MinecraftAccount.cpp +++ b/launcher/minecraft/auth/MinecraftAccount.cpp @@ -121,7 +121,7 @@ shared_qobject_ptr MinecraftAccount::login(bool useDeviceCode) { Q_ASSERT(m_currentTask.get() == nullptr); - m_currentTask.reset(new AuthFlow(&data, useDeviceCode ? AuthFlow::Action::DeviceCode : AuthFlow::Action::Login, this)); + m_currentTask.reset(new AuthFlow(&data, useDeviceCode ? AuthFlow::Action::DeviceCode : AuthFlow::Action::Login)); connect(m_currentTask.get(), &Task::succeeded, this, &MinecraftAccount::authSucceeded); connect(m_currentTask.get(), &Task::failed, this, &MinecraftAccount::authFailed); connect(m_currentTask.get(), &Task::aborted, this, [this] { authFailed(tr("Aborted")); }); @@ -135,7 +135,7 @@ shared_qobject_ptr MinecraftAccount::refresh() return m_currentTask; } - m_currentTask.reset(new AuthFlow(&data, AuthFlow::Action::Refresh, this)); + m_currentTask.reset(new AuthFlow(&data, AuthFlow::Action::Refresh)); connect(m_currentTask.get(), &Task::succeeded, this, &MinecraftAccount::authSucceeded); connect(m_currentTask.get(), &Task::failed, this, &MinecraftAccount::authFailed); diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 1083b7efb..854590dd2 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -57,9 +57,7 @@ #include "tasks/SequentialTask.h" AutoInstallJava::AutoInstallJava(LaunchTask* parent) - : LaunchStep(parent) - , m_instance(m_parent->instance()) - , m_supported_arch(SysInfo::getSupportedJavaArchitecture()) {}; + : LaunchStep(parent), m_instance(m_parent->instance()), m_supported_arch(SysInfo::getSupportedJavaArchitecture()) {}; void AutoInstallJava::executeTask() { @@ -179,7 +177,7 @@ void AutoInstallJava::downloadJava(Meta::Version::Ptr version, QString javaName) return; } #if defined(Q_OS_MACOS) - auto seq = makeShared(this, tr("Install Java")); + auto seq = makeShared(tr("Install Java")); seq->addTask(m_current_task); seq->addTask(makeShared(final_path)); m_current_task = seq; diff --git a/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp b/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp index b9288d2b3..b63d36361 100644 --- a/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp +++ b/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp @@ -52,11 +52,10 @@ static bool checkDependencies(std::shared_ptrversion.loaders || sel->version.loaders & loaders); } -GetModDependenciesTask::GetModDependenciesTask(QObject* parent, - BaseInstance* instance, +GetModDependenciesTask::GetModDependenciesTask(BaseInstance* instance, ModFolderModel* folder, QList> selected) - : SequentialTask(parent, tr("Get dependencies")) + : SequentialTask(tr("Get dependencies")) , m_selected(selected) , m_flame_provider{ ModPlatform::ResourceProvider::FLAME, std::make_shared(*instance), std::make_shared() } @@ -185,7 +184,7 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen auto provider = providerName == m_flame_provider.name ? m_flame_provider : m_modrinth_provider; auto tasks = makeShared( - this, QString("DependencyInfo: %1").arg(dep.addonId.toString().isEmpty() ? dep.version : dep.addonId.toString())); + QString("DependencyInfo: %1").arg(dep.addonId.toString().isEmpty() ? dep.version : dep.addonId.toString())); if (!dep.addonId.toString().isEmpty()) { tasks->addTask(getProjectInfoTask(pDep)); diff --git a/launcher/minecraft/mod/tasks/GetModDependenciesTask.h b/launcher/minecraft/mod/tasks/GetModDependenciesTask.h index 7202b01e0..29c77f9fe 100644 --- a/launcher/minecraft/mod/tasks/GetModDependenciesTask.h +++ b/launcher/minecraft/mod/tasks/GetModDependenciesTask.h @@ -61,10 +61,7 @@ class GetModDependenciesTask : public SequentialTask { std::shared_ptr api; }; - explicit GetModDependenciesTask(QObject* parent, - BaseInstance* instance, - ModFolderModel* folder, - QList> selected); + explicit GetModDependenciesTask(BaseInstance* instance, ModFolderModel* folder, QList> selected); auto getDependecies() const -> QList> { return m_pack_dependencies; } QHash getExtraInfo(); diff --git a/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp index 82f6b9df9..19b15709d 100644 --- a/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp @@ -157,7 +157,7 @@ bool validate(QFileInfo file) } // namespace DataPackUtils -LocalDataPackParseTask::LocalDataPackParseTask(int token, DataPack& dp) : Task(nullptr, false), m_token(token), m_data_pack(dp) {} +LocalDataPackParseTask::LocalDataPackParseTask(int token, DataPack& dp) : Task(false), m_token(token), m_data_pack(dp) {} bool LocalDataPackParseTask::abort() { diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp index d456211f8..fa5d479ba 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp @@ -730,7 +730,7 @@ bool loadIconFile(const Mod& mod, QPixmap* pixmap) } // namespace ModUtils LocalModParseTask::LocalModParseTask(int token, ResourceType type, const QFileInfo& modFile) - : Task(nullptr, false), m_token(token), m_type(type), m_modFile(modFile), m_result(new Result()) + : Task(false), m_token(token), m_type(type), m_modFile(modFile), m_result(new Result()) {} bool LocalModParseTask::abort() diff --git a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp index 27fbf3c6d..0b80db82d 100644 --- a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp @@ -358,9 +358,7 @@ bool validate(QFileInfo file) } // namespace ResourcePackUtils -LocalResourcePackParseTask::LocalResourcePackParseTask(int token, ResourcePack& rp) - : Task(nullptr, false), m_token(token), m_resource_pack(rp) -{} +LocalResourcePackParseTask::LocalResourcePackParseTask(int token, ResourcePack& rp) : Task(false), m_token(token), m_resource_pack(rp) {} bool LocalResourcePackParseTask::abort() { diff --git a/launcher/minecraft/mod/tasks/LocalShaderPackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalShaderPackParseTask.cpp index 4deebcd1d..a6ecc5353 100644 --- a/launcher/minecraft/mod/tasks/LocalShaderPackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalShaderPackParseTask.cpp @@ -93,7 +93,7 @@ bool validate(QFileInfo file) } // namespace ShaderPackUtils -LocalShaderPackParseTask::LocalShaderPackParseTask(int token, ShaderPack& sp) : Task(nullptr, false), m_token(token), m_shader_pack(sp) {} +LocalShaderPackParseTask::LocalShaderPackParseTask(int token, ShaderPack& sp) : Task(false), m_token(token), m_shader_pack(sp) {} bool LocalShaderPackParseTask::abort() { diff --git a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp index 00cc2def2..18020808a 100644 --- a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp @@ -230,8 +230,7 @@ bool validate(QFileInfo file) } // namespace TexturePackUtils -LocalTexturePackParseTask::LocalTexturePackParseTask(int token, TexturePack& rp) : Task(nullptr, false), m_token(token), m_texture_pack(rp) -{} +LocalTexturePackParseTask::LocalTexturePackParseTask(int token, TexturePack& rp) : Task(false), m_token(token), m_texture_pack(rp) {} bool LocalTexturePackParseTask::abort() { diff --git a/launcher/minecraft/mod/tasks/LocalWorldSaveParseTask.cpp b/launcher/minecraft/mod/tasks/LocalWorldSaveParseTask.cpp index 9d564ddb3..74d8d8d60 100644 --- a/launcher/minecraft/mod/tasks/LocalWorldSaveParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalWorldSaveParseTask.cpp @@ -170,7 +170,7 @@ bool validate(QFileInfo file) } // namespace WorldSaveUtils -LocalWorldSaveParseTask::LocalWorldSaveParseTask(int token, WorldSave& save) : Task(nullptr, false), m_token(token), m_save(save) {} +LocalWorldSaveParseTask::LocalWorldSaveParseTask(int token, WorldSave& save) : Task(false), m_token(token), m_save(save) {} bool LocalWorldSaveParseTask::abort() { diff --git a/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.cpp b/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.cpp index 1cdde7541..98dab9abb 100644 --- a/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.cpp +++ b/launcher/minecraft/mod/tasks/ResourceFolderLoadTask.cpp @@ -47,7 +47,7 @@ ResourceFolderLoadTask::ResourceFolderLoadTask(const QDir& resource_dir, bool is_indexed, bool clean_orphan, std::function create_function) - : Task(nullptr, false) + : Task(false) , m_resource_dir(resource_dir) , m_index_dir(index_dir) , m_is_indexed(is_indexed) diff --git a/launcher/modplatform/EnsureMetadataTask.cpp b/launcher/modplatform/EnsureMetadataTask.cpp index ec3538010..2b2e04c25 100644 --- a/launcher/modplatform/EnsureMetadataTask.cpp +++ b/launcher/modplatform/EnsureMetadataTask.cpp @@ -19,7 +19,7 @@ static ModrinthAPI modrinth_api; static FlameAPI flame_api; EnsureMetadataTask::EnsureMetadataTask(Resource* resource, QDir dir, ModPlatform::ResourceProvider prov) - : Task(nullptr), m_index_dir(dir), m_provider(prov), m_hashing_task(nullptr), m_current_task(nullptr) + : Task(), m_index_dir(dir), m_provider(prov), m_hashing_task(nullptr), m_current_task(nullptr) { auto hash_task = createNewHash(resource); if (!hash_task) @@ -30,9 +30,9 @@ EnsureMetadataTask::EnsureMetadataTask(Resource* resource, QDir dir, ModPlatform } EnsureMetadataTask::EnsureMetadataTask(QList& resources, QDir dir, ModPlatform::ResourceProvider prov) - : Task(nullptr), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) + : Task(), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) { - m_hashing_task.reset(new ConcurrentTask(this, "MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); + m_hashing_task.reset(new ConcurrentTask("MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); for (auto* resource : resources) { auto hash_task = createNewHash(resource); if (!hash_task) @@ -44,7 +44,7 @@ EnsureMetadataTask::EnsureMetadataTask(QList& resources, QDir dir, Mo } EnsureMetadataTask::EnsureMetadataTask(QHash& resources, QDir dir, ModPlatform::ResourceProvider prov) - : Task(nullptr), m_resources(resources), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) + : Task(), m_resources(resources), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) {} Hashing::Hasher::Ptr EnsureMetadataTask::createNewHash(Resource* resource) diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index 7007a8c84..1865ba1df 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -677,7 +677,7 @@ void FlameCreationTask::validateZIPResources(QEventLoop& loop) } } // TODO make this work with other sorts of resource - auto task = makeShared(this, "CreateModMetadata", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); + auto task = makeShared("CreateModMetadata", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); auto results = m_mod_id_resolver->getResults().files; auto folder = FS::PathCombine(m_stagingPath, "minecraft", "mods", ".index"); for (auto file : results) { diff --git a/launcher/modplatform/flame/FlamePackExportTask.cpp b/launcher/modplatform/flame/FlamePackExportTask.cpp index d661f1f05..3405b702f 100644 --- a/launcher/modplatform/flame/FlamePackExportTask.cpp +++ b/launcher/modplatform/flame/FlamePackExportTask.cpp @@ -103,8 +103,7 @@ void FlamePackExportTask::collectHashes() setStatus(tr("Finding file hashes...")); setProgress(1, 5); auto allMods = mcInstance->loaderModList()->allMods(); - ConcurrentTask::Ptr hashingTask( - new ConcurrentTask(this, "MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); + ConcurrentTask::Ptr hashingTask(new ConcurrentTask("MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); task.reset(hashingTask); for (const QFileInfo& file : files) { const QString relative = gameRoot.relativeFilePath(file.absoluteFilePath()); diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp index 52db95077..b76883e65 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp @@ -32,7 +32,7 @@ void ModrinthCheckUpdate::executeTask() setProgress(0, (m_loaders_list.isEmpty() ? 1 : m_loaders_list.length()) * 2 + 1); auto hashing_task = - makeShared(this, "MakeModrinthHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); + makeShared("MakeModrinthHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); for (auto* resource : m_resources) { auto hash = resource->metadata()->hash; @@ -99,8 +99,7 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp // If the returned project is empty, but we have Modrinth metadata, // it means this specific version is not available if (project_obj.isEmpty()) { - qDebug() << "Mod " << m_mappings.find(hash).value()->name() << " got an empty response." - << "Hash: " << hash; + qDebug() << "Mod " << m_mappings.find(hash).value()->name() << " got an empty response." << "Hash: " << hash; ++iter; continue; } @@ -173,7 +172,7 @@ void ModrinthCheckUpdate::checkNextLoader() m_loader_idx++; return; } - + if (m_loader_idx < m_loaders_list.size()) { getUpdateModsForLoader(m_loaders_list.at(m_loader_idx)); m_loader_idx++; diff --git a/launcher/net/NetJob.cpp b/launcher/net/NetJob.cpp index 3cd3958f7..335e360b2 100644 --- a/launcher/net/NetJob.cpp +++ b/launcher/net/NetJob.cpp @@ -45,7 +45,7 @@ #endif NetJob::NetJob(QString job_name, shared_qobject_ptr network, int max_concurrent) - : ConcurrentTask(nullptr, job_name), m_network(network) + : ConcurrentTask(job_name), m_network(network) { #if defined(LAUNCHER_APPLICATION) if (APPLICATION_DYN && max_concurrent < 0) diff --git a/launcher/tasks/ConcurrentTask.cpp b/launcher/tasks/ConcurrentTask.cpp index f2ee40c31..ad2a14c42 100644 --- a/launcher/tasks/ConcurrentTask.cpp +++ b/launcher/tasks/ConcurrentTask.cpp @@ -38,7 +38,7 @@ #include #include "tasks/Task.h" -ConcurrentTask::ConcurrentTask(QObject* parent, QString task_name, int max_concurrent) : Task(parent), m_total_max_size(max_concurrent) +ConcurrentTask::ConcurrentTask(QString task_name, int max_concurrent) : Task(), m_total_max_size(max_concurrent) { setObjectName(task_name); } diff --git a/launcher/tasks/ConcurrentTask.h b/launcher/tasks/ConcurrentTask.h index 0d6709940..d988623b9 100644 --- a/launcher/tasks/ConcurrentTask.h +++ b/launcher/tasks/ConcurrentTask.h @@ -48,7 +48,7 @@ class ConcurrentTask : public Task { public: using Ptr = shared_qobject_ptr; - explicit ConcurrentTask(QObject* parent = nullptr, QString task_name = "", int max_concurrent = 6); + explicit ConcurrentTask(QString task_name = "", int max_concurrent = 6); ~ConcurrentTask() override; // safe to call before starting the task diff --git a/launcher/tasks/MultipleOptionsTask.cpp b/launcher/tasks/MultipleOptionsTask.cpp index 5afe03964..ba0c23542 100644 --- a/launcher/tasks/MultipleOptionsTask.cpp +++ b/launcher/tasks/MultipleOptionsTask.cpp @@ -36,7 +36,7 @@ #include -MultipleOptionsTask::MultipleOptionsTask(QObject* parent, const QString& task_name) : ConcurrentTask(parent, task_name, 1) {} +MultipleOptionsTask::MultipleOptionsTask(const QString& task_name) : ConcurrentTask(task_name, 1) {} void MultipleOptionsTask::executeNextSubTask() { diff --git a/launcher/tasks/MultipleOptionsTask.h b/launcher/tasks/MultipleOptionsTask.h index 9a88a9999..7a19ed6ad 100644 --- a/launcher/tasks/MultipleOptionsTask.h +++ b/launcher/tasks/MultipleOptionsTask.h @@ -42,7 +42,7 @@ class MultipleOptionsTask : public ConcurrentTask { Q_OBJECT public: - explicit MultipleOptionsTask(QObject* parent = nullptr, const QString& task_name = ""); + explicit MultipleOptionsTask(const QString& task_name = ""); ~MultipleOptionsTask() override = default; private slots: diff --git a/launcher/tasks/SequentialTask.cpp b/launcher/tasks/SequentialTask.cpp index 509d91cf7..2e48414f2 100644 --- a/launcher/tasks/SequentialTask.cpp +++ b/launcher/tasks/SequentialTask.cpp @@ -38,7 +38,7 @@ #include #include "tasks/ConcurrentTask.h" -SequentialTask::SequentialTask(QObject* parent, QString task_name) : ConcurrentTask(parent, task_name, 1) {} +SequentialTask::SequentialTask(QString task_name) : ConcurrentTask(task_name, 1) {} void SequentialTask::subTaskFailed(Task::Ptr task, const QString& msg) { diff --git a/launcher/tasks/SequentialTask.h b/launcher/tasks/SequentialTask.h index a7c101ab4..77cd4387f 100644 --- a/launcher/tasks/SequentialTask.h +++ b/launcher/tasks/SequentialTask.h @@ -47,7 +47,7 @@ class SequentialTask : public ConcurrentTask { Q_OBJECT public: - explicit SequentialTask(QObject* parent = nullptr, QString task_name = ""); + explicit SequentialTask(QString task_name = ""); ~SequentialTask() override = default; protected slots: diff --git a/launcher/tasks/Task.cpp b/launcher/tasks/Task.cpp index b17096ca7..1871c5df8 100644 --- a/launcher/tasks/Task.cpp +++ b/launcher/tasks/Task.cpp @@ -40,7 +40,7 @@ Q_LOGGING_CATEGORY(taskLogC, "launcher.task") -Task::Task(QObject* parent, bool show_debug) : QObject(parent), m_show_debug(show_debug) +Task::Task(bool show_debug) : m_show_debug(show_debug) { m_uid = QUuid::createUuid(); setAutoDelete(false); diff --git a/launcher/tasks/Task.h b/launcher/tasks/Task.h index 883408c97..e712700a1 100644 --- a/launcher/tasks/Task.h +++ b/launcher/tasks/Task.h @@ -87,7 +87,7 @@ class Task : public QObject, public QRunnable { enum class State { Inactive, Running, Succeeded, Failed, AbortedByUser }; public: - explicit Task(QObject* parent = 0, bool show_debug_log = true); + explicit Task(bool show_debug_log = true); virtual ~Task() = default; bool isRunning() const; diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index a02f527de..b3b6d2bcc 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -46,7 +46,7 @@ BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, cons : QDialog(parent), ui(new Ui::BlockedModsDialog), m_mods(mods), m_hash_type(hash_type) { m_hashing_task = shared_qobject_ptr( - new ConcurrentTask(this, "MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); + new ConcurrentTask("MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); connect(m_hashing_task.get(), &Task::finished, this, &BlockedModsDialog::hashTaskFinished); ui->setupUi(this); diff --git a/launcher/ui/dialogs/MSALoginDialog.cpp b/launcher/ui/dialogs/MSALoginDialog.cpp index 2f6c6d9b2..40d1eff1e 100644 --- a/launcher/ui/dialogs/MSALoginDialog.cpp +++ b/launcher/ui/dialogs/MSALoginDialog.cpp @@ -85,7 +85,7 @@ int MSALoginDialog::exec() connect(m_authflow_task.get(), &AuthFlow::authorizeWithBrowserWithExtra, this, &MSALoginDialog::authorizeWithBrowserWithExtra); connect(ui->buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, m_authflow_task.get(), &Task::abort); - m_devicecode_task.reset(new AuthFlow(m_account->accountData(), AuthFlow::Action::DeviceCode, this)); + m_devicecode_task.reset(new AuthFlow(m_account->accountData(), AuthFlow::Action::DeviceCode)); connect(m_devicecode_task.get(), &Task::failed, this, &MSALoginDialog::onTaskFailed); connect(m_devicecode_task.get(), &Task::succeeded, this, &QDialog::accept); connect(m_devicecode_task.get(), &Task::aborted, this, &MSALoginDialog::reject); diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.cpp b/launcher/ui/dialogs/ResourceDownloadDialog.cpp index f9b6716af..bd398aa75 100644 --- a/launcher/ui/dialogs/ResourceDownloadDialog.cpp +++ b/launcher/ui/dialogs/ResourceDownloadDialog.cpp @@ -298,7 +298,7 @@ GetModDependenciesTask::Ptr ModDownloadDialog::getModDependenciesTask() selectedVers.append(std::make_shared(selected->getPack(), selected->getVersion())); } - return makeShared(this, m_instance, model, selectedVers); + return makeShared(m_instance, model, selectedVers); } } return nullptr; diff --git a/launcher/ui/dialogs/ResourceUpdateDialog.cpp b/launcher/ui/dialogs/ResourceUpdateDialog.cpp index 958bc9683..e2e337fa3 100644 --- a/launcher/ui/dialogs/ResourceUpdateDialog.cpp +++ b/launcher/ui/dialogs/ResourceUpdateDialog.cpp @@ -45,8 +45,7 @@ ResourceUpdateDialog::ResourceUpdateDialog(QWidget* parent, , m_parent(parent) , m_resource_model(resource_model) , m_candidates(search_for) - , m_second_try_metadata( - new ConcurrentTask(nullptr, "Second Metadata Search", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())) + , m_second_try_metadata(new ConcurrentTask("Second Metadata Search", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())) , m_instance(instance) , m_include_deps(include_deps) , m_filter_loaders(filter_loaders) @@ -90,7 +89,7 @@ void ResourceUpdateDialog::checkCandidates() auto versions = mcVersions(m_instance); auto loadersList = m_filter_loaders ? mcLoadersList(m_instance) : QList(); - SequentialTask check_task(m_parent, tr("Checking for updates")); + SequentialTask check_task(tr("Checking for updates")); if (!m_modrinth_to_update.empty()) { m_modrinth_check_task.reset(new ModrinthCheckUpdate(m_modrinth_to_update, versions, loadersList, m_resource_model)); @@ -195,7 +194,7 @@ void ResourceUpdateDialog::checkCandidates() auto* mod_model = dynamic_cast(m_resource_model.get()); if (mod_model != nullptr) { - auto depTask = makeShared(this, m_instance, mod_model, selectedVers); + auto depTask = makeShared(m_instance, mod_model, selectedVers); connect(depTask.get(), &Task::failed, this, [&](const QString& reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); @@ -265,7 +264,7 @@ auto ResourceUpdateDialog::ensureMetadata() -> bool { auto index_dir = indexDir(); - SequentialTask seq(m_parent, tr("Looking for metadata")); + SequentialTask seq(tr("Looking for metadata")); // A better use of data structures here could remove the need for this QHash QHash should_try_others; diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index dc43ea4c9..5f69b9d46 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -317,7 +317,7 @@ void InstallDialog::done(int result) deletePath(); } #if defined(Q_OS_MACOS) - auto seq = makeShared(this, tr("Install Java")); + auto seq = makeShared(tr("Install Java")); seq->addTask(task); seq->addTask(makeShared(final_path)); task = seq; diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index b9e0cfeef..64d8f6b6c 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -155,7 +155,7 @@ void ModFolderPage::downloadMods() ResourceDownload::ModDownloadDialog mdownload(this, m_model, m_instance); if (mdownload.exec()) { - auto tasks = new ConcurrentTask(this, tr("Download Mods"), APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask(tr("Download Mods"), APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -238,7 +238,7 @@ void ModFolderPage::updateMods(bool includeDeps) } if (update_dialog.exec()) { - auto tasks = new ConcurrentTask(this, "Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -310,7 +310,7 @@ void ModFolderPage::changeModVersion() ResourceDownload::ModDownloadDialog mdownload(this, m_model, m_instance); mdownload.setResourceMetadata((*mods_list.begin())->metadata()); if (mdownload.exec()) { - auto tasks = new ConcurrentTask(this, "Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); diff --git a/launcher/ui/pages/instance/ResourcePackPage.cpp b/launcher/ui/pages/instance/ResourcePackPage.cpp index 97d61058e..79e677765 100644 --- a/launcher/ui/pages/instance/ResourcePackPage.cpp +++ b/launcher/ui/pages/instance/ResourcePackPage.cpp @@ -37,8 +37,6 @@ #include "ResourcePackPage.h" -#include "ResourceDownloadTask.h" - #include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/ProgressDialog.h" #include "ui/dialogs/ResourceDownloadDialog.h" @@ -88,8 +86,7 @@ void ResourcePackPage::downloadResourcePacks() ResourceDownload::ResourcePackDownloadDialog mdownload(this, m_model, m_instance); if (mdownload.exec()) { - auto tasks = - new ConcurrentTask(this, "Download Resource Pack", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Resource Pack", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -168,8 +165,7 @@ void ResourcePackPage::updateResourcePacks() } if (update_dialog.exec()) { - auto tasks = - new ConcurrentTask(this, "Download Resource Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Resource Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -234,7 +230,7 @@ void ResourcePackPage::changeResourcePackVersion() if (rows.count() != 1) return; - Resource &resource = m_model->at(m_filterModel->mapToSource(rows[0]).row()); + Resource& resource = m_model->at(m_filterModel->mapToSource(rows[0]).row()); if (resource.metadata() == nullptr) return; @@ -242,8 +238,7 @@ void ResourcePackPage::changeResourcePackVersion() ResourceDownload::ResourcePackDownloadDialog mdownload(this, m_model, m_instance); mdownload.setResourceMetadata(resource.metadata()); if (mdownload.exec()) { - auto tasks = - new ConcurrentTask(this, "Download Resource Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Resource Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); diff --git a/launcher/ui/pages/instance/ShaderPackPage.cpp b/launcher/ui/pages/instance/ShaderPackPage.cpp index c734f539e..a287d3edf 100644 --- a/launcher/ui/pages/instance/ShaderPackPage.cpp +++ b/launcher/ui/pages/instance/ShaderPackPage.cpp @@ -83,7 +83,7 @@ void ShaderPackPage::downloadShaderPack() ResourceDownload::ShaderPackDownloadDialog mdownload(this, m_model, m_instance); if (mdownload.exec()) { - auto tasks = new ConcurrentTask(this, "Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -162,7 +162,7 @@ void ShaderPackPage::updateShaderPacks() } if (update_dialog.exec()) { - auto tasks = new ConcurrentTask(this, "Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -227,7 +227,7 @@ void ShaderPackPage::changeShaderPackVersion() if (rows.count() != 1) return; - Resource &resource = m_model->at(m_filterModel->mapToSource(rows[0]).row()); + Resource& resource = m_model->at(m_filterModel->mapToSource(rows[0]).row()); if (resource.metadata() == nullptr) return; @@ -235,8 +235,7 @@ void ShaderPackPage::changeShaderPackVersion() ResourceDownload::ShaderPackDownloadDialog mdownload(this, m_model, m_instance); mdownload.setResourceMetadata(resource.metadata()); if (mdownload.exec()) { - auto tasks = - new ConcurrentTask(this, "Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); diff --git a/launcher/ui/pages/instance/TexturePackPage.cpp b/launcher/ui/pages/instance/TexturePackPage.cpp index 990ee2b2e..fd1e0a2fc 100644 --- a/launcher/ui/pages/instance/TexturePackPage.cpp +++ b/launcher/ui/pages/instance/TexturePackPage.cpp @@ -92,8 +92,7 @@ void TexturePackPage::downloadTexturePacks() ResourceDownload::TexturePackDownloadDialog mdownload(this, m_model, m_instance); if (mdownload.exec()) { - auto tasks = - new ConcurrentTask(this, "Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -172,8 +171,7 @@ void TexturePackPage::updateTexturePacks() } if (update_dialog.exec()) { - auto tasks = - new ConcurrentTask(this, "Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -223,7 +221,8 @@ void TexturePackPage::deleteTexturePackMetadata() m_model->deleteMetadata(selection); } -void TexturePackPage::changeTexturePackVersion() { +void TexturePackPage::changeTexturePackVersion() +{ if (m_instance->typeName() != "Minecraft") return; // this is a null instance or a legacy instance @@ -237,7 +236,7 @@ void TexturePackPage::changeTexturePackVersion() { if (rows.count() != 1) return; - Resource &resource = m_model->at(m_filterModel->mapToSource(rows[0]).row()); + Resource& resource = m_model->at(m_filterModel->mapToSource(rows[0]).row()); if (resource.metadata() == nullptr) return; @@ -245,8 +244,7 @@ void TexturePackPage::changeTexturePackVersion() { ResourceDownload::TexturePackDownloadDialog mdownload(this, m_model, m_instance); mdownload.setResourceMetadata(resource.metadata()); if (mdownload.exec()) { - auto tasks = - new ConcurrentTask(this, "Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index cb04f9db1..ab1c48ed4 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -435,7 +435,7 @@ void VersionPage::on_actionDownload_All_triggered() if (updateTasks.isEmpty()) { return; } - auto task = makeShared(this); + auto task = makeShared(); for (auto t : updateTasks) { task->addTask(t); } diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 2b270c482..6efd3f581 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -460,7 +460,7 @@ void JavaSettingsWidget::checkJavaPath(const QString& path) } setJavaStatus(JavaStatus::Pending); m_checker.reset( - new JavaChecker(path, "", minHeapSize(), maxHeapSize(), m_permGenSpinBox->isVisible() ? m_permGenSpinBox->value() : 0, 0, this)); + new JavaChecker(path, "", minHeapSize(), maxHeapSize(), m_permGenSpinBox->isVisible() ? m_permGenSpinBox->value() : 0, 0)); connect(m_checker.get(), &JavaChecker::checkFinished, this, &JavaSettingsWidget::checkFinished); m_checker->start(); } diff --git a/tests/Task_test.cpp b/tests/Task_test.cpp index 0740ba0a3..463e78b42 100644 --- a/tests/Task_test.cpp +++ b/tests/Task_test.cpp @@ -16,7 +16,7 @@ class BasicTask : public Task { friend class TaskTest; public: - BasicTask(bool show_debug_log = true) : Task(nullptr, show_debug_log) {} + BasicTask(bool show_debug_log = true) : Task(show_debug_log) {} private: void executeTask() override { emitSucceeded(); } From 99cfb6237030f03c148e531da78b8da8f7d4c2f1 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 1 Nov 2024 11:03:47 +0200 Subject: [PATCH 341/616] use isPortable to determine if the MSAStep should check for url handler Signed-off-by: Trial97 --- launcher/minecraft/auth/steps/MSAStep.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/launcher/minecraft/auth/steps/MSAStep.cpp b/launcher/minecraft/auth/steps/MSAStep.cpp index 74999414c..151ee4e68 100644 --- a/launcher/minecraft/auth/steps/MSAStep.cpp +++ b/launcher/minecraft/auth/steps/MSAStep.cpp @@ -85,8 +85,7 @@ class CustomOAuthOobReplyHandler : public QOAuthOobReplyHandler { MSAStep::MSAStep(AccountData* data, bool silent) : AuthStep(data), m_silent(silent) { m_clientId = APPLICATION->getMSAClientID(); - if (QCoreApplication::applicationFilePath().startsWith("/tmp/.mount_") || - QFile::exists(FS::PathCombine(APPLICATION->root(), "portable.txt")) || !isSchemeHandlerRegistered()) + if (QCoreApplication::applicationFilePath().startsWith("/tmp/.mount_") || APPLICATION->isPortable() || !isSchemeHandlerRegistered()) { auto replyHandler = new QOAuthHttpServerReplyHandler(this); From f77f0207f779e2fe0df58f89295be3ef44853489 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 1 Nov 2024 13:44:06 +0200 Subject: [PATCH 342/616] fix the flame loaders match Signed-off-by: Trial97 --- launcher/minecraft/mod/Mod.cpp | 8 ++-- launcher/modplatform/ModIndex.cpp | 13 ++++++ launcher/modplatform/ModIndex.h | 1 + launcher/modplatform/flame/FlameAPI.cpp | 40 +++++++++++++------ launcher/modplatform/flame/FlameCheckUpdate.h | 1 - .../modrinth/ModrinthCheckUpdate.cpp | 12 +++--- launcher/modplatform/packwiz/Packwiz.cpp | 7 +--- launcher/ui/dialogs/ResourceUpdateDialog.cpp | 1 + 8 files changed, 52 insertions(+), 31 deletions(-) diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp index 4986d8ee1..50fb45d77 100644 --- a/launcher/minecraft/mod/Mod.cpp +++ b/launcher/minecraft/mod/Mod.cpp @@ -48,6 +48,7 @@ #include "Version.h" #include "minecraft/mod/ModDetails.h" #include "minecraft/mod/tasks/LocalModParseTask.h" +#include "modplatform/ModIndex.h" Mod::Mod(const QFileInfo& file) : Resource(file), m_local_details() { @@ -157,11 +158,8 @@ auto Mod::loaders() const -> QString if (metadata()) { QStringList loaders; auto modLoaders = metadata()->loaders; - for (auto loader : { ModPlatform::NeoForge, ModPlatform::Forge, ModPlatform::Cauldron, ModPlatform::LiteLoader, ModPlatform::Fabric, - ModPlatform::Quilt }) { - if (modLoaders & loader) { - loaders << getModLoaderAsString(loader); - } + for (auto loader : ModPlatform::modLoaderTypesToList(modLoaders)) { + loaders << getModLoaderAsString(loader); } return loaders.join(", "); } diff --git a/launcher/modplatform/ModIndex.cpp b/launcher/modplatform/ModIndex.cpp index 8c85ae122..c3ecccf8e 100644 --- a/launcher/modplatform/ModIndex.cpp +++ b/launcher/modplatform/ModIndex.cpp @@ -31,6 +31,19 @@ static const QMap s_indexed_version_ty { "alpha", IndexedVersionType::VersionType::Alpha } }; +static const QList loaderList = { NeoForge, Forge, Cauldron, LiteLoader, Quilt, Fabric }; + +QList modLoaderTypesToList(ModLoaderTypes flags) +{ + QList flagList; + for (auto flag : loaderList) { + if (flags.testFlag(flag)) { + flagList.append(flag); + } + } + return flagList; +} + IndexedVersionType::IndexedVersionType(const QString& type) : IndexedVersionType(enumFromString(type)) {} IndexedVersionType::IndexedVersionType(const IndexedVersionType::VersionType& type) diff --git a/launcher/modplatform/ModIndex.h b/launcher/modplatform/ModIndex.h index d5ee12473..8fae1bf6c 100644 --- a/launcher/modplatform/ModIndex.h +++ b/launcher/modplatform/ModIndex.h @@ -32,6 +32,7 @@ namespace ModPlatform { enum ModLoaderType { NeoForge = 1 << 0, Forge = 1 << 1, Cauldron = 1 << 2, LiteLoader = 1 << 3, Fabric = 1 << 4, Quilt = 1 << 5 }; Q_DECLARE_FLAGS(ModLoaderTypes, ModLoaderType) +QList modLoaderTypesToList(ModLoaderTypes flags); enum class ResourceProvider { MODRINTH, FLAME }; diff --git a/launcher/modplatform/flame/FlameAPI.cpp b/launcher/modplatform/flame/FlameAPI.cpp index ddd48c2b1..53eadcf02 100644 --- a/launcher/modplatform/flame/FlameAPI.cpp +++ b/launcher/modplatform/flame/FlameAPI.cpp @@ -270,21 +270,35 @@ std::optional FlameAPI::getLatestVersion(QList instanceLoaders, ModPlatform::ModLoaderTypes modLoaders) { - // edge case: mod has installed for forge but the instance is fabric => fabric version will be prioritizated on update - auto bestVersion = [&versions](ModPlatform::ModLoaderTypes loader) { - std::optional ver; - for (auto file_tmp : versions) { - if (file_tmp.loaders & loader && (!ver.has_value() || file_tmp.date > ver->date)) { - ver = file_tmp; + QHash bestMatch; + auto checkVersion = [&bestMatch](const ModPlatform::IndexedVersion& version, const ModPlatform::ModLoaderType& loader) { + if (bestMatch.contains(loader)) { + auto best = bestMatch.value(loader); + if (version.date > best.date) { + bestMatch[loader] = version; + } + } else { + bestMatch[loader] = version; + } + }; + for (auto file_tmp : versions) { + auto loaders = ModPlatform::modLoaderTypesToList(file_tmp.loaders); + if (loaders.isEmpty()) { + checkVersion(file_tmp, ModPlatform::ModLoaderType(0)); + } else { + for (auto loader : loaders) { + checkVersion(file_tmp, loader); } } - return ver; - }; - for (auto l : instanceLoaders) { - auto ver = bestVersion(l); - if (ver.has_value()) { - return ver; + } + // edge case: mod has installed for forge but the instance is fabric => fabric version will be prioritizated on update + auto currentLoaders = instanceLoaders + ModPlatform::modLoaderTypesToList(modLoaders); + currentLoaders.append(ModPlatform::ModLoaderType(0)); // add a fallback in case the versions do not define a loader + + for (auto loader : currentLoaders) { + if (bestMatch.contains(loader)) { + return bestMatch.value(loader); } } - return bestVersion(modLoaders); + return {}; } diff --git a/launcher/modplatform/flame/FlameCheckUpdate.h b/launcher/modplatform/flame/FlameCheckUpdate.h index 2b5c6ac17..6543a0e04 100644 --- a/launcher/modplatform/flame/FlameCheckUpdate.h +++ b/launcher/modplatform/flame/FlameCheckUpdate.h @@ -1,6 +1,5 @@ #pragma once -#include "Application.h" #include "modplatform/CheckUpdateTask.h" #include "net/NetJob.h" diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp index 52db95077..e86447989 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp @@ -8,6 +8,7 @@ #include "QObjectPtr.h" #include "ResourceDownloadTask.h" +#include "modplatform/ModIndex.h" #include "modplatform/helpers/HashUtils.h" #include "tasks/ConcurrentTask.h" @@ -99,8 +100,7 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp // If the returned project is empty, but we have Modrinth metadata, // it means this specific version is not available if (project_obj.isEmpty()) { - qDebug() << "Mod " << m_mappings.find(hash).value()->name() << " got an empty response." - << "Hash: " << hash; + qDebug() << "Mod " << m_mappings.find(hash).value()->name() << " got an empty response." << "Hash: " << hash; ++iter; continue; } @@ -108,10 +108,8 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp // Sometimes a version may have multiple files, one with "forge" and one with "fabric", // so we may want to filter it QString loader_filter; - static auto flags = { ModPlatform::ModLoaderType::NeoForge, ModPlatform::ModLoaderType::Forge, - ModPlatform::ModLoaderType::Quilt, ModPlatform::ModLoaderType::Fabric }; - for (auto flag : flags) { - if (loader.has_value() && loader->testFlag(flag)) { + if (loader.has_value()) { + for (auto flag : ModPlatform::modLoaderTypesToList(*loader)) { loader_filter = ModPlatform::getModLoaderAsString(flag); break; } @@ -173,7 +171,7 @@ void ModrinthCheckUpdate::checkNextLoader() m_loader_idx++; return; } - + if (m_loader_idx < m_loaders_list.size()) { getUpdateModsForLoader(m_loaders_list.at(m_loader_idx)); m_loader_idx++; diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index bbccb72b8..a3bb74399 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -190,11 +190,8 @@ void V1::updateModIndex(const QDir& index_dir, Mod& mod) } toml::array loaders; - for (auto loader : { ModPlatform::NeoForge, ModPlatform::Forge, ModPlatform::Cauldron, ModPlatform::LiteLoader, ModPlatform::Fabric, - ModPlatform::Quilt }) { - if (mod.loaders & loader) { - loaders.push_back(getModLoaderAsString(loader).toStdString()); - } + for (auto loader : ModPlatform::modLoaderTypesToList(mod.loaders)) { + loaders.push_back(getModLoaderAsString(loader).toStdString()); } toml::array mcVersions; for (auto version : mod.mcVersions) { diff --git a/launcher/ui/dialogs/ResourceUpdateDialog.cpp b/launcher/ui/dialogs/ResourceUpdateDialog.cpp index 958bc9683..bfa1fae2b 100644 --- a/launcher/ui/dialogs/ResourceUpdateDialog.cpp +++ b/launcher/ui/dialogs/ResourceUpdateDialog.cpp @@ -1,4 +1,5 @@ #include "ResourceUpdateDialog.h" +#include "Application.h" #include "ChooseProviderDialog.h" #include "CustomMessageBox.h" #include "ProgressDialog.h" From 6f2f3c2d3bf6a170060523ad47fe69fef57bd9b4 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 1 Nov 2024 17:34:29 +0200 Subject: [PATCH 343/616] disable retry for modrinth currentVersions API Signed-off-by: Trial97 --- launcher/modplatform/modrinth/ModrinthAPI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/modplatform/modrinth/ModrinthAPI.cpp b/launcher/modplatform/modrinth/ModrinthAPI.cpp index 323711e02..a954f65a5 100644 --- a/launcher/modplatform/modrinth/ModrinthAPI.cpp +++ b/launcher/modplatform/modrinth/ModrinthAPI.cpp @@ -34,7 +34,7 @@ Task::Ptr ModrinthAPI::currentVersions(const QStringList& hashes, QString hash_f auto body_raw = body.toJson(); netJob->addNetAction(Net::ApiUpload::makeByteArray(QString(BuildConfig.MODRINTH_PROD_URL + "/version_files"), response, body_raw)); - + netJob->setAskRetry(false); return netJob; } From d63a3364111a99337c2096c807550f3d7c62b47a Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Tue, 5 Nov 2024 01:10:38 -0700 Subject: [PATCH 344/616] ci: bump linux qt version Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6c167d8f1..90f74fae5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -59,14 +59,14 @@ jobs: qt_ver: 5 qt_host: linux qt_arch: "" - qt_version: "5.12.8" + qt_version: "5.15.2" qt_modules: "qtnetworkauth" - os: ubuntu-20.04 qt_ver: 6 qt_host: linux qt_arch: "" - qt_version: "6.2.4" + qt_version: "6.5.3" qt_modules: "qt5compat qtimageformats qtnetworkauth" - os: windows-2022 From ba6743d134589294ac3ba754e6ad83c2e59d4ffd Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Tue, 5 Nov 2024 01:30:55 -0700 Subject: [PATCH 345/616] ci: libxcb-curcsor_dev ? Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 90f74fae5..2cefa8100 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -206,7 +206,7 @@ jobs: if: runner.os == 'Linux' run: | sudo apt-get -y update - sudo apt-get -y install ninja-build extra-cmake-modules scdoc appstream + sudo apt-get -y install ninja-build extra-cmake-modules scdoc appstream libxcb-cursor-dev - name: Install Dependencies (macOS) if: runner.os == 'macOS' From b67d400f607b92b717a65a49af72cb8ae3186794 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 6 Nov 2024 15:56:10 +0000 Subject: [PATCH 346/616] Update formatting guidelines Signed-off-by: TheKodeToad --- CONTRIBUTING.md | 54 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 072916772..d76f992eb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,16 +2,54 @@ ## Code formatting -Try to follow the existing formatting. -If there is no existing formatting, you may use `clang-format` with our included `.clang-format` configuration. +All files are formatted with `clang-format` using the configuration in `.clang-format`. Ensure it is run on changed files before committing! -In general, in order of importance: +We have no tool for enforcing names but please follow the following conventions for C++: +- Class and type names should be formatted as `PascalCase`: `MyClass`. +- Private, non-`static const` class data members should be formatted as `camelCase` prefixed with `m_`: `m_myCounter`. +- Public, non-`static const` should be the same but without the prefix: `dateOfBirth`. +- Class function members should be formatted as `camelCase` without a prefix: `incrementCounter`. +- Non-`const` global variables should be formatted as `camelCase` without a prefix: `globalData`. And, of course, should be avoided where possible. +- `const` global variables, `static const` class data members, macros, and enum constants should be formatted as `SCREAMING_SNAKE_CASE`: `LIGHT_GRAY`. +- Avoid inventing acronyms or abbreviations especially for a name of multiple words - like `tp` for `texturePack`. -- Make sure your IDE is not messing up line endings or whitespace and avoid using linters. -- Prefer readability over dogma. -- Keep to the existing formatting. -- Indent with 4 space unless it's in a submodule. -- Keep lists (of arguments, parameters, initializers...) as lists, not paragraphs. It should either read from top to bottom, or left to right. Not both. +Here is what these conventions with the formatting configuration look like: + +```c++ +#define AWESOMENESS 10 + +constexpr double PI = 3.14159; + +enum class PizzaToppings { HAM_AND_PINEAPPLE, OREO_AND_KETCHUP }; + +struct Person { + QString name; + QDateTime dateOfBirth; + + long daysOld() const { return dateOfBirth.daysTo(QDateTime::currentDateTime()); } +}; + +class ImportantClass { + public: + void incrementCounter() + { + if (m_counter + 1 > MAX_COUNTER_VALUE) + throw std::runtime_error("Counter has reached limit!"); + + ++m_counter; + } + + int counter() const { return m_counter; } + + private: + static constexpr int MAX_COUNTER_VALUE = 100; + int m_counter; +}; + +ImportantClass importantClassInstance; +``` + +If you see any names which do not follow these conventions, it is preferred that you leave them be - renames increase the number of changes therefore make reviewing harder and make your PR more prone to conflicts. However, if you're refactoring a whole class anyway, it's fine. ## Signing your work From 0a80da28fa168456584dd05938bce790d09b5ca4 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 6 Nov 2024 19:29:57 +0100 Subject: [PATCH 347/616] chore: update Nix readme Signed-off-by: Sefa Eyeoglu --- nix/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nix/README.md b/nix/README.md index 8bb658477..7c43658f9 100644 --- a/nix/README.md +++ b/nix/README.md @@ -4,7 +4,7 @@ Prism Launcher is packaged in [nixpkgs](https://github.com/NixOS/nixpkgs/) since 22.11. -See [Package variants](#package-variants) for a list of available packages. +Check the [NixOS Wiki](https://wiki.nixos.org/wiki/Prism_Launcher) for up-to-date instructions. ## Installing a development release (flake) @@ -223,4 +223,3 @@ The following parameters can be overridden: - `jdks` (default: `[ jdk21 jdk17 jdk8 ]`) Java runtimes added to `PRISMLAUNCHER_JAVA_PATHS` variable - `msaClientID` (default: `null`, requires full rebuild!) Client ID used for Microsoft Authentication - `textToSpeechSupport` (default: `isLinux`) Turn on/off support for text-to-speech on Linux (macOS will always have this) -- `withWaylandGLFW` (default: `isLinux`) Build with support for native Wayland via a custom GLFW From 8ecc21c09371914fc8cc44e1596ced949f0cbb39 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 6 Nov 2024 22:12:22 +0000 Subject: [PATCH 348/616] Make Ryex's suggested change Signed-off-by: TheKodeToad --- CONTRIBUTING.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d76f992eb..f016391d3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,11 +6,13 @@ All files are formatted with `clang-format` using the configuration in `.clang-f We have no tool for enforcing names but please follow the following conventions for C++: - Class and type names should be formatted as `PascalCase`: `MyClass`. -- Private, non-`static const` class data members should be formatted as `camelCase` prefixed with `m_`: `m_myCounter`. -- Public, non-`static const` should be the same but without the prefix: `dateOfBirth`. +- Private or protected class data members should be formatted as `camelCase` prefixed with `m_`: `m_myCounter`. +- Private or protected `static` class data members should be formatted as `camelCase` prefixed with `s_`: `s_instance`. +- Public class data members should be formatted as `camelCase` without the prefix: `dateOfBirth`. +- Public, private or protected `static const` class data members should be formatted as `SCREAMING_SNAKE_CASE`: `MAX_VALUE`. - Class function members should be formatted as `camelCase` without a prefix: `incrementCounter`. - Non-`const` global variables should be formatted as `camelCase` without a prefix: `globalData`. And, of course, should be avoided where possible. -- `const` global variables, `static const` class data members, macros, and enum constants should be formatted as `SCREAMING_SNAKE_CASE`: `LIGHT_GRAY`. +- `const` global variables, macros, and enum constants should be formatted as `SCREAMING_SNAKE_CASE`: `LIGHT_GRAY`. - Avoid inventing acronyms or abbreviations especially for a name of multiple words - like `tp` for `texturePack`. Here is what these conventions with the formatting configuration look like: From e6d4e5d78dfacc4836a3a2240d6531cdc2dcee76 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 6 Nov 2024 23:46:30 +0000 Subject: [PATCH 349/616] Unify instance and global settings pt.1 Signed-off-by: TheKodeToad --- launcher/Application.cpp | 4 - launcher/CMakeLists.txt | 12 +- launcher/InstancePageProvider.h | 2 +- .../ui/pages/global/CustomCommandsPage.cpp | 84 -- .../pages/global/EnvironmentVariablesPage.cpp | 71 -- .../pages/global/EnvironmentVariablesPage.h | 42 - launcher/ui/pages/global/MinecraftPage.cpp | 185 ---- launcher/ui/pages/global/MinecraftPage.h | 28 +- .../pages/instance/InstanceSettingsPage.cpp | 611 ------------ .../ui/pages/instance/InstanceSettingsPage.h | 74 +- .../ui/widgets/MinecraftSettingsWidget.cpp | 320 +++++++ .../MinecraftSettingsWidget.h} | 34 +- .../ui/widgets/MinecraftSettingsWidget.ui | 876 ++++++++++++++++++ 13 files changed, 1244 insertions(+), 1099 deletions(-) delete mode 100644 launcher/ui/pages/global/CustomCommandsPage.cpp delete mode 100644 launcher/ui/pages/global/EnvironmentVariablesPage.cpp delete mode 100644 launcher/ui/pages/global/EnvironmentVariablesPage.h delete mode 100644 launcher/ui/pages/global/MinecraftPage.cpp delete mode 100644 launcher/ui/pages/instance/InstanceSettingsPage.cpp create mode 100644 launcher/ui/widgets/MinecraftSettingsWidget.cpp rename launcher/ui/{pages/global/CustomCommandsPage.h => widgets/MinecraftSettingsWidget.h} (69%) create mode 100644 launcher/ui/widgets/MinecraftSettingsWidget.ui diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 11b80a006..c45bb1c8c 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -59,8 +59,6 @@ #include "ui/pages/BasePageProvider.h" #include "ui/pages/global/APIPage.h" #include "ui/pages/global/AccountListPage.h" -#include "ui/pages/global/CustomCommandsPage.h" -#include "ui/pages/global/EnvironmentVariablesPage.h" #include "ui/pages/global/ExternalToolsPage.h" #include "ui/pages/global/JavaPage.h" #include "ui/pages/global/LanguagePage.h" @@ -801,8 +799,6 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_globalSettingsProvider->addPage(); m_globalSettingsProvider->addPage(); m_globalSettingsProvider->addPage(); - m_globalSettingsProvider->addPage(); - m_globalSettingsProvider->addPage(); m_globalSettingsProvider->addPage(); m_globalSettingsProvider->addPage(); m_globalSettingsProvider->addPage(); diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 486aaff3e..7a23b2300 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -908,7 +908,6 @@ SET(LAUNCHER_SOURCES ui/pages/instance/NotesPage.h ui/pages/instance/LogPage.cpp ui/pages/instance/LogPage.h - ui/pages/instance/InstanceSettingsPage.cpp ui/pages/instance/InstanceSettingsPage.h ui/pages/instance/ScreenshotsPage.cpp ui/pages/instance/ScreenshotsPage.h @@ -922,17 +921,12 @@ SET(LAUNCHER_SOURCES # GUI - global settings pages ui/pages/global/AccountListPage.cpp ui/pages/global/AccountListPage.h - ui/pages/global/CustomCommandsPage.cpp - ui/pages/global/CustomCommandsPage.h - ui/pages/global/EnvironmentVariablesPage.cpp - ui/pages/global/EnvironmentVariablesPage.h ui/pages/global/ExternalToolsPage.cpp ui/pages/global/ExternalToolsPage.h ui/pages/global/JavaPage.cpp ui/pages/global/JavaPage.h ui/pages/global/LanguagePage.cpp ui/pages/global/LanguagePage.h - ui/pages/global/MinecraftPage.cpp ui/pages/global/MinecraftPage.h ui/pages/global/LauncherPage.cpp ui/pages/global/LauncherPage.h @@ -1128,6 +1122,8 @@ SET(LAUNCHER_SOURCES ui/widgets/WideBar.cpp ui/widgets/ThemeCustomizationWidget.h ui/widgets/ThemeCustomizationWidget.cpp + ui/widgets/MinecraftSettingsWidget.h + ui/widgets/MinecraftSettingsWidget.cpp # GUI - instance group view ui/instanceview/InstanceProxyModel.cpp @@ -1171,7 +1167,6 @@ qt_wrap_ui(LAUNCHER_UI ui/pages/global/LauncherPage.ui ui/pages/global/APIPage.ui ui/pages/global/ProxyPage.ui - ui/pages/global/MinecraftPage.ui ui/pages/global/ExternalToolsPage.ui ui/pages/instance/ExternalResourcesPage.ui ui/pages/instance/NotesPage.ui @@ -1179,7 +1174,6 @@ qt_wrap_ui(LAUNCHER_UI ui/pages/instance/ServersPage.ui ui/pages/instance/GameOptionsPage.ui ui/pages/instance/OtherLogsPage.ui - ui/pages/instance/InstanceSettingsPage.ui ui/pages/instance/VersionPage.ui ui/pages/instance/ManagedPackPage.ui ui/pages/instance/WorldListPage.ui @@ -1202,6 +1196,7 @@ qt_wrap_ui(LAUNCHER_UI ui/widgets/ModFilterWidget.ui ui/widgets/SubTaskProgressBar.ui ui/widgets/ThemeCustomizationWidget.ui + ui/widgets/MinecraftSettingsWidget.ui ui/dialogs/CopyInstanceDialog.ui ui/dialogs/ProfileSetupDialog.ui ui/dialogs/ProgressDialog.ui @@ -1222,7 +1217,6 @@ qt_wrap_ui(LAUNCHER_UI ui/dialogs/ScrollMessageBox.ui ui/dialogs/BlockedModsDialog.ui ui/dialogs/ChooseProviderDialog.ui - ui/dialogs/skins/SkinManageDialog.ui ) diff --git a/launcher/InstancePageProvider.h b/launcher/InstancePageProvider.h index 174041f89..1d7c193f8 100644 --- a/launcher/InstancePageProvider.h +++ b/launcher/InstancePageProvider.h @@ -43,7 +43,7 @@ class InstancePageProvider : protected QObject, public BasePageProvider { values.append(new ServersPage(onesix)); // values.append(new GameOptionsPage(onesix.get())); values.append(new ScreenshotsPage(FS::PathCombine(onesix->gameRoot(), "screenshots"))); - values.append(new InstanceSettingsPage(onesix.get())); + values.append(new InstanceSettingsPage(onesix)); auto logMatcher = inst->getLogFileMatcher(); if (logMatcher) { values.append(new OtherLogsPage(inst->getLogFileRoot(), logMatcher)); diff --git a/launcher/ui/pages/global/CustomCommandsPage.cpp b/launcher/ui/pages/global/CustomCommandsPage.cpp deleted file mode 100644 index cc8518c2f..000000000 --- a/launcher/ui/pages/global/CustomCommandsPage.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (c) 2022 Jamie Mansfield - * Copyright (C) 2022 Sefa Eyeoglu - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * This file incorporates work covered by the following copyright and - * permission notice: - * - * Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "CustomCommandsPage.h" -#include -#include -#include - -CustomCommandsPage::CustomCommandsPage(QWidget* parent) : QWidget(parent) -{ - auto verticalLayout = new QVBoxLayout(this); - verticalLayout->setObjectName(QStringLiteral("verticalLayout")); - verticalLayout->setContentsMargins(0, 0, 0, 0); - - auto tabWidget = new QTabWidget(this); - tabWidget->setObjectName(QStringLiteral("tabWidget")); - commands = new CustomCommands(this); - commands->setContentsMargins(6, 6, 6, 6); - tabWidget->addTab(commands, "Foo"); - tabWidget->tabBar()->hide(); - verticalLayout->addWidget(tabWidget); - loadSettings(); -} - -CustomCommandsPage::~CustomCommandsPage() {} - -bool CustomCommandsPage::apply() -{ - applySettings(); - return true; -} - -void CustomCommandsPage::applySettings() -{ - auto s = APPLICATION->settings(); - s->set("PreLaunchCommand", commands->prelaunchCommand()); - s->set("WrapperCommand", commands->wrapperCommand()); - s->set("PostExitCommand", commands->postexitCommand()); -} - -void CustomCommandsPage::loadSettings() -{ - auto s = APPLICATION->settings(); - commands->initialize(false, true, s->get("PreLaunchCommand").toString(), s->get("WrapperCommand").toString(), - s->get("PostExitCommand").toString()); -} - -void CustomCommandsPage::retranslate() -{ - commands->retranslate(); -} diff --git a/launcher/ui/pages/global/EnvironmentVariablesPage.cpp b/launcher/ui/pages/global/EnvironmentVariablesPage.cpp deleted file mode 100644 index 2d44ed624..000000000 --- a/launcher/ui/pages/global/EnvironmentVariablesPage.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (C) 2023 TheKodeToad - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include - -#include "EnvironmentVariablesPage.h" - -EnvironmentVariablesPage::EnvironmentVariablesPage(QWidget* parent) : QWidget(parent) -{ - auto verticalLayout = new QVBoxLayout(this); - verticalLayout->setObjectName(QStringLiteral("verticalLayout")); - verticalLayout->setContentsMargins(0, 0, 0, 0); - - auto tabWidget = new QTabWidget(this); - tabWidget->setObjectName(QStringLiteral("tabWidget")); - variables = new EnvironmentVariables(this); - variables->setContentsMargins(6, 6, 6, 6); - tabWidget->addTab(variables, "Foo"); - tabWidget->tabBar()->hide(); - verticalLayout->addWidget(tabWidget); - - variables->initialize(false, false, APPLICATION->settings()->get("Env").toMap()); -} - -QString EnvironmentVariablesPage::displayName() const -{ - return tr("Environment Variables"); -} - -QIcon EnvironmentVariablesPage::icon() const -{ - return APPLICATION->getThemedIcon("environment-variables"); -} - -QString EnvironmentVariablesPage::id() const -{ - return "environment-variables"; -} - -QString EnvironmentVariablesPage::helpPage() const -{ - return "Environment-variables"; -} - -bool EnvironmentVariablesPage::apply() -{ - APPLICATION->settings()->set("Env", variables->value()); - return true; -} - -void EnvironmentVariablesPage::retranslate() -{ - variables->retranslate(); -} diff --git a/launcher/ui/pages/global/EnvironmentVariablesPage.h b/launcher/ui/pages/global/EnvironmentVariablesPage.h deleted file mode 100644 index 6e80775ec..000000000 --- a/launcher/ui/pages/global/EnvironmentVariablesPage.h +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (C) 2023 TheKodeToad - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include - -#include "ui/pages/BasePage.h" -#include "ui/widgets/EnvironmentVariables.h" - -class EnvironmentVariablesPage : public QWidget, public BasePage { - Q_OBJECT - - public: - explicit EnvironmentVariablesPage(QWidget* parent = nullptr); - - QString displayName() const override; - QIcon icon() const override; - QString id() const override; - QString helpPage() const override; - - bool apply() override; - void retranslate() override; - - private: - EnvironmentVariables* variables; -}; diff --git a/launcher/ui/pages/global/MinecraftPage.cpp b/launcher/ui/pages/global/MinecraftPage.cpp deleted file mode 100644 index 3431dcb9c..000000000 --- a/launcher/ui/pages/global/MinecraftPage.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (c) 2022 Jamie Mansfield - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * This file incorporates work covered by the following copyright and - * permission notice: - * - * Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "MinecraftPage.h" -#include "BuildConfig.h" -#include "ui_MinecraftPage.h" - -#include -#include -#include - -#include "Application.h" -#include "settings/SettingsObject.h" - -#ifdef Q_OS_LINUX -#include "MangoHud.h" -#endif - -MinecraftPage::MinecraftPage(QWidget* parent) : QWidget(parent), ui(new Ui::MinecraftPage) -{ - ui->setupUi(this); - connect(ui->useNativeGLFWCheck, &QAbstractButton::toggled, this, &MinecraftPage::onUseNativeGLFWChanged); - connect(ui->useNativeOpenALCheck, &QAbstractButton::toggled, this, &MinecraftPage::onUseNativeOpenALChanged); - loadSettings(); - updateCheckboxStuff(); -} - -MinecraftPage::~MinecraftPage() -{ - delete ui; -} - -bool MinecraftPage::apply() -{ - applySettings(); - return true; -} - -void MinecraftPage::updateCheckboxStuff() -{ - ui->windowWidthSpinBox->setEnabled(!ui->maximizedCheckBox->isChecked()); - ui->windowHeightSpinBox->setEnabled(!ui->maximizedCheckBox->isChecked()); -} - -void MinecraftPage::on_maximizedCheckBox_clicked(bool checked) -{ - Q_UNUSED(checked); - updateCheckboxStuff(); -} - -void MinecraftPage::onUseNativeGLFWChanged(bool checked) -{ - ui->lineEditGLFWPath->setEnabled(checked); -} - -void MinecraftPage::onUseNativeOpenALChanged(bool checked) -{ - ui->lineEditOpenALPath->setEnabled(checked); -} - -void MinecraftPage::applySettings() -{ - auto s = APPLICATION->settings(); - - // Window Size - s->set("LaunchMaximized", ui->maximizedCheckBox->isChecked()); - s->set("MinecraftWinWidth", ui->windowWidthSpinBox->value()); - s->set("MinecraftWinHeight", ui->windowHeightSpinBox->value()); - - // Native library workarounds - s->set("UseNativeGLFW", ui->useNativeGLFWCheck->isChecked()); - s->set("CustomGLFWPath", ui->lineEditGLFWPath->text()); - s->set("UseNativeOpenAL", ui->useNativeOpenALCheck->isChecked()); - s->set("CustomOpenALPath", ui->lineEditOpenALPath->text()); - - // Peformance related options - s->set("EnableFeralGamemode", ui->enableFeralGamemodeCheck->isChecked()); - s->set("EnableMangoHud", ui->enableMangoHud->isChecked()); - s->set("UseDiscreteGpu", ui->useDiscreteGpuCheck->isChecked()); - s->set("UseZink", ui->useZink->isChecked()); - - // Game time - s->set("ShowGameTime", ui->showGameTime->isChecked()); - s->set("ShowGlobalGameTime", ui->showGlobalGameTime->isChecked()); - s->set("RecordGameTime", ui->recordGameTime->isChecked()); - s->set("ShowGameTimeWithoutDays", ui->showGameTimeWithoutDays->isChecked()); - - // Miscellaneous - s->set("CloseAfterLaunch", ui->closeAfterLaunchCheck->isChecked()); - s->set("QuitAfterGameStop", ui->quitAfterGameStopCheck->isChecked()); - - // Legacy settings - s->set("OnlineFixes", ui->onlineFixes->isChecked()); -} - -void MinecraftPage::loadSettings() -{ - auto s = APPLICATION->settings(); - - // Window Size - ui->maximizedCheckBox->setChecked(s->get("LaunchMaximized").toBool()); - ui->windowWidthSpinBox->setValue(s->get("MinecraftWinWidth").toInt()); - ui->windowHeightSpinBox->setValue(s->get("MinecraftWinHeight").toInt()); - - ui->useNativeGLFWCheck->setChecked(s->get("UseNativeGLFW").toBool()); - ui->lineEditGLFWPath->setText(s->get("CustomGLFWPath").toString()); - ui->lineEditGLFWPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.GLFW_LIBRARY_NAME)); -#ifdef Q_OS_LINUX - if (!APPLICATION->m_detectedGLFWPath.isEmpty()) - ui->lineEditGLFWPath->setPlaceholderText(tr("Auto detected path: %1").arg(APPLICATION->m_detectedGLFWPath)); -#endif - ui->useNativeOpenALCheck->setChecked(s->get("UseNativeOpenAL").toBool()); - ui->lineEditOpenALPath->setText(s->get("CustomOpenALPath").toString()); - ui->lineEditOpenALPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.OPENAL_LIBRARY_NAME)); -#ifdef Q_OS_LINUX - if (!APPLICATION->m_detectedOpenALPath.isEmpty()) - ui->lineEditOpenALPath->setPlaceholderText(tr("Auto detected path: %1").arg(APPLICATION->m_detectedOpenALPath)); -#endif - - ui->enableFeralGamemodeCheck->setChecked(s->get("EnableFeralGamemode").toBool()); - ui->enableMangoHud->setChecked(s->get("EnableMangoHud").toBool()); - ui->useDiscreteGpuCheck->setChecked(s->get("UseDiscreteGpu").toBool()); - ui->useZink->setChecked(s->get("UseZink").toBool()); - -#if !defined(Q_OS_LINUX) - ui->perfomanceGroupBox->setVisible(false); -#endif - - if (!(APPLICATION->capabilities() & Application::SupportsGameMode)) { - ui->enableFeralGamemodeCheck->setDisabled(true); - ui->enableFeralGamemodeCheck->setToolTip(tr("Feral Interactive's GameMode could not be found on your system.")); - } - - if (!(APPLICATION->capabilities() & Application::SupportsMangoHud)) { - ui->enableMangoHud->setDisabled(true); - ui->enableMangoHud->setToolTip(tr("MangoHud could not be found on your system.")); - } - - ui->showGameTime->setChecked(s->get("ShowGameTime").toBool()); - ui->showGlobalGameTime->setChecked(s->get("ShowGlobalGameTime").toBool()); - ui->recordGameTime->setChecked(s->get("RecordGameTime").toBool()); - ui->showGameTimeWithoutDays->setChecked(s->get("ShowGameTimeWithoutDays").toBool()); - - ui->closeAfterLaunchCheck->setChecked(s->get("CloseAfterLaunch").toBool()); - ui->quitAfterGameStopCheck->setChecked(s->get("QuitAfterGameStop").toBool()); - - ui->onlineFixes->setChecked(s->get("OnlineFixes").toBool()); -} - -void MinecraftPage::retranslate() -{ - ui->retranslateUi(this); -} diff --git a/launcher/ui/pages/global/MinecraftPage.h b/launcher/ui/pages/global/MinecraftPage.h index 5facfbb3f..9c01bdec6 100644 --- a/launcher/ui/pages/global/MinecraftPage.h +++ b/launcher/ui/pages/global/MinecraftPage.h @@ -39,6 +39,7 @@ #include #include +#include #include "java/JavaChecker.h" #include "ui/pages/BasePage.h" @@ -48,31 +49,20 @@ namespace Ui { class MinecraftPage; } -class MinecraftPage : public QWidget, public BasePage { +class MinecraftPage : public MinecraftSettingsWidget, public BasePage { Q_OBJECT public: - explicit MinecraftPage(QWidget* parent = 0); - ~MinecraftPage(); + explicit MinecraftPage(QWidget* parent = nullptr) : MinecraftSettingsWidget(nullptr, parent) {} + ~MinecraftPage() override {} QString displayName() const override { return tr("Minecraft"); } QIcon icon() const override { return APPLICATION->getThemedIcon("minecraft"); } QString id() const override { return "minecraft-settings"; } QString helpPage() const override { return "Minecraft-settings"; } - bool apply() override; - void retranslate() override; - - private: - void updateCheckboxStuff(); - void applySettings(); - void loadSettings(); - - private slots: - void on_maximizedCheckBox_clicked(bool checked); - - void onUseNativeGLFWChanged(bool checked); - void onUseNativeOpenALChanged(bool checked); - - private: - Ui::MinecraftPage* ui; + bool apply() override + { + saveSettings(); + return true; + } }; diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp deleted file mode 100644 index 1a5be050f..000000000 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ /dev/null @@ -1,611 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (c) 2022 Jamie Mansfield - * Copyright (C) 2022 Sefa Eyeoglu - * Copyright (C) 2022 TheKodeToad - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * This file incorporates work covered by the following copyright and - * permission notice: - * - * Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "InstanceSettingsPage.h" -#include "minecraft/MinecraftInstance.h" -#include "minecraft/WorldList.h" -#include "settings/Setting.h" -#include "ui/dialogs/CustomMessageBox.h" -#include "ui/java/InstallJavaDialog.h" -#include "ui_InstanceSettingsPage.h" - -#include -#include -#include - -#include - -#include "ui/dialogs/VersionSelectDialog.h" -#include "ui/widgets/CustomCommands.h" - -#include "Application.h" -#include "BuildConfig.h" -#include "JavaCommon.h" -#include "minecraft/auth/AccountList.h" - -#include "FileSystem.h" -#include "java/JavaInstallList.h" -#include "java/JavaUtils.h" - -InstanceSettingsPage::InstanceSettingsPage(BaseInstance* inst, QWidget* parent) - : QWidget(parent), ui(new Ui::InstanceSettingsPage), m_instance(inst) -{ - m_settings = inst->settings(); - ui->setupUi(this); - - ui->javaDownloadBtn->setHidden(!BuildConfig.JAVA_DOWNLOADER_ENABLED); - - connect(ui->openGlobalJavaSettingsButton, &QCommandLinkButton::clicked, this, &InstanceSettingsPage::globalSettingsButtonClicked); - connect(APPLICATION, &Application::globalSettingsAboutToOpen, this, &InstanceSettingsPage::applySettings); - connect(APPLICATION, &Application::globalSettingsClosed, this, &InstanceSettingsPage::loadSettings); - connect(ui->instanceAccountSelector, QOverload::of(&QComboBox::currentIndexChanged), this, - &InstanceSettingsPage::changeInstanceAccount); - - connect(ui->useNativeGLFWCheck, &QAbstractButton::toggled, this, &InstanceSettingsPage::onUseNativeGLFWChanged); - connect(ui->useNativeOpenALCheck, &QAbstractButton::toggled, this, &InstanceSettingsPage::onUseNativeOpenALChanged); - - auto mInst = dynamic_cast(inst); - m_world_quickplay_supported = mInst && mInst->traits().contains("feature:is_quick_play_singleplayer"); - if (m_world_quickplay_supported) { - auto worlds = mInst->worldList(); - worlds->update(); - for (const auto& world : worlds->allWorlds()) { - ui->worldsCb->addItem(world.folderName()); - } - } else { - ui->worldsCb->hide(); - ui->worldJoinButton->hide(); - ui->serverJoinAddressButton->setChecked(true); - ui->serverJoinAddress->setEnabled(true); - ui->serverJoinAddressButton->setStyleSheet("QRadioButton::indicator { width: 0px; height: 0px; }"); - } - - loadSettings(); - - updateThresholds(); -} - -InstanceSettingsPage::~InstanceSettingsPage() -{ - delete ui; -} - -void InstanceSettingsPage::globalSettingsButtonClicked(bool) -{ - switch (ui->settingsTabs->currentIndex()) { - case 0: - APPLICATION->ShowGlobalSettings(this, "java-settings"); - return; - case 2: - APPLICATION->ShowGlobalSettings(this, "custom-commands"); - return; - case 3: - APPLICATION->ShowGlobalSettings(this, "environment-variables"); - return; - default: - APPLICATION->ShowGlobalSettings(this, "minecraft-settings"); - return; - } -} - -bool InstanceSettingsPage::apply() -{ - applySettings(); - return true; -} - -void InstanceSettingsPage::applySettings() -{ - SettingsObject::Lock lock(m_settings); - - // Miscellaneous - bool miscellaneous = ui->miscellaneousSettingsBox->isChecked(); - m_settings->set("OverrideMiscellaneous", miscellaneous); - if (miscellaneous) { - m_settings->set("CloseAfterLaunch", ui->closeAfterLaunchCheck->isChecked()); - m_settings->set("QuitAfterGameStop", ui->quitAfterGameStopCheck->isChecked()); - } else { - m_settings->reset("CloseAfterLaunch"); - m_settings->reset("QuitAfterGameStop"); - } - - // Console - bool console = ui->consoleSettingsBox->isChecked(); - m_settings->set("OverrideConsole", console); - if (console) { - m_settings->set("ShowConsole", ui->showConsoleCheck->isChecked()); - m_settings->set("AutoCloseConsole", ui->autoCloseConsoleCheck->isChecked()); - m_settings->set("ShowConsoleOnError", ui->showConsoleErrorCheck->isChecked()); - } else { - m_settings->reset("ShowConsole"); - m_settings->reset("AutoCloseConsole"); - m_settings->reset("ShowConsoleOnError"); - } - - // Window Size - bool window = ui->windowSizeGroupBox->isChecked(); - m_settings->set("OverrideWindow", window); - if (window) { - m_settings->set("LaunchMaximized", ui->maximizedCheckBox->isChecked()); - m_settings->set("MinecraftWinWidth", ui->windowWidthSpinBox->value()); - m_settings->set("MinecraftWinHeight", ui->windowHeightSpinBox->value()); - } else { - m_settings->reset("LaunchMaximized"); - m_settings->reset("MinecraftWinWidth"); - m_settings->reset("MinecraftWinHeight"); - } - - // Memory - bool memory = ui->memoryGroupBox->isChecked(); - m_settings->set("OverrideMemory", memory); - if (memory) { - int min = ui->minMemSpinBox->value(); - int max = ui->maxMemSpinBox->value(); - if (min < max) { - m_settings->set("MinMemAlloc", min); - m_settings->set("MaxMemAlloc", max); - } else { - m_settings->set("MinMemAlloc", max); - m_settings->set("MaxMemAlloc", min); - } - m_settings->set("PermGen", ui->permGenSpinBox->value()); - } else { - m_settings->reset("MinMemAlloc"); - m_settings->reset("MaxMemAlloc"); - m_settings->reset("PermGen"); - } - - // Java Install Settings - bool javaInstall = ui->javaSettingsGroupBox->isChecked(); - m_settings->set("OverrideJavaLocation", javaInstall); - if (javaInstall) { - m_settings->set("JavaPath", ui->javaPathTextBox->text()); - m_settings->set("IgnoreJavaCompatibility", ui->skipCompatibilityCheckbox->isChecked()); - } else { - m_settings->reset("JavaPath"); - m_settings->reset("IgnoreJavaCompatibility"); - } - - // Java arguments - bool javaArgs = ui->javaArgumentsGroupBox->isChecked(); - m_settings->set("OverrideJavaArgs", javaArgs); - if (javaArgs) { - m_settings->set("JvmArgs", ui->jvmArgsTextBox->toPlainText().replace("\n", " ")); - } else { - m_settings->reset("JvmArgs"); - } - - // Custom Commands - bool custcmd = ui->customCommands->checked(); - m_settings->set("OverrideCommands", custcmd); - if (custcmd) { - m_settings->set("PreLaunchCommand", ui->customCommands->prelaunchCommand()); - m_settings->set("WrapperCommand", ui->customCommands->wrapperCommand()); - m_settings->set("PostExitCommand", ui->customCommands->postexitCommand()); - } else { - m_settings->reset("PreLaunchCommand"); - m_settings->reset("WrapperCommand"); - m_settings->reset("PostExitCommand"); - } - - // Environment Variables - auto env = ui->environmentVariables->override(); - m_settings->set("OverrideEnv", env); - if (env) - m_settings->set("Env", ui->environmentVariables->value()); - else - m_settings->reset("Env"); - - // Workarounds - bool workarounds = ui->nativeWorkaroundsGroupBox->isChecked(); - m_settings->set("OverrideNativeWorkarounds", workarounds); - if (workarounds) { - m_settings->set("UseNativeGLFW", ui->useNativeGLFWCheck->isChecked()); - m_settings->set("CustomGLFWPath", ui->lineEditGLFWPath->text()); - m_settings->set("UseNativeOpenAL", ui->useNativeOpenALCheck->isChecked()); - m_settings->set("CustomOpenALPath", ui->lineEditOpenALPath->text()); - } else { - m_settings->reset("UseNativeGLFW"); - m_settings->reset("CustomGLFWPath"); - m_settings->reset("UseNativeOpenAL"); - m_settings->reset("CustomOpenALPath"); - } - - // Performance - bool performance = ui->perfomanceGroupBox->isChecked(); - m_settings->set("OverridePerformance", performance); - if (performance) { - m_settings->set("EnableFeralGamemode", ui->enableFeralGamemodeCheck->isChecked()); - m_settings->set("EnableMangoHud", ui->enableMangoHud->isChecked()); - m_settings->set("UseDiscreteGpu", ui->useDiscreteGpuCheck->isChecked()); - m_settings->set("UseZink", ui->useZink->isChecked()); - - } else { - m_settings->reset("EnableFeralGamemode"); - m_settings->reset("EnableMangoHud"); - m_settings->reset("UseDiscreteGpu"); - m_settings->reset("UseZink"); - } - - // Game time - bool gameTime = ui->gameTimeGroupBox->isChecked(); - m_settings->set("OverrideGameTime", gameTime); - if (gameTime) { - m_settings->set("ShowGameTime", ui->showGameTime->isChecked()); - m_settings->set("RecordGameTime", ui->recordGameTime->isChecked()); - } else { - m_settings->reset("ShowGameTime"); - m_settings->reset("RecordGameTime"); - } - - // Join server on launch - bool joinServerOnLaunch = ui->serverJoinGroupBox->isChecked(); - m_settings->set("JoinServerOnLaunch", joinServerOnLaunch); - if (joinServerOnLaunch) { - if (ui->serverJoinAddressButton->isChecked() || !m_world_quickplay_supported) { - m_settings->set("JoinServerOnLaunchAddress", ui->serverJoinAddress->text()); - m_settings->reset("JoinWorldOnLaunch"); - } else { - m_settings->set("JoinWorldOnLaunch", ui->worldsCb->currentText()); - m_settings->reset("JoinServerOnLaunchAddress"); - } - } else { - m_settings->reset("JoinServerOnLaunchAddress"); - m_settings->reset("JoinWorldOnLaunch"); - } - - // Use an account for this instance - bool useAccountForInstance = ui->instanceAccountGroupBox->isChecked(); - m_settings->set("UseAccountForInstance", useAccountForInstance); - if (!useAccountForInstance) { - m_settings->reset("InstanceAccountId"); - } - - bool overrideLegacySettings = ui->legacySettingsGroupBox->isChecked(); - m_settings->set("OverrideLegacySettings", overrideLegacySettings); - if (overrideLegacySettings) { - m_settings->set("OnlineFixes", ui->onlineFixes->isChecked()); - } else { - m_settings->reset("OnlineFixes"); - } - - // FIXME: This should probably be called by a signal instead - m_instance->updateRuntimeContext(); -} - -void InstanceSettingsPage::loadSettings() -{ - // Miscellaneous - ui->miscellaneousSettingsBox->setChecked(m_settings->get("OverrideMiscellaneous").toBool()); - ui->closeAfterLaunchCheck->setChecked(m_settings->get("CloseAfterLaunch").toBool()); - ui->quitAfterGameStopCheck->setChecked(m_settings->get("QuitAfterGameStop").toBool()); - - // Console - ui->consoleSettingsBox->setChecked(m_settings->get("OverrideConsole").toBool()); - ui->showConsoleCheck->setChecked(m_settings->get("ShowConsole").toBool()); - ui->autoCloseConsoleCheck->setChecked(m_settings->get("AutoCloseConsole").toBool()); - ui->showConsoleErrorCheck->setChecked(m_settings->get("ShowConsoleOnError").toBool()); - - // Window Size - ui->windowSizeGroupBox->setChecked(m_settings->get("OverrideWindow").toBool()); - ui->maximizedCheckBox->setChecked(m_settings->get("LaunchMaximized").toBool()); - ui->maximizedWarning->setVisible(m_settings->get("LaunchMaximized").toBool() && !m_instance->isLegacy()); - ui->windowWidthSpinBox->setValue(m_settings->get("MinecraftWinWidth").toInt()); - ui->windowHeightSpinBox->setValue(m_settings->get("MinecraftWinHeight").toInt()); - - // Memory - ui->memoryGroupBox->setChecked(m_settings->get("OverrideMemory").toBool()); - int min = m_settings->get("MinMemAlloc").toInt(); - int max = m_settings->get("MaxMemAlloc").toInt(); - if (min < max) { - ui->minMemSpinBox->setValue(min); - ui->maxMemSpinBox->setValue(max); - } else { - ui->minMemSpinBox->setValue(max); - ui->maxMemSpinBox->setValue(min); - } - ui->permGenSpinBox->setValue(m_settings->get("PermGen").toInt()); - bool permGenVisible = m_settings->get("PermGenVisible").toBool(); - ui->permGenSpinBox->setVisible(permGenVisible); - ui->labelPermGen->setVisible(permGenVisible); - ui->labelPermgenNote->setVisible(permGenVisible); - - // Java Settings - bool overrideLocation = m_settings->get("OverrideJavaLocation").toBool(); - bool overrideArgs = m_settings->get("OverrideJavaArgs").toBool(); - - connect(m_settings->getSetting("OverrideJavaLocation").get(), &Setting::SettingChanged, ui->javaSettingsGroupBox, - [this] { ui->javaSettingsGroupBox->setChecked(m_settings->get("OverrideJavaLocation").toBool()); }); - ui->javaSettingsGroupBox->setChecked(overrideLocation); - ui->javaPathTextBox->setText(m_settings->get("JavaPath").toString()); - connect(m_settings->getSetting("JavaPath").get(), &Setting::SettingChanged, ui->javaSettingsGroupBox, - [this] { ui->javaPathTextBox->setText(m_settings->get("JavaPath").toString()); }); - - ui->skipCompatibilityCheckbox->setChecked(m_settings->get("IgnoreJavaCompatibility").toBool()); - - ui->javaArgumentsGroupBox->setChecked(overrideArgs); - ui->jvmArgsTextBox->setPlainText(m_settings->get("JvmArgs").toString()); - - // Custom commands - ui->customCommands->initialize(true, m_settings->get("OverrideCommands").toBool(), m_settings->get("PreLaunchCommand").toString(), - m_settings->get("WrapperCommand").toString(), m_settings->get("PostExitCommand").toString()); - - // Environment variables - ui->environmentVariables->initialize(true, m_settings->get("OverrideEnv").toBool(), m_settings->get("Env").toMap()); - - // Workarounds - ui->nativeWorkaroundsGroupBox->setChecked(m_settings->get("OverrideNativeWorkarounds").toBool()); - ui->useNativeGLFWCheck->setChecked(m_settings->get("UseNativeGLFW").toBool()); - ui->lineEditGLFWPath->setText(m_settings->get("CustomGLFWPath").toString()); -#ifdef Q_OS_LINUX - ui->lineEditGLFWPath->setPlaceholderText(APPLICATION->m_detectedGLFWPath); -#else - ui->lineEditGLFWPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.GLFW_LIBRARY_NAME)); -#endif - ui->useNativeOpenALCheck->setChecked(m_settings->get("UseNativeOpenAL").toBool()); - ui->lineEditOpenALPath->setText(m_settings->get("CustomOpenALPath").toString()); -#ifdef Q_OS_LINUX - ui->lineEditOpenALPath->setPlaceholderText(APPLICATION->m_detectedOpenALPath); -#else - ui->lineEditOpenALPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.OPENAL_LIBRARY_NAME)); -#endif - - // Performance - ui->perfomanceGroupBox->setChecked(m_settings->get("OverridePerformance").toBool()); - ui->enableFeralGamemodeCheck->setChecked(m_settings->get("EnableFeralGamemode").toBool()); - ui->enableMangoHud->setChecked(m_settings->get("EnableMangoHud").toBool()); - ui->useDiscreteGpuCheck->setChecked(m_settings->get("UseDiscreteGpu").toBool()); - ui->useZink->setChecked(m_settings->get("UseZink").toBool()); - -#if !defined(Q_OS_LINUX) - ui->settingsTabs->setTabVisible(ui->settingsTabs->indexOf(ui->performancePage), false); -#endif - - if (!(APPLICATION->capabilities() & Application::SupportsGameMode)) { - ui->enableFeralGamemodeCheck->setDisabled(true); - ui->enableFeralGamemodeCheck->setToolTip(tr("Feral Interactive's GameMode could not be found on your system.")); - } - - if (!(APPLICATION->capabilities() & Application::SupportsMangoHud)) { - ui->enableMangoHud->setDisabled(true); - ui->enableMangoHud->setToolTip(tr("MangoHud could not be found on your system.")); - } - - // Miscellanous - ui->gameTimeGroupBox->setChecked(m_settings->get("OverrideGameTime").toBool()); - ui->showGameTime->setChecked(m_settings->get("ShowGameTime").toBool()); - ui->recordGameTime->setChecked(m_settings->get("RecordGameTime").toBool()); - - ui->serverJoinGroupBox->setChecked(m_settings->get("JoinServerOnLaunch").toBool()); - - if (auto server = m_settings->get("JoinServerOnLaunchAddress").toString(); !server.isEmpty()) { - ui->serverJoinAddress->setText(server); - ui->serverJoinAddressButton->setChecked(true); - ui->worldJoinButton->setChecked(false); - ui->serverJoinAddress->setEnabled(true); - ui->worldsCb->setEnabled(false); - } else if (auto world = m_settings->get("JoinWorldOnLaunch").toString(); !world.isEmpty() && m_world_quickplay_supported) { - ui->worldsCb->setCurrentText(world); - ui->serverJoinAddressButton->setChecked(false); - ui->worldJoinButton->setChecked(true); - ui->serverJoinAddress->setEnabled(false); - ui->worldsCb->setEnabled(true); - } else { - ui->serverJoinAddressButton->setChecked(true); - ui->worldJoinButton->setChecked(false); - ui->serverJoinAddress->setEnabled(true); - ui->worldsCb->setEnabled(false); - } - - ui->instanceAccountGroupBox->setChecked(m_settings->get("UseAccountForInstance").toBool()); - updateAccountsMenu(); - - ui->legacySettingsGroupBox->setChecked(m_settings->get("OverrideLegacySettings").toBool()); - ui->onlineFixes->setChecked(m_settings->get("OnlineFixes").toBool()); -} - -void InstanceSettingsPage::on_javaDownloadBtn_clicked() -{ - auto jdialog = new Java::InstallDialog({}, m_instance, this); - jdialog->exec(); -} - -void InstanceSettingsPage::on_javaDetectBtn_clicked() -{ - if (JavaUtils::getJavaCheckPath().isEmpty()) { - JavaCommon::javaCheckNotFound(this); - return; - } - - JavaInstallPtr java; - - VersionSelectDialog vselect(APPLICATION->javalist().get(), tr("Select a Java version"), this, true); - vselect.setResizeOn(2); - vselect.exec(); - - if (vselect.result() == QDialog::Accepted && vselect.selectedVersion()) { - java = std::dynamic_pointer_cast(vselect.selectedVersion()); - ui->javaPathTextBox->setText(java->path); - bool visible = java->id.requiresPermGen() && m_settings->get("OverrideMemory").toBool(); - ui->permGenSpinBox->setVisible(visible); - ui->labelPermGen->setVisible(visible); - ui->labelPermgenNote->setVisible(visible); - m_settings->set("PermGenVisible", visible); - - if (!java->is_64bit && m_settings->get("MaxMemAlloc").toInt() > 2048) { - CustomMessageBox::selectable(this, tr("Confirm Selection"), - tr("You selected a 32-bit version of Java.\n" - "This installation does not support more than 2048MiB of RAM.\n" - "Please make sure that the maximum memory value is lower."), - QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok) - ->exec(); - } - } -} - -void InstanceSettingsPage::on_javaBrowseBtn_clicked() -{ - QString raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable")); - - // do not allow current dir - it's dirty. Do not allow dirs that don't exist - if (raw_path.isEmpty()) { - return; - } - QString cooked_path = FS::NormalizePath(raw_path); - - QFileInfo javaInfo(cooked_path); - if (!javaInfo.exists() || !javaInfo.isExecutable()) { - return; - } - ui->javaPathTextBox->setText(cooked_path); - - // custom Java could be anything... enable perm gen option - ui->permGenSpinBox->setVisible(true); - ui->labelPermGen->setVisible(true); - ui->labelPermgenNote->setVisible(true); - m_settings->set("PermGenVisible", true); -} - -void InstanceSettingsPage::on_javaTestBtn_clicked() -{ - if (checker) { - return; - } - checker.reset(new JavaCommon::TestCheck(this, ui->javaPathTextBox->text(), ui->jvmArgsTextBox->toPlainText().replace("\n", " "), - ui->minMemSpinBox->value(), ui->maxMemSpinBox->value(), ui->permGenSpinBox->value())); - connect(checker.get(), SIGNAL(finished()), SLOT(checkerFinished())); - checker->run(); -} - -void InstanceSettingsPage::onUseNativeGLFWChanged(bool checked) -{ - ui->lineEditGLFWPath->setEnabled(checked); -} - -void InstanceSettingsPage::onUseNativeOpenALChanged(bool checked) -{ - ui->lineEditOpenALPath->setEnabled(checked); -} - -void InstanceSettingsPage::updateAccountsMenu() -{ - ui->instanceAccountSelector->clear(); - auto accounts = APPLICATION->accounts(); - int accountIndex = accounts->findAccountByProfileId(m_settings->get("InstanceAccountId").toString()); - - for (int i = 0; i < accounts->count(); i++) { - MinecraftAccountPtr account = accounts->at(i); - ui->instanceAccountSelector->addItem(getFaceForAccount(account), account->profileName(), i); - if (i == accountIndex) - ui->instanceAccountSelector->setCurrentIndex(i); - } -} - -QIcon InstanceSettingsPage::getFaceForAccount(MinecraftAccountPtr account) -{ - if (auto face = account->getFace(); !face.isNull()) { - return face; - } - - return APPLICATION->getThemedIcon("noaccount"); -} - -void InstanceSettingsPage::changeInstanceAccount(int index) -{ - auto accounts = APPLICATION->accounts(); - if (index != -1 && accounts->at(index) && ui->instanceAccountGroupBox->isChecked()) { - auto account = accounts->at(index); - m_settings->set("InstanceAccountId", account->profileId()); - } -} - -void InstanceSettingsPage::on_maxMemSpinBox_valueChanged([[maybe_unused]] int i) -{ - updateThresholds(); -} - -void InstanceSettingsPage::checkerFinished() -{ - checker.reset(); -} - -void InstanceSettingsPage::retranslate() -{ - ui->retranslateUi(this); - ui->customCommands->retranslate(); // TODO: why is this seperate from the others? - ui->environmentVariables->retranslate(); -} - -void InstanceSettingsPage::updateThresholds() -{ - auto sysMiB = Sys::getSystemRam() / Sys::mebibyte; - unsigned int maxMem = ui->maxMemSpinBox->value(); - unsigned int minMem = ui->minMemSpinBox->value(); - - QString iconName; - - if (maxMem >= sysMiB) { - iconName = "status-bad"; - ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation exceeds your system memory capacity.")); - } else if (maxMem > (sysMiB * 0.9)) { - iconName = "status-yellow"; - ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation approaches your system memory capacity.")); - } else if (maxMem < minMem) { - iconName = "status-yellow"; - ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value")); - } else { - iconName = "status-good"; - ui->labelMaxMemIcon->setToolTip(""); - } - - { - auto height = ui->labelMaxMemIcon->fontInfo().pixelSize(); - QIcon icon = APPLICATION->getThemedIcon(iconName); - QPixmap pix = icon.pixmap(height, height); - ui->labelMaxMemIcon->setPixmap(pix); - } -} - -void InstanceSettingsPage::on_serverJoinAddressButton_toggled(bool checked) -{ - ui->serverJoinAddress->setEnabled(checked); -} - -void InstanceSettingsPage::on_worldJoinButton_toggled(bool checked) -{ - ui->worldsCb->setEnabled(checked); -} diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.h b/launcher/ui/pages/instance/InstanceSettingsPage.h index 6499f9e8f..b13dc572f 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.h +++ b/launcher/ui/pages/instance/InstanceSettingsPage.h @@ -35,63 +35,29 @@ #pragma once +#include +#include +#include +#include #include -#include -#include -#include "Application.h" -#include "BaseInstance.h" -#include "JavaCommon.h" -#include "java/JavaChecker.h" -#include "ui/pages/BasePage.h" - -class JavaChecker; -namespace Ui { -class InstanceSettingsPage; -} - -class InstanceSettingsPage : public QWidget, public BasePage { +class InstanceSettingsPage : public MinecraftSettingsWidget, public BasePage { Q_OBJECT public: - explicit InstanceSettingsPage(BaseInstance* inst, QWidget* parent = 0); - virtual ~InstanceSettingsPage(); - virtual QString displayName() const override { return tr("Settings"); } - virtual QIcon icon() const override { return APPLICATION->getThemedIcon("instance-settings"); } - virtual QString id() const override { return "settings"; } - virtual bool apply() override; - virtual QString helpPage() const override { return "Instance-settings"; } - void retranslate() override; - - void updateThresholds(); - - private slots: - void on_javaDetectBtn_clicked(); - void on_javaTestBtn_clicked(); - void on_javaBrowseBtn_clicked(); - void on_javaDownloadBtn_clicked(); - void on_maxMemSpinBox_valueChanged(int i); - void on_serverJoinAddressButton_toggled(bool checked); - void on_worldJoinButton_toggled(bool checked); - - void onUseNativeGLFWChanged(bool checked); - void onUseNativeOpenALChanged(bool checked); - - void applySettings(); - void loadSettings(); - - void checkerFinished(); - - void globalSettingsButtonClicked(bool checked); - - void updateAccountsMenu(); - QIcon getFaceForAccount(MinecraftAccountPtr account); - void changeInstanceAccount(int index); - - private: - Ui::InstanceSettingsPage* ui; - BaseInstance* m_instance; - SettingsObjectPtr m_settings; - unique_qobject_ptr checker; - bool m_world_quickplay_supported; + explicit InstanceSettingsPage(InstancePtr instance, QWidget* parent = nullptr) : MinecraftSettingsWidget(std::move(instance), parent) + { + connect(APPLICATION, &Application::globalSettingsAboutToOpen, this, &InstanceSettingsPage::saveSettings); + connect(APPLICATION, &Application::globalSettingsClosed, this, &InstanceSettingsPage::loadSettings); + } + ~InstanceSettingsPage() override {} + QString displayName() const override { return tr("Settings"); } + QIcon icon() const override { return APPLICATION->getThemedIcon("instance-settings"); } + QString id() const override { return "settings"; } + bool apply() override + { + saveSettings(); + return true; + } + QString helpPage() const override { return "Instance-settings"; } }; diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.cpp b/launcher/ui/widgets/MinecraftSettingsWidget.cpp new file mode 100644 index 000000000..32c99f03f --- /dev/null +++ b/launcher/ui/widgets/MinecraftSettingsWidget.cpp @@ -0,0 +1,320 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2022 Jamie Mansfield + * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2024 TheKodeToad + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MinecraftSettingsWidget.h" +#include + +#include "settings/Setting.h" +#include "ui_MinecraftSettingsWidget.h" + +MinecraftSettingsWidget::MinecraftSettingsWidget(InstancePtr instance, QWidget* parent) + : QWidget(parent), m_instance(std::move(instance)), m_ui(new Ui::MinecraftSettingsWidget) +{ + m_ui->setupUi(this); + + if (m_instance == nullptr) { + // Java + m_ui->settingsTabs->removeTab(1); + // Launch + m_ui->settingsTabs->removeTab(2); + m_ui->openGlobalJavaSettingsButton->setVisible(false); + } else { + m_ui->showGameTime->setText(tr("Show time &playing this instance")); + m_ui->recordGameTime->setText(tr("&Record time playing this instance")); + m_ui->showGlobalGameTime->hide(); + m_ui->showGameTimeWithoutDays->hide(); + + m_ui->maximizedWarning->setText( + tr("Warning: The maximized option is " + "not fully supported on this Minecraft version.")); + } + + m_ui->maximizedWarning->hide(); + + connect(m_ui->maximizedCheckBox, &QCheckBox::toggled, this, + [this](const bool value) { m_ui->maximizedWarning->setVisible(value && (m_instance == nullptr || !m_instance->isLegacy())); }); + + loadSettings(); +} + +MinecraftSettingsWidget::~MinecraftSettingsWidget() +{ + delete m_ui; +} + +void MinecraftSettingsWidget::loadSettings() +{ + const SettingsObjectPtr settings = getSettings(); + + // Miscellaneous + m_ui->miscellaneousSettingsBox->setCheckable(m_instance != nullptr); + m_ui->miscellaneousSettingsBox->setChecked(settings->get("OverrideMiscellaneous").toBool()); + m_ui->closeAfterLaunchCheck->setChecked(settings->get("CloseAfterLaunch").toBool()); + m_ui->quitAfterGameStopCheck->setChecked(settings->get("QuitAfterGameStop").toBool()); + + // Console + m_ui->consoleSettingsBox->setCheckable(m_instance != nullptr); + m_ui->consoleSettingsBox->setChecked(m_instance == nullptr || settings->get("OverrideConsole").toBool()); + m_ui->showConsoleCheck->setChecked(settings->get("ShowConsole").toBool()); + m_ui->autoCloseConsoleCheck->setChecked(settings->get("AutoCloseConsole").toBool()); + m_ui->showConsoleErrorCheck->setChecked(settings->get("ShowConsoleOnError").toBool()); + + // Window Size + m_ui->windowSizeGroupBox->setCheckable(m_instance != nullptr); + m_ui->windowSizeGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideWindow").toBool()); + m_ui->windowSizeGroupBox->setChecked(settings->get("OverrideWindow").toBool()); + m_ui->maximizedCheckBox->setChecked(settings->get("LaunchMaximized").toBool()); + m_ui->windowWidthSpinBox->setValue(settings->get("MinecraftWinWidth").toInt()); + m_ui->windowHeightSpinBox->setValue(settings->get("MinecraftWinHeight").toInt()); + + // Custom commands + m_ui->customCommands->initialize(m_instance != nullptr, m_instance == nullptr || settings->get("OverrideCommands").toBool(), + settings->get("PreLaunchCommand").toString(), settings->get("WrapperCommand").toString(), + settings->get("PostExitCommand").toString()); + + // Environment variables + m_ui->environmentVariables->initialize(m_instance != nullptr, m_instance == nullptr || settings->get("OverrideEnv").toBool(), + settings->get("Env").toMap()); + + // Workarounds + m_ui->nativeWorkaroundsGroupBox->setCheckable(m_instance != nullptr); + m_ui->nativeWorkaroundsGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideNativeWorkarounds").toBool()); + m_ui->useNativeGLFWCheck->setChecked(settings->get("UseNativeGLFW").toBool()); + m_ui->lineEditGLFWPath->setText(settings->get("CustomGLFWPath").toString()); +#ifdef Q_OS_LINUX + m_ui->lineEditGLFWPath->setPlaceholderText(APPLICATION->m_detectedGLFWPath); +#else + m_ui->lineEditGLFWPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.GLFW_LIBRARY_NAME)); +#endif + m_ui->useNativeOpenALCheck->setChecked(settings->get("UseNativeOpenAL").toBool()); + m_ui->lineEditOpenALPath->setText(settings->get("CustomOpenALPath").toString()); +#ifdef Q_OS_LINUX + m_ui->lineEditOpenALPath->setPlaceholderText(APPLICATION->m_detectedOpenALPath); +#else + m_ui->lineEditOpenALPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.OPENAL_LIBRARY_NAME)); +#endif + + // Performance + m_ui->perfomanceGroupBox->setCheckable(m_instance != nullptr); + m_ui->perfomanceGroupBox->setChecked(m_instance == nullptr || settings->get("OverridePerformance").toBool()); + m_ui->enableFeralGamemodeCheck->setChecked(settings->get("EnableFeralGamemode").toBool()); + m_ui->enableMangoHud->setChecked(settings->get("EnableMangoHud").toBool()); + m_ui->useDiscreteGpuCheck->setChecked(settings->get("UseDiscreteGpu").toBool()); + m_ui->useZink->setChecked(settings->get("UseZink").toBool()); + +#if !defined(Q_OS_LINUX) + m_ui->settingsTabs->setTabVisible(ui->settingsTabs->indexOf(ui->performancePage), false); +#endif + + if (!(APPLICATION->capabilities() & Application::SupportsGameMode)) { + m_ui->enableFeralGamemodeCheck->setDisabled(true); + m_ui->enableFeralGamemodeCheck->setToolTip(tr("Feral Interactive's GameMode could not be found on your system.")); + } + + if (!(APPLICATION->capabilities() & Application::SupportsMangoHud)) { + m_ui->enableMangoHud->setDisabled(true); + m_ui->enableMangoHud->setToolTip(tr("MangoHud could not be found on your system.")); + } + + // Miscellanous + m_ui->gameTimeGroupBox->setCheckable(m_instance != nullptr); + m_ui->gameTimeGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideGameTime").toBool()); + m_ui->showGameTime->setChecked(settings->get("ShowGameTime").toBool()); + m_ui->recordGameTime->setChecked(settings->get("RecordGameTime").toBool()); + m_ui->showGlobalGameTime->setChecked(m_instance != nullptr && settings->get("ShowGlobalGameTime").toBool()); + m_ui->showGameTimeWithoutDays->setChecked(m_instance != nullptr && settings->get("ShowGameTimeWithoutDays").toBool()); + + m_ui->legacySettingsGroupBox->setCheckable(m_instance != nullptr); + m_ui->legacySettingsGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideLegacySettings").toBool()); + m_ui->onlineFixes->setChecked(settings->get("OnlineFixes").toBool()); +} + +void MinecraftSettingsWidget::saveSettings() +{ + SettingsObjectPtr settings = getSettings(); + SettingsObject::Lock lock(settings); + + // Miscellaneous + bool miscellaneous = m_instance == nullptr || m_ui->miscellaneousSettingsBox->isChecked(); + + if (m_instance != nullptr) + settings->set("OverrideMiscellaneous", miscellaneous); + + if (miscellaneous) { + settings->set("CloseAfterLaunch", m_ui->closeAfterLaunchCheck->isChecked()); + settings->set("QuitAfterGameStop", m_ui->quitAfterGameStopCheck->isChecked()); + } else { + settings->reset("CloseAfterLaunch"); + settings->reset("QuitAfterGameStop"); + } + + // Console + bool console = m_instance == nullptr || m_ui->consoleSettingsBox->isChecked(); + + if (m_instance != nullptr) + settings->set("OverrideConsole", console); + + if (console) { + settings->set("ShowConsole", m_ui->showConsoleCheck->isChecked()); + settings->set("AutoCloseConsole", m_ui->autoCloseConsoleCheck->isChecked()); + settings->set("ShowConsoleOnError", m_ui->showConsoleErrorCheck->isChecked()); + } else { + settings->reset("ShowConsole"); + settings->reset("AutoCloseConsole"); + settings->reset("ShowConsoleOnError"); + } + + // Window Size + bool window = m_instance == nullptr || m_ui->windowSizeGroupBox->isChecked(); + + if (m_instance != nullptr) + settings->set("OverrideWindow", window); + + if (window) { + settings->set("LaunchMaximized", m_ui->maximizedCheckBox->isChecked()); + settings->set("MinecraftWinWidth", m_ui->windowWidthSpinBox->value()); + settings->set("MinecraftWinHeight", m_ui->windowHeightSpinBox->value()); + } else { + settings->reset("LaunchMaximized"); + settings->reset("MinecraftWinWidth"); + settings->reset("MinecraftWinHeight"); + } + + // Custom Commands + bool custcmd = m_instance == nullptr || m_ui->customCommands->checked(); + + if (m_instance != nullptr) + settings->set("OverrideCommands", custcmd); + + if (custcmd) { + settings->set("PreLaunchCommand", m_ui->customCommands->prelaunchCommand()); + settings->set("WrapperCommand", m_ui->customCommands->wrapperCommand()); + settings->set("PostExitCommand", m_ui->customCommands->postexitCommand()); + } else { + settings->reset("PreLaunchCommand"); + settings->reset("WrapperCommand"); + settings->reset("PostExitCommand"); + } + + // Environment Variables + auto env = m_instance == nullptr || m_ui->environmentVariables->override(); + + if (m_instance != nullptr) + settings->set("OverrideEnv", env); + + if (env) + settings->set("Env", m_ui->environmentVariables->value()); + else + settings->reset("Env"); + + // Workarounds + bool workarounds = m_instance == nullptr || m_ui->nativeWorkaroundsGroupBox->isChecked(); + + if (m_instance != nullptr) + settings->set("OverrideNativeWorkarounds", workarounds); + + if (workarounds) { + settings->set("UseNativeGLFW", m_ui->useNativeGLFWCheck->isChecked()); + settings->set("CustomGLFWPath", m_ui->lineEditGLFWPath->text()); + settings->set("UseNativeOpenAL", m_ui->useNativeOpenALCheck->isChecked()); + settings->set("CustomOpenALPath", m_ui->lineEditOpenALPath->text()); + } else { + settings->reset("UseNativeGLFW"); + settings->reset("CustomGLFWPath"); + settings->reset("UseNativeOpenAL"); + settings->reset("CustomOpenALPath"); + } + + // Performance + bool performance = m_instance == nullptr || m_ui->perfomanceGroupBox->isChecked(); + + if (m_instance != nullptr) + settings->set("OverridePerformance", performance); + + if (performance) { + settings->set("EnableFeralGamemode", m_ui->enableFeralGamemodeCheck->isChecked()); + settings->set("EnableMangoHud", m_ui->enableMangoHud->isChecked()); + settings->set("UseDiscreteGpu", m_ui->useDiscreteGpuCheck->isChecked()); + settings->set("UseZink", m_ui->useZink->isChecked()); + } else { + settings->reset("EnableFeralGamemode"); + settings->reset("EnableMangoHud"); + settings->reset("UseDiscreteGpu"); + settings->reset("UseZink"); + } + + // Game time + bool gameTime = m_instance == nullptr || m_ui->gameTimeGroupBox->isChecked(); + + if (m_instance != nullptr) + settings->set("OverrideGameTime", gameTime); + + if (gameTime) { + settings->set("ShowGameTime", m_ui->showGameTime->isChecked()); + settings->set("RecordGameTime", m_ui->recordGameTime->isChecked()); + } else { + settings->reset("ShowGameTime"); + settings->reset("RecordGameTime"); + } + + if (m_instance == nullptr) { + settings->set("ShowGlobalGameTime", m_ui->showGlobalGameTime->isChecked()); + settings->set("ShowGameTimeWithoutDays", m_ui->showGameTimeWithoutDays->isChecked()); + } + + bool overrideLegacySettings = m_instance == nullptr || m_ui->legacySettingsGroupBox->isChecked(); + + if (m_instance != nullptr) + settings->set("OverrideLegacySettings", overrideLegacySettings); + + if (overrideLegacySettings) { + settings->set("OnlineFixes", m_ui->onlineFixes->isChecked()); + } else { + settings->reset("OnlineFixes"); + } + + if (m_instance != nullptr) + m_instance->updateRuntimeContext(); +} + +SettingsObjectPtr MinecraftSettingsWidget::getSettings() const +{ + if (m_instance != nullptr) + return m_instance->settings(); + + return APPLICATION->settings(); +} diff --git a/launcher/ui/pages/global/CustomCommandsPage.h b/launcher/ui/widgets/MinecraftSettingsWidget.h similarity index 69% rename from launcher/ui/pages/global/CustomCommandsPage.h rename to launcher/ui/widgets/MinecraftSettingsWidget.h index ec1204ffe..3a4bf30a5 100644 --- a/launcher/ui/pages/global/CustomCommandsPage.h +++ b/launcher/ui/widgets/MinecraftSettingsWidget.h @@ -2,6 +2,7 @@ /* * Prism Launcher - Minecraft Launcher * Copyright (c) 2022 Jamie Mansfield + * Copyright (C) 2024 TheKodeToad * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -35,29 +36,24 @@ #pragma once -#include -#include +#include +#include -#include -#include "ui/pages/BasePage.h" -#include "ui/widgets/CustomCommands.h" - -class CustomCommandsPage : public QWidget, public BasePage { - Q_OBJECT +namespace Ui { +class MinecraftSettingsWidget; +} +class MinecraftSettingsWidget : public QWidget { public: - explicit CustomCommandsPage(QWidget* parent = 0); - ~CustomCommandsPage(); + MinecraftSettingsWidget(InstancePtr instance, QWidget* parent = nullptr); + ~MinecraftSettingsWidget() override; - QString displayName() const override { return tr("Custom Commands"); } - QIcon icon() const override { return APPLICATION->getThemedIcon("custom-commands"); } - QString id() const override { return "custom-commands"; } - QString helpPage() const override { return "Custom-commands"; } - bool apply() override; - void retranslate() override; + void loadSettings(); + void saveSettings(); private: - void applySettings(); - void loadSettings(); - CustomCommands* commands; + SettingsObjectPtr getSettings() const; + + InstancePtr m_instance; + Ui::MinecraftSettingsWidget* m_ui; }; diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.ui b/launcher/ui/widgets/MinecraftSettingsWidget.ui new file mode 100644 index 000000000..a70d2418e --- /dev/null +++ b/launcher/ui/widgets/MinecraftSettingsWidget.ui @@ -0,0 +1,876 @@ + + + MinecraftSettingsWidget + + + + 0 + 0 + 648 + 400 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Open &Global Settings + + + The settings here are overrides for global settings. + + + + + + + 0 + + + + General + + + + + + + 0 + 0 + + + + Qt::ScrollBarAlwaysOff + + + true + + + + + 0 + -131 + 610 + 607 + + + + + + + true + + + Game &Window + + + false + + + false + + + + + + Start Minecraft maximized + + + + + + + The base game only supports resolution. In order to simulate the maximized behaviour the current implementation approximates the maximum display size. + + + <html><head/><body><p><span style=" font-weight:600; color:#f5c211;">Warning</span><span style=" color:#f5c211;">: The maximized option may not be fully supported on all Minecraft versions.</span></p></body></html> + + + + + + + + + Window height: + + + + + + + Window width: + + + + + + + 1 + + + 65536 + + + 1 + + + 854 + + + + + + + 1 + + + 65536 + + + 480 + + + + + + + + + + + + true + + + Game &Time + + + false + + + false + + + + + + Show time spent &playing instances + + + + + + + &Record time spent playing instances + + + + + + + Show &total of time played across instances + + + + + + + Always show durations in &hours + + + + + + + + + + true + + + &Console + + + false + + + false + + + + + + Show console while the game is running + + + + + + + Automatically close console when the game quits + + + + + + + Show console when the game crashes + + + + + + + + + + &Miscellaneous + + + false + + + false + + + + + + Close the launcher after game window opens + + + + + + + Quit the launcher after game window closes + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + Java + + + + + + true + + + + + 0 + 0 + 610 + 454 + + + + + + + true + + + Java Insta&llation + + + true + + + false + + + + + + If enabled, the launcher will not check if an instance is compatible with the selected Java version. + + + Skip Java compatibility checks + + + + + + + + + + + + Browse + + + + + + + + + + + Download Java + + + + + + + Auto-detect... + + + + + + + Test + + + + + + + + + + + + true + + + Memor&y + + + true + + + false + + + + + + PermGen: + + + + + + + Minimum memory allocation: + + + + + + + Maximum memory allocation: + + + + + + + Note: Permgen is set automatically by Java 8 and later + + + + + + + The amount of memory Minecraft is started with. + + + MiB + + + 8 + + + 1048576 + + + 128 + + + 256 + + + + + + + The maximum amount of memory Minecraft is allowed to use. + + + MiB + + + 8 + + + 1048576 + + + 128 + + + 1024 + + + + + + + The amount of memory available to store loaded Java classes. + + + MiB + + + 4 + + + 999999999 + + + 8 + + + 64 + + + + + + + + + + Qt::AlignCenter + + + maxMemSpinBox + + + + + + + + + + true + + + Java Argumen&ts + + + true + + + false + + + + + + + + + + + + + + + + + Tweaks + + + + + + Qt::ScrollBarAlwaysOff + + + true + + + + + 0 + 0 + 610 + 439 + + + + + + + &Legacy Tweaks + + + false + + + false + + + + + + <html><head/><body><p>Emulates usages of old online services which are no longer operating.</p><p>Current fixes include: skin and online mode support.</p></body></html> + + + Enable online fixes (experimental) + + + + + + + + + + true + + + &Native Libraries + + + false + + + false + + + + + + Use system installation of OpenAL + + + + + + + &GLFW library path + + + lineEditGLFWPath + + + + + + + Use system installation of GLFW + + + + + + + false + + + + + + + &OpenAL library path + + + lineEditOpenALPath + + + + + + + false + + + + + + + + + + true + + + &Performance + + + true + + + false + + + + + + <html><head/><body><p>Enable Feral Interactive's GameMode, to potentially improve gaming performance.</p></body></html> + + + Enable Feral GameMode + + + + + + + <html><head/><body><p>Enable MangoHud's advanced performance overlay.</p></body></html> + + + Enable MangoHud + + + + + + + <html><head/><body><p>Use the discrete GPU instead of the primary GPU.</p></body></html> + + + Use discrete GPU + + + + + + + Use Zink, a Mesa OpenGL driver that implements OpenGL on top of Vulkan. Performance may vary depending on the situation. Note: If no suitable Vulkan driver is found, software rendering will be used. + + + Use Zink + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + Launch + + + + + + true + + + + + 0 + 0 + 624 + 291 + + + + + + + Override default &account + + + true + + + false + + + + + + + + + 0 + 0 + + + + Account: + + + + + + + + + + + + + + + Set a &target to join on launch + + + true + + + false + + + + + + Server address: + + + + + + + + + + Singleplayer world + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + Custom Commands + + + + + + + + + + Environment Variables + + + + + + + + + + + + + + CustomCommands + QWidget +
    ui/widgets/CustomCommands.h
    + 1 +
    + + EnvironmentVariables + QWidget +
    ui/widgets/EnvironmentVariables.h
    + 1 +
    +
    + + maximizedCheckBox + windowWidthSpinBox + windowHeightSpinBox + showConsoleCheck + autoCloseConsoleCheck + showConsoleErrorCheck + useNativeGLFWCheck + useNativeOpenALCheck + closeAfterLaunchCheck + quitAfterGameStopCheck + + + +
    From 71e55f88294976577ad0b2f8c21b635cf8fc9735 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 6 Nov 2024 23:57:24 +0000 Subject: [PATCH 350/616] Add scrollbar to Settings -> Launcher -> Features Signed-off-by: TheKodeToad --- launcher/ui/pages/global/LauncherPage.ui | 638 ++++++++++++----------- 1 file changed, 330 insertions(+), 308 deletions(-) diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui index 3cba468ff..09e7bca5b 100644 --- a/launcher/ui/pages/global/LauncherPage.ui +++ b/launcher/ui/pages/global/LauncherPage.ui @@ -46,317 +46,339 @@ - - - Update Settings + + + Qt::ScrollBarAlwaysOff - - - - - Check for updates automatically - - - - - - - - - Update interval - - - - - - - Set it to 0 to only check on launch - - - h - - - 0 - - - 99999999 - - - - - - + + true + + + + + 0 + 0 + 473 + 770 + + + + + + + Update Settings + + + + + + Check for updates automatically + + + + + + + + + Update interval + + + + + + + Set it to 0 to only check on launch + + + h + + + 0 + + + 99999999 + + + + + + + + + + + + Folders + + + + + + &Downloads: + + + downloadsDirTextBox + + + + + + + Browse + + + + + + + + + + + + + &Skins: + + + skinsDirTextBox + + + + + + + &Icons: + + + iconsDirTextBox + + + + + + + When enabled, in addition to the downloads folder, its sub folders will also be searched when looking for resources (e.g. when looking for blocked mods on CurseForge). + + + Check downloads folder recursively + + + + + + + + + + &Java: + + + javaDirTextBox + + + + + + + &Mods: + + + modsDirTextBox + + + + + + + + + + + + + + + + Browse + + + + + + + Browse + + + + + + + Browse + + + + + + + I&nstances: + + + instDirTextBox + + + + + + + Browse + + + + + + + Browse + + + + + + + + + + Mods + + + + + + Disable using metadata provided by mod providers (like Modrinth or CurseForge) for mods. + + + Disable using metadata for mods + + + + + + + <html><head/><body><p><span style=" font-weight:600; color:#f5c211;">Warning</span><span style=" color:#f5c211;">: Disabling mod metadata may also disable some QoL features, such as mod updating!</span></p></body></html> + + + true + + + + + + + Disable the automatic detection, installation, and updating of mod dependencies. + + + Disable automatic mod dependency management + + + + + + + When creating a new modpack instance, do not suggest updating existing instances instead. + + + Skip modpack update prompt + + + + + + + + + + Miscellaneous + + + + + + 1 + + + + + + + Number of concurrent tasks + + + + + + + 1 + + + + + + + Number of concurrent downloads + + + + + + + Number of manual retries + + + + + + + 0 + + + + + + + Seconds to wait until the requests are terminated + + + Timeout for HTTP requests + + + + + + + s + + + + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + - - - - Folders - - - - - - &Downloads: - - - downloadsDirTextBox - - - - - - - Browse - - - - - - - - - - - - - &Skins: - - - skinsDirTextBox - - - - - - - &Icons: - - - iconsDirTextBox - - - - - - - When enabled, in addition to the downloads folder, its sub folders will also be searched when looking for resources (e.g. when looking for blocked mods on CurseForge). - - - Check downloads folder recursively - - - - - - - - - - &Java: - - - javaDirTextBox - - - - - - - &Mods: - - - modsDirTextBox - - - - - - - - - - - - - - - - Browse - - - - - - - Browse - - - - - - - Browse - - - - - - - I&nstances: - - - instDirTextBox - - - - - - - Browse - - - - - - - Browse - - - - - - - - - - Mods - - - - - - Disable using metadata provided by mod providers (like Modrinth or CurseForge) for mods. - - - Disable using metadata for mods - - - - - - - <html><head/><body><p><span style=" font-weight:600; color:#f5c211;">Warning</span><span style=" color:#f5c211;">: Disabling mod metadata may also disable some QoL features, such as mod updating!</span></p></body></html> - - - true - - - - - - - Disable the automatic detection, installation, and updating of mod dependencies. - - - Disable automatic mod dependency management - - - - - - - When creating a new modpack instance, do not suggest updating existing instances instead. - - - Skip modpack update prompt - - - - - - - - - - Miscellaneous - - - - - - 1 - - - - - - - Number of concurrent tasks - - - - - - - 1 - - - - - - - Number of concurrent downloads - - - - - - - Number of manual retries - - - - - - - 0 - - - - - - - Seconds to wait until the requests are terminated - - - Timeout for HTTP requests - - - - - - - s - - - - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - From 223b6b3b2b4b5ffa943c8185b7718d61835333e2 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 7 Nov 2024 00:22:22 +0000 Subject: [PATCH 351/616] Fix non-Linux build Signed-off-by: TheKodeToad --- launcher/ui/widgets/MinecraftSettingsWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.cpp b/launcher/ui/widgets/MinecraftSettingsWidget.cpp index 32c99f03f..79ff4c060 100644 --- a/launcher/ui/widgets/MinecraftSettingsWidget.cpp +++ b/launcher/ui/widgets/MinecraftSettingsWidget.cpp @@ -137,7 +137,7 @@ void MinecraftSettingsWidget::loadSettings() m_ui->useZink->setChecked(settings->get("UseZink").toBool()); #if !defined(Q_OS_LINUX) - m_ui->settingsTabs->setTabVisible(ui->settingsTabs->indexOf(ui->performancePage), false); + m_ui->perfomanceGroupBox->hide(); #endif if (!(APPLICATION->capabilities() & Application::SupportsGameMode)) { From e06b3e7a7aba613fc054b63edf4ff0c0df3f7828 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 7 Nov 2024 00:47:32 +0000 Subject: [PATCH 352/616] Implement open global settings Signed-off-by: TheKodeToad --- launcher/Application.cpp | 9 +++++--- .../ui/widgets/MinecraftSettingsWidget.cpp | 22 ++++++++++++++----- launcher/ui/widgets/MinecraftSettingsWidget.h | 2 ++ .../ui/widgets/MinecraftSettingsWidget.ui | 4 ++-- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index c45bb1c8c..de60f86eb 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -972,7 +972,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) [[fallthrough]]; default: { qDebug() << "Exiting because update lockfile is present"; - QMetaObject::invokeMethod(this, []() { exit(1); }, Qt::QueuedConnection); + QMetaObject::invokeMethod( + this, []() { exit(1); }, Qt::QueuedConnection); return; } } @@ -1004,7 +1005,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) [[fallthrough]]; default: { qDebug() << "Exiting because update lockfile is present"; - QMetaObject::invokeMethod(this, []() { exit(1); }, Qt::QueuedConnection); + QMetaObject::invokeMethod( + this, []() { exit(1); }, Qt::QueuedConnection); return; } } @@ -1734,7 +1736,8 @@ QString Application::getJarPath(QString jarFile) #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) FS::PathCombine(m_rootPath, "share", BuildConfig.LAUNCHER_NAME), #endif - FS::PathCombine(m_rootPath, "jars"), FS::PathCombine(applicationDirPath(), "jars"), + FS::PathCombine(m_rootPath, "jars"), + FS::PathCombine(applicationDirPath(), "jars"), FS::PathCombine(applicationDirPath(), "..", "jars") // from inside build dir, for debuging }; for (QString p : potentialPaths) { diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.cpp b/launcher/ui/widgets/MinecraftSettingsWidget.cpp index 79ff4c060..cfe7a49c1 100644 --- a/launcher/ui/widgets/MinecraftSettingsWidget.cpp +++ b/launcher/ui/widgets/MinecraftSettingsWidget.cpp @@ -51,7 +51,7 @@ MinecraftSettingsWidget::MinecraftSettingsWidget(InstancePtr instance, QWidget* m_ui->settingsTabs->removeTab(1); // Launch m_ui->settingsTabs->removeTab(2); - m_ui->openGlobalJavaSettingsButton->setVisible(false); + m_ui->openGlobalSettingsButton->setVisible(false); } else { m_ui->showGameTime->setText(tr("Show time &playing this instance")); m_ui->recordGameTime->setText(tr("&Record time playing this instance")); @@ -61,6 +61,8 @@ MinecraftSettingsWidget::MinecraftSettingsWidget(InstancePtr instance, QWidget* m_ui->maximizedWarning->setText( tr("Warning: The maximized option is " "not fully supported on this Minecraft version.")); + + connect(m_ui->openGlobalSettingsButton, &QCommandLinkButton::clicked, this, &MinecraftSettingsWidget::openGlobalSettings); } m_ui->maximizedWarning->hide(); @@ -68,6 +70,10 @@ MinecraftSettingsWidget::MinecraftSettingsWidget(InstancePtr instance, QWidget* connect(m_ui->maximizedCheckBox, &QCheckBox::toggled, this, [this](const bool value) { m_ui->maximizedWarning->setVisible(value && (m_instance == nullptr || !m_instance->isLegacy())); }); +#if !defined(Q_OS_LINUX) + m_ui->perfomanceGroupBox->hide(); +#endif + loadSettings(); } @@ -136,10 +142,6 @@ void MinecraftSettingsWidget::loadSettings() m_ui->useDiscreteGpuCheck->setChecked(settings->get("UseDiscreteGpu").toBool()); m_ui->useZink->setChecked(settings->get("UseZink").toBool()); -#if !defined(Q_OS_LINUX) - m_ui->perfomanceGroupBox->hide(); -#endif - if (!(APPLICATION->capabilities() & Application::SupportsGameMode)) { m_ui->enableFeralGamemodeCheck->setDisabled(true); m_ui->enableFeralGamemodeCheck->setToolTip(tr("Feral Interactive's GameMode could not be found on your system.")); @@ -311,6 +313,16 @@ void MinecraftSettingsWidget::saveSettings() m_instance->updateRuntimeContext(); } +void MinecraftSettingsWidget::openGlobalSettings() +{ + const QString id = m_ui->settingsTabs->currentWidget()->objectName(); + + if (id == "javaPage") + APPLICATION->ShowGlobalSettings(this, "java-settings"); + else // TODO select tab + APPLICATION->ShowGlobalSettings(this, "minecraft-settings"); +} + SettingsObjectPtr MinecraftSettingsWidget::getSettings() const { if (m_instance != nullptr) diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.h b/launcher/ui/widgets/MinecraftSettingsWidget.h index 3a4bf30a5..a76ff647a 100644 --- a/launcher/ui/widgets/MinecraftSettingsWidget.h +++ b/launcher/ui/widgets/MinecraftSettingsWidget.h @@ -51,6 +51,8 @@ class MinecraftSettingsWidget : public QWidget { void loadSettings(); void saveSettings(); + void openGlobalSettings(); + private: SettingsObjectPtr getSettings() const; diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.ui b/launcher/ui/widgets/MinecraftSettingsWidget.ui index a70d2418e..d86fe20f4 100644 --- a/launcher/ui/widgets/MinecraftSettingsWidget.ui +++ b/launcher/ui/widgets/MinecraftSettingsWidget.ui @@ -24,7 +24,7 @@ 0 - + Open &Global Settings @@ -61,7 +61,7 @@ 0 - -131 + 0 610 607 From 900235642cc806aa671c05ee8f90cc6168a8e3ae Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 7 Nov 2024 12:16:22 +0000 Subject: [PATCH 353/616] Fix formatting oversight Signed-off-by: TheKodeToad --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f016391d3..31881270a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ We have no tool for enforcing names but please follow the following conventions - Public class data members should be formatted as `camelCase` without the prefix: `dateOfBirth`. - Public, private or protected `static const` class data members should be formatted as `SCREAMING_SNAKE_CASE`: `MAX_VALUE`. - Class function members should be formatted as `camelCase` without a prefix: `incrementCounter`. -- Non-`const` global variables should be formatted as `camelCase` without a prefix: `globalData`. And, of course, should be avoided where possible. +- Global functions and non-`const` global variables should be formatted as `camelCase` without a prefix: `globalData`. - `const` global variables, macros, and enum constants should be formatted as `SCREAMING_SNAKE_CASE`: `LIGHT_GRAY`. - Avoid inventing acronyms or abbreviations especially for a name of multiple words - like `tp` for `texturePack`. From 9601fbf2d5b36d3609cce6b1a3b458db0d170531 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 7 Nov 2024 14:45:14 +0200 Subject: [PATCH 354/616] Close the window using the invokeMethod to not block Signed-off-by: Trial97 --- launcher/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 11b80a006..0943c4ebf 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1507,7 +1507,7 @@ void Application::controllerSucceeded() // on success, do... if (controller->instance()->settings()->get("AutoCloseConsole").toBool()) { if (extras.window) { - extras.window->close(); + QMetaObject::invokeMethod(extras.window, &QWidget::close, Qt::QueuedConnection); } } extras.controller.reset(); From 8132828ad7f6f53513d8c3012c3110e1f583050f Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 7 Nov 2024 13:36:30 +0000 Subject: [PATCH 355/616] Phrasing fix Signed-off-by: TheKodeToad --- launcher/ui/widgets/MinecraftSettingsWidget.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.ui b/launcher/ui/widgets/MinecraftSettingsWidget.ui index d86fe20f4..6b93f55bb 100644 --- a/launcher/ui/widgets/MinecraftSettingsWidget.ui +++ b/launcher/ui/widgets/MinecraftSettingsWidget.ui @@ -181,7 +181,7 @@ - Show &total of time played across instances + Show the &total time played across instances From 012bbca197b64a22e4b7befd001414283f300712 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 7 Nov 2024 14:51:43 +0000 Subject: [PATCH 356/616] JavaSettingsWidget -> JavaWizardWidget Signed-off-by: TheKodeToad --- launcher/CMakeLists.txt | 4 +- launcher/ui/setupwizard/JavaWizardPage.cpp | 10 +- launcher/ui/setupwizard/JavaWizardPage.h | 4 +- ...ettingsWidget.cpp => JavaWizardWidget.cpp} | 68 ++--- ...avaSettingsWidget.h => JavaWizardWidget.h} | 6 +- .../ui/widgets/MinecraftSettingsWidget.ui | 239 ------------------ 6 files changed, 46 insertions(+), 285 deletions(-) rename launcher/ui/widgets/{JavaSettingsWidget.cpp => JavaWizardWidget.cpp} (91%) rename launcher/ui/widgets/{JavaSettingsWidget.h => JavaWizardWidget.h} (95%) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 7a23b2300..28d184501 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -1085,8 +1085,8 @@ SET(LAUNCHER_SOURCES ui/widgets/FocusLineEdit.h ui/widgets/IconLabel.cpp ui/widgets/IconLabel.h - ui/widgets/JavaSettingsWidget.cpp - ui/widgets/JavaSettingsWidget.h + ui/widgets/JavaWizardWidget.cpp + ui/widgets/JavaWizardWidget.h ui/widgets/LabeledToolButton.cpp ui/widgets/LabeledToolButton.h ui/widgets/LanguageSelectionWidget.cpp diff --git a/launcher/ui/setupwizard/JavaWizardPage.cpp b/launcher/ui/setupwizard/JavaWizardPage.cpp index 8caae173c..6b8ece9f7 100644 --- a/launcher/ui/setupwizard/JavaWizardPage.cpp +++ b/launcher/ui/setupwizard/JavaWizardPage.cpp @@ -14,7 +14,7 @@ #include "JavaCommon.h" -#include "ui/widgets/JavaSettingsWidget.h" +#include "ui/widgets/JavaWizardWidget.h" #include "ui/widgets/VersionSelectWidget.h" JavaWizardPage::JavaWizardPage(QWidget* parent) : BaseWizardPage(parent) @@ -27,7 +27,7 @@ void JavaWizardPage::setupUi() setObjectName(QStringLiteral("javaPage")); QVBoxLayout* layout = new QVBoxLayout(this); - m_java_widget = new JavaSettingsWidget(this); + m_java_widget = new JavaWizardWidget(this); layout->addWidget(m_java_widget); setLayout(layout); @@ -58,13 +58,13 @@ bool JavaWizardPage::validatePage() settings->set("UserAskedAboutAutomaticJavaDownload", true); switch (result) { default: - case JavaSettingsWidget::ValidationStatus::Bad: { + case JavaWizardWidget::ValidationStatus::Bad: { return false; } - case JavaSettingsWidget::ValidationStatus::AllOK: { + case JavaWizardWidget::ValidationStatus::AllOK: { settings->set("JavaPath", m_java_widget->javaPath()); } /* fallthrough */ - case JavaSettingsWidget::ValidationStatus::JavaBad: { + case JavaWizardWidget::ValidationStatus::JavaBad: { // Memory auto s = APPLICATION->settings(); s->set("MinMemAlloc", m_java_widget->minHeapSize()); diff --git a/launcher/ui/setupwizard/JavaWizardPage.h b/launcher/ui/setupwizard/JavaWizardPage.h index 9bf9cfa2b..914630d0b 100644 --- a/launcher/ui/setupwizard/JavaWizardPage.h +++ b/launcher/ui/setupwizard/JavaWizardPage.h @@ -2,7 +2,7 @@ #include "BaseWizardPage.h" -class JavaSettingsWidget; +class JavaWizardWidget; class JavaWizardPage : public BaseWizardPage { Q_OBJECT @@ -21,5 +21,5 @@ class JavaWizardPage : public BaseWizardPage { void retranslate() override; private: /* data */ - JavaSettingsWidget* m_java_widget = nullptr; + JavaWizardWidget* m_java_widget = nullptr; }; diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaWizardWidget.cpp similarity index 91% rename from launcher/ui/widgets/JavaSettingsWidget.cpp rename to launcher/ui/widgets/JavaWizardWidget.cpp index 2b270c482..edf49fab8 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaWizardWidget.cpp @@ -1,4 +1,4 @@ -#include "JavaSettingsWidget.h" +#include "JavaWizardWidget.h" #include #include @@ -29,7 +29,7 @@ #include "Application.h" #include "BuildConfig.h" -JavaSettingsWidget::JavaSettingsWidget(QWidget* parent) : QWidget(parent) +JavaWizardWidget::JavaWizardWidget(QWidget* parent) : QWidget(parent) { m_availableMemory = Sys::getSystemRam() / Sys::mebibyte; @@ -42,17 +42,17 @@ JavaSettingsWidget::JavaSettingsWidget(QWidget* parent) : QWidget(parent) connect(m_minMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int))); connect(m_maxMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int))); connect(m_permGenSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int))); - connect(m_memoryTimer, &QTimer::timeout, this, &JavaSettingsWidget::memoryValueChanged); - connect(m_versionWidget, &VersionSelectWidget::selectedVersionChanged, this, &JavaSettingsWidget::javaVersionSelected); - connect(m_javaBrowseBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaBrowseBtn_clicked); - connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaSettingsWidget::javaPathEdited); - connect(m_javaStatusBtn, &QToolButton::clicked, this, &JavaSettingsWidget::on_javaStatusBtn_clicked); + connect(m_memoryTimer, &QTimer::timeout, this, &JavaWizardWidget::memoryValueChanged); + connect(m_versionWidget, &VersionSelectWidget::selectedVersionChanged, this, &JavaWizardWidget::javaVersionSelected); + connect(m_javaBrowseBtn, &QPushButton::clicked, this, &JavaWizardWidget::on_javaBrowseBtn_clicked); + connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaWizardWidget::javaPathEdited); + connect(m_javaStatusBtn, &QToolButton::clicked, this, &JavaWizardWidget::on_javaStatusBtn_clicked); if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { - connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaSettingsWidget::javaDownloadBtn_clicked); + connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaWizardWidget::javaDownloadBtn_clicked); } } -void JavaSettingsWidget::setupUi() +void JavaWizardWidget::setupUi() { setObjectName(QStringLiteral("javaSettingsWidget")); m_verticalLayout = new QVBoxLayout(this); @@ -183,7 +183,7 @@ void JavaSettingsWidget::setupUi() retranslate(); } -void JavaSettingsWidget::initialize() +void JavaWizardWidget::initialize() { m_versionWidget->initialize(APPLICATION->javalist().get()); m_versionWidget->selectSearch(); @@ -202,7 +202,7 @@ void JavaSettingsWidget::initialize() } } -void JavaSettingsWidget::refresh() +void JavaWizardWidget::refresh() { if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked()) { return; @@ -214,7 +214,7 @@ void JavaSettingsWidget::refresh() m_versionWidget->loadList(); } -JavaSettingsWidget::ValidationStatus JavaSettingsWidget::validate() +JavaWizardWidget::ValidationStatus JavaWizardWidget::validate() { switch (javaStatus) { default: @@ -277,12 +277,12 @@ JavaSettingsWidget::ValidationStatus JavaSettingsWidget::validate() } } -QString JavaSettingsWidget::javaPath() const +QString JavaWizardWidget::javaPath() const { return m_javaPathTextBox->text(); } -int JavaSettingsWidget::maxHeapSize() const +int JavaWizardWidget::maxHeapSize() const { auto min = m_minMemSpinBox->value(); auto max = m_maxMemSpinBox->value(); @@ -291,7 +291,7 @@ int JavaSettingsWidget::maxHeapSize() const return max; } -int JavaSettingsWidget::minHeapSize() const +int JavaWizardWidget::minHeapSize() const { auto min = m_minMemSpinBox->value(); auto max = m_maxMemSpinBox->value(); @@ -300,17 +300,17 @@ int JavaSettingsWidget::minHeapSize() const return min; } -bool JavaSettingsWidget::permGenEnabled() const +bool JavaWizardWidget::permGenEnabled() const { return m_permGenSpinBox->isVisible(); } -int JavaSettingsWidget::permGenSize() const +int JavaWizardWidget::permGenSize() const { return m_permGenSpinBox->value(); } -void JavaSettingsWidget::memoryValueChanged() +void JavaWizardWidget::memoryValueChanged() { bool actuallyChanged = false; unsigned int min = m_minMemSpinBox->value(); @@ -334,7 +334,7 @@ void JavaSettingsWidget::memoryValueChanged() } } -void JavaSettingsWidget::javaVersionSelected(BaseVersion::Ptr version) +void JavaWizardWidget::javaVersionSelected(BaseVersion::Ptr version) { auto java = std::dynamic_pointer_cast(version); if (!java) { @@ -347,7 +347,7 @@ void JavaSettingsWidget::javaVersionSelected(BaseVersion::Ptr version) checkJavaPath(java->path); } -void JavaSettingsWidget::on_javaBrowseBtn_clicked() +void JavaWizardWidget::on_javaBrowseBtn_clicked() { auto filter = QString("Java (%1)").arg(JavaUtils::javaExecutable); auto raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable"), QString(), filter); @@ -359,13 +359,13 @@ void JavaSettingsWidget::on_javaBrowseBtn_clicked() checkJavaPath(cooked_path); } -void JavaSettingsWidget::javaDownloadBtn_clicked() +void JavaWizardWidget::javaDownloadBtn_clicked() { auto jdialog = new Java::InstallDialog({}, nullptr, this); jdialog->exec(); } -void JavaSettingsWidget::on_javaStatusBtn_clicked() +void JavaWizardWidget::on_javaStatusBtn_clicked() { QString text; bool failed = false; @@ -412,7 +412,7 @@ void JavaSettingsWidget::on_javaStatusBtn_clicked() ->show(); } -void JavaSettingsWidget::setJavaStatus(JavaSettingsWidget::JavaStatus status) +void JavaWizardWidget::setJavaStatus(JavaWizardWidget::JavaStatus status) { javaStatus = status; switch (javaStatus) { @@ -429,12 +429,12 @@ void JavaSettingsWidget::setJavaStatus(JavaSettingsWidget::JavaStatus status) } } -void JavaSettingsWidget::javaPathEdited(const QString& path) +void JavaWizardWidget::javaPathEdited(const QString& path) { checkJavaPathOnEdit(path); } -void JavaSettingsWidget::checkJavaPathOnEdit(const QString& path) +void JavaWizardWidget::checkJavaPathOnEdit(const QString& path) { auto realPath = FS::ResolveExecutable(path); QFileInfo pathInfo(realPath); @@ -447,7 +447,7 @@ void JavaSettingsWidget::checkJavaPathOnEdit(const QString& path) } } -void JavaSettingsWidget::checkJavaPath(const QString& path) +void JavaWizardWidget::checkJavaPath(const QString& path) { if (m_checker) { queuedCheck = path; @@ -461,11 +461,11 @@ void JavaSettingsWidget::checkJavaPath(const QString& path) setJavaStatus(JavaStatus::Pending); m_checker.reset( new JavaChecker(path, "", minHeapSize(), maxHeapSize(), m_permGenSpinBox->isVisible() ? m_permGenSpinBox->value() : 0, 0, this)); - connect(m_checker.get(), &JavaChecker::checkFinished, this, &JavaSettingsWidget::checkFinished); + connect(m_checker.get(), &JavaChecker::checkFinished, this, &JavaWizardWidget::checkFinished); m_checker->start(); } -void JavaSettingsWidget::checkFinished(const JavaChecker::Result& result) +void JavaWizardWidget::checkFinished(const JavaChecker::Result& result) { m_result = result; switch (result.validity) { @@ -490,7 +490,7 @@ void JavaSettingsWidget::checkFinished(const JavaChecker::Result& result) } } -void JavaSettingsWidget::retranslate() +void JavaWizardWidget::retranslate() { m_memoryGroupBox->setTitle(tr("Memory")); m_maxMemSpinBox->setToolTip(tr("The maximum amount of memory Minecraft is allowed to use.")); @@ -506,7 +506,7 @@ void JavaSettingsWidget::retranslate() m_autoJavaGroupBox->setTitle(tr("Autodetect Java")); } -void JavaSettingsWidget::updateThresholds() +void JavaWizardWidget::updateThresholds() { QString iconName; @@ -538,22 +538,22 @@ void JavaSettingsWidget::updateThresholds() } } -bool JavaSettingsWidget::autoDownloadJava() const +bool JavaWizardWidget::autoDownloadJava() const { return m_autodownloadCheckBox && m_autodownloadCheckBox->isChecked(); } -bool JavaSettingsWidget::autoDetectJava() const +bool JavaWizardWidget::autoDetectJava() const { return m_autodetectJavaCheckBox->isChecked(); } -void JavaSettingsWidget::onSpinBoxValueChanged(int) +void JavaWizardWidget::onSpinBoxValueChanged(int) { m_memoryTimer->start(500); } -JavaSettingsWidget::~JavaSettingsWidget() +JavaWizardWidget::~JavaWizardWidget() { delete m_verticalSpacer; }; \ No newline at end of file diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaWizardWidget.h similarity index 95% rename from launcher/ui/widgets/JavaSettingsWidget.h rename to launcher/ui/widgets/JavaWizardWidget.h index 35be48478..9c76c0610 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaWizardWidget.h @@ -22,12 +22,12 @@ class QSpacerItem; /** * This is a widget for all the Java settings dialogs and pages. */ -class JavaSettingsWidget : public QWidget { +class JavaWizardWidget : public QWidget { Q_OBJECT public: - explicit JavaSettingsWidget(QWidget* parent); - virtual ~JavaSettingsWidget(); + explicit JavaWizardWidget(QWidget* parent); + virtual ~JavaWizardWidget(); enum class JavaStatus { NotSet, Pending, Good, DoesNotExist, DoesNotStart, ReturnedInvalidData } javaStatus = JavaStatus::NotSet; diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.ui b/launcher/ui/widgets/MinecraftSettingsWidget.ui index 6b93f55bb..78fae9639 100644 --- a/launcher/ui/widgets/MinecraftSettingsWidget.ui +++ b/launcher/ui/widgets/MinecraftSettingsWidget.ui @@ -282,245 +282,6 @@
    - - - Java - - - - - - true - - - - - 0 - 0 - 610 - 454 - - - - - - - true - - - Java Insta&llation - - - true - - - false - - - - - - If enabled, the launcher will not check if an instance is compatible with the selected Java version. - - - Skip Java compatibility checks - - - - - - - - - - - - Browse - - - - - - - - - - - Download Java - - - - - - - Auto-detect... - - - - - - - Test - - - - - - - - - - - - true - - - Memor&y - - - true - - - false - - - - - - PermGen: - - - - - - - Minimum memory allocation: - - - - - - - Maximum memory allocation: - - - - - - - Note: Permgen is set automatically by Java 8 and later - - - - - - - The amount of memory Minecraft is started with. - - - MiB - - - 8 - - - 1048576 - - - 128 - - - 256 - - - - - - - The maximum amount of memory Minecraft is allowed to use. - - - MiB - - - 8 - - - 1048576 - - - 128 - - - 1024 - - - - - - - The amount of memory available to store loaded Java classes. - - - MiB - - - 4 - - - 999999999 - - - 8 - - - 64 - - - - - - - - - - Qt::AlignCenter - - - maxMemSpinBox - - - - - - - - - - true - - - Java Argumen&ts - - - true - - - false - - - - - - - - - - - - - - Tweaks From 4c8c6e543ecef1b447d27b7e72739317e670d039 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 8 Nov 2024 00:18:12 +0200 Subject: [PATCH 357/616] fix contrributing Signed-off-by: Trial97 --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 31881270a..713c9ba7c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,10 +5,11 @@ All files are formatted with `clang-format` using the configuration in `.clang-format`. Ensure it is run on changed files before committing! We have no tool for enforcing names but please follow the following conventions for C++: + - Class and type names should be formatted as `PascalCase`: `MyClass`. - Private or protected class data members should be formatted as `camelCase` prefixed with `m_`: `m_myCounter`. - Private or protected `static` class data members should be formatted as `camelCase` prefixed with `s_`: `s_instance`. -- Public class data members should be formatted as `camelCase` without the prefix: `dateOfBirth`. +- Public class data members should be formatted as `camelCase` without the prefix: `dateOfBirth`. - Public, private or protected `static const` class data members should be formatted as `SCREAMING_SNAKE_CASE`: `MAX_VALUE`. - Class function members should be formatted as `camelCase` without a prefix: `incrementCounter`. - Global functions and non-`const` global variables should be formatted as `camelCase` without a prefix: `globalData`. From 66883db645e72eee221604812efa0bf648de22b4 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 9 Nov 2024 00:11:30 +0200 Subject: [PATCH 358/616] Fix removed signal handler for filter resource Signed-off-by: Trial97 --- launcher/ui/pages/instance/ExternalResourcesPage.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index 4ea12cb6d..50217f982 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -112,6 +112,7 @@ ExternalResourcesPage::ExternalResourcesPage(BaseInstance* instance, std::shared m_model->loadColumns(ui->treeView); connect(ui->treeView->header(), &QHeaderView::sectionResized, this, [this] { m_model->saveColumns(ui->treeView); }); + connect(ui->filterEdit, &QLineEdit::textChanged, this, &ExternalResourcesPage::filterTextChanged); } ExternalResourcesPage::~ExternalResourcesPage() From f41380d91c72a35d6a5ff814c6b484b9171892f6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 10 Nov 2024 00:24:54 +0000 Subject: [PATCH 359/616] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nix-filter': 'github:numtide/nix-filter/3342559a24e85fc164b295c3444e8a139924675b?narHash=sha256-1Wvk8UP7PXdf8bCCaEoMnOT1qe5/Duqgj%2BrL8sRQsSM%3D' (2024-03-11) → 'github:numtide/nix-filter/776e68c1d014c3adde193a18db9d738458cd2ba4?narHash=sha256-SCHiL%2B1f7q9TAnxpasriP6fMarWE5H43t25F5/9e28I%3D' (2024-10-29) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0?narHash=sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c%2BcHUJwA%3D' (2024-10-18) → 'github:NixOS/nixpkgs/4aa36568d413aca0ea84a1684d2d46f55dbabad7?narHash=sha256-Zwl8YgTVJTEum%2BL%2B0zVAWvXAGbWAuXHax3KzuejaDyo%3D' (2024-11-05) --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index a82e6f65f..e599acaef 100644 --- a/flake.lock +++ b/flake.lock @@ -34,11 +34,11 @@ }, "nix-filter": { "locked": { - "lastModified": 1710156097, - "narHash": "sha256-1Wvk8UP7PXdf8bCCaEoMnOT1qe5/Duqgj+rL8sRQsSM=", + "lastModified": 1730207686, + "narHash": "sha256-SCHiL+1f7q9TAnxpasriP6fMarWE5H43t25F5/9e28I=", "owner": "numtide", "repo": "nix-filter", - "rev": "3342559a24e85fc164b295c3444e8a139924675b", + "rev": "776e68c1d014c3adde193a18db9d738458cd2ba4", "type": "github" }, "original": { @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1729256560, - "narHash": "sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c+cHUJwA=", + "lastModified": 1730785428, + "narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0", + "rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7", "type": "github" }, "original": { From 885fc66c14ab55596197465d5456611e48eb4e7d Mon Sep 17 00:00:00 2001 From: Awqre <32497511+Awqre@users.noreply.github.com> Date: Tue, 12 Nov 2024 20:02:50 -0500 Subject: [PATCH 360/616] Lossless image compression Applied lossless zopfli/ect/deflopt compression to PNG files including ones contained in ICO files. Repacked ICO files with optidash icopack Signed-off-by: Awqre <32497511+Awqre@users.noreply.github.com> --- .../resources/assets/underconstruction.png | Bin 14490 -> 12372 bytes .../resources/backgrounds/kitteh-bday.png | Bin 99736 -> 65715 bytes .../resources/backgrounds/kitteh-spooky.png | Bin 94677 -> 77430 bytes .../resources/backgrounds/kitteh-xmas.png | Bin 72818 -> 68931 bytes launcher/resources/backgrounds/kitteh.png | Bin 62973 -> 58885 bytes launcher/resources/backgrounds/rory-bday.png | Bin 83235 -> 75145 bytes .../resources/backgrounds/rory-flat-bday.png | Bin 57713 -> 49757 bytes .../backgrounds/rory-flat-spooky.png | Bin 66906 -> 47832 bytes .../resources/backgrounds/rory-flat-xmas.png | Bin 59495 -> 51816 bytes launcher/resources/backgrounds/rory-flat.png | Bin 52337 -> 44719 bytes .../resources/backgrounds/rory-spooky.png | Bin 95940 -> 76908 bytes launcher/resources/backgrounds/rory-xmas.png | Bin 85543 -> 76541 bytes launcher/resources/backgrounds/rory.png | Bin 76448 -> 68309 bytes .../resources/backgrounds/teawie-bday.png | Bin 190586 -> 163564 bytes .../resources/backgrounds/teawie-spooky.png | Bin 204756 -> 174906 bytes .../resources/backgrounds/teawie-xmas.png | Bin 200137 -> 168267 bytes launcher/resources/backgrounds/teawie.png | Bin 187972 -> 159697 bytes .../128x128/instances/chicken_legacy.png | Bin 6369 -> 5184 bytes .../128x128/instances/creeper_legacy.png | Bin 9046 -> 7449 bytes .../128x128/instances/enderpearl_legacy.png | Bin 21425 -> 18944 bytes .../128x128/instances/flame_legacy.png | Bin 6226 -> 2890 bytes .../multimc/128x128/instances/forge.png | Bin 3229 -> 1556 bytes .../multimc/128x128/instances/ftb_glow.png | Bin 12708 -> 11319 bytes .../128x128/instances/ftb_logo_legacy.png | Bin 7883 -> 6664 bytes .../multimc/128x128/instances/gear_legacy.png | Bin 18321 -> 16940 bytes .../128x128/instances/herobrine_legacy.png | Bin 4937 -> 4514 bytes .../128x128/instances/infinity_legacy.png | Bin 8012 -> 6118 bytes .../multimc/128x128/instances/liteloader.png | Bin 7619 -> 5579 bytes .../128x128/instances/magitech_legacy.png | Bin 23097 -> 21813 bytes .../multimc/128x128/instances/meat_legacy.png | Bin 10583 -> 7876 bytes .../128x128/instances/netherstar_legacy.png | Bin 14062 -> 10041 bytes .../128x128/instances/skeleton_legacy.png | Bin 3673 -> 2882 bytes .../instances/squarecreeper_legacy.png | Bin 9136 -> 7099 bytes .../128x128/instances/steve_legacy.png | Bin 4312 -> 3640 bytes .../resources/multimc/128x128/shaderpacks.png | Bin 12390 -> 10629 bytes .../multimc/128x128/unknown_server.png | Bin 11085 -> 6726 bytes launcher/resources/multimc/16x16/about.png | Bin 1270 -> 752 bytes launcher/resources/multimc/16x16/bug.png | Bin 734 -> 618 bytes launcher/resources/multimc/16x16/cat.png | Bin 736 -> 707 bytes .../resources/multimc/16x16/centralmods.png | Bin 1145 -> 561 bytes .../resources/multimc/16x16/checkupdate.png | Bin 1212 -> 741 bytes launcher/resources/multimc/16x16/copy.png | Bin 957 -> 396 bytes launcher/resources/multimc/16x16/coremods.png | Bin 702 -> 654 bytes launcher/resources/multimc/16x16/help.png | Bin 1297 -> 779 bytes .../multimc/16x16/instance-settings.png | Bin 1410 -> 912 bytes launcher/resources/multimc/16x16/jarmods.png | Bin 693 -> 586 bytes .../resources/multimc/16x16/loadermods.png | Bin 731 -> 609 bytes launcher/resources/multimc/16x16/log.png | Bin 630 -> 327 bytes .../resources/multimc/16x16/minecraft.png | Bin 782 -> 742 bytes launcher/resources/multimc/16x16/new.png | Bin 1175 -> 625 bytes launcher/resources/multimc/16x16/news.png | Bin 727 -> 598 bytes .../resources/multimc/16x16/noaccount.png | Bin 334 -> 191 bytes launcher/resources/multimc/16x16/patreon.png | Bin 840 -> 278 bytes launcher/resources/multimc/16x16/refresh.png | Bin 931 -> 828 bytes .../resources/multimc/16x16/resourcepacks.png | Bin 1207 -> 906 bytes .../resources/multimc/16x16/screenshots.png | Bin 976 -> 533 bytes launcher/resources/multimc/16x16/settings.png | Bin 1410 -> 912 bytes launcher/resources/multimc/16x16/star.png | Bin 729 -> 628 bytes .../resources/multimc/16x16/status-bad.png | Bin 643 -> 400 bytes .../resources/multimc/16x16/status-good.png | Bin 714 -> 483 bytes .../multimc/16x16/status-running.png | Bin 675 -> 475 bytes .../resources/multimc/16x16/status-yellow.png | Bin 590 -> 398 bytes .../resources/multimc/16x16/viewfolder.png | Bin 852 -> 319 bytes launcher/resources/multimc/16x16/worlds.png | Bin 870 -> 768 bytes launcher/resources/multimc/22x22/about.png | Bin 1693 -> 1151 bytes launcher/resources/multimc/22x22/bug.png | Bin 1180 -> 1022 bytes launcher/resources/multimc/22x22/cat.png | Bin 1034 -> 916 bytes .../resources/multimc/22x22/centralmods.png | Bin 1561 -> 984 bytes .../resources/multimc/22x22/checkupdate.png | Bin 1635 -> 1157 bytes launcher/resources/multimc/22x22/copy.png | Bin 1004 -> 461 bytes launcher/resources/multimc/22x22/help.png | Bin 1735 -> 1217 bytes .../multimc/22x22/instance-settings.png | Bin 1964 -> 1431 bytes launcher/resources/multimc/22x22/new.png | Bin 1440 -> 907 bytes launcher/resources/multimc/22x22/news.png | Bin 1173 -> 932 bytes launcher/resources/multimc/22x22/patreon.png | Bin 939 -> 332 bytes launcher/resources/multimc/22x22/refresh.png | Bin 1283 -> 1182 bytes .../resources/multimc/22x22/screenshots.png | Bin 1320 -> 849 bytes launcher/resources/multimc/22x22/settings.png | Bin 1964 -> 1431 bytes .../resources/multimc/22x22/status-bad.png | Bin 968 -> 561 bytes .../resources/multimc/22x22/status-good.png | Bin 994 -> 724 bytes .../multimc/22x22/status-running.png | Bin 957 -> 702 bytes .../resources/multimc/22x22/status-yellow.png | Bin 803 -> 592 bytes .../resources/multimc/22x22/viewfolder.png | Bin 1006 -> 475 bytes launcher/resources/multimc/22x22/worlds.png | Bin 1397 -> 1262 bytes launcher/resources/multimc/24x24/cat.png | Bin 1252 -> 1175 bytes launcher/resources/multimc/24x24/coremods.png | Bin 1281 -> 1176 bytes launcher/resources/multimc/24x24/jarmods.png | Bin 1170 -> 1024 bytes .../resources/multimc/24x24/loadermods.png | Bin 1240 -> 1092 bytes launcher/resources/multimc/24x24/log.png | Bin 1117 -> 607 bytes .../resources/multimc/24x24/minecraft.png | Bin 1500 -> 1452 bytes .../resources/multimc/24x24/noaccount.png | Bin 344 -> 186 bytes launcher/resources/multimc/24x24/patreon.png | Bin 977 -> 377 bytes .../resources/multimc/24x24/resourcepacks.png | Bin 2000 -> 1679 bytes launcher/resources/multimc/24x24/star.png | Bin 1217 -> 1062 bytes .../resources/multimc/24x24/status-bad.png | Bin 1102 -> 632 bytes .../resources/multimc/24x24/status-good.png | Bin 1066 -> 794 bytes .../multimc/24x24/status-running.png | Bin 1059 -> 749 bytes .../resources/multimc/24x24/status-yellow.png | Bin 872 -> 648 bytes .../resources/multimc/256x256/minecraft.png | Bin 49869 -> 42727 bytes launcher/resources/multimc/32x32/about.png | Bin 2658 -> 2088 bytes launcher/resources/multimc/32x32/bug.png | Bin 1772 -> 1584 bytes launcher/resources/multimc/32x32/cat.png | Bin 1678 -> 1573 bytes .../resources/multimc/32x32/centralmods.png | Bin 2119 -> 1477 bytes .../resources/multimc/32x32/checkupdate.png | Bin 2480 -> 1989 bytes launcher/resources/multimc/32x32/copy.png | Bin 1401 -> 777 bytes launcher/resources/multimc/32x32/coremods.png | Bin 1758 -> 1595 bytes launcher/resources/multimc/32x32/help.png | Bin 2720 -> 2161 bytes .../multimc/32x32/instance-settings.png | Bin 2983 -> 2429 bytes .../multimc/32x32/instances/brick_legacy.png | Bin 2388 -> 233 bytes .../32x32/instances/chicken_legacy.png | Bin 1181 -> 987 bytes .../32x32/instances/creeper_legacy.png | Bin 1524 -> 1361 bytes .../32x32/instances/diamond_legacy.png | Bin 2444 -> 228 bytes .../multimc/32x32/instances/dirt_legacy.png | Bin 482 -> 211 bytes .../32x32/instances/enderpearl_legacy.png | Bin 2120 -> 1893 bytes .../multimc/32x32/instances/ftb_glow.png | Bin 1747 -> 1515 bytes .../32x32/instances/ftb_logo_legacy.png | Bin 1607 -> 1452 bytes .../multimc/32x32/instances/gear_legacy.png | Bin 2414 -> 2281 bytes .../multimc/32x32/instances/gold_legacy.png | Bin 2366 -> 228 bytes .../multimc/32x32/instances/grass_legacy.png | Bin 618 -> 408 bytes .../32x32/instances/herobrine_legacy.png | Bin 1034 -> 850 bytes .../32x32/instances/infinity_legacy.png | Bin 1714 -> 1319 bytes .../multimc/32x32/instances/iron_legacy.png | Bin 1772 -> 195 bytes .../32x32/instances/magitech_legacy.png | Bin 2646 -> 2503 bytes .../multimc/32x32/instances/meat_legacy.png | Bin 1514 -> 1129 bytes .../32x32/instances/netherstar_legacy.png | Bin 1942 -> 1201 bytes .../multimc/32x32/instances/planks_legacy.png | Bin 2299 -> 226 bytes .../32x32/instances/skeleton_legacy.png | Bin 696 -> 442 bytes .../32x32/instances/squarecreeper_legacy.png | Bin 1623 -> 1388 bytes .../multimc/32x32/instances/steve_legacy.png | Bin 969 -> 757 bytes .../multimc/32x32/instances/stone_legacy.png | Bin 1866 -> 185 bytes .../multimc/32x32/instances/tnt_legacy.png | Bin 378 -> 230 bytes launcher/resources/multimc/32x32/jarmods.png | Bin 1566 -> 1406 bytes .../resources/multimc/32x32/loadermods.png | Bin 1708 -> 1539 bytes launcher/resources/multimc/32x32/log.png | Bin 1460 -> 850 bytes .../resources/multimc/32x32/minecraft.png | Bin 2495 -> 2352 bytes launcher/resources/multimc/32x32/new.png | Bin 1769 -> 1293 bytes launcher/resources/multimc/32x32/news.png | Bin 1752 -> 1342 bytes .../resources/multimc/32x32/noaccount.png | Bin 363 -> 182 bytes launcher/resources/multimc/32x32/patreon.png | Bin 1086 -> 441 bytes launcher/resources/multimc/32x32/refresh.png | Bin 2182 -> 2075 bytes .../resources/multimc/32x32/resourcepacks.png | Bin 2818 -> 2419 bytes .../resources/multimc/32x32/screenshots.png | Bin 1892 -> 1388 bytes launcher/resources/multimc/32x32/settings.png | Bin 2983 -> 2429 bytes launcher/resources/multimc/32x32/star.png | Bin 1698 -> 1492 bytes .../resources/multimc/32x32/status-bad.png | Bin 1422 -> 890 bytes .../resources/multimc/32x32/status-good.png | Bin 1400 -> 1048 bytes .../multimc/32x32/status-running.png | Bin 1425 -> 1045 bytes .../resources/multimc/32x32/status-yellow.png | Bin 1158 -> 920 bytes .../resources/multimc/32x32/viewfolder.png | Bin 1518 -> 958 bytes launcher/resources/multimc/32x32/worlds.png | Bin 2336 -> 2195 bytes launcher/resources/multimc/48x48/about.png | Bin 3995 -> 3331 bytes launcher/resources/multimc/48x48/bug.png | Bin 3124 -> 2680 bytes launcher/resources/multimc/48x48/cat.png | Bin 2733 -> 2521 bytes .../resources/multimc/48x48/centralmods.png | Bin 3201 -> 2506 bytes .../resources/multimc/48x48/checkupdate.png | Bin 4196 -> 3582 bytes launcher/resources/multimc/48x48/copy.png | Bin 1952 -> 1271 bytes launcher/resources/multimc/48x48/help.png | Bin 4170 -> 3535 bytes .../multimc/48x48/instance-settings.png | Bin 4797 -> 4146 bytes launcher/resources/multimc/48x48/log.png | Bin 2825 -> 1713 bytes .../resources/multimc/48x48/minecraft.png | Bin 5077 -> 4563 bytes launcher/resources/multimc/48x48/new.png | Bin 2870 -> 2215 bytes launcher/resources/multimc/48x48/news.png | Bin 3333 -> 2408 bytes .../resources/multimc/48x48/noaccount.png | Bin 387 -> 183 bytes launcher/resources/multimc/48x48/patreon.png | Bin 1390 -> 622 bytes launcher/resources/multimc/48x48/refresh.png | Bin 3743 -> 3627 bytes .../resources/multimc/48x48/screenshots.png | Bin 3010 -> 2474 bytes launcher/resources/multimc/48x48/settings.png | Bin 4797 -> 4146 bytes launcher/resources/multimc/48x48/star.png | Bin 3227 -> 2799 bytes .../resources/multimc/48x48/status-bad.png | Bin 2389 -> 1536 bytes .../resources/multimc/48x48/status-good.png | Bin 2248 -> 1807 bytes .../multimc/48x48/status-running.png | Bin 2288 -> 1732 bytes .../resources/multimc/48x48/status-yellow.png | Bin 1773 -> 1491 bytes .../resources/multimc/48x48/viewfolder.png | Bin 1945 -> 1342 bytes launcher/resources/multimc/48x48/worlds.png | Bin 4043 -> 3823 bytes .../50x50/instances/enderman_legacy.png | Bin 2429 -> 1327 bytes launcher/resources/multimc/64x64/about.png | Bin 5513 -> 4775 bytes launcher/resources/multimc/64x64/bug.png | Bin 4263 -> 3810 bytes launcher/resources/multimc/64x64/cat.png | Bin 4033 -> 3764 bytes .../resources/multimc/64x64/centralmods.png | Bin 4408 -> 3607 bytes .../resources/multimc/64x64/checkupdate.png | Bin 5858 -> 5102 bytes launcher/resources/multimc/64x64/copy.png | Bin 2884 -> 2078 bytes launcher/resources/multimc/64x64/coremods.png | Bin 5036 -> 4263 bytes launcher/resources/multimc/64x64/help.png | Bin 5402 -> 4351 bytes .../multimc/64x64/instance-settings.png | Bin 7125 -> 6346 bytes launcher/resources/multimc/64x64/jarmods.png | Bin 4003 -> 3618 bytes .../resources/multimc/64x64/loadermods.png | Bin 4406 -> 3894 bytes launcher/resources/multimc/64x64/log.png | Bin 3686 -> 2420 bytes launcher/resources/multimc/64x64/new.png | Bin 3949 -> 3157 bytes launcher/resources/multimc/64x64/news.png | Bin 4968 -> 3446 bytes launcher/resources/multimc/64x64/patreon.png | Bin 1667 -> 785 bytes launcher/resources/multimc/64x64/refresh.png | Bin 5745 -> 5352 bytes .../resources/multimc/64x64/resourcepacks.png | Bin 6805 -> 6022 bytes .../resources/multimc/64x64/screenshots.png | Bin 4518 -> 3878 bytes launcher/resources/multimc/64x64/settings.png | Bin 7125 -> 6346 bytes launcher/resources/multimc/64x64/star.png | Bin 4554 -> 3851 bytes .../resources/multimc/64x64/status-bad.png | Bin 2827 -> 1972 bytes .../resources/multimc/64x64/status-good.png | Bin 2954 -> 2304 bytes .../multimc/64x64/status-running.png | Bin 3178 -> 2408 bytes .../resources/multimc/64x64/status-yellow.png | Bin 2358 -> 1922 bytes .../resources/multimc/64x64/viewfolder.png | Bin 2134 -> 1470 bytes launcher/resources/multimc/64x64/worlds.png | Bin 7303 -> 6933 bytes launcher/resources/multimc/8x8/noaccount.png | Bin 284 -> 138 bytes launcher/resources/sources/burfcat_hat.png | Bin 15813 -> 9969 bytes program_info/prismlauncher.icns | Bin 400974 -> 194065 bytes program_info/prismlauncher.ico | Bin 372526 -> 18235 bytes 205 files changed, 0 insertions(+), 0 deletions(-) diff --git a/launcher/resources/assets/underconstruction.png b/launcher/resources/assets/underconstruction.png index 6ae06476eb256384ce693014bf2642365ba83220..5f2fdf9e45a21e32d32f058761235bd42c33714c 100644 GIT binary patch literal 12372 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 ACIA2c literal 14490 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 R?t``%db;|#taD0e0sswPW=sG8 diff --git a/launcher/resources/backgrounds/kitteh-bday.png b/launcher/resources/backgrounds/kitteh-bday.png index 09a36566934a0b25088486c10c452d71752464f8..f4a7bbc1fe48de1780c0dd3d38c798a782ec68c2 100644 GIT binary patch literal 65715 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í?n`&)NEu2^9 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 literal 99736 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 z⩰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

    8JGk?-WWN@rFscy?ztW3sru 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 diff --git a/launcher/resources/backgrounds/kitteh-spooky.png b/launcher/resources/backgrounds/kitteh-spooky.png index deb0bebbe65f452a93f6147086e44101d56c0514..da10967874497701058c3e59486142cd222fbdf8 100644 GIT binary patch literal 77430 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

    w>A(D0bJqT-Es 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 literal 94677 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 diff --git a/launcher/resources/backgrounds/kitteh-xmas.png b/launcher/resources/backgrounds/kitteh-xmas.png index 8bdb1d5c88e2b0d1b00e4aefee2a8a6229bdeee8..1e92e90817c7e84e660d3577de69e253cccb635a 100644 GIT binary patch literal 68931 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�G`qOuT8=&iqPD-=w8o{Fg)Gg!1`1 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 Kb6Mw<&;$VJ;73mY diff --git a/launcher/resources/backgrounds/kitteh.png b/launcher/resources/backgrounds/kitteh.png index e9de7f27ceb5b8882b7478a8f2a629008353b29c..fa3d525488c59acde3f6710a080957bfd4e55db6 100644 GIT binary patch literal 58885 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 z

    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 z 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 literal 57713 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 diff --git a/launcher/resources/backgrounds/rory-flat-spooky.png b/launcher/resources/backgrounds/rory-flat-spooky.png index 6360c612fc2108e300cd6243be36d4530388d78d..4a0046c2b88d9133290bb99868c08d869ef893f5 100644 GIT binary patch literal 47832 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%0AD-#QC14AnVB=z|z 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

    5njbxIHz?DEZJV~-UdQmidv~$%Ow|?P)cv!xu54 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 literal 59495 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

    Sc{=HEL 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 L{an^LB{Ts5ZjSUs diff --git a/launcher/resources/backgrounds/rory-flat.png b/launcher/resources/backgrounds/rory-flat.png index ccec0662bcbef77e2c9a59d6fa5cbd4414193804..4536dee78f276613f55680817d472336c69aba3f 100644 GIT binary patch literal 44719 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 yFf>irkhrI-pUXO@geCx$Bo&eX literal 52337 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%0Dv#Y-$tC0D|rsv6Yh;(5a&EkL=YV#AUp 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 aJw599{#$EUCNeNEFnGH9xvX8f};Gi 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 NJYD@<);T3K0RTZfZl?eM diff --git a/launcher/resources/backgrounds/rory-xmas.png b/launcher/resources/backgrounds/rory-xmas.png index 107feb780a935d73f85f14ed7e4283fe3b74b753..f33e92666b2f3c8086223099e5f8c9bc92ce1cc4 100644 GIT binary patch literal 76541 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%0Aeef*H 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Ð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 BeK7z4 diff --git a/launcher/resources/backgrounds/rory.png b/launcher/resources/backgrounds/rory.png index 577f4dce9e2008e7e878ad2e00bbc24c609bd0d5..5570499c22c24045bb2b09e2c670c26d683743f4 100644 GIT binary patch literal 68309 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 literal 76448 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 diff --git a/launcher/resources/backgrounds/teawie-bday.png b/launcher/resources/backgrounds/teawie-bday.png index f4ecf247cba21002a7510a8cd0020f3415e58575..7bf666ed4c1591264766021e01560e3c28c14034 100644 GIT binary patch literal 163564 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 z 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 Hr-UW|^(t0$ diff --git a/launcher/resources/backgrounds/teawie-spooky.png b/launcher/resources/backgrounds/teawie-spooky.png index cefc6c855789b3bbb325dece0664542d64ebf025..8b6bda6304e4ec0414cae33b8f79cf6e93236d48 100644 GIT binary patch literal 174906 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 z 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

    K?3#<` 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⁡qY3MaZ``ot(o&7CeQw&v_=$%?ra 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 literal 204756 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 @I_UG@pH4F33%$#xI?Wx68vhDG|tKRH-q+s_+ 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

    sV&M9mTA7c(q@MPAzbAG{7 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 z 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�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

    Q^~UI>;I9EywA^V9uyg$iaJ9GQK;$@7+>nhy8p( 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

    >EE;aKVPrs zjP%Me6Fl-TVA}Kb+>0}wcPjnwpS`5<_eNX0_ct@%>@6~GSRdvUFRu1+%QdYvS6&(Q z34an_8TxtygJ)KO@QiDW>({JE@Vq2fnbvhj#C0P7rh^Z944+Nc{cxN=N`RDqC<=;qQyw@y0tkd|Wdb=Pl_rI_u_dAUnfue^I7} z#!?y8+fsg)D_I!lu@oo?r?tHWs%l}XCoOe{?)!*zb@}+tzF-`vt?Hjgf~yh z;6Z#%CH$851Ra-`fBAD=M#SQVyZ8B3l}$D|F?VnAqmfG5nW!F z%B1E0b=x1E{Jlo%XF|gqn*x(#N{&yqPD8F?a3e`;nNX`ke^HEiuQmw8LSxUzlzJ=IA<)uTH0 z#-RyUtZzTpTALxiVfFk4a-1odv(je&7p?r3vf%K1-or1x+ilxsP{C(>;nlTU{BDIs zLD{;OOB$|S;fecot$cx<$(b*Y>Mxx*q1oYkK&`albo%)R!tZO<=lwb2?)h=Yv?~XG zepq_dmFE|8$BxDgmTW!m+GOT6cHA`JEyC@=>s(Q*^RD9W=I_e2Uz!Cp95T159Gm_B^7Z7DEH;^gHv2RMe$D*8SNikv z`E2IXk6o2|_v?`U;g8Yz%F~oyY`}bQ}%jcg_n|In}-pNX=UvVpE&Z>}AqD!ZEu-E>2)H;>xP!zLgF^lzjyH?xZ zeF@*6w8@O_hd&v z_vNj>p5Ao)ztf#(!Ye6;^62bj#nz6+EWh*ja8~!p>Z>c7U;L@mGwnu-w6}M~|1_1) z`|khN)tP788@Ijr>sM2)cY3<|38}fPZ|^afWiH(GSmWf`6B8vlWSzZE3bw93K1D&O z?UrxVja#1+AN~rQp?FL?=6Um>$zE~GCLD6OY}a-PQs`>IA|DF(-;oR>^rZ+~F?K7SYA?|!*u{_yDfdTy<&R*Vj__$+i!&2QIy%EKmNdp)c4 z{k+Rtr4B3&K6t#sZ0c;KkN*}N&peR+zc14AU~(iAQ+t1W^QjLS=WI&sYyTBJT)fyo zYU8mvGKSl%C6D%>f4cJMw+cUgM*BrGr#Ss93|c>rYw?a%Tipa)47?@>ecZafMp>== z{qcX3uP=_uPb?|qy?T|`gS#cURK;3)OOw|Ki#Bv*p*XeYl}+*Y{IhZuz15dFdxM%jkq(dbefbGfP+FstWd1zt=gMm@uBu z)z0S5pL%X*(XwYu3JDX0&Xvpid9muPYTWq8CV{uYAoRxMOAl8t7TnWeTJX0hIc62B zo_qYa=NEP!(s)oOnOAmam)Eyf=7*Rx?~Ai1H1J1=%q{3`SuC^JwDwuSv`+3hSxcrY z2wJzDecyb6)gl(+{`Zax%4s~3USg@crewj7T|15+e;xU7{>+`}-r1b{!%r~g{C>#4 z(4t(QY3<9s?eqRK?fJo*fAG?q)IVp}|5duC7u(XXK%;%hKlkGww&nko^Lcy2^>|El z{K8#4mnTP7He~C}>f^4;xiVWqc6LJpd)qzJ!+E{u?rQIi<9~i`zT5WO%cjg_U|h30 zdFsWD1rxQFp8NLRnup;>yZyh|ns4&|+U}%UifXjp&{(tgLjLys>|TE_Zo72gxo1kT z(W;EZx7)8quMH2+{+cyy*&+>|sLQ(xkBje@UH`8806B~$tIwL$405v$0yqs!&ext0b5dCIb#RnlMA zYT91jGPPYlwfQ;A*N+Lg8keko6lp%~Ty%mtn|Dza?{B}@_7#toD_5*Jd;Vdke+?6V z?GNV})xSJTZohVkUaJzy5*2*vu)~6mSpm+$D`fUaPTi}%aJ6oJ>RDlh^%gsY=SK$F zbj~_-VX<~yapHakM#ecjygT$+r%hcF*|bcBNn*NeVeChqvM>4bPDoy{soL(naDxu_ z<_$L4No!TV^IcS|h-Z^tmOh<7q(t0>;etry$5T;1_S&c}@Vs^0f|dDtgy!jz1?zd+ zn$*+2%S8!naAMMt*#5F|m%PtvHXAkBc=hXf9A`A99uH#?vzcKQ_r)w>`Z?tVQo((_ zS4ER%-2J@p`{PT8`JJX6E6y?gdq}@hyDzR@XTdj1$&RNN88qL&`p9u0*9CRu@y)w4Cuu|BA#r^BS8G|rg@@1El;76e*51&awQge2zrflRTm7}yuHBm9^Y+N<{jZ`6 z&&ukn2^4CwDfk5U#LRHNB7J~~5`GSg95Y8|*$V({YI?z{ex+3)N0MA+gj_7z_`v`^doXy{)@eS>39358dTu_iU){ei{p6WtnPUI6W^um~nkCxXsmWt@ZKI8Sc-c$oAn}Ta;d_|N_dJ;@lE}<(y(=ti`i4!LTvnQG z&k%T;uBh&Bblf5NzlZ#jzkO_<@a@-x2@9^w5m|QstzLTOufK}*63$|q*Z;fq{s^yrmFn7-KVMh{zOt`aSH8fAYv#h)f+eN}uCMdj zl2&#*u5GH*Wn@|L!glX-2EMp*ZoPT6Y;%uRe#$u69h1{1An@3r?EH=i>Cb!$8N)x! z2sx;!dNsPqAdA&eVfJC=1!}vR+fV6NH6FcrddG9-_lKL`*YcmcSI)nwuKyL2Nv4YE zt3Q69nY5dkq*pbi+~0b^y5Gt4ctUH^*3@}#B3f@YGQ}jTJlL&m^z6fQ*>hJ;zusrg zx_QwIQ#bAWa-AK;mzO*_b#%_U#n+kET24K>;8ElBtqkAK8E9}G_^We(ck-FI&$De$ zf8lSGiI&+BCw}4M&xz9RjCn4q7oJx!*1CyTetNFtkn)?kO12;>t51R<-RRiaISZ~! zWJv6Yuxel5Zom5clf}Q!A7TGDb=N)l$rG#9+1_3<*J$6sdPqa({l+6t8l5Zd?%yYU z{cf51iN1z;Wg>Z+Dx2msEUTHfuBq9-f1MB0Qdh=Fn+5mH>5WfMYDlThj$HPOM=+XW z&zjcw{Kvcn-OHQe@=e=0J-)}3@+|kaZ~gX&Nkhq-{lsP;mc$t>js+&1!kbqI{eH7E zZux<474I6)`hH#5b?MjbS!=HyR9VTPs9JWnN<8l8)Bm%i4s3gtU3q2tHG$HqfJ(+p zoi71Qp}Yt0e@I%&zImdOZ_<}+(froyQnL?ioIRgk_-Mta%ks(xotKI>Y4B{l792Ti z-kb@qX39Drey;a@S9qG#TEm*jlU}9vx^14A#@y(TTys9I$LIZlJ3BX5JXtJ%F#X@h z_Zxqlxh!B=n!_xxpk_CxmT_vn6D;9l*JHZ2T)4V-$+04pg&FZbTnp~q z@1OA_O5`?&MML8aE-MCiWuAmTJLfje^uM0U&2ls?RmRuy!L#he=0#N#@3Wg{US1sR zmf&R>&)wX=y3kXc^Wx8+b_Nr?cBP3|KDz0!P=rl;b3kVMEQQ>kyQSyNaSF;$di5Z2 z&$qSzrGEFz=m)1Sxc>LcQm6IzT_-+2BT>5Q$}xk;7ROm7Zy5r%ESy@#&Ghfj9I3^x z3%CQOY*jY$Ic?-%u{AgT$z}1$r+xd}_BwvM@42*T<=x*OPCTz_|HP9ytH?xc$~Du7 z>P6Szss#uBxp+DIdQ8E%}kl9ZtDX-E-_GX_;TiN`20gzyL*os`#XzRGR`(s z>w8pjN}@XY+RHifjgLOw!E}7ttV0{Ne$$hE(OEaG>u-3htJ#_UT&~o4|KFrfT)SqW zn7RPdkuNK+OK;g_;-om)@XQUnBh~(kcKsJgDdk{Q*)i`>!h)@7rwsn{*|htzbsQ4$ zdHmF=-16b)C8xCWuO~n1bN>Bnjp@0o#s@C${Bw)jT~TN4d+ro3|LZ&gC4N@hA1N6w z&v;=PX0$B1aPvw%?iUFLj2fY?=dDeXs{AaRn6vvUg|v9MnDne3YBaxJ96YT|>o!l( zmDkOaPWjF6z0d5mF!C|O={(a#+P^zR{Qo6br@tz0no^M9@_a+iY2W{1Rt^^<6$|}B zzi`g*kWD!6xaZO7dwtSzAB1{({3~i5>iUIOJBdtjOD^;V}ZN7F}ucDX;(qZ z1}3ID`w3r`v_`ZxO=Y{Jqsp)FZ}-=`4vg$A4bcIaLi4v?n^Yg1T_Yquzpg3hBG;y# zc~cCoUFk7wUt>6Z+3d6J8HT%T=UFFg)?UY#x%PdZw&&GDr|$h?i~A|RpSAZIM@vDF zw#}nF`KepYN@h7na0_a^*r@gORzb>S-R}up3+}H`TC2)%$56+3#+GC6l*2DiPx$$X z^;4{V(WQj@CD``H@n?Vj{6bHE@%7x` zbvq3zcmBHe;#>8Et${3)*(b>CVeG9{U!bKMp=fhg@7l#j&s-X;x2@!O$JlmfmBJaL zuU-G2ayx$7So>`HlkcCaWBs|BMP`&RJYf~T@VBGuwW6Kkp|zK$e)%25@M>>Ub-ico zGo`)JjMZ9aefpREezf9bjeLywZq0)%1vz>5+T*t;e3Sov|Hm5Z{k&uRBDO~4<+J^}{p+~)roTJ-;FGY&bARP{ z3+~+&WySlAJ+6x-T+-`$XZ7i;>I#J>z7zWGcdb{J37?#^W<4uQmh<5q-@aJ~W}7_x zG|Oh@=h6oD(x1YtyY}c!dmA`!D)Zj%*~u?=9adOU?Q;BktNa{2**W)QSu~_xeY^E# z?=x231A!CwXFU8BIgRf`uh|7f+3cDsb}i?_7T<3y77%;T_ELevRiM>#|Mk7sc-Z*Q z&wOOE?Rarg$0o~g9(w7_(Vl)H_R>vz>*GEZtf?CKj$#(54_GTWJr@D=v>^iLZ zv4Z>Nd|@;PplUP*FUOHaJ;Yj`z-g(>Hx!V;%O z2CH>S`F>7U-3*NG99ieZK7C#l(<~XU#%D)(^6Jk@7k>ER`MtV8-2HrINKu1Q-_M_? zRq7|Fu6%BE>UWjj#>9?~8$Fdaet5sTAdBnXKN;T7#opeZXUyH}@w{eRq1>Ghc8`zz zFqwH^;;9DKjqmOLHhzC_clIUUxnDzAA{}LXU&&%B4UdhWQ>306ClUUn~j6)JD(s~m9 z8?>;<8qLmEw%^PooN-3(PHUcOnbFgCXW|&mPqY0v5&uu|-cN7)wtJ_PX7pLU;Gecj zTDm^9=jSrtX}A9T53ihMASso_BQG4ZFLCeQUrE`8Cl0ku^%Cu>i52)a+ zcjB?{jy-Q0cvs)iJZEzKQeEVs152lz+9Gm&JI5LZ_vvR(r@5$ac{#^8@u4qU!IVTc z6RUE80L44z{LH^!828Tl#>&s8{`>)_`k5Ch-+#uOVSD_{U+(E^lb=CL*pB}zn#eI( z=*5gT3NODg#~in3xtjPQ=FE>roc-@P?|V;cPW)_o-0bs;Q|las3%;A5ZrIX&@RF;_ z>*X7(kF%VcZ`=R%XeGyN;~ke6O9ZB*6*DfKyd*?Lck**d+v%w(_hV5f1cg8`LJc*q4G%Kpbe=L>vC&n zsw}&tv-JF95yhBOf(+gwfs3D?IAPJKvY$^siABF?n_j?+>Vk)dB(1^|i!2h77Cd70 z2sGo&ezp7N=I08689%J5-tyM`vHjoRzyI_53z3mbH;dT?b#&MwXMMf(_II!0`-;Ad zmAT6=9#g!pGPSCeuPK6I(TU7V~!cXbp} z$@TH5ZQlBAdDo&J;X6;}PmMa8A^XCj?`GP}C3im`Qd;l7uIHou-x{?~wEPQ;?^K}%~7yqmSB-|&MtgB}axRgM6M z2xgDvMmZa&YQ6cTsqnyX_ns5SPKs6j=Hy(G$ydgin#6K>ZDr#j7e=$9$4a&jz85u| z^StiyJk3*#&1s(G_Itq<-SXiFo?nr@ddMn!!)E`4f^T&Zv3%j)U2SL8l1j|X z0@j)v?5)<9TKrgI?yQBMKkt-HI&^il#9Qy(g^Pp_U-~&WLi_rQnj&Y%29_(YO8fK9 zXB=MXH@#`eb5EOX_g`P!S<|M%|I#(qsX;uRrQi%l&t!?;eKO9qH8RuZ)p2ER=gxEE zJLKTlwNS^`T|M-}Ov}mZ6RTrxPCRSs_^C8#b^hvWuS=5~J6Eqi9RByn`o)$;Y{|9a zk55Ih9~Kv1@JZ&N0&9yyMFPtvQD=?-uC@Pf2<7BWP*v2Ez1Mr_XB0!-5q|Fa8FBpY zf1i{;aR2|y^~_x=S2k|kmuDsY*4uSnZS#*9^^Xgp|JXCmG~i4)qsef8MQOq2R@sFN z3B^~kczG__O$nM3cZyfQPu6MA^Q;%gEJ`G-H@fy;;$m3$;N6n3m7e23=Nvc5zfs+u_O9aJEV#EIqMWdP1P6(z*jKyb`j4 zg^l*B7fW$l+|p;}&X8YT^!7$%OXj*`Ox*gtkH4;u(A%{;V^vSp0R`{lpXNHA+`@Z@ z|L~QxUF(_ly!sv@GG&U~)|qj!^N&{i*I7F6)@g2sYwgzz)z!O%j zuWHBI)eVgIHFN!(Icde#wg6dK=j0@*)1RkvCS1$$d$0dVU#3?f6a0Cg|$nWKd2SQZCJBzZ9;PLR4H5b zbF!Bi*H+u}a!)9D_Tt&GiJPupe!5Xqx5JPBLg_r)-zvZU+A+>vzU<-uGshRbcy{2Q zGRGkXh8dpn$AQS>>V{Nc0uwY;KQGqZM?_KF!lwbWK%=Cr-caLOio-woG|W(&-hTxF3~ z_Wgc5_2A(|zWg<@sw{nOzGu$H9(wbJHL1XnL$EFJYLtxjrZ1P~Xv!V^|Fp0;*<#8B zeeT0AtPdIN$u=&J?O)_lzFRiRufMl%^0zBhyLm152!DNi-hI<|sTa2lX2y!1kyw0H zX*u5mpTjyfZjua4y4=qjJQ*4Ny6$gYa7kg>l=ZP}40ZE+U#mY9HI(7zQ4Niealeg2VbsP*oKMlnf!>!b6S$!BK$JtrTl^Vcu)6jY-vxGmUVM`Fm-R; zdHPGt=9^AJ>MxcvXRI_dvulisIofw}uSMaPs+xzZ_lc~p`NAR|TU`WvgB;NN|Zc1<>av@JXTFz@z#4A=L5c)H_brT)Q{XXkBuT)tQ4 zc>JHNj;hHSr<%*8r)DhMPtrGbVBF%B) zv4-Yrhj%-YCmY`={h{%aecie9m!7Y^`dVpKNJ)BaZHdz>{&O>vIB!4hl6h6My;)N> zE`H_JcRpHEcW7{(nX{vAa?sDB{G`Wf@0Z+FPI9;*?;yc2u}N-yW9fy@H+dIKcVu{B zzA9t;s}0}kBThABISS9^*h}&7CZ2O|JMEgs z@AvRPk^7GKlTI#6WMFPg*|2bG=z+9W=B zCHE(vS3`#T z+{xnx5*0Z%QilY^?i9|fWLtOk!m&$+b9Ozhm9@QfSv@)7d9p=X)XHlNlNBRsxTa2B zKCy$Td%FI`-`bw764R}^HY7inJ7c0=_~ydail1sb_WW9R{n5AA?+^5?oV(&$R)7_Q z@6>2dk&<}FZj)FEm$!0RtEDq^)-Bq)qwST#;fx6hMLAsR>v!`W&)X^N{;q~IWo_To zqpVB*ihNzt6qe258PqDqiOra``HTwVj?ky*)px(ys0D2;0SWMn}4#v3pK@ z?P@mlo>Qe8ZJHI!q(oo*oFuWN;-K^F?u3jQ%)SJewGc);N z&(m4XhckNnlE2-N^pLove%|=%`x2w24db56JwA+Mb0g|T0PQ2;?%Apt5Wj6l#qvc|`@td^im)W8RE_;58 z%&ZHRSg={<>(NjXY3CbTv*qRLUkS$StKqX;D#ew`dhC;qwTa$W_h&x$j{R>nOnPgl z_+jnTs=q(yesgQ>Ug@RDBx<@*{^C1fk8g9Ga*r#XFi5i$Js&@>`|P}*Q=&VIuN+ir zo!4a`{-E=y%8KnrzUMR6cx^~f5Spi~ae7`$V-mmctvM$pD_URaOlke#Vv;JLoYR|J znaOMz^e@W4bO zcKfF+y*p1l4~za=IOTUuYHyFUz2#Sr1yZ_poy=cl{(cqBnZWhEL22QRIOnDJ4rJu= zn9r|~i~D%!`r~P5U!+vk%o1}c`5XOOGU&jsi5e++FRCBg`-}H3xb42_o@?sf-d~@r zj{Rb@*3zA0QDNFAYumc;m;l!ji4;w-=la21Ywo{YaR2oLm;X1_<&VGUo14MQ%gpm6 z&*^)}-opw?2g5(@ym?1P^P*)*Q1QyioQvKwG+gR(IK<9#z@F{uwGJ!W7vEpVFH&w}-Je4IISc{6)@<9tmdR5RdF4uQ=?N7UmV|4+HgL-t ztokA?T9O@lV{QElF}tZz75ppKluy{Q`^&tC#{`bG9sBq|`FjBS7CsZR?G9R7H=o!P zYn=FL-Ra6%f91ce@a!>+56<2iw{D7*>V(NsA1{b#{a){0^nlIfGP_{Ek7Fz6mTOC6 z3lFk>40;n#btNYJLRtKurl4@YRY&fsSiIGA{$F$;p~l=rJamWOw>^J!qD>CkxQQvu zSain6C`|K%=FL>!HnWwATE1)YzHF>{muZsReejdar#SJBYyqn~t5&^nEvU)U`^EI7 zIMRP(&D!XvaW;Q-73Vxqk4a%^4`Ip^J$K+~UD%UzC&f7Wjvn7?lzb{HpkDUio5LK| zp9Lbj40=wyQsh&5V^zT6{8e$zjbh$?FGAznR`bXCzBJxt=P55R$Ej&iy>r%bRrM(> zZ`sRvo5Yo5QlkP?T=s@PedP3%^^nf-8GZ#N&mB!xJKwkw(cYyU5jjsebB4|73CksC zon?D=&Zb$GeVtR#+Fw&Lr2MS?JfaQ=2>WpaZ7YyU^ZS10uddZjg{n1S*)=ulFPZPN z@b~pN&flz2q+jaRe)&(BrHXt0W@@{N{=LV^B-vH->CDfM-WIjjjI+}n_Ven>9G$JKvhH(%ZrkPV%CHNDk&k;KVDn@U%lpL{jc&Hg|8Ds{CyWy{S{etJvYz%?1Hk- zd?BaTmR;ttjkmOHJk`mma{QRUTY0A)n;EyR=CllKU*Rs`$>3-k$lx_WbIX$VeN(qE ziV66I^In&+>Rey(HT=sH*ic$JeHi`kM-J!Pkig?j`%9-mll#au8`SU%&2jg_yX_8z18>zsST z_x|&JagFESFZ24XOKjSdR)!v{lAbGXwKR+S`FgKv?Bs8Tnx>v zn>*6_4k)mApNcr_dc7#9TvNxrIF(P-dx1viK6XF(9shQ-Y~j+W%z6JHC6>)Urs zbnE!I#Nqd)!y239j=YeQP&}xe5aAv=?MuzhBE1~T#t9Gm*0Zw-aGy)lOqrl4N2XB;rR5H!+t7e{J719+~ zZfUa4e^++@A&J5{7b*i78pLl_a52~LW$XU@;N$Y)gkM37}yYc(KoASZ$EN;jwn8&G!M-=a`n7@vU z-E-8e0~vG791^$!gmq)9`Hp^{XB>9SH7GOefT@+2$WF(3-xfZb=X4>`Vf9sq%@>)n zcfYkSlgY2TeY@bp4Z{}(4QIIpA}+99xU1PXc`?6+qeGL!#IOYmzDVtv5O++fLr1}> zYQJ9aQVlN!ui_bTY?t*Dep_~xaZQ%A>VKPF@_*G-se7L`=^x4eb98-DZKbH^+P1G# zMRj8KaI9Ni^X>5a!@cEuCB9TY{+$~+Tc^=d2ap2S1ik~+JuKPxLlNzlXMRa{oudy8q?J(*(RmsES2+4 z>6|}g;_VD7Cpv@^g}Afp_Xn-t@4~(-tLNxK>$tA%wb%U@+>&v!?5H)X`z7?KS1)B| z9mhJUW|@^iA(QXbOL`Pf@#T5JV_xv`f}g~7{zqS5TWss8_I<{>Y`zWu+_Vx24$g%v zTJ7!&gnBORzItexq3**NoG-qJ63<>TY6xEZ$h`Ey@>9a{aj?rcrkbmmdyiF;B?i5FH}*Qho1U@wv5 z=)Dus@yg)Btfo9)rHmed%ti*@GggbwzZ27cC$&>>%DJ7PHJdezQl85-?)<czm zgM_QDjA5Zk=8enj=WO0xT3Q?t9sl(4?#0y(kCo;qaJ>BI?|ZIbZIQNM;|an0-~064 zL|P55J>eGDx6RYNSMz?sXN_&gMLEnIWe(r6UvDz7J4 zBCeOX8ddz3aBaDJCuHlT0|7=Y zdyUyQsOjGOeQ^KLS4)kri1IGHa8BjOyKDjfH_c0)-8c4TOA*xZZT)CkvmJly6Fp^Zx33=$TVxxHyv+Q1~x;sJ$riG=B^aKv2hY7lj;r) z3&(RzO}2$yJg@odII8~YOtNs;8ss`ndX0!-Q>{7E)`ycyk1t47xWxD7Pv(=&{tLHT zaceqGiPCz)?6S?nnAy;zHz9|=={%!PE{7Als&|*;RAq7QF!u?5dh#*y%AED?(-u_E zdv58W@%bYEA}JvwFG zk4<^J>mO&zs;N?@)mdvFe*0e7b$;Upi}s^OD?hC?jJf@B<$JlM@!7tKQ`b0JbI$a6TMmI&!4N?bUkzbzk7A*jJF?mNoP3;_P$u_xz)l~Qq0KVum>ACN480-O`u)qSP$q5bV-wXT z_UCN*8~)!nEvIlff6`-*N2{EUcf~lY{I6`@Q7tuD`SOnM2hTGY7)-k|k$LG8jg}p; zUWJn#>(W%hW?+f-Fo7TBnV6c81Qs&7zZ{B>YC| zcCT`~-=iNBvkQM5i&o^9J97DZ4cFYOsU_CZ9@eX0#8xmVtyGkosUnc@HTvP3;+w`T z+)LlAbegBq$y4Q91VK0i+=ZCP-QiP2?$@4=Q7xC?@dcyO6 zs_X1`sYS~)q+D#_`QvNM-fv^6l`>AH6E5{sk9SAL-vEek?S_dgS6 z%g|nYdC?SgBNn#4+839v|C}>RtSz=Hr$_Ta@B-C}9n%=tt-eOdCMX{q3KJITK4a+OFHNa9Ohk!<*=(L6a-zv0e!Ce z7|;F`^;#OZFv#=8TwO0#1#OQK;TxBvh1erzO1iI`a^B+e)#r@!Titl`X3eqB{po6c z;VjET1JhEa=yw;V7iQ&fO`dH1@xxB_iQlVp^0lW<+ZeEERr7+dY?CBK*A-jD=6+*i zQ8D&js4(Fh`;ipSYUYqvyo`JZ~Dsy zo4h8467E$t$7|>RFwnF4RxnfVT=&$aM~`nd`8(M%_{#>{bvqQfon3=B?!5TQqg8QH z)!Zcu;CNn6!k)mLZ5L~mN}wKKDd&DwS4 zD%;av?&b0a4mw|da4kB%YkU3E>knSm6AJ^o68SeS%y^ra5-+YJ7QSF-; zZmLg6=P$?#c6-wL|5vu4Y5T<$+dYC7FKYazEbqE+8%Orq@CnaC`lJ`JD95weo#r|| zAxUDxgM(iZt>j+U?wlvFK5?bV-l8z(Xq^d>XAjKYa8u*-@*Ulq%%1EtsN!9IZKJ!w zkDoiZHa?Gfa3J@^5}`;(vx74vRw_r?x4-%o`9@}K;*zUM_48Ywmadu2)fIbP+2&_Z z2>%@i1>s|y+!?z{B);>D_HD{xtSV9av2MR6kIA8c&Hnx~`L_7UCce~(I;zDdXVLKS zqh{AJwPVXZuDV{QsaF1WvDM;>LT+9XYdvr4cRN2R^hj&C8z!4QSvjNMMzrdP;3CCm7k9y+v?qiG}8qcqu)zKFv`hvy1#Sl7PjIoEzW z?rYkD6Ca=3|9N|&s`eL?X-eCJKg=56;@FSy2GlOOa`)5cd+Q9=FLeqOJE{2KJ-5U3 zYbWN+Ql2KM)3Q0?nUnQjYaYoPy5)a2yGian*IQ<_KyLD+h=6M~IhGSO(w&aQ7aa&( z5gPfK@on-!75*?;jU9|zOgT%Ru)ff<>3w&{hAC5Vs@mIiSHCg*jgybP>QL~+YJpu> zjQfL*!%+eICq7ZKKJdnfN%CLKH7k2*Hv5B9Zm-dB_0v4n{9sn1XUxRErZ>3x6(v^% zO`P3z+v-@O_&%ns(Rqg!T?%-5WPU3nTOkX_4`+kLr@tQOI6t4&j?ry_4?nY&x|8Ef z-H2uLOiwo?^QqJ2Cw8rSnXb;Ot!!0y`HZ}K&To2o`6YXxtRT~+ z;4K;&NWtdUPM%#4<6#dvdxi{ROc_l0UqKs6QqsNwI<&Sgi zKWR(c-q^k6LYd7Uo)k_7CB6mzet{3~t@$?5cB99G1FdYzta@^{+x^x)`hMZZji&T; zZ zmCh}i&iz|&>#?0B2N);Fvs`@gw(`kpqggk+oKsmd-_3oH(HY$8)X*s~Pjs_l$%zSi z^IBhQUFhRBxo4GG!fI!SRF1HKh5KscuXnY4o~9}P^TxW}G9oJt9{1ZT8_!#FxOtKY zz#FW0`>x*DcPv6?!qnh^IOPbFGqcxaQmukd&Ity8jEeePj1?zh;R9 z@$-jYG5r6>UN599Jb6#S=b(&zne!F0eqOr7RC#=hwY0)p6UE5$dD^QdtZ(X@8KNcf zwZEsw+2T;Avcv_;#;aFFUoCuDX1(Cp*-xeovu(Cd+pn?LedaXV-QR=Rn6Eu}{JvWK z-hcJ_hTfyB5!pH0Z`<0xD6Rj~nDZg{hFtiQ3u4>Yv%}YHb=`m6b+0MQ%F@goEIhF> z3{NL|-&!oUp6QQk{QJfRHl_&-Pm@=RmPlsEG#-1s{bP{vy2LA|GcW(2Si-Zij&V^v z(-niPDPOYKzdjT+X>*sEz`1_^ap5-_Q<}t@)^#hJL`wv1Xq$F~&q4>Y3wwPA-qDS56e!a3PUHTV#&doDX|KDhwUIA2r(S)1Z0g%sJr#JIf%> z=|RRW-@i>+D!F3^b8W%9z#B)?1$ei5d{XTYdShFu{O-@A@`lD^{+!iIb@(;zEbdpc z`%%&Ggm>Rrjp|cohuE$~^LETt_}a6=Ug40>rkxiLc^n8_^H8EljO}QZeA!ZNQOzw< zoO%0S>is#kn15=ft1Ise@$>TzzBnS1abm4ik(k|6368@Z4#}Fc-9_A9@Mi=*HqSG1 zK5zAQSKNAj&D$&<&d$n9H|v}iRGnT*zx zxGc-+e%*b41z-{^0whx}1e@-loI7DOAac+a>X zFYof{OjS>7&BnaNTylk5+a|7@>8p0eedESG4y-;})5^>Qde1Q=vQCOfpVYm|=I4}m zQzt2L*A=af;bC<7nQx#_UH5jKdfR;VAEov&DGiAU!KXBtELMuEKjSPD-1=t4i#3xu zLmYlj>*tHGQFPrQYONd5q7tTj_5TjX3!Z-j4iskf&+cSh6D;z9`)tC2#K~q=7ymPV zR;fG?aWC4v;-O;?-_;k!lc(1Q9hHs$rN8m@iK{oNgc|?bhK2mPwKiAJ6|Qam_3&Va>u@ zXU|-Gd}Hf>h9BkUcntG3pGny*Y;L$W{i)^>l~oqPUUwcHc+IR_CY5_kBp_aG)?`+KhZ z_a^Dq{bjcC7ZZ}t9JKI!$JMl;GbsG^uIc;4f;Ao1%~25JyW+!~wS$S{fKJJYiNXx! zOu-*Z>fW398q}R+%R5x=@L*oE>eT2^kt-|GU%EOnEO@Obs}ld>K#5UDlO1=L!{W;Y zVW+oz_?6E%Yqr9I%}jyY-5r#91EXKs>=I*S=3I{C&SDZnj!s)%=gsudkVXERfZFew4-3tZ$blKKQ)5&HtKwbGHnK%TCRp1EQ0- zogI!&Y-eZtU|VUy^zq6@M)pN-JWkElF0s~A`7X-Hpsh1Q$GPCAp-E}m!3E86``iDY zxfkkST@-UO`oi6$+GR8UryrB6J|<$lOr=a>`plU#_ntX(#z!QL?YN`!n;99$k|h?M zk9YA6UA;#yJo9%=>Rz99#U(0Rqt;Hla(DZ^>hE`NXPA6gqyJ0l&WD-t9BMBAn&z`N z-f6m{wKHSZ)11l0IX=H*8r}3%pKm+Zb1Wf(=fccYi2=HcH!YGkIQ}F>s%#3E z>Z1MjRgXAC|85O?!Rr+BbB(m(lH{+w*JggYKUtCaN!)g3hv?^l?;?8jdY8R4FV8U& zJ{o>X)I&4Z`Q-~&$4Sfm)Hk09TdBCVz+IqdO7@O3dp%GNxin>x)(fyqeSR+`Ihvf0GTI62ZS3;M2a|^bY&GQraG{fJyrI05-i+@Yo>s#%T>&`KRa~p^!6i@1#RcD!HEOUV) z`%|jQ&EVTFGFiFrp1HiKE$H$5_;kSS^e1(%N7Wr% zb{p@tnOpsnWWKq1^O|>w*;XsBRs46q$En8pQudpaZ%p0c&mHId4`2Iqrv8yq??qYuT->ef-eL}WYEdnl~dLmrk?92aaFTeg+W6=q<&c_!Y+nNWKZevN@-_F11 zDR0G}dAldL6}mNbC~GX8A+X3|k8SkQmsbOJm2a>seG{^O^@lG%-kY{}bw*C^rf zo5QlNFW!y1eS61S+xG_+%l|Ymsg-Y6R$F_@=KlBADb*4;yk;$1{ru4fiFtDWli9u- zZ9H@C*UHP;f8*BQ&NRJv|EAlfjhw0yQzl+~uvxTPVO8;3AA<`EIW}%Ba(JxgQe|@L zQ>eLDAiB@1EFKJl(qES@C|6Gx|5a+z46Q_2`-K1CPYn>tY4(#@a}3 z*5q0mI&IM;7LIdX2iCq!jM#tb*-rqOd7aX5i>-6d$|KT{VGtYN(bR0M&c~tWBqlZ;n>ZYi4 zEV}VW@0^j9XYeFWBU1(KawpSO=hV0!ntgkJ+y6c1VhQi|bq7rKf0-m)$Ruaw+2>HnJ7(h?J^A)mudE!R1_Ggy0c8*6C+>YJ4=lid!iCk zN~Kd({!evVe)*VR^667*GaEQGS4L$s&2|b<&?+(eDOeyZB+hEO-R$E*^Syk>^Z#n> zO|MXHn-#91G-HOt#u&9gKVd~ysb9M^xbmyoc=V26eq4V>;CWT-nc~W~R~{YGKDG2y z(Igd{h9kY3%R?dV9u>ydM{fQx&rTI zHap(FGBuogMH(~1N4Nf0rZcxPF1`|5y{pgSL-|})tE7hA2j?B|lX7?Ayu;OC9?7tr zgGr@gg_3K-k)9_UPfr)KW*@UyCjKqq^PS8&RWIUHj`&^vFi~k*>I&pphR;1|vyEMf zSK6_$8-%KqNmiCi75w`Q(U)cmpJTj7%zwGsEDRK1D>SVSbx$yqSyEBu#Ye$jX5VZ{4& z^D@|$9%gIa_xj+bz-_0Dzpi;7BDQwYVZDvFGMW;2f6vIg;oB=!;Nx_|b)y$CkIR=g%)Ht60sO z|M~FkdED(HH@Q~}w`TU9j6C)=X`#USV-t`4zkHD4fuzxoU!6O5%CEheB|c$dkkZHG z`#+L*BxKrOHQJ*scEE;_!Qb*--U`6z>e@c)Hf zN6wg@b(_6>f!t4lZ@T9$r*FNT8}s3i|55S(2hK;$7yo{&I*NfA6k%;ryO4!YhCEdEJMrrtfF!X4iAr8l-N! z(Zo7V=fQJNfpblB0$a9h+}Wj}GP`7QR_NkK^Onge8)mi2{jk$y=XrVIi| zcNQ;S`TUr~rkfXU{&acuX0Ao;^|?1mWp)LYyTVlH4+l`>-55ws;8*-9O7JhNpkM8;HK`>m%k@x&hq)W^wJWZKR1)M zhWSpOvD(o@BSh=y+N+;!R!n(aw{QZ_t+|ZTjb50}K79RDsN!BH8wr!i23eu$>0N8r zu5}X%3bbmu7Hgo!_=drPKf#@Uy5X^Hj4BM<75$ong6wV=>uRfG8}x@IOFs1h&e@$Az3H9559>7rP_@}0tYXA~MVx9y(xDUvAH(U=$0nZGQ&jPe>p-!%k(6cGgq!w@e8aazfBCssTsr9HR~FNgiEGm@ zWhkUFy7Mk5jjdwl5sxV}T~~2&`Gdvv-_<)Fb#z^DGT!h^>&73))pw7+^~@+b+w}Bi z~mx(`lgJ_i;mn`1Jy%cp?TgsEbd_a>S{p??c1Chs$@>yK|&b#YXz0Hjyo*|FtePCLA z=a%djf#sYf7nx_Toe{;d;F`6Ad6C`A9%UV|3oFCRx>N2L%}u{+k)W})dP4IN&m#;W z>mTkr(e*kp><-ImJ*!!Pg;(Yt-1*FsuQ}}9=JL0N9j92kCb&$Rq3@oMrJu0r#l=1;_w#b!**BsD zB<5_|;{AN)*M`8AOmi%`bt5aySaops!w_qA#GEWDk$@b=pWZR`Jdt&!Pvhta3c=zT+?$)gPyJ7dqU z&7W`0&amU)+22JDliAh2?~A#8A@6o#&UMciyDFuEc{64ne{)Bu%KCLctCGdzDbr>} z-*XrLdhDFpP38m< zJ6}fGaz3{3o66Oy9=t5@#?5>0zTeJWIVFpAY0zqj%U4!rHc^H7g~5@8w<28C`fhU+v@_JDVs^NB9o%fye%Z8n?}XVim+mz| ze;tqW#SI%zyWVk0dz`Jkd(XSLQ;mYhzF&ADbCD(4h~Ztu*~Y2Wz3<8ug#sA&O1Fyi zp7A-KRG7-T`fx|$&ku#~bA*RjiOA^W7Qqi4wOo8Nd?P?TlavS$U)juhVcHqHFun`Zui#a{~K zJq5O0e(NA&Gv)i*ghx%>2R3zYo>_6Q%JJ&7Xy$E{qn|MG!rzh-${s_@h-bzK>; z&pq=gFWcYF)p-@?T-*8LKfQ6>UhKR7@>Cr!g(jhvq!riInos^^4_td)!G^yn{p<0j z_renoP8JgB<#3cLXqv}uGTZmhul0YqQnkLlx!L{x-@5n8OId#PZr}Eyz5WmTjXbje zEs>A9_y6RsxVlQRbhd}S;2{mA4R5|x9gdz}Y8|`&{`<qL5o2)q8uhxvuuBW!||K zmEXAW@}1ASzJI&*YJb?eW%8epCX)z#b^xvt@_H@ktQC8uR%Q)a!IG^6aYYpaz% z+9WL~RdZW3D@L!ua@zTIn+?~QdbLR`IJlsPZ;FQZ>yztw7z!r6dcaboDISn;!u$Rc z|DqRn(`#9hZY_B`#q55k5@+}g(Vm{Q5&Da^$V$d7U1@!@+;e+~+Ooo{-uANm^*?Ga zTrkQ0xQF4d@OOuEI?gPv*_I2Ye63ubnz!uvmBm}zbpQ45YMQl;IbHUxMCvgUo(Ibq zUccc^xEU|0VKJdVB)Q6F*165%zgSolt_e<7GPzyCX~3kSWESCmapIjl%=}9YUP;VS z>5`~OxYacA+PY&bPZq7X;+kq=a;Cf};aD}Viu7^8sj7=sG?XoG?r!^)?kz6Y#5^TN z%S62Jb*vJ9_zD!jX-BG$R{YP!~SI;B8yjyPR zhFHg{1kK{~_xUR&;rDuaLjNulIDt?B!c$ zn5hf7tnE5>O)avmnV0>!9s4@(Nl%hJrQWCZOwaqbyWXbo{HJ^0?|hgfzW&Vl^ZM`N zV~&+xkMVZPoy5&#pI3F}j=~WWeo?n{&2wzg3!~;QFq!v7W!kql8(&vA31zU(Yk&GQ z^-ZMF`pA>=*MBdWn%(Om%DEve;hXgSF86*}R`I6z(yLc1-hH0euj2dj*tKQlkB)He zd7qo#%EiQT^wF0?cWiFFx${t^FI1wfS+SwE^O1~BXyE?awze@PH4>b6nI3Q&l(leP z{CnQ-@X0!vte2I{@xPAx>@{x<*IHO|Q0Ia4!Xu76cV!x+d$(K>_NeK+m%_U7egC{4 zKPR6(IaiV0q$kfUW`f<(Q;$weVh=vr_U`C~ElS4qZeoF!3lHDblgg7cSZ2Z9X7Rye z+cBLJTds@b9N)X*hey=JzDf+aK8NThd#3!m|uL`HAAPOL;CpvF}*Dg zkJHxb`OmXDweD^D#zXBr3l6+meRH4Gtjb+{Z!HX^f)~4my~|4PI=E#UYx5NsfqB_? zwp>YF_o8k~K>i69&A;V+H;+x2q~6upBFS??LwekX7Dvz;9DBNq1x1mPm;IZp5 zpBBxQU^n^Mc|LFc+TsW74*fUnobxiGu3t53R7) zXi8Gbfr7h|w~uhYK5sH>-LmIxo*DsbuNiyJwlFER^cFI__C!b_mHTvsvO?ze*&>El zUJ1W2k*;_u|JTg#&ga43Su$?fo&6TMlxL?!|EW)L2Fn#5c5qr=n-i~f(e9;z z)5;h(kv7Lgm$Y{r+P>6B-&@oBY1Y=T^;h-k-ZZkO$?tt%XA`jQ!8XOUzaDk-KRm?E zpY%g2Y+CpM*7DgzMSZ=qb8|#|bh7h?ofa}YAJw_y7cQz;Fx5)V^`UdP@xKLL zlle8*o-e%L|L*O!EA<*TF4$Q5dCmJWL;lB$(p?(*eoem9Wo5rT@tfu+C^IWn{I}y; zpDac_ZD;f4a@NZ%W-ZSRs_zZkmUh_E$kC@kr>ggttJv2JHzU)zQm(b1qML$IE?&X<^zq{dIoQY4( z*-{h?3~SBH!Zcpmmrh#YHJi!WXP1|R)8WYzofqW@&-W9RsgPLc^E5|5;!eT0LsADO z^H?`tVPJFh>097%TPRAxYx~>(iVcZ+ixxj!x8dvp>)8@>c8JS$FBIzk_OIU}=_0$!};_3`mJJi%m)p71Z8($&Yiq0YGIsvX_e5yD=J-E zXR$g?Hd=gqo;ss}b)@$pfoOl5#->XTrW#e%V9>dCZ)RH<@MZ8 zi)IEMajtb1YE8PB;$*YyXPv>G)U4}Eof>7rrLC=xoa#Pg_eViO@3mw0g~waJnw|&} zbX@6T^0oFizd**UlX8<((h6mg1==!9XV33wTlG9Fe6_Q7Ztb@>GrQaF|6Tew&RnkU zeDPVg#|usR`gxV-?`GU1KgaxC|1ZUVbDM292Yj4)ZNK&Y@}H-7BwSr_`}p+Q%iAAn z?|UX~yv^O(r6xtzLu0=G%FRb6XS|u|TD|C%#w4rdj8hl4zKYeD`%mG}BjNM|F?jB0y|G#=Ib-sh^0;>eZv`yBO$*GprdOKEwLNd{n}y!ZA7w5!MLRWJ z&EM=dy;G4fBV4`klSNL*QOjx_9#(6^%^3{WPMn#1NX+f7>-Cct4Z2MlpJ6B9 z?rq+%^b*UjA9p+a@A__z@_IjI^^aNce}iMH{uamnQeEycPkm$0vMV1#BB$<5I-9pu z!ET+}X71Aad*9ugeLG(2XKkq7spB_~%N=B1|2z1Ot;o7J+ip*3`n1Y)&l~OieG)PA zo+n??n^o*s+IF&2lH0;z-^S~bR~^&8PC9$mv}E^No(&7mKIwdZ-lKYrT4B%ecmFKp zWS5=Wc7DD(Q~Sz;6Hct1G4Ifwh20NDyTwxGh)L_*=&|eD6}!g%he8dnkH3E~b5;On z!N=703z=quyiU7#+qTE;cK*%FYV>;Xv5Rh(x2bq2YP?mIT-rQ2o+Qrc5b z?Fw4ENl}3J;3tuqq7!ouZLfb`{_wylyDP6tnF=+RPF;2>?^Ak~o1)cSy|#<|eYW3L z)SX=&FFC*JPoc)tvQtyN#HIX8tmc-lGO=B^(EfzQ{hj)++<%1g&0N;ma83K~hT~dO zwOXEE$yAo+?-XjPNlt$O6ga$-1z8HofGfU zID3@`o3+j*o7_0Hl{4nspXrIuJKZnlzrE0-+Lc^#-i9M?HlwhdTX0y^&1atCdw1xk zJpIDR#yU0m;ZA}6gQB+=a>~S5d1rE*TpQZ3Au25|z~wN*!z`Dje0+7){Re43}J z2c>D9S@+U}Kjz(x^3%uVF86VEY|MJ4*R-9By+rZrsmUB%sb6m8&iZ)noPL0aqK&+R z&q_Vs)YlfhZfQ4dtT!ice<-l3dDnD)=Gw_;&*?g>*K{%bdVj|KkjRf=+Nnn*ta@c_ zYJRV^FlCWG=@YCUQ(W=%KwZc*F-_xT z=VkKU|E7Gulbc_53CHs5FO~X)Cm(yQ(4`dh@51r-hdUpu3ocWPlD?htWqL+(^g&a$ zz58C2?GB#3dbPRR-+%l@=XZBA&it_MLB{smYp%cNV*3>B~6m+oOXE;@LMaEMQ2O zW_V0Ad49z587hTb3v%+9865ZDUfH;DS6G(dffh@NRTpke_g#OAWxA(GCBtmCl1n#k z@wFd#Qh4t2(y6su4<=0D`JZgb5@z`3rDxr@<#lsdTbtgqH_n?q`}hRG#;3KvZ+y98 zB9@kJXl~r@wbe_J0@pAG_+; zSzh|=yX1H|&sj;8KiB83OiZtvHLZ8%(%#&b)AKbqFAwt!m2!K}6}50fjPr)&Y*RJ9 z^yN90DrM|2UTbRH`1axR&xUia>TNn@e(3F_X8}^&hfkd97Mk(Qvnwa!B=hG@eE;tW z^Sa!w-F@-1_*#LlR`rLTbDw-WS9j0T?e%i%`Tqqv?U#8ime&3eUaJ+6Di!2qJo(bP z5Bv;zUK?BwU(`76s=y+%ZTc}6L%#!;Tr`eN=zS&Mu)32&Ihe^jdwY(>{mIj099G)4 z?Ma*E{dj3++T)xhnG6xZCQC!(e%^Z5EXxz-bUbkNTJDv-ZlAVfGAy2U*hS%`%x+nW zN_{moH4WL|c{2`%|2rlB=z^*Fli7x{8#H)tZ8|q&qGLY8d*SbMV@ z+FQAuSM+7xG4nkYdbu`4FF<`in=amPj_H>l z-xi(z`j6zE_vh=_)8GA4hFtvg3-<@d0rzuzxD@576)8l5Za6xFh3?0q6M zW%=@lTdurWa@_6U;|64l$z|-(JyH`KAc(n9|VooVEROPiZ)#QJLBEq*K}~ldU|r z#_K5fPMTsYH=!ja;DguGN#@4J+I+EPlF>Ko8O5GI+qh{@Px+qbu@$eg)&s`n6*7b$Su&2BkJ((&w(QK9xK1BXxrD?m|JlF_P*`c19vaK z_~(+!<3GB>n=fBytrH084*hfB{C}=>HZ`h~l(QXXFfq*4NL<-*m3!KPnwi!IWH0R4 zGHds8_MdjFYd3!RA^GE&gx755H6;a1i-ZKY*OsRU-9T`q>&m+pCudc>=6S?^zrD*{-2atx)v@$?&V5go&0jQS z;#Gs@HV;u#A@=5uGbddprSvWi^f_?QzRx=F2KDw_n%A&Q?cC3uu35*f+=>c+vSjj|jk_-2aM^v; zY5o1i&myP(Ex&qsdBOAO`#tZDSuMT6abt?p6g3Vp@tj*c>+Di|uD|#!b76*k(T2^< z-%bX9m^@{Qz$BApyDr|@XZz!u{6D>z+PhcN?%$D|#VuZ3=~I3$FE5Ap;B%XM-*#<( zbTIn8)4~wf^|y~+d*-%!>&~yq%8E{I4A+qP4G_k~x>CmlX_z39`~>0XKF zFHU~2a?`!nK1LyWvsv{$jJ#gU-rV3j)x@IU-37Z(#qM`7>;%#n}YyE)cg-FHK$=JEPF7rEKo6b8=E!Y>PR! zGCa&;?z2p56J<92?dl-#V_xS81Fb5{U$diMsg*m;-Qp*q9@cW@Pn_5diNhKnW;|VN zXDwDdC!N=5SH<^@y9MUd3j}}VRLQ)y;`gTa{|fJXh>T}hCerABL4LuNSBvgs9DeOS zMQrhjXD44wWVV{np#DOFg>zGp_SGlrKKOCTpEG0JCC|L_luK5%;DjvgPhO{kob672 zeD2BXByiYR`F@Dkly$Gey{1g-=3*4`>V3y#@c6aG5|@AL?Ei(XvHMcUvn%pQ;0pf- zkDl*i=>E;`;FYMZ>bCEM+a0&+zDqjAo4rFeZ2MolF8S8g0FRoiM ztI&#@(`)tiy~*Aua{BkQgBACV&wkETU^z9R*Tz8b!JkL{e{5zw-!9N5xaeWu`uW!X zPsgqNuvtFVe*MS&1u>Cp3g)V?X4D!sa2D@oIuIvpD9f~AzQ@6*Sr+Ez;Q~P?6d4r* zqCOtrzj1VWT-)q@-+yo1Q?9>MSzg+0x_SMBw3;{9qA!Onznf`3`*op&U0{5S#l4vO zKOCfvua~~GDtP7Abw+M+IyD#GA50g@Qg;dRODI~V;(B@3>;nrzB;MaNoX6pyeE)dB z3qB)n#>e{^H44rv|CeI$uwJOWWk$_e7?? z-RCOZCArsI-IH0Mk11Gl7#3fgSjv#P?6Un~{po3!XQ^b&QDwAXn0{&UvW)zq zry=!|f^K-6G>M;eoMH3Dj^K`EC%m&apPTG3^KSB$qZ18-xI89b5#sDHVQ9U0-)Xtp zRW{yfEe~#|2k3^ckhbkoatV60Y2hO0(&esv8|v~MG>rt+BX!+0SMhG@;*a~bd7hU4 zjf`GaIfcq~C)q?kzS3Z2DWAACvOknLW3k9PmAZWavzWGsav((E4K`IYkPWR^UW}M5uQN8?XRPeh6OMYbs=m@56+q|>aYirlHYhveY zil(fYy8QVwg&O{tsxl{q+Ws8YieoWL9(_C++#jr*zSl0(wsnH{YAH9Bi!*EO9roWo zdhz%BBO9&roYRY$@0_?B;AqtsFl+wtD+jp)XU!{nw=r$^&XSow_XmHO<-5lIhd{`3 z=JVebZ8Oyzgyw(jjc;22@7Q{mtzpuSuiCn;naFr%Y0Bn(i_^HDpIi4Z|Nn>ch2JKs zFX-Knu_i>K?eE(D(lV2O)BAq^n)2us;|}q>Juhc|^_=$Y7vq*V#sFpm>Go!A|M@nC zb60ISCsDoZ+OJJ=w=UY2-?{jITmGM0m%g5_PkedlwBB)6ZS6;*`jwW^(XpcH{_|E$ zZ?89*p7dVydhGW*yY0)KUpmPyUt`_Cw|iH>%*#>ttqhH~%7}FB3z4z^|95}q-)jC8 zwak6(U%9_6h}U{{>tp%C&S$}%l|c<h$(@m2 zeS7wbgzU^|enlHpo|!esw6RbzX7&gcjfL6LnYk`J8ro z?RKin_v};gIW<4(_Iz8O?^K>V)o#npmkRUt2|PVLKYvNGh+F!kKBHB!Zx7A2S;p?# zKW{;qtaG;6X_F-h7yQnjy~WTVr_CI3=aTZ$8l&2!Yo>15+EsR_Cv9ihx2p-;-YNMA z&Yx$!l+l~-Le%YB7drl~zq@a>7 z@MwoheAT!xaZxgd$U)&3H%dFz>^d3^7=>IX3Nl8{xX`QGl{ZU~Sx$3eMdX*u>!-iG z^X96ShfU(*zkxzWj?J80@j3q=kKDf(XFICq>d3OSCT;aoNMVcJae6B!)1?JLjyt2A zQ;WEYwY4>_W=&Xf#eBXE5>vk-6lk{gq&XVT&WgfmvjgQ4KK<~6s-KXF6 zywzext&i7EWi6R2JZoR5!GxUSdhRRo;6=IL|p&a!DTN!%xWXDKr) zSi~Alk1BdJSIj52ipRu8Ge^bwbyRoybhd@}Z@OsqOjCZomwB~=@9Pn>jY`|n)dt-lj?&v?6W&&t_F>sM7YoLjs8n9G4c&8ZhM%neKpyXAMhoL-o5 z-*rO3gCkl`M3!!9dafj?$~)C+r-Pp^5?SiD^ZCyyy{Sf*0v0@;xwFap z+rJ1$>41eAo(5e7XZokq#?4{ctHHc5j%VtGQ>_zkJb!X)rG$IX35Vsu>xCp8Xa8S! z|K$VS{r^wzc)WH!(;>!-jV}$prvzz;rOLR5Jb%!WJY~^4c2|~GrY9f5=FdLeSh?q@Nt25W+o&5svGz2IYxa5jEr+j zEJ~UZJB?j@w@lRH`&o&9Zx}9-p1s9CP^3|E@0Rr1Tizc^@BcF0@#BM|d+&|44LlQq zz8-(SLwbAd17(Yk9}G)w$Cliht8Lsu-!7a)WcMHC&%Pk_1kaj8$aLw z@8ZQ#Q56%YQ8;Z$aMbHchU*3oA}{f;U^-739u!_OzpjOBZuudO)SUoS4{E!w5Z!zTEs_PX;s%N&Md zbGGzNeQI(x$M)zezn$H?7yI-xHErz(JGJlluTv6QD?^PYT&g;?W077)1VhTVv`EJ< zcTE2puHH50^BhBw4EJuoNhaZM$}}CT&T2~ExWdOcfAND`+#)9{*Vr+BJCdtWHRnoe z=&FLV#q;{#|GX!EJY*|hVv}g}uU3A_G5M93DPv=w5EH9}QIlWH z6{ghxvbXZgbbefT&ZrR3EMg{<#E|gMzJ+tk&24i-T&F~xo7S&o?xOZ|+N(E(=1qCu z7K#c~3U$5@p1a&S)U|w5S434ttL>h@{q@Z5_P^r3l$)IlcB`5vb*bXK{+n36vg)}- zLheD?x-~C@k6e0PsyX$DZwt5P!5aC?)zdeAf8aV}R`h{0f0V?&uSr?C)Z);wo5m5= zr9!Wl`%l__=GMvM7hjiYe4RRj?cpm{_JDb_nT7e5ESa)R?eQx+7L_Z;TTB0_Y-@KA zw$c3hh&_b;lFW~${C`@j&R`OiwOO7;+v zxNtbTd#k_pRjvAnRUzLzH8++&75a0a{J%`sR4J+M%aL=_rY~^l)jjZj)t5JN#tUv` zB>y^N6=S7nop?I@OyF6yJMR{kFXEiH>%S?V#$5M{)0n3%H#_Doce6YAb+ktA*35X9 z1A$f+ta`p)N1u0G+a_~m>3huItc9=Q9VX1+>@)B3Jo zo9+7-&CaPkT~qX^y-fPdhU0UDHgE1LiwaqGE%|z*WoM|~f7#=nZvJK4&ZR~CW{!S- zvikA?!}~_OCW*GGJ;7;NFE3s2a|xNrv}JKd_Vl*}I_Bz|H*>$%Jb&eKX4994-xp8Y zqR8sW960yQ=Y20$f3%GMaa6#Se~-pN-U}DlvlhR*+wFTqz|ov7VA+E6Ij6i+&+`Tg z%`0HFlxk~qn|A8i_Q`w~wj?rMDn7aS`978%JHPMPT3(Qp>$j?*Qb<6p%GYO#^YQtw z9i3)eD7yMWSio(f+ZonIzem*;*Y6$Ej{oa!QTivbWH#@QqfKnjkNe5nezTgo*-l}3agddAlncWmC7n%So= z3-5UOyiVl&zK>R$JR0Q8KbMxP&$DQh|G8}ThP}J^Uj8(AF6~;?qqx|t+&b&R`_@2- z)(18|lb1+;tt!u4``^*)=fd6WciHC2{a<%*-4`zXXHI|aewh%WzqEa-t@z{J`@cUA zm>YlO+q_5(Wv0%Jaxy=U|Nk^2=DyqCKVl3KyO|6F9X>94xkj&O-CW7(naih(g>^;5 zM>agG$w|Jg&Mx-dMn2Ow@6Ccuj_(#Pkqg+B(G{c@)%Bwj{EAdNIoaO<} z_#9&b*{t9N?t?7UdJ_`9Z-lDgP}DYy5(+1b4*XD#O$ zSLd7V2Fr~Wc)DD1%h!5t<+UK~Qqzl^#or(3Cfw!C3gT{JdiHGkhpo=b&OA(ynfP{c zf|=IExdK(2nfKm3eW0yNQEgWnqiDHL+G$yDfyJ7!%Y1p;oUEnWcS=3ZaNhjUx8bdP zS_7lOvtqBefhtctHzlO2evUcVFzIrv)2yZUXKYej&#GeU@j`;v+4V+A-D8=1KNp%m zI`hhN%{*J*-Z`I7S8sp6^Y6F!e;?eOT>qPAy@0`nS=X{y4|KOq_&qgfx`*a>p7+nY zrgqsITT3?>3LZC{#iAqVD&e@$W3ucq$(5q&o<5l?4lbB))Zp)X-bjt*R$_mG?}zXA*0N7K_(^ke%|(fI z7uVf>`Jk~{{y?n!ZfW_7)4MN5++9*4Bi{68NxS*pjr;1h?cV!&hQOobLK*u-3*R#( z_w%GbRh%dHU(uPZE^$+Y)>l`xUv5V7le|loWd$_NHaREpvMx>T^+(p9HH!0>avgPJ zzwm5{nffG+YPU-6TO(qg81j!`Zyr z(LKy6zp`eS3x$n@42tC2b#$GjC!K z9lB>L*=y<3d38lJ^NO=_1|BbdJpOj$Qd#x4{kL0BE@7Bq$`cwTd8x~~YsaFDj&qU? z=?N)Q&F9uKi)7eVt>3z3L4KN&#=NC}R;*L$eAwoHN8I*+i_4lQhGu5@fXBs7uTM0! zc!>OT_^I1B_bV^YZ|4P!I`8gw&;0qbYGFth!+{tNbAvs+ceUR8KU$&EI%jR@>+ofn zRmtnG@7=d?udSv1{tylEQE1Dk(mt8DQ*`^J2|L^^l<71{r9p4&-Zw|N~^^G>{$FR${uZpCfw`2KT# z(no_N10~)bX+D^3DZYQPrFC()CaX?X$Hj~3=a8qXPJjAj;QAOIPWmWvoIZA z3sdpx*H815*w{Zz3(I*Yd&$sX_B12$-xo!uzRhGz-o4~F&xu)iZ$&g2y%q%x0x3D?nwtarO;aAH&5aQ^F_-((A@m}TCpWGs!QtleDGIB_ z8#|RMKPU^Z800KU$h^{F6x6up*9R>o;cnxM<+5ItOEbIDlGWdp+_Ecr{I1TL?ShMt z*~WXdZ;ZdoRz*)bGPQ2Gb>*VZFM3yc>HA+^BJ!g(Q}IdH`^u{-eUI~&FJ{=g^q|tz zW#;^jk9XP;J@Z!nX!uX$ox@0;+nnlWmx+@Gh~0x^GN3=|K>?mA&xHuv*4r~EAWuvzj2 zEllrTNl!CWyYuVa{xhADMW;E-ubqmCsAfLQ#GLCqspDD3bNe&TBLvUKtaS|xUL)X_ za(N}6#Y!1xp@NcRbD!XqA6-3_mMnkgytY&-aldn>tU(*M-Y%B-@1^F6@4v_~i3=aS zam+VwR_xAeWs%SRXf2d97W991)us91*E2Ibj>%2$*ug(|lINPwIFF-t z%BrHegLy@uDbu-_DXCj-C8%YJysTha!Mfz!IW5LU!M}l>o2DtG%hfZjuRfk#`2XVX zle^Q3%GfSVzTJPP_&@)W3-w>`P40iW{0>iq2DiUQh?l5h>zBtWdVG%AW}cJlc80vF zj=Lb&^7l*Mw{s6(CAm7i%zw~y{|W2CE_<1&MWScZm^*_$sJ~kAF4D=s(6MjU>hJg1 zufCr=i*fFIx3iCqov&ow_e8t>K*86k3G2e2t$g z_AkHPdn{`C%|DZqcK+GC-F%zKJh}f19}Cx-86ORLd2Q*`solHw>P-rHy!+p;wGmbY z1>tuM7w?!~o%`oRb71Z2#*>?8FaB@kV(ako0?%5BwPh>pn9_ykYTCx{Xm?<@tXwSf zqo-4^i1m-m?&O+xSs3BoU3Hqz3@20hl$qt zN9F6khbv~i4cIq(&17!j5BzrQtw)>1baKx3zP2t1oU-$Pw{xo55vId8HocBEO+TEo zxVvJG%C>oje0QDR5gipaql{^K*yl5n);DW*|E-PP#dqy^OXJSJOcS0JeJ$vpyQi-+ z>XOgj>GP~PWxBqtnbmm9lKK6YT8*W(T^S4tE3SNKl8)~?|9j4QrFQpu%iQKNi8vb1 z_%c->pedDM;o1BnGgq(8xZq*yIQNg|gPFTj7grzUoYIkIvuAsecb$at!gp0{Gu6zV zK5I4fI=hXPCo!l=$uCphbwb#T#W*BD`m8uxrE>7#$VhplQxUBkNr4gfmjb}sg zrxS*Iey#t{RBm6S|94w)^|TA`w)C%+tA4cnUh%slt3S-QSjTlLX!V!NjNcwRojR?y zd>QxNxc0z>@tQ84OzWc*`xo6iw@q~M)OqbrJA1O@E12_st$cs{%p0B?6+7S5cpcO= zTj@PFJ|l$l+WGYlFD~wXm|yo^|KiP)Of$=NOK#sTRnGV;`~91(atALzwlCR`-F3C= z`EU7|@lm^ULRa!s*VY`Kzeh~m_OVogx!`F-@$1X2()`yiy7H!J;x41*lTXanUbrJ) zNJ^@CGVhUW+Z|WLozr)@ot<;eC+kdm-&fHSuFjRIuUrz}Z=C!B9-e>d6hJYn{T{jS{%TRp;&D|8>UMC}sx%GC*%>VaE z|H#zoak-0`=A}*aj`=e2SKPC?OH3LkbOv&SoY=KULSTZ+K7SscONNWz+uUPPus?h) zc~Na%n(IG>HlL)ZXWx~D7JfZ+qN7sn!OHF$53ls;$#XTspPOtl|7Mev%0FXegMP@$ zb;Zwq6z=(#|BtQwPOY`3ZTNDvFXx_p)6G`*|9dg_?AhxN_b2c?-S8@?!k(jT{db%E zWl?Lp^VU0SF`b%|@8pr5sbKj^c=C*SbC2<^uTYHpH&b8zr=;fG+|s_wd}zFwG9^T)#M{90${%ipZ;_8AJDnPt8Gy4lIRhGOqSp4ZQ>x0B-iwZE)h=%4C5 zx&H@Q8W$LJJbtk)Y;|Q}07uHkpo7Zgce}dR?YNayv@@wZPW8dc-?axSZ`@db_DN4uTy;Bpz?O1^=0V|V=${4$=r(eu93D67=oIU4ImAzYfy67f5epa@r zOBV0d9-|YeDfD?W0cx)=HdH5#BbZ1XWrM-86O(%>*S@6^vN@49{Hk@!X7fC(1^s2??<5pIJ7w$H` zI-0PxAt=*TUqLLg{;4R^H}}G9pkkUGpg+Z&#H}BbQxg|61-pv~VnNuDu&fhI5U-i5CW7GK>$+(Y_>krJEx_82} z|3w;SGCqB23*XCF|2euoX}#`B&*M?8yp!wLBmy`2K5LLDnX<1pxuiN)w7prcVR1#( zpLYJ0Tbw4T#4ZgHVL7TK&g6fm-n{Cq+0UkgFGq@acRfC4VVV}DH(6zN?5@m3rAJJD zioJ-Kc|G={nOW}~8-F{7vUI&C-woMk@NwKp*YMvpsbET)3S;7oz;A!`wtQa95@;xH z+FSe~WrJFlczn6C-~F$FMbB>Eh;m+ixha0_!P}OMp)=Vg%Pp82pjK|5#>S!+^>C8p zS;O4;>HgQ!&P*=}Ge0-O*Nd5FvG4R_o3Ea{6)@}El6yh7`2C9tJ}&v%uxX;mU7mo7 zncHTt$}A1$I4kRW>uaz@DdT3@$wtMQ4v#Nz=6$(w=){eLx#+Au703YQOKvX1d|Fw*Q9;^VhFsuqg=*_!YDEN_zDKd!-pS&Rb0H?243eJ$NxBY{5PgE=gvpw+9_I;Z7cuq>i&OkBb#6! z!G&|vEe_Qs&zQ0*JR z`t~gB6OZJd+Vz)zE=t-N^7U`S_W2fV#{IGfkDjl&_QEr1QTN@m%kOZSsO>%0;B>wt zf0^>mjQEDxd9Sy~ONaYRclNLG%+!9fY(q~W7i02bo$pnCm)r{Z=A{LF_Sn?QXYa9U zzLf3M&J!sz&;JzNNxrq-aLr!tb^8U&_hjlaq;?1Tjr~ZDD*0X`q+KT zoD`58Cv$wlQlq9I)~KCQ9*?T8@K5z>yt0a`Khxs+?kJ<(rRCPw-hMI+^4;CR^Zb1O zpPeF}ojal&t1Flryq0&L^5b6W#?Gm-b_p}vM30KZ9A)KY5oP|b*c+TUuJvEMnYZY2 zp0o49+b>&gzm{fR`!(~Ac~AA>IF1LV=2KR^pXgMVyZ-*)DHeTw%s-AM-gGhvS4=sBCTi|Nc(g?lk+pA|+T$TT$dhd_<`h%tVy9B4l*0SpD`M{7RYs2_l+u9k6(V2w^L#GQTJg6L%qeDui6Z1l8=Af*nPi;d3qeDzQ!B3`m+Ax?&d#V zG^J(hlutXoDqk}u(|S{DP_CH(`#(MLE<^R#J1+4`e_oV4VPdHh@0q3CYs=Y~6GWOc z&nDkU>SUUy6xejI*K2KG=h3}4tp0H{9a!FGF;~UmirW=izWgfv855@6dXw_S_iUTW z)wx>hCT!E5|4r97xAA_|+gWJ=tGDp@o-y3q=N(>nd83@$Mpey%11kju7T9t|+_MTxL&INN9MXg$NH&-ws zbX93g#mT8lCivX_JgFx6#ZQZ4Lh^^xww!iT3VpX|=AHU?zl=p0%lSHPyvq@+dNpl# z&q2MFyZyHIy!#L~>(#+YX%A#B(`# zZHa-!af|nl_ZQx|rNVmeepTAeZ`R+BGP6ou`F@%8gYf{Ix4^GZCu&?_V-RQ?n_QE9_CZI*lu$1Y+CW!y?Z}z@VXq~>^|q?vI(Cu z9$5e7p;IA0(sbn-`^|EPv{?6B!yE3YdZ=0}9 zDVj5EPGa(ZAx6i22mB|;7zc~b+w%PLg6pcC#d@i1VSz0A924x{e^#&EdG+X(m!$`K z9yMC+iDF2b;k9c1gdE>HofFignzJ}(SErqwE_2vh!uZ{;pKmKZum8)k#A`x};7xvq zs*J@wkCy5;tni8K7fh5gpL=}&Ygfsog4yabGIfPwdQY9&7TxauZq3%UXE*t#T7L9q z;#R-&a@Vig^Oe`T)s_91bG)5Ve3RM3Ut;d6DGZl1IBsyX8LzfVc{h!TeL|QTwnBA*Vx?VTY-fe4lS@H1#JytWdr_Z+i7r8kz zFV?{9*k$eQ{c$3T@4QJ!%H>uvv&u?Sou}m$+O44&bV!!}Zl`(em$w#oqf{B}>)*Xu z`S9qs?=#fvKfm(}{@Z{3)~s32V;-|Htbg&v%A8B_*{ZL4ZRzpSxxrZOvY$w!FE{!XYz_ zGycQk{Vh|Sr#pN66#12L=frZEQ*ZUs`sTAsmj+LkS?ZnUkr}DZb(h_IMI2Mg%gMU( zH)0}}bQkWw%d$o7=9jwNt&TU`*I!i#efsN+jD@&L_Qt9&jy~^V9T%E0&OMT`W}b6x z=1jW{FvEBDJM-$VZ$aGVOK(`r_J{8~U z-aPxk5s%Ar`gdOFVSl>0-@eKG-!K29$DNBW1h%Mj391QN2|5?NyQKp0A(0WM%KAo}~v@h)Fj_oqIp;n)Fr`jW=_gGXF{}`Xbu$=JaFvn9j_N!~zu9mt5 zdM)W%v-bX{f94OL_1|v_yX3n5`qkOl+3u`2&ety4_|fZ+zV!LobGVxp?5G#ui@Wr4 zOWcZu&zHV`e>p1L=KN((8F#JFjX^JuGyeHf>wi7=-|;5i-t_S0`<9wn{!E@4RjPj? zC_>?@*N%tX``Ne{=2>V^eHbqnTyzSzE5;zXoL`q?Qxx7kj|2+ls}TIpwE++{4Ct;zHGBxi$^ zK(Vda5{ZPGBAyMFPcz+}3>G-1Fx?7wt~FEP=nE9MS|B)4(05DHyn8RJALPz$==;TS zn9*~#kB^UZ=L?Vdp9f&nbdu_cJ12kkNaz4 zqF1qc&XP$x(4)RLYR(Z?%_o)TKg;ddx^rvi^5g$=Hb|OP=rO(VU-m35UPh$3Xl2Br zKeZC75j*~5#eDvB{zz+hOmom$zf~75eLgN`^V#)AtMK!VSmvdC!eEK0cN4Cj(_vItk7Id0$3RcKT-L{taQXL|a#-qY9BglNWN&w3PuKO2e z%$cL8xZiKPFY6_p?W-S5U%h3{ioN^%-@i4HPB`PdGQweL*uh7Kj3SlzZcmr-n!!;!nfkW zTUOU42UQGq@|aaKXiU*OW#E>2PVH9dvuIsogNUV!;oA!Z`xZJ#tMRWX+Prhd?9!Oz z%t_0{ru5vK#cI1)BX^efT-GfU?ljC7zWIbFO_o>K$MPwo!DV(w6*l)B2EW&xVOs0> zb>@>3x(A+lPO)LU|9SKKV4a8A|3AoUGReC$IM~^mneClg|Gq*yEqwMF#>v$-ai31s z-V6TNRm6QvV{Ny}(J!yWT&!!Lgn}P{d$s5d*h)Y}3)d>>Eoy7#uKK zS6!Yi?Ni`Y{MBmaiMd|FUZKA0@*Mf6zrS70pykPFa&F7{q^-LftL=X!zL^uh*lu>+ z4d;zfs#*D~Z#FFZ)!@H!t;)hVI#a^F)Lo8#^h$6}@RG$_H<{eF=$ok0`SqkgP=oYM zaZTGzdu8|KSZC#W&v-6b!=SkNgps@alSe|E*74T~n>n z#J&flOpTo}ze#IrSjB_G=8xZ*|7Q;KmvK%`X1?nuJ=LqXZhPGdfm2)|scbb>`Vj$b zI$;K{W}Wn@_pxI&Ue$W+40q>e-oh=9b%czL)~Ihf$-13)>au&ujjhw97d+^TWy=fU z;&`(rXDO?}cd6uU=1h7^rx`w5vgE&$=5vOZG06_sIPUFaS2UAr?)bfh_x|S$=K0^d z>l@Pdy$C)QGh3FU=kmJK&0L>OfBILwGcDwWKcCMjPQiX=S@WW;%6m^YZpr2i%Dyry z*Jpl|^YWd|`zznhPug18w`h^$`s+7hVylgx|CxQi=FdX`|NiC2>y2+**s;&1a6<7v z+q#uMA}>u2c3c?n{ z^tk^qBHE!04jW@!OLzE6G;g_>?Iv<`$K$#AM|S`J5q{zRoh9eLG%;K@-u&e1!5uDB z7}om9FXT9|+W3Q-_yOMVGX-mwq=sJ3Z^;iG?eJ%ip~%KKI@HT79tO z*Vz9huUuQ(+RT|ZuG|?}!Oc>$@%>NvJGLbsvf4j(7;<$=Ff&HZYA9wrUif8S$;7`?seamz|{ffIHyE9kNnV6aO1rNH6&PQyz_j&51*7vOIcNM;HA)THp9$#aOh`o=~TzX zCI_Q9WX0cx{Z0zrCFXK&?k|_Ht=_p|(TmP+eSXmG-OXcBN3261JPltQBJ?2X&hi3T z@sr=o;&%PE5Bzrh_4_lMc8PBZ4t#0QGvoE|CmigX*1h0T$>cj-+mRvn_G$BtDSA0~ zSey7Hk{^2|Uova+-N7Z07<1L<#;G3jz_^x+KWZ6n2tRRKysztl%#07okLUQlnQ!>` zu|;yS;FF$Xp%bNe4K4WQo5=08C@|Rf#Qf&{kCWsMaqBnmhPf-|2^}_RjOP3@{qLvw zN&hdNK0a0MTb22{)MIsPS1vMfj%m0#e{(SZEZqbN?h7K0vkNv@{GI>5?fL(&`GG5B zJdMt*t~(oi_~Ezoe-DHCZF<|<%#}Av77KrT`qR1HKD{FGFS8iG>>e%e;1`>EIt}eR zoZjt}o4hF{Dtl`%L+0YGhHaJW@;eV~z2*}>B{i|b(ECVApvcm&NmHimeE!qPduwro zYz6lM{nMAi3?i&m7MZ%e3FV%1!7Ei^&aK=z=$L}^*J)Y@8(1%N-JY1vlu z4QHv%F3^++j}~q$c>L1T{ll;4KFd0|&K;{&T>ACJrD)xR&Cu@d#iXj7pGy}XS>Dk*SC?(G{~Ft*;>`P74NEk`oA=6J z40<%v{#Wjo)&G_YFwOpZub?>jvEI_B$N!#@{Xb#R!iQ%Aanl)69b-l7}DO~eD!Z!J1)st;I4*LXdanjE)Jh#4AZ1;AtDA{MX z%32#0-H#k!xA)ns6oU)W>F3o2N;b^86+JD|Z$p8$daO~@dkz7~)hl(pr9$%;%T00> zIm+>eVei@As!wO0_8Fd%Sn2i5>Rz8jUglCi;SaT*(`?e$RQ4a>zVB%9NKNm^rh>bz ze(C3!nY}NwI9Y7XTDrt_BHDp*M*X_ z_tCTWE=`EK-_h{qkL8{}$M-jX&R+hCxh=YxG4uD^TeIf>KUn`Sxx1~+JbdHKCly!H znmSI|yl?Ojo~S6W#KR5#iEAGA6;!)?5qJ4f>Rs~7 z{@h#>`HClANypmOuK3I6)DgX8();%o?+zXgk1KSYm^R1y(D_YA&VI_da(z;%>(uA0 zJe(2_4|2)Zt>%{2U&Qk)q1o)s|GQK7r)MODm++L$?0LI4;-JBei>a3PA0{;Q2RqbW zI?*1z)nn(JMq%b-|IK9tB)*keWpKASc{MPwG3S*h^LZ_unBBT%%7tS}No;)26BfTZ zlhNv;bz|*kjcV-)m1TiTUafRKDsk^Q_kJn)PdDTF1m5lyG26?&d3(}~+RU7?tHInS z|NEC@cx^S^z1+C=7jM+Vr~7|<+kBI+Z%>b_VOqN)_wvCHUp^iB_x;z=>VHo~O-%Nr zcK9BCTi9;dv)ShSodaK4#Seu>m9BcO%V71v+2Gvw$n3obxRuWBjC>z!v1n`8A%$CM zJ(6on-|c+2Idb0mthGssN2aMptt_+7_IY?Yzb@Ua;eJ+Wp5VIAa#I8L2Csa&C*-N1 zP|o~~+um{JOOQYwgC0waK1(5gTjd6y12K2R53!mQE38&s!_>vHOXolf z!%oGFE5(9tP6Dqkm|y>zC0Ou>L5$~cNypS;?TGsk&PI1yv}Jb8xymG5!MH`|!pk#< zKOg#aqqU5?doJqjkdg`FC!^^Z-67^S9qSj^;Q@XdigPl~%*Etm}Ao zKkJQ@J!Y{YQoWCMrhk02|DWu?uYLOuyS-?HVZxz5}#E_geCZEgLtj_g}=&uyA&mDW^!sIX$%(yb?20!@V28x=Yh=&nA# zBX#SYUFV-ThiL1oZqa#I#AN7nq3g95^E3wT9ZiQ*dBR>>Nd{+io^|B+ob~X}FRgR& z7R+l!*O)3WaqO<08+PT^-YcvL_a6yeGP(KpXVmq>qD>#G3{*VZGmh&1SjV5;XuxrC z?(0Q&UnOkZ-SYF5VdI3SnYqE6%l_G%n`_&8cCDR{?b~CoLbF=6?>}$;U^oA7YR7JF zg;`$|XIpvMSkBwCebP)-JL5U$)AxM;FCQUcz0QB@)s+{gGR$Ak#w=I)<6M>Ta)8&T{giX=tBv4s z-LelC1Rw5_+rHSRKG!5N`?Z#8my*WPEXE67S4CNp*T|XcpW5`!nAI_&zOR^3H`MlA z-K#UJEB>r>zj*%^gT&ju@a)pU=C>8{Qy$1P%3llZe!XLbp6a6QS2ufZ@~tV4?-g~5 z5HMVP#p2}bj*B(Ry{A67vGnNQ7e|VJ#@M7kQds09mKW-~aclAOQ*R$O@K4T7xB05! z&GPy4jz4$ri*K+0vRvWKnX`HC&aZPg)~_zhWN`O>PQL!qv{%p5=g-)z&w6deLxGAv zfpe$w-{ukh8AmWm4prG|C<|9O};1c>~!ZZ2qXxGr!p zbgDq>+-owdfjiE0uzG1f{1JD167SS0YLaSc>x}syTFvQ@cs}RTqJ~MTj4pGErP&k@ zY24fR)m(aSX{gjnf1BSfmN)K|oZ9rkL1n4V(pAnI)|h!&I&s{OINWnhNWt?6Pch4` zV(wROUQT8;>^c+{9k%$*GN-D2@=}X?wNlki8*M*!;Ok$pj#EG1+3mgZj!)0Nq}8hI z#U>@L$Lowvz5HtSZ*|DigF#~N_nY46X*;<=?6^VChLWeE8KHg`!uP*#zg9h6=h&N@ zcl}E;l_Mh#oLONL_qeg)x{}{qy@x@JYbUHjsPY$hZNxE44*YbL4^i%=alc)b!H85$OmR{Ah zz||!%G*@J)j%%x8(yi}*SIpY>dB^**>wfcZrX1l();YPkr26R_ugXU|)t}sI-K@&M zcR-dkXeomV1G59;6Xt8o0ZbBo%lMNSv>DhKiWnprm==`xA7o{)WjLA5N0uH8CVaC%B=r8I|qM#8<_C%FAr3LUAi^}A+9zu?{F}f2;J^Rw(>5-zx|LjN61v1EGU4w-_JnhDn4W6R zt9oU4=j(-f<G$IX3>i^m6)5=l*-U7xunmo*~ca$CAM7 zBJC2=bmCCds`usI?60>Z{l0LkvfG?t|Nm0^ALm$pEmS&tFLK(_^;2$@F8p9q;eGnX z_q_L==T3xW9#Ivxd@01_Xp%esoLu>{y%!mGTzNe68tZhsz_qUbpLpM>c;d)n)Sj)Y zm3Ywp?|1tLSEq{S%v!em^1*NQOh2BjT4mYa)^?r0_lAkdpO4{xFWlB%Ti?R@O)u)@ zfe7PIhl(GRh;R6??tSNvE^WqR%R+=VOaCyrEm2&yx&GDyrf)MU<90nV6l*R{-|+EI za76th#gfMY8m5aB4&B_kdF$!om0xduy}bNC&w}}@Tb`+!n3yD8zVM++d``LfwK{Hz zd(sXOvv*X*?Va&>@#ntxEgybKGn`9&yR_!SGI42>-YTb2yxv5}rlfG&_Fcd1|9{P|-%|PQj{HZ9st*^>&U1A> zEIrRHM@lMBXdVAryKdu;H{I9o_%>}ZdtX)bOEc|HJ)br?Oj8etYT^{X^EF{=ll1n& z56f;F)ISig`aP}iMOXF%cf(uUzZtpYHS6>`MPmf&b?NpTB&3H7xT<^lXpn z*Dvhj2*5O?TK%vN8a#H?a?pPlMuJw&%(WkqwjUkosGu}xecNYGi_y<>dEzP zM?%x#?6ZxPajI_a1s{$@zt%d!tyH4*aObNVS0k*dEPEa>h?gFH;$oP<_=x8*M;>=d z^Vwa`leQjvaP;|u6-<898bTPARX>@y8{KFMz z{-1O8>*v<|e7@uH-9jfZAzofkHrSKt8@l$|afTYchVM#?q9u}_v?}sHo?+dm?C`+E zOwQEc)|I;4p27n62EpbjLUW2GxNmfx$a>hm^bng z#{PrE^KCjs0uxP-MJzUX-uGbL>m>GEo|M2Vj}EY|cV@o-Zd$q1_PebLZ3aDo>i?&* zUMk@@lvny_SDmcsyUI9SGoF^RJL{6qOJ1}P=A3h|-+96VEzL_Qwb_gRpXxq;|N9qX zf7}0$I*WYqqqp?? z_iH**QumCGE?cN@HPgKz4&KTL zk(5n1#Mu$J;PfRX4bCS<=hmCKX(yd2jMdlbPTDE7aJoeKyz`UZ`sQ9)I5Gc@RDOX^7d~7&=RYei-?g7*R>gu03=9mOu6{1-oD!MRNADqS#9-o zLr=}vkCPgHn_I}7c>U-8|Icy%KimHo4)Xc_^~o(S{in~aU!E_=K7Y&a=huJyy=>*mkq@4q;I ze*eb5Po4JP)2MWx=>Kg!_t$uFuaD2AA6{oYc0T#;((S*#_Zyr)e>~p)zcJ6By?>s^ zZv4H~rheb|>;LPt7H>CxKRL-pbII)b;4XXf34dm|H@{xL`RkE*eb0KyC!dZVumAN``$@f> z_WcY0?^@fx?Kk*&`TFU<#$nh0PQUn{?f>1kf9K6yF5#cJ;`I9VUw<|3r|;=|SyA)4 ztng$}_`fv0!2S2<-tS!z*K%mzb=#kNo%kodtU4@QCh?H>`R^Tv9*NDbSQqhA<(TN@ z??QoI76N&-DH4 z|9@k@cRhsT;Xl(KEv(-~7dM~HwJ82~`t*#6AO1;Q`NR9+{r&pCPxq*$8CaiM=8>N8 z{Jd%!U%hkF7vGXctuy=WEhS$4D`jl!*naMgkH;B?&0;}(s&`C}Nii|soU!2G+T&l2 zoaAYl^Z1$Cb!XPPrPpp{tzW$K+m<_CtJiM5=hkn_IBVzhxa!w? z`wv$0t+V;@@*wxI8HLM!o~b!&^g3tr`HdX&zpmMHYSrqs`;PTl=YB|@9$S99wqKZU zVadG7{+3_2Ts~jHxz#-O{pV-f_k7LGuRkuoS*&j9+xYtb;+w_l&PM%7J0*V2KCO5C zwO_x594$_slN1(PuWs=8s;0t%#l>aYKiFKHS$yst-=C#2J5Rou^Y%fHVe@%T!~GAx z---R0?lyPl|Miu-UwvL)+5P|a%-wT#{V#gX6THTQ&FoN>}) z{+O@*^6L-Uo;x((=FrQXZ3mT?n}j{M$#4Gi$|t>`zdS$YaNb^hdY0y1?eD_(WwlqB zuUnpbY4MjIciz649L~4eV8Qc;zmMn$pZcr2F7Wxfwa@>qle!;pJ|W@pE9I&4PVakn zXXds5@x?c#`M;jqdT>Up;`i9+vyY#9|99H9>{`V=d#a);=bhN2DzBch@rRb_p&tn; zx$ldE>Wi(k&z+sTO+x*9K$3Ev)Wd_TqofroD>(O`IC1?p`@Qqh>vkqvt-P}BvGMKC zUw+ycpV{7Mt!ei)?kR7!uHxTyR}a2t^joj{K}zl|@7i^f)*o@WZZjk7iIcbg?4?i4 zr%v_1rTu)?HO*)D_h!|5Tl5}ZYjd;WefoBz`$cAJ3R*W+%u@F;YKpK@IX~y=npuaf z%Y1*cBxyYREAuQ}D7bOUiNs~UjupzScwEQ1{Pl0YHm6r75_`5kw+w#8qnN?UI9G6{ z#Pb=79mR)o-fj`#N-SEx+@X1iu%?rk&FjAIDN1Hi+m9#o?A`f9F?{FbszVyW6+5aG zCK_FI5@@-bt=p>6H#>jY>o0$WloI#0*2wI?#JVu6^n}B$x3!jo-cV@s{GXkz3{x#;bujjOoN|W~jKPgB?saO< z_vs!C*Pq?}Rpnnb^TnB?hu561~GjCY7-H`XO&kp8-9(@^! z!^{t38gnvis@P*5+Fj+@$m_gkkM+-=K4}}Ksms1AZ&I4Myl&^&X?_XEIu9xp#4jv6 zCU7n94vRz80-FquQtn09HkG~A-d}3i)p~kTzKUV_k`W@wKG+ zcsep`%?!SCwC!4OUB8M))0Mwrd7A`Nt2JLA#Kycg+x5j=eF6nE}YgU>hhCox*gVNjXEwZYj}xin4qT>B=ki@x9g8e}|? zZ2lxRq550*37I(NgtTQdPj8aA(;L>*D1S-n(%p=<$x$*>9k_QNY+!z7Q)oEhJ?Gop z7mIUQ*cr-I)27Us#ruWv@^8lTd2-nenK$;iX`E@V&RC-9JXNlP%f+tY>}36ai%z_& zUu;}ww{POlKTT~DTXUmo#iiC2v%B1}U4L)-%Vxe79?6g2{M@(}ihpX{F;V)*%4fcU z+c&VyJh0&5H0O7mXZ9QnZ)4m4?bynrTAqIu=jL3PbMaFs`#oRQt62&6vi23$^Rq9U zC>#7#no&>w?aSS%38E75tp}1jPF&z9YUIymssE+;T8)$KoY;%BbsLU5zZ30bwbM0t z{dLlD4Xcbzj#~xnHGbVYbMB{vMB|5^d*2=vatb#{S>&f2a7kRl8Io#J;{E>XB-T6s z3fkVC)mE%*i}$&i`*Dr-UemqoUSCDIW4S+ zpI0hw_7T|^=F%3}t@S6uqw2xkV<+FcUis#vRg{^nc;@pyPp1TduPr)fHomR&sy1YO zo$#=t= z`h**cPd`)SHt<^2Dz5aTk>72h&@>G<7oKIiLRyr0`h#p2C{D_B`2Sw!rw7}Kqrdm& zeP+z6XVQAFE-Jrc4Rhz6JH4fqNx^HlHQwHIVA(QZ{@j`^H$U%XjySMbG4{b{^X6|1 z21@yM3LITbSJv<^^weSIpCNy!tvh+r0mEY_H%?DKDDm#6REsB*#gtkDxw@Y3ZY?bx zJ3XE*kmr2%jaBC&Gk3-P0)v!>E&4A^(iVTr*dZ`uk&tEppN`-TwFtMO19#aDeNp@U zM0dt%9)-{Q_~)@+ancw3{o%i!_>q$}HG3MS+>T-5x&1;Yp^x3b&pQ8nfV@(roXfFZ zCMjuN+51x6hhEn{KAQYt%7-7_3uN~=^<}a?J6^WW<8AcS<~^;a*?JBus5vC85j)j8 zhj&4W@@c&-%vHiW9F|RXP}ywbQuW}u#0);qv_}hB>YTf0zC2RD(1=6b;q@{5eeH?+ zb|lV`T*Z@p^OwRojwyURtA(}oG|lB2Za6kO8J|(z)o=eoORhD;|Ifj;__dAsDw=N7 zzdNfrt;%&;*Kv1K(y^6?U%A$AF6aGyPjao#x-~3Ohl|fVV=>peV&2Dm`%m6Q={rBJ ze5hTZ7^qmIpL@nalcld)Ftz!K;IXG^GgK5ZG!@(o-ThXocC8t(sN ztMJ(Ed+HU%ix*z65HB*`cgd!*Zoc&96HkQi`dKpH{&@R|)+eETu4ffoIA$FYnc&Kw z8Bno2&oTJT`pJpR%O)7HB;=;8-yYvC)Z@wR@sH(O)H=zGs-i{TJ&!QGk>qXR-@_+Z zbb^1%p~WtNH+A!PnUuG2`%Nf}>iOhmCijJBWlMsdn{UF0X=SU=lzg0dW0I8Np)UzN z3@J-}j_HLT<@M4R3hwwcWv#aPRqg=63&(lwnmCFp_0FtXHleXvC;L%^nOLx>@g(K_ zTfXbZy=>Dx$E31+7w=Z?EY+k_`Gyz8<=A^>tTsN|Sa7VmC%5&%*^k0@PfVH(#pZu{ zo+hyI+pm;QVr+3f0Sc+>q&w8Mc5P$ixjj{ee@D)d$mC@oy<&gQRA<_l7k`{psg5nX zEP958n)WY^#H|0#4J!3hAGt|6$@CU>RJEK}FA1wY%*S4QhGE|9<(V74&7F~T=ZMhL z2MRn42VxZyXP&Bxf5&<`RrkeCbC&);$C~GVh+&yNxyxO9!s}jT7E`$!wOoDg3p^j} zo_9a_!me@ox(cOyFc;UHox^hJ%Uc(lv>C{iSx=CVOR5-Yn+l zG(W_q7Q16tYtKQpcicVurn&W|ogP^B$n;)Z97lX#(KWQ0j zQm!!FtK=2Azd~>l(|4oA62hm%+p;*XvDU|xSTEl187DMzJL{k6D&N=4w)f~i>^t}0 zmLy5Z^0P60EGHy_?&c2=japxslcx8dBe<4+=m85$OK zua9XSm41=uwcH*&)H`#ZeY5c7Uq*inT2G#Ic)S06Fq7!-`4eN7zk0PmCB}Fj`~3Q# z(hcf||0>;^vQf0@u&%P^&lAZhQ?&n?=Pu&R{WrDTlPlZGzp0tuIMqaX_PT@F@^kDJ zZ*4qWtsd82t;Aw?&8^vH#le~TcPqEevw!#5Uw-}m+Q#jT?If2m!r zz5b$JQTb%nBxe4p1{U1nawp$Ktos}3;v3>N{Si~4?BOhyq)o3D9kkwe*M2)+Skvra zj>EEMxuR2;S?~X@@jJjZx>kq*P^M7oSWuB+8#AJ>7Asg$n z{I%<^q|GuE*uCBLw%E7kxK-26<=?Yv7Ru&xQN6~$;NY5sRXUQ7E^jaREySh#raOGm zj6{wS{gN%yVv@Zg6O_K#}@i_^A_CX71MJR@jZE7JwV4GDCMs+$G3}@7_yBUw+d)Y zn|Z$=aaXZ#tD}|kN}qWL-*!(t{{5kE8@B%_tGvk(j)YI5Y_i9+F2t-(c*W|p@S^h0`jGH-PY=9{X#1f1 zdJnVJ)7R~HTvG(u1V48Ds5D;-eFnNbIxt8h13hj3=Uc2 zAAMVo-zxGdhZw^VGr;t_s8=HZi~ zTj4Knt=rFgMaHp9%li6S9=#{Fk9WzN+^_f^zF^%2SI5oD8@j95jvG`SO6!!~J1^zh zw7$AMhmMNR%DBPup)FeVKEotek9!do%l@C#)2#WY5zdkqp%8o7NGvVoz%S80wVk(E z1$>m2>dlFr<9>|kf7IS;jUMsOmG)(f9N7(`D~x7FD;!>=9Da1Ng672IOY%HrcQRgE zT*IV%Xl+Yf_|$)l=8oJR($6@P6=zys6LNIVb88X3@%!lS9b%W{mVsyOi_Db<@MKsgzr%d`Q&L4S@a_)Ldqo=V2`yyK*iM|Qi ziZ;dXSD5^<`Ej7%_Sb=0MS;EYY}J*jHi`+4nS3_IoI1=b{czhW*MKILGc8ja#Kn@i zI<7iJER$Qmb3@|(6P8PV+fVnHnR;OU6qhZ};-?udy3zOAB)DncP^SxvVp(KC}PU4 z*fVe93)6S9U0fV$RU*D}Zlb7-P}mlm&sR%Bg!YQnPh?)QI_kfpXR*G8$L>8BxD}ij z88--g?{DmG@jb$86!YVSO+%=La{irC>z}MYyS{Ff4ESL4iB)@Q*KVb0pB3glSk1Fg zbT9jl){^tjF8w*CeZyESi&>;az>|gloJDrM-my&6*AX#EH#yz5y}tKxQp1s(4D4({ zino8T+-Xf=NLaCY(ae_HdY_(fS4r@%jM@J*?Nj@7g+&P&9yeDc8!!m4{cg=jJLGY2 z{^aAvJ)QPOg1!dpo=4l-3JEQi6?}KFv_9|pqd69?XN0?V7Ol=#(mr2&DYNjw9BY$0 zu1i@C?l%8h&g^oPU7~8lu*z#%`iCzLORBtNyRH5iDJbn05d6Sl$?ENLXu-XwRa?&; zaMWVV`ttH%fArUuAKp?k7|qnKbnj&HWb$3=*m?WX-$}Q3ttizz_G)k7`qag@;zJG< zYR)o0-T#(}W9jWzK8=Si#0XfvVX8U8q1f`z_Tj6k4O`|o3)~dC$eplj)>7NoBAaa< zMIQa2cy_yMR71)1>#mOvsccz`^ek8YQqtoUM8Y`wY zuVeUI;uBypDKM42VDB%_Cx$K(6T2ghseFlkmngKz+>0qCdx>c3V=sfpJ|A{P#m?}l z<9fSj^ZKuv4+3Ajh~}Qd!TK!0Skq$0i5pQ4oi+watm%%ouK$jf&e)bKlk{<}kWi)Z zLggzW?{+jv-r?8dj?Y!N7vO&P+Ug1R>@zn0;QD!cPSfgL7YizDSF3v6mDM+z+Oy5J z%bT&Nr?+R~%sGaucRkg6K66R>#S2O0*Bv_=CQtbPd(oZ%<2$d8E>T{2@w0+YvYL^O zI@hzm9~N_b*fS$fHkj)JgVj~PWgkzS|IBPq@cvAZsxoHRUmXcy!^Tb%Aaz2Q?0dy0;kablbPB{X??TtIKxWEVjQ?Zk)Jkc=gE14W??h zd=Dr*ur!i#>|VvWE0FEA&~f|S3pU2z{^s5=H=NJl&+C;xr&X-YHeNNOYJs^>;oJ=l zD<-OW>-TbqM!2N+Bt@AyzioN%FmcK4scpiQ z@}GG2R}^gD9$t~V>P?E$ylnRR*e8C=s_m-Lu@qfnj6 zv-Fpz!rvWvarn=DDE!{vC^SWV^R@yg#2qPrs~uX!w`OqMMqZ zxK5qitsEOz(=utH(WlUx#>@y{Od zeD)QK=B#OH<2&*p%KP88Vwu#rDMo8HHEou-$nd;KYFAvrTOePeX=<0Yc@zxO)3{lV9T4_qvnCtf_d>QR$^V4uXcK*9afb@u7*dG^}L*vryE>dEA8 z#&c4OPA}g%lOfwt!@hwpukD&$xBVwugJlNw0+wrY7fR={?7t{rwdjZLi5U4<=L@f^ zTT;T^T+`OB?>KqBQQRe9_r=5W^*7ID`pTG`r6(UCHl;B{FYnsEBQkDL9?1=7Q+KA= zPGz~7|3qkqpaSCscW%`~;-}h#FCF)LFvYj{We{`Iq>Fq4aW|)Al+D!NEM28`&v0Fs z(xSOe9LM^e&h$|hUuRx;FWup@(}aUj(){0rc75hsC4NC7^JB)3W>&*1yk!esuGi|b z+RLDGOYQzzwdqd5^5LPrExg8xi3jSL_C`+hfAZ9gwbnIH);8&_WB2(l_fpMwbDUkm zK4aVS7dwCHn?1hxOs+4p+}75EZ+-8i6a3Ptj$f*I-c?PQvmtB6-PG^8I~E=neijk` zsV*Z&`p}p3jfxtJ^mlM39TDOQjrn=Iv^!6Al5hOZ882SFO-#_MUNvL?)|eXIMFEea zeqX!a;J~Spb3^&qx{~ns6IX}*H1lM&o0Ovw|ERj=?S^m9b7f|T^3H2!aQ$|$gU=;{ z=l|QJ_-XfzxCE`F+(IuNJ)alK8TWftnF5O&+x3eQO-ao$HTx!PVZCv5d;0><8*N{k zZ<%{7ZAgsIwp04SsV6Hm@kmgQ-!|_#7yEu5y<=Z>CGY+Az48ufeu{Ou9ot*CB~%(l z#+97;ki9!|?^l!c+MjtUKlx%F6Srzczz~H*K$A0PcX}vq6p8x4u^zpUBX4ceQG8>;Cw0n}i zxO3h1g_pkv&tnbG>`LI`U^{Wvfn}43!tFe>6IVACZ~pRg?RQld>q(N2y{s1e$>n-$ zq2KVot@Z37=2an^$|L3;g%dbA zUM~J&yWvR2Nk6SUYzHrS%rTK@W0!C&5V&W^7stVO<@7EI^SfLZSWj!o8_bxx#Z9H9 zJzMD3w{MNyQ}dOx%AP1YOf}>$D^|!4-hX1Z$%I;a)|s>Rv3afQ-p^HNa=Scn{_$h& zlb6dREdN}|7(9K`jMJ$b(_{4(`EV@TEz&ye=zSxL#0Mug@1D`MR4iz5ck4F)2;TzF zi>4g!Ob^WbbK{`XlWki!so!|{L8)-V^KH`?9;!F>vS}-vcS$E_?uEY!Tq{`8l#62b zo4c;66}|J&t<;Por{3K9!a4o?8M#YYUv;hBt3Sb+t;wkC`!gZ^%`r#b)hM2N==uK3 zgb%HIR9|%nPP&bEYEP1Zf`Vf?Vnt{@5!hRCrdJwJpBhfN4p| z_M;njo;VSEJ|$UV*{Zea?|6F@c>Id1B`;?lkFuG6;((UHuIJGcXFE$hJ=tY>OF~~k zy*#0@lYMKGHU9lbsA|NlC>?xwMm@)y$&ay~Dc+0Xsz{I`q6+-TjoX%Y(>_v9Z* zRb))tm3upW{^Ul3yR)~Z-A|FPe6ww)Y9qt*8Rd@?YHBTd`nVPsDQ>S>67C^0L5`>0 zkdJ$3>Bonxd?A{CK1qBYhoha}1=(A@mt?s3x++FI`NaMSg)9q2T{ONc9JYVz^+11; zp|)nqXZiB1neX|m?t}cQsI3;2>HU?yX6By)WQ`}q8oa7d zJf;?X$3c2g-yLU$b!QLHj#~WaxBKqO)?EAD%a*#bJy)=v<@$R4Ly<2>oh`x+3BKq! zow54+7qivMd#e2;QaV1x@O~>OtkaE^GMoQEJzd>Oa%W_WEaR_&&Br&%p2GHCYvcnIYQ+xRL{oJRoaE_uc24))(+qOBC$BcItIWkgX^AOyYkRupw9Nf2lQ+HRgJ}e3$nUpO zd!u|OvT;6<|IN8m<5Kc-v31|xR<4fN@M)?-ZH|rUbUT$PrLG-G`#BgNNae={I3K>s zF}plhiJf}_zlNFk!x=~a>c!5u+kZT5Plx4%+p*I&R&~FTV9?E+e0=wT1D#q4I}ZGI z?8r|$8=K(0(3zv=^t-*>SMLXLv7~f%G#sn6EnA+nb863_BO$(Su6mzq=YD$h%j4;7 zC#ycruL>U?s+&FT>OJ%&TEQfLk*ma>ISvaoYH}U6xO~}?y*yc3e2wY#Gx_h!8mDi$ zBjflWukqK;&+Iq9@Bdlx_qI4o(9N(V>LF}@U!--;QfYCYem<9D)v>$3cLd)Nn)3U> z2A_^6@7B#vRb0e#BZygGUr{7Osd8|mLP4SA*C(F@FIhHid@MB2K*Z)&ZmGP2VXs8U z3ZCnM`D8s`e|yI<=IJbtWFk`+NBQJUt6uL?pk(p&l~2~sZ_G+}CcJznsCwYS zBC*}iy93(wDwJ2tFV4x|`PiP}LCk&a1u`j$<{xEuTinV15z1a+U1N2tKmRa?#pVRj zi>Vim?e;TXyPc8V*77YL(f?OjGv+3H zaQGBWYd>;j0dHZ|)qjP%E8ZL5l|C`~L@$TqgKv!Q?w;Zi>r2#rd|ILQk;vLkud36R zC;6T!tUYDE?ZvO}e@|>&d_2RM`*2IjS-aNX0-jag*8UR}JELBHJ#r~}XU?0S$BGK# zPu_bjRw?P(*#F|)GY9o`7nQbca9FrbE>T`QM_`tUz{1rLCrn%PEwh*Z-2VRWxdiEZ zhp+8izxlc5eW3%%?vj&EC_UmzYtP1I&CkksXhX8M%q_0es|kB!!o zFM8HxCS~pW`thmR)BkfG|Nr&)Ywf2Qx*i43mWLbJ@|kPf9NwG8vZwm|yRU11+-P() zc#vrj>XET}o5J_W>l{w)-p1Y5FIHh#<9TWRmI-yAZ&zQtdCnr^&7SHhJ5QXtU%kV1OZ>J! zV&0cN`^@W=e|quGo6k?~RrE>bXs0aOpz|@p6#5N(x?Y<$h4**xy$1Z)4d8 zA?CFFy=v~q->J-fx}fbFa7l-PxjV-tp`3PSF%srZ3i~>K9&V->W~t=HSDl4X#W-W6ds{kye$S z*DhWD+w#NoyAK{t@~nS*#rhdvNa;>3r+d5PPsmPv%*^wk>&fH!t5zNfZ&<81HI)0F z^ZNVp+oSjYu9n`hHvXzWk!s8Ax?+2&MeC0}xwY!3L|W7tscA0Pi;jQY{&H3$^XJ^X zs@LD$S(o_w!GY6ZHd9y=Dg?eT`idzt7#z^Z3Jp5W6;dLNh7$3FH<(-zl;eg94+3CA&+WsB6=eX3z?a~AN zHsObAb<^E0cBbxVJ*M*LU*5rZ;d8b-GtY$uro8$u=T=wG_*i04C-I}fA`w;<=gB-er()-f_LKOQob7#e)PQS^0=?Y zrx!0H;^Gqd21Gh6eXxR;)mx9N{$Y`x%l?fIJEg}FM6GUvZ|d_KHfs=47u z%$~=)POGbS)h0aHlJe-2ep)w=!xW#nEE(T*xu2)3zEt?J|F&P0io>$F8x!(h9Avms z#47rRi7DeAzwA!&j#Jkb-LAVSac(=y9q~11US9TM>)GmEFQpY49_f`=?Q`?vDNucUbWen1;pWUOt{gcV zw>|Mw{cf^qyL8oK20oYdvlD86*BH)Hxb;~>tzxBg)>gxbI}g3z28x{4yP3eItFbNh;q%9;TiSk0$XCbg zuD0KK$y6|CeK)tBtCZlLL^kP#y|WqX@7M_C9NEsi`rd(mj}v8DR_JmEusujR|D&|; z^pOPn%Ln#O(tog|TK8w*c7-IK1L6+*EBww(w&RJ<`@3<=r%%_nZ9DWu`Cdzo!uK7E zy7oPa-ST|GvfFI?om_MtW;d_;%-E;uYO=#RNSk+h}HzpdhxCT^RQ-`vPs=y+V`v-!*F z?v)bG?ZRst-aKtny73_UefImS%ayJ7C9T!oYGW3V8Emj7cefDR-Fcn|s&+mTujIWX zmHYG7^AEZ~IhWohX>f*27rnFV_I@MLo2li`dM4StN(>RN$gen=*3s#p+z`Ke3FnUa zYE7kU|6fVF&>`xw>FHIY+uIY(cWHd8YY_hSrt5me+MlH?5g7@0I(EKfv$-vECvDOy z=}eQ?D;1C3y6IF_i&@US?{99x5~BH`mRK=DW7k)omR`F_2@}{yxZStf8FoD zYsnJjd>nQAtr_nZ>lN*bj7Y<5q3xMX}#@u|A3xkFyV-k~)$6I(5g4-=&p{Gh-)a zr|-Bs?~7LUoyxlC(hbfwYZg2#;<$Iu_UPTVcS-$XMLn;XioG^g8+EKRT6~H3bwnsH zd++l*zrVU_9Q<*l$Z6;8I*B_fQTn>e80OjLHEg$E$NTza`{~>3j~%7_zEjly>_46S_7>ZsYc}grqZ0pH-MmxCEG=(-B3I|%wi;K5N1F;>h} z<{s0UsA+(M>qXTVE+HDDyg#KeqOWQmNRd6AN>Dwp3t=yCmguv+huH8+%l)_pDzcuudJb(JmyDGi!cPdyIX8N!&=yuHbarVO9yT9eS{$AYuxP9Zcj4SJTuRr!m z@ZG*TVp78ceQW#I+c)1k`}jkxOxo1D^WXhFS!Oul!I2N!Z}m;66$)e9Yi$_t&LnEv zqix)Ixx%%{H?wrVekgkFe0v+0YX8iY^E8*7Y!tb(bK~1y#TBp1UCt@I(s>dismicZ zZb`V>J-KkVrT>n$B#P#`7Ig2gJ^7?#&2zP_zk=l}?znB-pLOZ$>mM`LYo@H(FDvg{ z=V_t$!;X*V5!*5;Ps{fcP1FPzKA31Iv9?C9d-jQiFQqP7+g^I`;LZK}`BvBN-}`d# z%fCI#e;4js9KNd0(BbRrSvG(FMB4nEUS~TeAouvYLndBFgtMGJ1+d4Mh;Utc=*su% z>SlL2rvpsNZ(j1P;VV(Fs`&h-%*i`?uetw&lc%2=ZG0ZR!Z>253EwBi=;gl)?mR!x z`@4_D+@q24_p<486nE{PtShnG!f(smi$~W^xN_sgn&QyiA?c;enkN`}+8-ZlSuXtA z$t>b$nO@p;Kc$JEN{%;Z8)+Q2xT9vEZds;yUq`vw>h7Y`E{Z#S1J-%#eOuoC(J@^( z<XA(g2oCjXQ5W^`VmtS@rq24ktg-Hps43yUtST4By|dfQv(IXiR@b=4l-rtm#5 z+IRNdvVhfI0WYuam-FstIUTld^WUQ{L{il9qBnf-b1&NMd4}I+SKZrfNiJ_ctFXV@ z?6h~9?~09Ugm=%Kw&3r9K=lY#@7I_1rOs^=REoTl8@bQw>MuUE%?Cu3QyN8fJh@Vs zEIvV>v6OxLdgpU2#}s#*z8d=P++)6?|7G50&l;vT&tb1-{%bV7R>1vo=#{JBvyV}U>$BcFxtZjYZrgy%WK~(O>q}?u&4aaBo%um{= z?tJsGV~lut`==jbdO5AN3(l%H?|hKZGtcZxuD9BgH_e;AUoC1;U;Ci*Ztq0K6}A7f z6y3h_`M+H|+Aw>y({z$tvuCR^?ksj@;so5gf?O?vmdYi9Y6Cy{co^Bct7U)b9o z$jOkO9_dziy+H5V5}i1w>(_HWgb2Slw7L4t z$|RLL0iPaSpEPaT-Xph@)XZm{Vph=kbwjD#%gHU%{_f!ebKm5*PmLC}sX9{XWPRXU zsLt!%=IeLwy|v45k*xA}F@N!oYn-kp{Vv+|CM4xl+tCg4KhK(Xe%(ip$qifn*GhB{QCWE$|2Uy8=raF zs#+8_`9|IUrMsHvbh6z%X%F|3TPjRzc5XegPXG2QN#pa+T28BNZm)V^Z}h(PVAa!b zVXb$^o(3$xv%>xS&9@JK%Dk)9+GV`Y>(Z)({k3}Lhl&>7KY3Dl+2XR!xA)luI@gMP zeX%HEJ-hIi(tL)qc`tTUgqZGbkJ&1CXsulF+S=;6gtOOdQ;r722(7}ZxY2`K&e>ziPd*i}ojMoUyE^Hho^&(XQs(_Eq=qOU}6~R9kA@VSP^i`i2chH|w^ENRS$yX9p(_z@ zy5t0(7?c}dG7W1 zYvRBE-fp^Hs<}5^v2b7R9kcz$7pDFHnYMTLu9w+`EYj=dANJs~{I$w4aohU;w<5|P zC$Cklu&ub`rF2+GjB!(6^_ha%hc8Plie2+}?S#H4gq%qzDev0ReqyT2m$>br@^63TY)DLc z9435e$B$fTp2Z!OZY+^8vD4Pw@>WT7xe#k{tj_*^n#}HBg^FA=A3w7@{KxvsS=~8i z9XDd@?(*c8^q+mt{Jv1))n2nV+t%|(1+TAY+Pd-cTpn8ic@Nh|_SJfd-+%T!S1P^2 z8F09SS>g#<8s9-yzSPX?W#!Zs@!%m62cWH0+msyKfW0kxKqcZGNS49O8e-f1(qf++BPe4@$i3ZlK$71-*@1b zj@%;aw^P3cFt|vq+GZPnnCaCSUWTxLaV>8rx!(zSf6?Gyz?No**Nk>M9Fpwyr({IQ zxZE~9cbzM?|9HXMO-(ts*Ge#PanJh3V^_22_o3C#Kdn@5x~==J{5IPXO_vk3(lf+@ zZY-{@c=vec-g)~DZb?a5f18c#+ue6s33oU3x_@i%>A%_+zxhq0uusaT1#TQy9vss) zyfnKZ$>n?DXMvhSxi8nIhc2wkjXUyPYyGiv&0D27I775D+gwc_G^qqy$+xDIo?p}( zc*2fl#<3I0$L^=q$IUvuHS70=yR*#nw6`{&EQ(c(Ec{XS+kB4ir;4qwI?YcPyVxXi z7^Xh|^m3i?Zp|4d4@}&3_w%iFLW0GmyFXvKJj-^`^=%DNHjyb=^1o(un8sb%wfl{D zQcmR>UV(-K%4X#Oa{T6(7G2!DJN4boJHPf%n0(DS@B5?O!gs~)y}#gaUhUD(*qaUW z1=4;O8XpO@y|>O;igi|@@ADIWE-N}9Yh;mK6aTYoo`?7KIUXS_cN2cK zx0afl7~C&QUSW4A$YXcVsik+%{?biQl;^VNomcT;lJvK(MSsr8NfrBkf3f4NC|A>~ zyF3QlmZwX%v&S3Rq_=cLyiB)mI=y9brW6C`odV|acOUjk{QNODcj4*NW^e>>`gLxG}<%_Ak_C1si^y&h$+_g-arWS&_VTlQy_*U{vMXYW4V#ArC( zCUU0Co;p4^-I#;LFAa_I>K|Js*!$Z(*(<0oyY#i9?}=6KG(#m#i|vHk?``lta%HK< z;p>lPBpG-|Zo)>C3yZvN)Y=bWAS(>HVT^hb9rzFmCx zllau-p`}m%KU^%j-NF7}y?xL+``69a>mw{`Vh#8Ilb?Up++Xp;wPFSa#@0+{=KxP< zXV@-O28N0`wG(YU4hM*|`Ufvnn#xxuPu1-hS3$?WoEZj@iURc$9()<4cPv=RG z9%<|lllc?5#%hPf>sJr7IGXGg*6I0m=>hq zI?OxL&2;B}wkw=5RkiiUoQgXOxP|PCV#|K^7N1OPOmFMWvGS8q6Z4MMDL2%X*7|5t z=n`mpO1wxu?@!)u5OE>QC}z276U(#-E?i0}R{|YH#TISJUNXbua^;!B z_HTX!Kbdqglu`LOQ&xbYW!(q+AGXn(Elgjku_imb@6N67VQP$BaCO7m_sO^O<}&H|;t48AP!ZhPWU7v;2(W6%7H=1&_BMlYy8 zJ2(2b%yNE*X=z()m}O*`l2uQ|eXl5w|9(4T>Uw=6Rxq9nrC z$0|8LS1&OoKPgqOBDa761Z?ap3KEmEQ%e+*Qqwc@Y?a>c-mj#PnPRIHZt82`Ti~3U zk?B!Ylp0*+7m{3+ootz+WN*i1Q(;w+TacStlBiITo0C^;Rbi_HHrFbz*a{@9ucQE0 zQj%?}6yY17;GAESs$imLqGzD%T9H|1q-4jXU{jQmW)}AAQ`ZCkR4KyTL3o~MK#RtV8!4tvU15!E(JNy z)5TT^WWQBPesX4t6_}Z7Y-wO*nq;Dzl4h2oYm#J;s%vRzlB}DWYG7$$Y+|02m}G`z zlxJRXNn&1dD#)mc+ycGK%oHn2OAAv=3ln2qLkmL_T@y27W8EYJ3v=D%G()4rq*T)s z1G7XVBm9dp(=+oDbC6vHGAboA#mdy!AT`y@$UxWJ%rsfo#KbIFH!;c7TsPS`#Wcmt z&@wgA)C6o)O0tz(eo<~>iLFv*Zen_>enDP3SOOH_R*nIlwn|2N1_+UWoWzo}{Gwc2 zrSQzWl>G8ygj7goZfbBzA}Bl!&CHDr%nVJ84J|A!O^gf?io#NhiZk=`K&BcR=ouS< zWk3;QGBC6J71;Q>*A zRK(bEDL}-6T-@xqZ1ln99H`8L7ziqJXo;cmKuaqW6h3IUQ7kEX8C z;36pmNK!nSx~LXhT!_w8YF>)1Qn`}7ovV%NdfhRPWE6 zRaL>qUwYbB9)6Qm%opVFm5y4w%&euwgZba zkC=kb1OcI>@LOxnZnm~8t#b~&Yj1VtwyiDq43!1v-3uT3DY0cA+W~J_fx8PKMyA$B#Rj z>^iUibL~Wsj)cpbrq$lx78#+<_(w=EmiYkVM9#IA4D1Z+|7ff&Wk_H-P|sAs;&T7S z^XYr8aco{SR+~qpikc~lQsmfZ@E!RTd`!r{m3a*{tSYX{DclXTMdZlCY zZoi&>ZcAF|>8NX6IZYD%06`>$(@ z?VtbpedqSuK_|;I*1lI$SU2TYThOcdQ?K<;elYpI?z1P{CYxTS_Uttj>fgUKL}LlV zfg+g##Q-fa!3w($4i|=Gp0?CR!%2q>7ECGI8}xEXv`(#?=Fjs-e*W8=rb9}Mr_-6O`+3{I>ufOvs(lzgO=RN%<$z{=m^VLUwZi&`; zcQxp5Jnvst!T#R*^s-;9qAzoL)jdVMS9iYX*FC=T(gq#w3ooRi`hGe!{JFu=bVud@ zi;GHAg$>(flZ8`SrU=d9-mxzF)Y)k`l;XRKlAvE6)Ld)p@~dv3o7lY_g2-)?&? z7VIR^>9q02!(B&bJa$nEI#t?GrsS7%<@??>@;@2{9%WqV^z%9Id)7Yo%-OAO8(7Wu zf7liok;`z8?SY-ZSK$K;0g~wq$1GbC8@L&dNif}S58`48l8VY+x?t-xFD-^yf`S|+ zG6(7eWRs4_rOtW#H>|8oilOYr$Jn;yzq?Z-WqS<6v_vOnc)twV_#!bkC3dbXo?-tfHf3I& zNLRFhg~J5{A8s$t&@xZcNtqw7wI%Jb|FLf>Rywy0);f4T>1Gw% zI7j389`)JhpUo@$+`jsJbzpjYjHYFTmgsknm1eV-?Yz0|jiS;kjue5)4L9Tay^XKJmLenA0r5Ea=F*qJg_Zq9xGprKaXWQ->Y~-hyLWrWhsk7)qWH z669-qQS7x+KXYl&ksIxEGnUMjFif0b;KMv~XXOcn3ytr08*#WX{$XzDf6IMGSbs_3 z?P)#}&xqd>>^y!y*SgG0Do|(t+uj=mubUMvvnexeaWk~;Uzz;daNGCS6913wckG+r zpvcl9z`%H9#<}!j%ln^=@)mxuXxJZqA->{T`Q2-8{#?BEuHw{(nC-E-4vU9qdQX?G~EV*5MFw4~3tj-W}crzJL)Ee+|`qhUW3jJI@@?wf=N+z2E%P zTlUQqyYZ*yGUL-ZXUZ7L4Uet67`0wS$#~9_bxgck35&O`+mI@?%SyAu!6iXdfvI&_ z*R_UqG0hW|0v2rjlp>H~I$>*0wTEUZ_hEH~jA%mk~(h2|GM`z0SwFUqG zsb9cv&w0FX!Iq}PSqVqBwtY)qzFfU&((g?B5C2QzAIRmMy&``u&TP*-HMQgIT&;IZ zUA`1C@g9GCGEZ-Z;zHlsg-p7kjx*YHeS(h&dp;B6S{(e`&GuNO&ICu122B?6AgyB^ z3DIVoT5W31w+3-tkaA(M*LeQg;&H+pMGlpgM2CXLZQDd-)S2u*EWH->lzV5;gP-?> zdj3xoI5z!X@t2g-J6A~L^Bz1OXp(%xY)X}};NDilGTnwc1|^x3A&f1CY>5(2c_(g^ znwut}w&Ou+R4>P}+{M`$0(%c@KQNSz)8jsC;lR_D*(jl$$dPw*TV_<)m7+OQ-dd<7 z^GLB=+bi@|e;@nO9JW*12Tz}6K60YdMQ7<3qor3inFz*eooz8QU&S-Fl)mB~GOOa4sUm5a&WrN4D^ zAN{jlb7`G7+rR9NjiDDKlvw@5#1EAy38ry5Klxm#K6$38k+Jcf38xLumrg#S@$^^R znN2>ynn#xgrLH=&Nq~j1)&!1-k4@Z)$q1T)#^k8Tt;yVw zz!0%=>pP#~$EP1_{peJ?Y%X0UbReGd^sbvlbM7`i&-FI`_@lgdrcZxjuco95<1Iaw z?WKm@L3Zui9`YI}eYA>lc=>7n3{l7DAJ}-}3Z>5+G(GXW`-9r~ki99-Tx8Uz`II$o z?%r}q|J@ahB|8fXVpunsHlNSG{WijXzJa{Jp&ttjdfK^;9%|k9ejDfIlxeBL={=rH zIlK;*+p_HIcQWih@R>m%X`{uWi5eY+mwJ??vYDU9+`K5kn}4?@b@nx7Yy0*jJAMb{ z2|_)^N0JO9rm^1MmRQioeQoV=?RPtbx8Ez$UbpYn(HoneCw<}NJ*2(!#JTf_zs6MT z)8FyH^RP+yj=0QR!}yA{@1L$3pZA@UeKAA#_s#|9?m4>b=UO1k5W09~mdIfX_dRQQ zU*3yb6R}Uowzk&e`V)|MG(+MZlqeans@r zVeb!o($06R`g~L&Z^4wg$KRZ6o?-LDpO7W*KV( z=UBC;|Nr;h@Y~t*$}{G-gmE!!;c1$4?N_-+hy9J{Q>W)&m?0T;>b`;QYsSmls;36U zDbBWKdf@w;>HBO^27l%svpsC;S~Da0UdtS6W53tE(Du4RXove!?VPB?O+itI&!0_v za?<_dA9Z^s+d7$L4+Pp8rU)&|T-kZ?V&wLSKWq*BZ@KU2Z%O-t#ikkn~do{t$0dYE<{>1Hs7yea{vC;Ij>GGYGsj}a6{^?ggJ?Cck%9c zrh5HR*Xg*H6eGrS7FuVFmrT(R;r{XK@%_Qx_4=cO7f=9Fk_2zlx|Q}}`CCW~K3>koePuaRgiKE6sgfPJ6+ z;;sL3g&z5ToA$~6npE4`jVvoCRjWUL^mk%KPV4hsJq-IpbmZ6y{_i{Rw@f2xPgCK) z|gj@&%2Ylg_rw1n%rN*J)50>|XZP=JRxan^pCK z`!9>#`18iy@FQR=X!glWvW|v0Xcwc+}z!lxEVoJXj zWZphJr&#&J=}aX>mdQa`ORwD6G3ovayLy`srL#IG8*!}LzIfu2TrNXv)6RRb;mxzf zIvC=o)~BROSZde5d*xfmRCDyfmePggw^KKS=Nve5g7e4c%MCmZ44W5EoS|@S?#x+n zYo|ore(%!%E%Mu&72&^HKQ!t4e-A!2J$p;g{&N=f+b?C=7QS;)3KU}zTK8Phqa@+y z+x%nS%>T-eRKIQ2CttyHs@J8CUmGy@Y?!#k+=Tg*YW?|?iAjB8?m)WVp?X? zthIAhr%e`MT4pf8N5#O-vh(K8NRRvN$?iSdwtbVkU;5j;?3?Z9H&1Tf6uYtIO)J02 zvgC}V_ZSy_FI2qM*U?@b-CwsKbq#Oc$m~cys4I3l&@YW`bNly0Z#Q^VrLvx2mWzEYLqY#HL>H z!pyl*nQz0SSeGc8R`b5oJ= zqgw3++7Gm}=J#vO%P-Yf?U-VEOR%kR+rh*y@Ak1ZK0F{T-GvkVaHvrK6T&s z8+`j{@0#~MS>xQC=J#R@860{7{YN*{T~51G`+aZ4&0h1wf`SEe7W1qZ{q?U>;jlr% zZ8M$24f?7@Kbah1l>pE%Uy`3{(9^9IHw_kpa)=vfOTTTS>bcrjn9 z?V_hkkD#-P+~MfDpVvRUy8Yh4Xd+AI6=vSV!nJ1(O_N|+bb))7h@jx3jTYC|$8sOu zWMF337qqY=$E^9l=LKGsDa(&fytjv4=N4Zt>xPxp(*@RL@){g=$+{X=F|Yg1P2mZx zIt&7jZI&&$Gb8QK>c?K!LR0e1a<~tymz?%hOVApOu}fxJ=>C1M%R}cL<64)E5eE*uTYZps zvCLY-D@DOl+&g8Ko;F!@P~6Two#k-nqU5t?60)`@dgi-krZMe{ZU~#iIxl^-f`@AL zrPU`4%(jc(UCti#w)Ntp^Wnlx-nTF7`2Mk4`s9DoocqdKW5haLl$|&>&5`grB^`QIHVOE_q1~P1j|~M-*&&^ z=KTHQ?y!{S&L5dAQ$ED-Z_JPpkE`K~tA77?$K$8v2~R(X8u%>Edw2bBym>|D7Lz{~ zea+wc_zVO#&CGc_$!n#@8r_@b)|OXyu3Y^-n?3E=T~K~w&AdBn9m@yym=3!z#Yw!E zk2vSov&Vhh6rCXDrlIcqRZf!eLI}T3)OB~8(C;;Y3`-7L9zP|jZD?W8aq(hcN^zt} zH>-x~L%-g{ygxF(w#D*j3$0!28^$=#LD$71N)P8k*L#_MyxB47_<8fZ%%tr?7xksv1cRd{ ztF@)BuaTY>Tg$$z|6QxSc_^<(P?^p*dF7*jZhm$V>=G3Tle>ta} zsBWD-W#JL0dv5J*R}!9be`Z}Kw99FyN}HZT&QB{5v@LNKbI*m~ zQ=;2WCKcxQr=FkNAN414leX3GM?D{_Yw!PNX5HH-p~`z%h)c>~u}9usrq%EMm9E+I zP0u3s?}MJ!nQH09EV?#dpUf0c9o-Kc(Wrq`j8^~v+J2fO8T zE+0CU8~yRu_5F;5U*oE2z;C5Y!JjqzBHBA1SnyqXX(DsmQE&3moHV|j zIbw}d_$1fZTidVS{*A}BE}_b2J1Db$({__qzIihkWh|`Ph#C$uR zX>VM<&w86M$2rU_?${}5-Q`tYy#fEEIfYkFm0rk@a^9w2VLl_HkM`B|TjgFGzIor{ z9bcZki{rrif^+S6k^(E%onEk&<-^ZHRsOl@cfuHdtVo=-x2JgBR=1M3emVQ!n@^CE zId&sB-mz@SnjU4hYpY_dAN}r={r&y>{{Mfs-pgIQRB2b|@-4@DCuSV^=&hP`Qm@sVju*G-sa$(^=#%xm zwyE3q34Uz6%J6uqM;hZA#?Y|Vk41W$w0syDgEG&|x9eh-uM|JF|I7IaH#G|s19YAw zN{Y3GtvQnYZYTTty`SaQ#MUzUoX#mYvBI*&q+}go`-Gid-iJj-Jb3CU&OX7za{Rj zSz0-hZKqo6Az9f)H@_%}WS#gv<@THHTel|O-1O9<>=(;2b#=w1EQ~Ym{m*p?TjPHF z0_)T5tGk$PI6d04%dlP3G;h|6h^>M!%x*MV8))SR)%P|0}m-{av<$mTCTPj=!0> z_kt0F$%!m~-imd<&n&n5zH^ta!r3D&JWbNAidIb9RhA?sW}NqSIJAa&mO-n8m=DJ` zhAob+Tf^?Y=*bY8o4w7EQ@XD#@WeUiT}NNFT@&j(w(It8EB%?X=PZ&-tgH6-rnVJW?YpqT*dEt zxLb<{dUdb-IMS;8O7Pc%sw`O9`wT1OTwRy`gm2Be6(XwY* zuz9br_?o!pzwP`^l-t8>x&eFo)$9y zT3>5=?Ous~OJ<`qQRHn;dQ^X@Bc~54SsK^6R*9s zk8|V6O**&FKEJs6_tB0m@lZpNc5x5CymzmRdrOJZ@f z>sE-@^Wll{=TKa@xh|(gKs1(1SPU(^lf<{5c-^(ztiu|8J)iRXX^`IU9RtZ)VcSyP;d z_-#tczjv$7SSJ}o_bUwVFYJKGhPn1)-`%Wh5Ta7(UubyEGoF1Zed@<%#Lo-WA# z+bXb(ago5$D;xS&Pjr}BrWNePb>PgxbOnI}TYMakgt5*mpK8!!w(7}Bm!;8LCk17$ zeSYA^eUnSxvw3f`eOTV}xp&Q+Kkaun%UH|R$S2u4o385aD0sK>c)%>H=-u0Yo;*44 z@BNxT8x19|6q!H16rQQpw&hAV_vL~m?-wV(e(J%))2uboyL53@$V1J&8w|7d2K2j# z9*A5ZBe^K{?}n1%ASUEFu3WKQF@MZ4=`PTo1saN&#A z(tEkHp3Q#ip^_W9ZGzXq%}Ek_{;s|8;Z?bU;f76OIxpD%d+7IF7XM@{bz+`%BlG`1 z`whRx|K~d8@4T8pp{+ut@8QGH9Z$DSe|$?kzPUnYpUalMXJ3s&r$n!DS^VqzJoOWt zvC|FP=9TatTdrnkZOrW~@q~S!t-1N_rBiFZJUHXBj@3-}_sW~!LfAFWS2q+FuFj11 zbc(e5y{`PPT3OEBuz6ptwiN4Iew0=cxvMhEa=-fa4c%?)Tzf9uzt5i+ZLy`^-sV2@ zW1gK8A7|VzP!zIdE?qRY;GXD;oE?hq=kIVRDv)SB!}F~FZM&vK$B8M94+I32m1b;X zRb;6-->i3=r(u8YmoJxl_H(&>=Q@{sL?SaU;dJx+qX*WlcI?r=a-=}`s1x7LiOC#A z#ZP}GZnB|eHHol=t*`gL)I;7(( z+LJA!%u!aYKk0PXVeKamo^SfF`SR6&Wp4Km1f1^*UESvHey%Gov8L4KL)-?=XR>8E zwu1jIY*}+#G^BcCL_*`Wj`cS?OY?vH-|*+t>;rQpTq0}*=bZ}Sw|iJKV-nZQ$?PBh z+^=Ui_Ay^sZsWy^7dew;-gcVh+}p&;Z~Mb7=jM)`HD8=B-&m69bg5EluKbl*3^N{E zym}Ll&eeBw+b!6dc0ua< zo{x%meqEa0D7^m23ttDf#h!P4n$?%hW(Y9Vy40ND_RY0x-JI?> zef2V1aVsI`@5{Om?g;$+8uuE$$TG2X-{f zeRb&0N9GU9+!jo2(c>1Gmc8`Oy^J>>4bQJ_^5s16dZs`jQ$)$ns4wsL?7H-KJCl@X zAWLgQORJgZDxTU>oh4kZ)(h94$b9W^`;~5h4}+Ie>T-vu=1hgzXWe4XKki(2E_I{N zJL|-i-?)!%i@X?nG2&0N&@0!N4>PVQC{J?uy>5EKVdnRaw?C+HoD&E+FvGNyLG#Id z12L{sOZ!*ujX%Dzf1mijo6avhmQK)rBIwcSqSEE9x0|Q@Zl(CH-MhpcSnsn>xWLb$ z_T?|L@717O%^8C1=WV`+z#Ek;Pz^D<`w6&J3HM(qhni>Y|olmnzriOeoLKWQ_3a# z(!_6`Ri~34w;s!<$ImZpee2p$wj`TZyL81=@7_44TDfN71InBgH!VAU76E*wiyEN)xOllGlqYo0-rf*j@f$Q~dv87whWm zOUYtgCTBdD!ZyhoyMK3l`b^-5oZ&H_wO6Fxva27PYQw{jnP5SrKJ4&SEFc` zsaL=6%a03{TqcE9CmoXE}-z@ zkIgxopQaD!nNLr;i zF6=Ed-&GdVX}nlHVTKyhef48M7w|OM-_cnU{F~|fZc+B!IPaw)0tMxtbh?a%J4(M^ zdz!Q)Zo#pLzZ zS~T&*+09-r&mQ_E|C`DDcW`Ht66Z4J_#0tIzSX`zrobU*CYvq(_zX`C=jM7-vppZ{ z7Zu;l+t78%XQ2)MD;AMmHd|LS2(PnMW5_F$OW*e`b57lp!x_nTEvW}T$M~eHZ~WF| zT5)ytyCdJ$-acRv&7m(9ZN&KXXx!Od844mzdI#O~U3_-!vlpBek-Ttu^tRS+{hciS zwXZqPJT>Y#Ds)KTSegBY^$Z`1Z!+!?y}2h~@vNfi-}i-Ma#H4SD;+u(yZhsVz5EBt z<{ahxEoIP>xq*%0qIX5Y!*h(i7yV6}dnfp9FS?twvE~2&|9^C!J$v?`O0Pq(L&D~| zZn@Y5#!cz|3R|m$mF_ZcJ+x=lbNxW|g4M3f`*i;2Sp=%+-)KAWAZy9BoTIy@?-Sd& z&Th)G`?np@cZ&0@XC$oX@+-@bFrH8W& zm{&gRJt5Xr;4j~jC=n1O^xS6Ilv}gX{=81e;fmUS#^CJKLnanyII8q&IM1Y{@3eO4 z5MsGn-n!0fk)-aiTG45Kmz^BfthuxNnc5`nYl@RkFQ|COqV$w`-^8ln^fzA)U&!cnt+ zMQY&fa6|! zEh(vpY2I_i4>cM~6QabX1Wnl2u3+6h)A+ozgj&+wT7j~ZiODCW%%(@>axva1njjNOVIOUQ~w-FyKK1d>+aUXm@}5!MGC*f)>^me z?-op0BvEl@S6|0J-Z zWMWo!`?XoO1()CD{*!mV^s{YSX~rM*fcDMS6O-;H9FAH&UF$_|Q}=A$xNf5u`xuZ7Qc&XI31%YNg+U{d;oCs9GH|M8ED$tRv{ zQgGW7qEoow#~~;oeD${SGshos>L$cKt44{ra1_0x>#qoTUdYt1MaG zCa~z{ll)8bmc8rWQo+il_`pTk;=`Td6Hh-s&AZ?t(8eIH)-m<`zkr#UJ2nd^d@NIG zzjkfazNv9@xE_V9w^-}OdNreiqv8FbxpIfkEL`4rfZ0&&gu;n09H0L?txRROmwKy= zzwqFjb#*z_FPJw>nkz8%(4~UkGhR(-F}Ho_GEpL?cjv|6g5&qX?V+e$HImT7jv**IY{MJuI`1dnMDF1jSWrncN=E3Hxzx3)>6>0qLmb zNzqOA_RWW`Sb9hv_#UG@G3&jtO!bAc&*sZd{&!OTxy)TjUoOWtY>6}0NA7=q=`_d^Ukhg+ryUGxx{y)EZpv|JtcE-NeX^H0-uPCwR>;wiAOD)P(EhSq6a87p>L zD1OiWzZWGw? zd){w@JxQsDofbT+F*4`zEZ^~ZkO$AJGn)fiBSn_0 zAF%jtdwnkRm;Fo?6N>*OUEUr0KcTL2=VNr8WEi@Acr}ac@E9-8^yxDKO%9H6w z>}8Ydk=s(8vfu1{GQVV zb&7V%)ZB09-h9X9m;WTJY>>jaX$I?*w&&Aw5^raE zh`u#mqkit^yZ$M^?@xZw5xwlI_TAdr{I@UO#m$>Lzgxz>X2#Eb?5DQ{@`xzS)<6Et z{Eyk1cL$?d#NIK){jFJ(c&qJu_S(h;GmdXOUn8OgVRU2!e)m zs&-xWc2W1fn8Lf;ZmxQyv-gGk?jrlMpGTh?dma!^a(=wH7|5`BwT$p!AfmTsC)5N$?Q$DrY||Z zVx6`_>}AcYg014N<}LF|q=Jh#TkQC6X>iU#%ONj~%X#|!mcCHwiMJ{^cbUI&+M?T9 z@xQAmWs$hew^uG}t_8OI?g{-LoBJ$sUu<7Ynw<9JmQLg44|l6FJ&)WTaH9C!`fZCR z`tb%7y?z=|{<>M=aGTpqyVXo#Q}+d36%l`xdi-ikr>OtJ?7w~@MV~eL<}o$5g-Jze z&RE8}e6RGxg{B$NTX$Ytwrtkqm2SRQFMFjnZ(8+EBzW5dZ!US~ki}O7vdkhSg^lOA zEGf54^OJX;Ftcs??DqJu3zh-9W()TAR2*%#U$t}R(UPPkU)KviU$1^}_cAs02*t^c zCSuMy6I;|d&pkW6@nhrngIVv_o}9`ncIv39=kk{2(Yno2dPJoPY4IP0aR| zq>UU0SS?DI!bi5$`l)7C~d|9-bqyf4?h zygQ;#O{%$n1X8u?-K<`0Z2 z;rZ;_bzFpUADq-{sPJW7<|LPAdR;MswPeGDBmCmir;Dy-QJ#A2&kq(izqxJALSJ>I zyFAY21ZAzwz0Ks4@YDDE!t~Ea85(v3`nv{pTw3+0=5tJm%4PSc5GZgkL%32tj!zsh5^T>o09ea#`XN*Q+`I_>hrs)XJ;2J~nmd%GK*`?A&?SbIpS}|NRT<=4Z~H z+xXmge+W|{-({1;Gc)P{(E;U z*yU-y(#^oTygXTN`q7)k&l94iNmj(EX;dv{Pdhd*7nEO~TwA+R{DAzFseU~Z+4AbY zW^YLUK5qh3Zs(hnyszFPkT!JCQwWN8M9#C54$8&i?uO^Q=o4mO3$R zOI5PAY&>y5OQnkKpk$-q)j$o0<|pP?M0efF2;5Ml*V50 z5Bf;Ijn+H3Yqq>Y($A`lfZXP%q6b1UIs&vFwXE8;W}{%a#iCVibr1b6mOcn()^ECc zjdyu9gJT-o(TkHm+)-Mf=ySP8g!|{yOf@;_aL0e`3(Bl>F8`Vvq4RIkx4yoz+kF$> z|16MUpO_)C?zuDHy2HnQ-|NkIzbR_%#YKIByr!lP7oEM8enlwRzfLgy-_z!fRZ2xW zD+`V#Mw^wr-6fD;`$PA|n>R64mzN)#(;GLZnsM5S=?jleo_B6D-@fU4e%i#ch}ljR zY*IMzkC{E@+)RNs!6#|YpR}FZxBlIHxl&MLS>CW!EzYIqZfZo>6vinp-W-sYt5LR+ zo@y4lAtTEALe3}imvfg*j}r7=D-iX_pWBwRde>!%7xD)_K0eNvQE<6UU3AyAJa+Rl zv%bf*hlkv^RCwbMmMOmW_0tVoo7}CL9FiZM(R^`7=hI9}t*4tFv@zZ&TvPeg`rzV| zQ6UPYmQ4&|D>Njn?zNkqn6~=j)O8FKH6-oD`=|2ohTVrO{Z2n~P^+@ASmaukSTKd9bQ= z#l+BG_X76{EU3D_Y2lvM@F`7~+4uD>many+Aj>Y!bI2fJwpdx-{m$R-s~KLtd-rU% z&0Kbu6(+O;K37M16kMrL)hAxGqd|vYQ|7Sn%b* zmm4R+rBYh7&+&$9??s$)Hp?D=((|zGcHVK`@cm14G_UzSIp=aV`m#=^G%vq^>Gvxu z7J8eQdK}l`3O$qi*cVn z2%hS_!WzG20?&H2(~*bQwmP~CH&1-ga`9TPk6QDgD;jrpN;Yul%sSL19nYQTemXGF zwEfVltLs-e&JFXu@cKepoV8g4!$FQPoyLf8dmr_nyuOoSEDWIr5v$InT};nl=>Je@ z5wh@G%2I}HRsWS-F0Pz#>D0S7?boD^UJU+VY@E7>NUbFiUr@|I~Jutm@{$4-dsN#A#3^VN0F zSd*ewPF2`-XH)KEL$+m&y3%G%+=93MI&H2G6cWyevcIq~CMuJP~hZ%VVz9{OIJp|$2ei0ij-1dEolvvj2P+anUA6uL7>P9iC3~kw4FIIn* zbNhPFi6Nl;ozIJp1ua6~Zms^QaqohpYuK#~ElbZoe9R`be_GbQRo5aNr@o*3y46E7 zMq;(d0Uzm?-FXgaUqsH;Jkw{~&cHNN;g-V!^IXHZ+uwif`h5R<&7Cy2FyZ9=m#U&G(E$y3? zr;)Sx^9D9=Q--y7?)T;1K01B>m#0FREZdU5-}FoIeeiQN!yE9L#f;n6uK5{F-|sEq zHa$^_O`Pd;7+>=7X=}OHl}Q+AY`LA0P#CmH(zH#LkMm-;_=>zk(d}{7Uw(Z4v3max zgL(F4B0p>7W}P~I-%B%4Ys!Z2E0-tO{nlC3$x?M~&2g4$IqhIu10h+1xf*X=q$9SL z`ldc!$>e2`9=vqlDrqs(D=Q4b?xmO-O60~id`XNl>+rep(JbRp>Z`t2=ci_Fd$3wM ze(Eb>#jnwiy_*79_be-_p1VOfw?*TiRckcIkF2}%o#)jDFp4;GzuNLabH3IcR?Cuj z(?Ui@H=V|(*Y9=iRKD-}@PV*`u4B(FZpVL4Y*lC1xx7-of9}kx_lzcgkKFj3b9|qj zpufvA<5b5fiP0xgpPk+kcVOeEXXXp4@1C==U*;A3>hqlVB_azBEs*|U@%O5`!S@@- z6AM`H7YlYD*^u}Vo2oN=&!2q{ z-DY`Re;#z`ch^Cwta7c88T#T`Er(j?Jrpz5nX;Jk`r{C5nUMB*;rljkXj(h#_lkY> zR~!46v2S>Eth%7&4NFKGlUBeKk8QkDxQRsb+KAhScdX@zYPOw&Hl$cTYzpK0oEasRN4*_q~^vsD5(( z;Df`TnT{w0Zc!E5@qOR#i`Q@8o^$Ndb8ka4lS#bHJ%@f)F9^NPEp>{Oqx;}WNnJ5L ze~$8d7kJmJ-`%px^p(Yy=ZCnDs`tyx?>YKtZf8aG`H%(I_tYJqdM)1eujqErq?e+l z$zAUwVMgb8mYOsL$wiyzvaQ}y9eKwi*xY{KhP=QFP43IZt&4s4IxjfMIsfat>kALJ z7koHSm-5+CVi{{Vw};S&sVs%ONp(BxmND6_5vmh8C*$_<&SwS*wePll&Hulszu5ok zse#bjf=9V8Vm6D0>2MyioUy@SqC`t5&qg$rGb*svKwE0jo4xB#k!&gn7CAGVft^;8MeE`pWFQof6(KsC3$_x_VcOF-rY^QQNQK7 zzV4#SdcLLZO$rqpJ?}hJgf1qn-9{+Y9?Zzyf_$B zOtq%)e#uByUwY_^1mEAs|J&xswm!b`V2*Q@U0l&$-UvI3D>d`xZBKkw$)zQIH6u}A zQJd5ptF0yrS32c>JUWX(PFE)H#+sYC!dmZ|o@y&az4X-Gs?T#ydD&*G4}UZoK$&EJ zesnVDGOu^JhfI{(5)IaxR)wuOvTCZf`1ZpYxAynEI=w0T-QqZzpNkduU*>R&IOM#> z#XgET{?B>+q^vBVAhru(JR5nZC!Dt3-*)n^|D!AQ|G2xJ_Z^-u+dRqjghIoT)?zEq zYyr&`KRGkb6@H5UFQUTJ5h1-LD8a>GlB~c=J(pkM2Yply>UtLQbHeA9o)|GytCzP!co)p zZvUPzityL1_SqfK4BCo(PBxvS={mGb?yuDkjFuXGN- zn(c24ScImfJ`gS6$96rwIQM7CSyhRL%ht{m6IFZtY^Tp&maMtUBi&-xE&q7(mkoo& zwQsN83Kp_;?Wx)SvgB6G&OBcIbIHfKrmc5VN`xgXg zIApQTR|$)))1I@AkthCY|G84@!fzkXKYTOYJ~B^W=G?|Fwi=oXx3=*#eKKTGc%h)- zZWwT3r=-ET#2IQg{#ddUKR2lSVQs*}c+PT5nCPnB0~YO*7^h4!;1QlvTyU6yaf4=q z^p6B5<>C*TKC(4je(CZZfjiBm#X=q@p4{BndfaAfz(xOslg(dynXS5Kt^M9MNLTEw z=G_TwD|!|!e-*u5W2?Z-7H-+l<~uuY#+_I#lDwk1w0EAe!bS6zh1v1V%ISSgQ=cs` znV1>%GRSU!w3v6j^tUO^3Ogng|C{EaVilqx=Apeb?A?u7{@crsZ8qLKWA0q`*Riel zPUpKFXN^w$(3-YN>kLopu};%DF@k)1wobA5dDTDh*Twn<#fY8fmV_Mge!qu%``r@m zoZE3R5}Z1*+ZRbQw9k54G|P6sV9P9pbBjFKdEF~bT9!KqyDf~gGpUK^evmvnEG47B zp#GXH=cA7- z>G@*)`NNtoHY{or(~rn{^z>p-jPuX@%f-bKw&i?{JPK3W%sA3?0#7a!5Zde9asQ9i zl51}cJSp~1c=hslz%0pjdwbrQ^IOBXRuvhAJ+(+*acWU&kKzX#gJTCQnopWasLZ&g za7@gBovX(6vzser zcX~|ma?L%G^jSQnYO-DR69FYd&eeO_|C;aNyIZ}E-MmNY!ij+U+Y0_^@97WLhz;6% zedlHOf*bt54Mb=vMU+!0a|LxuF z=l0w*=eZ`?z_77H+oMV0XuuSYP7!6VEl)fqrf7Qw`Nedu5(>BUQ=Mud8m>Ai$8yt@ z8`D-!wbqeo@}c+2mflp44%rx@G*+jhLYrAO?MMdu@nWA_fb7ZlvD zW7+vHY{L=1?SH*a`|WXcXt|&+-m-vs)`O>ke||Kw@9*vHEnQN{r>wN)o9xj`3s0Yt zY-41QO#FF7_eSYc-WPj6KmTw_`TL_o&gF+{UXYa?L#96{y3_YX-8^nB6E?8}lKl^w3!xwMmkKPkD zxBj?niuc8-ybVdGnEIA$fHS{=U`I_+%>V>pt9=&fu~1ihbXs zAKNtgZo4dzHoCXt>HGhaYaW02y4x)N)&Ygf5j)=6M(q1pcBFUN=8ULIhi={zsyu4% zK1qq`(pz4efA#+9rJ1O}jNcyMa&KV3ZQy)`)!!9pOBH)!>-lq4?a3{i0|<4hHsN5YxK-+_>-8rBI@(PM$QXIj&_SL zoYHhnD(d--@6*07G~FG*d*AS0=tYJi!NnV2EA;LCo^0`_k3Xs4oru}|dYRYuJNVPy z>fAbE=p*_~NB&UEa!yaK=VnG<+_`ioIy*g1(w9E{#l=ue{P_mc6AKgtRDF-!tyFpa zX-g(-Er4-xhOWFr_I0~0&&v{D{xI#BmHWia$!u1K#N5;898@+Zvcpage3s=eF!Ankl zNhg^(i_Tdee^h?@^y!z}(d%bieCa!RrH|HBedb3`^zVPT#{U1w?)yfdY*n{J`Tngu z!HaK=CY`l8?=bU_uKC?2jXwQGclMAuI~Osi^A&iU-G9ufM>c)#-d%UEeKQNwTjwCn zEa{oy5@A)R%X6$MebIqQZ-SCv9?D>ObdKlNasPyuo3a<={Z+X1kYS1On!O)HE;-6; z$uhYmub;9&qwS)ULgUgBjw8A&68U@6gm<$lW}QuVc!M(_naxQcMMZHbi^Ecf)DV{B zeLPWY4izGIA5Gs_V9k86{oXd|Pa*t2J}oo5+N5;ddF%P*K1W@QR~SF)XgCtxBf@f` zX~K)suLQiK&V?Vm^4z9yb!)Bp{kAWEG%swvf9Tn0Ni87g`1WXUh2Z^d9=1; zf~djti)>B;EN6DSP7q&yup;i^n|T`&R{Tt}TYW5f)s2KE)*RmH2U5y2-|YNwSJ3?` zdk$mp?sc<{Sg9wypP2H-)Y^N~qQ!NSMDDpC@no39;C&-#-tLyS`*PAR-mK@TzV~Ia z#r9uDi>`{l_z@bu_vOd9di^bSNn5<8G#V9q&%XZWQTWAgSJLBhNbPF>j3{qcdG-Q$C$JC3qGGc|L?)P z{5WBA>CI>Nv>rV6?W5b`n~WPQea$XEcDK#zot$z`!k6X2Ct>xCd$z2;P_*zDt0Ry4 zvwKF{mYCW<;$sMC*Kj(~q}X#wWbazt6*ldPjpsf&o_S;c%p`E;x^>qB--Yc@JsNM5 zqjS75^G%ND(r+_FkIR&Mn_S~$zPcoqg|RT?;*`qpB;kgSO>xT@Kjm)=CK*PYJ~?c#p8lKn>Urp`W?$#D=6A!Z?diKWhdWC%O}u&Mj>MjykN@wCyHUSnEysx> z-le9GmT(^NoGJ5q-O8)=F)tlO=Js8iCX-n3>tS`_zv}OYdVZY<>GSaTbEn96wzQyb0vr0c5Fb;T#g1xI?GeC;>y zj`gdr+p7w%T#PbzG~sqC2UQ9EB{B22Bujjr7q6^4@x==XHxEMgF?T(bcx=FUgz@iDehvEXJ)I zdC^DDWL3}UDW)N%KAke=i)R*1<>I+xd)K3a)gpB6^xE~M4HcrBm&`8NHN(1!>Gkuv zj{iU;gjW|CTfCGh$_KTgdPJ!?oxA-S>=FOOC0rB-$0vsrW4LeMY&Iu-x^D z(?3egS(tsS!otM2;Wv-B#a8pP{&9L|%1bKscd>t;cYb@7x924fx4j3GrY#L;sQCF+ z;`0%cH~(h{n5<1>{LHqr=u#B3*W+d8_avs7KjUoPqme1G!*O!RzdiG%!}_h31nwHIm6q~tO0K)|ksYg^&(pQJ@hnZIWvyw+&5sow zEeR*jo%+MA_f_eR-f1?!``T_7c0BHq5P7C;nf*=5?dJ@=wKwOeB%MDm%rJfT#d|r& z^k=QrbyU%^pYKsoR2H}VM187cQkU+mG_HmYgYqw07v30M(a?{0d}>RY)ytFo|CWEw z%vO}UywcQdukVVB0%~3|7X9ir^Fnr{mL6Ggx08j%3#Soj&YWtElsBkAplpPaJR z8cWwFN);A;`jqV#qY$v)+FCnRrTl4S-J7pcpO>9{cD($~6qDK9XT!9+7D@c>mpOXy z@9)>1tWOT5rUkX8y^=FMc4hHRml?C~^sVa2c>Mp`wd38>qq3hw^4-jE6cV1RvnnS- z*yLEiBhv+or<_rVvACkL_gx!%>b^r>0dC|va`xtwU z{jXPamPwf>eqg_*=3``_R-;rmajEYDYsZM64cSXSUVoFZUbOtor@Q%ko<1vHTxWmx z)-4v#i4z36<*h5Z_sTKf6LI_fQ8rvUIqCP(d-X2_#Kgs7kIlUQPrAP0XCcEc%*_R)?r>ybS+|bE+lc98?RZGU%kok*+ zc1G`&lX+H?$a8EH{}BPU_@|2xH9wtL%bqty$>^AbiBxY`e(~?Nd*8mjo;11N+`A>4S)YeR|ELLc58?YE4%e@4yl_R4}p|4o8NLf*HF zzV&IzK9!c}kQ8{l;_d>eZ-uY^S%3JneP2tg`u+v{1x>p$q4Okgf-iP={0Vfnvx zSB$;i<@I%3m=n)*^2EzoUen}P9m#!A`JF*x)uVK_h{|7rIW`6CY1Xnl?aV!F%zvKz zzSplDmLlBv-mKEtt)3^jtY8vv9J?Z~L;cH{D|6rUJY{|6vF4J2-5T?U8|SRjP&gUa z@m5b?XWO*zZx%b69dY<-y*Q`DpzCqwrkQf!ND+H*49e!CRbR_ z2Q7`w&P=yHru^wXRxOjQJ7L*{V+WpCim2@R-QU=8YF*Q2%S!hH3w1Vl-Tl$oQEL3* ztmDm33ij!zMT8eAs8+D`tz5^n$W-Am3)80+7X^2QF_s;i)W!JEBUFiZ+6sopLDMX& zuT^v&DO69@cRi5$nse3fhNnFHHXY$?e|p@?&2-+;2RqmQRh{=|aXr&qzJ+@84j!7v zeB;N%#~wJN;)mZcG`FM@%m2$R7I2+>I$F@>Jd6}KWgFFCY*d@HqSgYmhwVl$UNIP-7I$%e_QIYM2jS8FxT zKfRizUu&c5JD@;;^KG8y&bDjp@;eBWu$5EQ>XWvj57{cD|P1)67LhdCRQaJ^z>6 zHSDeaR+)ZQm1{OLED6&VxOwJs`PVy{Wv}8tUrpYs zESRd)cVX^JwYx``MxNSIXWO<{)A7OaVj0mQ8L!ZJiSHYkBkpZIBg9oMX!6xd_e9G_ zeX;&ePHS8hX60xe;AA~I|J#3;t4T7Mv0)eQoL5QmbTY{B$uytvJclp&W^l~xGc&3j zvs~5Jp6QNHyghxYNPnc7Xy8QlHEOeDXA~=*omliem!*5wNM<>@A`Rdh^esXL@-kdhX8YvMQ&L&D&2Te~Z*OuVy;q)#s;YY>lNJ ze3@I{`1bSi3$JsXvU^*Ps_r>^F6)e+!DP;Ig}QbJ#yO@fd_Ouit!I3pQ?hBBi1mTI zt=Z=<^B4&WJylUTI3wYch)dz_%Xy`{V@qzw%G@g6u(YJ^=xf6lzSgtl&l^r(zOwP6 zg5rh^8yFOiwwyY7MSJ;$JFM0rF;5a@oOaxau6r5~*u0^|*+gv5m8ioRyjdz8t%YU} zb0>t}`=fNV^ikj9*R5SD3A`t_6l!jby54QKZ+3FV9o~;e1B^niAC^qHQ>~V65S>!E zSxGRAY0uON%edZ5k4R5A`(V2d^WjC-!V={UOU-#FUz^19$ouP$vaXG%m#C{8{2o)} z&v)$H?4DB}-^kW?ops;GH?`NmCwR;Aw2fuoWG?mceyO(2`OdrU*M-{x>YP%7w@WX* zyR_`e~oBQosKHuNRTzr@BQVGk{)E_tWYh~EKz2%qw|8uTS z#y=r1yRD7;I2R|VF(hAYvh(%u=z04nn|+eIEYDf@?0eQFnXa!Nec!x!^Oc!%uSQNw zN-PtstQU#RDc=q1uIp9axiC|-%4FA0)5|ZLI!-X;?|AoXgJ0y?9vtMTi}_n`NjZm40*P zPrkf8|JoK=e@l~^%-+e7rY0=6(nsp=m005y@5){qdu92bH>(j;V6=FaQCDO#S?@|g zqvk4>+gTRX1qQ3c$4$-;+psSKoy3yyp?aXOG)tJi#gniik>~I_j)@2 zoqK2VgHV4yTPeLhs+s_AofM)+*TOG!8KzWW=+ zIwt7E_a;icjJtfR*h_%{P?HlXQ$4!@N<-B2B7QnH9Gk4E=!$;+=$Kw4GuPV>x);)LLS>!k4t&E)g ze`+ExzGRp)Px^pHxq;ujBV6Xfp*>eqn`PE-Yu!He{rl&fA+kX`UGty2A5oBdTqdBh zYOeTd`>q3I#HN6h0qTLMEcfuLP*57^i+}h@Y&?5PLN)Hc}ecQKM z->&t|#N7#7+@>v6&|LUQWVQD5joI((PFS?fxZApO@pXmEPgd-Y;5a)YOD|>e@|5@T z(;qzC@*${o*Z$t=`~HPzoZe`>`jpX|=zGoI?|hRxvQJS#!(#c0>a!JZ*3R`{v@UsW z9i9{SFtz4sCQHI=PA&Nc?K};t|t42Htae6{XPGidt13L zNF9^NSZYvy^lNf=x>Yj)7gJMo$ys`sMW#WhdOd^gPIX;|HEg4}RT< z=#=BOznNQi`pTp@!SipqcC^i^-4n7iws&v8&biZ*3{`qFkDaf5yWYU7-D8r(+?$m# zb$7pJY>T>ZE1~o$)3xotJow^T&wV;r_((5DxZ{;thO(QDM`@{E*YWDdhq{^?w#wVJ z8JE{fO*}bqnezdOJAa;;KVGr)+x3)mpN45~(nW45F0A05TKA!x?f*Rky@>s-BA3)v zdV`L&{q>Av4vjl}==H51+@FM&ty>o@b-P+g_S?$qw^eeBW_&u`a1*tET#Aw{H0{QScGMQo8)ER7dlom*_UJK&6?Ns{Km*|`%s z9NZia9q8b=H9@)jQN>wtHC@9c(iN}cwR;+c&=Eo#C20-(4q2 zHMY3?z7?G)CUzkv{&<0bi*lwy`;j-H=1wk!TV=Xm&H0hOfIDhu!urETFL(4d_}=2> zoKey+_5Gbr4~~?`F1Jf8Qw~Y{#kE`X1>U~%{p?w%SRVm4=NYPLPQ2|aZ=3$!5Ucz1 zLQBkp`Tw7&Enmizt<>rCj${cXI9EDjy}Wi=`6a>`;s$>c|2i%nZEE<652`SzVG z#vMkPrplVim$VK`zqxQ_MwL7B6@9m4H6Q1|{T#L5dXDyH&8WC>p!2=to4dRDgS;e? z6ORmo}l+ctf^zn_1$z8&w@I=Rnt*+R-Ci?849dY5{A;l;VmBF6X4=neRj;VM+8omz6fv`QpS+XFz2=Rg`$a^heKs#WQKXj~^ImGxh8ZiL znMt`mPqBA@y6VX16cw&L4O6V^Pf8jt3YfTZZEwM{nG3q+F5A0R{nL_$w#=^2{dLT{ zr+rV@v25b|y_@=tP~D&8t)c4*0h8z0R1} z^Y*8N-S4D_+xJ(={S}|jw#hDR`)`j$EbV+UhbAh!AO3uNf!r;YPVswN|F5u{YH~2+ zZ2Fvu>~C2&cW|B$Khd%GV?M>68N7PWR7q1`v&+fP z*V{Je@kli|Udl$=)JZdso zz_rjvL%giWgDvOeL}UM@_Q$vS%0)AUo(VgkC8=`sGhgwt3>~eafK@ThW*hoWzx#D0 z=UdRc)$10REZS(>)br|A&bO~OR99bY*<9?afQak~2An{(EN{pZ)`Z0f$T=h(d2#_CBbeL-pN%=)&Ud}C_< z73!EtO?WHTVz}ewv}l{u^fzm+*m&Mw^Q}C8k$lXInyI(4+qPy-Gp^S>Ce6BT;f0@< zTGqAm@5<`Dsw?pQ&FyX---{Vr6_yBS9cTP$HK)O6^4aW431j|-Nh*qp${dOlBDgd5 zdnpMv>^Sq}$)i8UTOPQ*n|?=vWpDPMuJsKj&vwO@JWJbH^pNS3jDQLm~>>|*7uL(tu}Nonz?Ys zk|xFDH$qd=9pfIKIB#yc&b2W%W=r3kS^RcKTU0+jvJ?tjsl(BDt52xXd&({4aL#@F zEnZ)OR?DQz?-Jhls#(hLlXm{0ciDMOVuDiLzc+kuD}Ru5sVV2|g6cOcD}MOo7;S#S zVqiA^*#+5E=lnMu4Snob_wt%m+|O&%FPKPn2pwQx|0aK=z5d(b^Ew5d>#$X-Iq_9|GXHMd~U*(T~_}B4tPoL{@C$>THAyLjp1s}U?oOOMNPv}n)hWa`w} zdXj4e|FOHWj|^rn`8Z*&dcnE74?+t3ZPkdr(%i{c< z_t({>c=vJd`NrK7x_@8X`G?IU?fJ#HTaQ;H->#K<7p8UcZZ}i&*B?G>Lpt=VcIFg| zde(D$rn4Dv^;#U9egB)8&YAP=>3Rn(7k|HNEIcFa|NP`N`wwipyiRiG(VI)A9dEyz z_55E}uHBxS6Ae2SNi4p|z{WPQV?m-um-6Q-?z+n&W_73Fk+ z?LviArb4{&O1gzY9~Cd^uY+IbX23NGWi?P3KuN zo#L~X7PxcuMP$7EqIpb(<)L-LqD2Jp-)pDcSFX-G!s6bVUY-))t)g(gc#U0+cu2l%<}LTtHxIoz!^0;9zbe@{MMQa8=$^OL%I)n1@N@4u_ig$y$T zsa^)n39ohfUADw&^?~NNW)!>;4JzYYU?Q7%eqJhv;>OJ?z2RRZ-riGV(f9df#BN*5 zd|KvK!tU#b&EN0mum5tqzGL%pf5(@G)$0t6yWgGM{@_V_J#%$_h4rJf+lEriT3+io zbvoT!n>N|L`LOfMu|-)&SVCi20!@z#Ha^_bdO9FrrT5c@MYE-z;gC0wm9lnc{e=QF3^Z{?pICz1b_){MKiywaH{<*;&N(t%UX@$Sz3 z1}BPV)bUT3-^~*qU%K@+XU3Jp=)R@bcqZsQb+AtK6WXKeD_1S#ucapN`7BFo=^Gus zge;x;zwWRVSUzWTQT7csnZ?;-_=5k}6ql31^1!X(zOyV!$-4HJiQVU)=O1Xt{}j@j zXV1S@q-9FS>|C9DANcmXH2+t9Ms6pU`GP|v)jw*CKUBs6(W9^oLqb}Z}X>92?S%fP$8P*)| z*O9a=R(rgP=f=^{X#Whor;8(wC*EKEkL{Lc&#`x@bI#6+*z<{vW0BCUORh>!cjYbG zkoWA&_K1*^foyMNbLKS^UR{{GEbjL|bA`=v3dgFG-&!0znZ5q7PdZzoxbc32Pu8zx zH+Q^#%pjbX)fAG_V*Pin75DS-=@D0W6mx{H-Vj{o#x4|TCDkjNJNXDlNA8nft=E%z zz8wFo09y+%M{V}?7bmt?pWShHpN{9FuzBeQk$r#J`6?=WIhdN$*>^UdZAg|r+a_qr zdduKW!j@w*H>ZDiZ}(CC$E~^l<)WpflXq>Fdw=xJ&y(?oO6~tgXS}y&at=8s{6nrY zSYy#Sv&{xm7Ve5zFMF)`Rqne|Ca;~IJUM!YR@Wt!JPQeR&VR=m?BsPO`nXfn#OI}l zC8Pgr^$p=SOusZ}?BFI{C7o}KK#9t&&?GZ&Tji474Nb2xk#s%+!?ji2VYgLvH2l-p@8>q zqI~h)$}{KAK0IvN zu5K2t|6X43mc3pyqwLh$>OAJN!VLM>P93bhD0yU)7e~yoqjBA0|BM=cBu?(y-xYYy z>dpR{d+K*?c)3!tm~-_CfhlKZgmkxFopZxMRJzCe{)Zz+nWu}M+_GWn+eb=8txd6#@^jCc0XcsIL60$%BgiHTd|Z}xu@B(<4mT{ zKb#Pf?>eV$Uiy^TJLrbpZ<|fU`imwmzp-@(k2Blm&6{uR&;Q?I**SAgNzKdup3H)? z6drksyqm}I^+3K_iNpsP6W;}(YRR&9amayxvECYXKNrYx^YHw8c5}aDo{805y-gQ8 z+M@q{TYv8h->-VPedVXzX3HI1blk)`SM=ya0Vk&k4l1b+m_AQ8tgM#3!L;V0W+u}* z+ngew|$W{^xo*YuAbKt6s1wSb1@vHprZHLS|!>x7vCKmLe&@ObBp;10{B5k{Aqrmi&1i4!^9 z6`A_~No=>Mh;Q%f-HT_WaL?~9aNcxj=9IMsH-2(YT>Vq+q^fYiQKr?wX~L1!b)1Q7*oFPRYru*wKH?hZMdsc{qN7~=jy&sd%sy27u<=FSd#9q=qtM9l!1`*nX~5~ z-*`Gbxon&DLSKdNyR(>XTwZNz^I2QazQg*bGs}{qJ;zP2UaJ$xF;HWeTzP0=-!1K! z8U1?}%CDdHKy#z`de7|M&(F^*2TPh=yT0Q7?YtK{`EEUuR=#GJ54W!nyB2Rb+5PwT zrEahMR8%(UG#f6P6uW-oIRnRn3EF0UyCyKNXuKF#blHHd;!)@E4^P+EaDK0OESIx> zE#onV<_kN&o!#;9@qg2A_rK^#1Vlc(b++#Cwl_PM2nTFD?{ze-%<^MG+&NtrRqfTR>EDVx62jpRC&?lNl3Y7d$qo zyV$%d!MQwvmU~xyd~?(I$E)!72kw5q*Sq$sX@+fI#oE*Bk4OJI_`fgKeSJ~hdM2|s zW;<>=Zf;#yQMcLAdu5jMywgw9Z++bt$a83+lE&xk_=;B_`OeNzl?ipJUHrO_Tk-NX zkFYBV`%+GFC++4rHFah3OTC0?pG>wD3q9`c-5(z#?zh^j+($%<*+y}SKse*p)SXNo z3k8;f(jfyt%f^mL8wzAKbRvg4O?`>6Jj%@8_93m=xF8`QF*Y z@c2^O`Me$at^OOoxw`K?z3*z4^TdN?`O-}+YC@6GJ}i9ypl|)X#)GO!+^# z9@zN*+xg>N6+(Ah{eDZCNKYy5l=iE9)_H8hlj93lO?nr@bARjd2Qfx(ZB7~cdo`&> zu039?etOyE71cLSXtebSn>>4_sA^fPe{c zt-?Kzfj2p|Ev2O564%@7J?kTxjZEgPJ|u0!Hsy}9wWZv}b@yL0dM&=2b(kS-!`8V{ zi`_sY*kxAFdakL-_AZ!usIiv)u#jJ$!~?%u8P=R;iR}+FOXt-6G}%}6JbdH6U0jPz zCxuBTU01yGBmQ6h4ErjkRS_|d4G+aRhdr|E(~_JvaaHy8>}!rU9%M;|b*@P2YhAo0 ze8Hsjz%$=%cGSe2;|dpaP}w0l`_Z+_J_*5_{d^`_&wo(NJDWw^iad`Qp=)?cT=;=Qpk zN%tYkg4LeNYQme|bHtXlsYQqQHyrf-F+u(KtJ1Z(Ym}w=Hr~DMCUgA8om&xxQFCXi z&3?J@a^ca1i;wfIiM7yoYi4|;!pF_@Yr{=Hab58*kL1i1r)KbPlKAqw;>||+2d&TN zu?jk>aTa;Z`SYT_ZSVDeEG+_hB1hAe7cIJY>!9)d%?}G^f7B^jLd zHnDGt=zDH_Y=@o6KDjxuo3_NxjLiylWqRtulxLnGo}SzE$zJ=um(;zV+0$gEvb#$K z|G0CY*n4a2M21f$$FFt!Gv8h<@j{SA@R^wS#vL0NGPhn(D>a>bMDyX{AiI(?yZ+71 zT0P4mjbYJd=St&;8;`KCU-VqX=D1R0hw)-5NsS3Db3@siO?(Yy_%3FcO-Qetw)~~r za?{UmOm6!0&*jT1y>)WKeaCsJ69QW<7Fg{3{o$?tTow_5t7{_JSZXeGAHV-D_p$N( zpC_wwm!7E!Pj+h-OEVNlUMV$u3srNqnS13WS8A* z*W~l}^3H1W-4zT@cWV%PyZ=+t2mQc}2U&VUS#)fs-8k_6=a~ew!FSHQ~SKv zt>lKAe%kt5?v)g7G*wBio~d=xL`mT^w-JMLh)4`KOZE%3o0~FS*1c*-yJS1(O2UJ> zWiek5dR|x-^8mM8!Jb?T_@Vqfd?#b?gzC*-sIU_DYC4oz#OUb|6d%|j$g!rgscPqWlZ8;%w`{Bu}6%X?N7OLzlJ1+KW zbI`AEF{1Lb54Jv^vhtbBq=SFwyhs;UPv$gv+_hzi@7Cbtv*)F9W?p71y}fp!N7v4E zI;(Ya(j<#*PI^8w(3!!yJt1B0s@|kJV`kIuv~Rbw2@q7JJa3C zJ6l*e0(X2~TxImCEX~11;!Cvzue;Xipc5L)z>`R_wM##p(CBrWw7}ZB`(~cG!t*Dp za{s$M71O$B25c1-Z|_}n)PDZY+35w(mQFW#^ZjDZ_QoBZ$@0HSb>hl$Mdx&NYg{gE zIdsVO)Q(NYodw-q+RgdaO){d=VH1*>efyeI7pk(coh&R9Pj}S}ahm7wRL678?M>Tr zU9NVYh;+?o-lr91emk(>MZn8b=iOKoG~b#oE;PJsq|-26K&D%}DRYshKgZ=L-5bZ5 zH_zW@y?>S{TiCt!&3Ad4b#z(Mw(Op9@_XTroIaPSD=b)VGrY*pW%5eAzwfUE&$f$w z!f$TwwRtzm*}F^az^_FDC1Nw?vEQ}Q@>vGyT?n-_C7aWW2T-nHZ?5oN5 z$?+bNiW%v)`)(GPxCpsU2ud=L;A8F7)og{7U>9%RyA#s8gi&jsXQ47@yupkm3tN84 z9Q%LC`cNBVJs-2lq?Df3%o4oq5?iNj_}=@T#nn*geP*pHgSExAGoF*hR~~9ES<|5Q zS-Q6rgOW{%kBQPg6S@-hO$;6 z@7I2iDBtShY^t`*pK(Jz?$;YF6>PFn9Lxr^ox9pIV-qYtOz^gip@G z;+`V6t_brxgRDmehgtHZ4Y+tb_g!E)ktK9RY>DFRxl`x<)ORv@E2YCxo_jFyK;c@a z-;o_guhS!MoetU7H)q*NPsIWy_~YL8gIW!m5vhA3mD4&pQ)a&Q+;lq`Lrn)Cy1^|6>d+;I=iw+Q0_k8>-|$Te&u=omB`~Yv$*1z|KwzAn>ie3$SAdnh=@6~ zu({pf^4qFA!SCNM%v<)&xJ>Xei;>1ciZ?ajOUmCmP)W12=@;8nM1Rh~Eq= zf4TGaj$xpwV(LeIM)t~<~o?E1FK;GW0v53^WW#z}dRPW8@Eq>O0 z-rn+U&a&ewcdmDUmxUj3lg`P_SIkp+ELJI$x4N{n@Cwhxp4YC2_4$~#1Q{6Uu}*#X zgq>gJz^6|}EP}uO%1xMe?DY3~$=~-sq`lD4)Xv?|kU3qgGylK%@=R-)lV7$eSuQh5 zZ*8enUbRj)*K4a*hFaZAiB%h4Pdi*Bb4l#b-Za@<{b_G1_`c_#K5F{bS~buyx#`YL zk^85fJC`5$dV(=#vWd5Z2Kz_L$sLBFleVqDddt+@b*jdiE&aA@^aE}tit1Q$@0@yW zUQT7m;(bT%Png=;)EF&dF;(+-W&Ts05UUmewwb3sep!6~X!-lUY*w2$XP8ABG%NDS z+3_4K41DbDW~X=b@(S@6*<}~3&qQzt$Cy|8ebS!FaK=2dBLB=2Mf>PS(EQab+XwJDFE_3Z1t#lVjyGengVF+_2MjM7 zgCrNK9B!Y^w)52SRgyAM2{$U|sO)%l#M9*V+rp$%ZWiCy>OX!|+;3eHr*}Mw+xcvZ zYGrB9qvvJ^BeWZ5{M@Co>Dk4wGXHBIdiZy+Mho<&9xW)&YtA~k>CLLHBjTGM=--U# zC^y)5sPkLG79VRDHuakg^JlM_cl%J;w$-OgN*89@g-@D#F#4PoJNInPB3(g?FVj|? zvU9BT()q^!|4!waC)NIToIzDu_YN7)JX75I)_C~^4?oe>{qyo0lf{OOPqqtRY}n&>`oHB> z;h|guFrC{>-v7}9mC142NSZ(=N;Z{ zmK!sb`Sre&=}+&(%@*c=lb&WBmbWu^p>edykwZ&+rPnsvxURnIwD_h|eYW)5GIr_L zt8d)9;iAKGui&nXuZyj?Zk>Pl%pI9U7HtbvuHWX1Pt}|e>F${n(>6zT)$J#ddMm2RSob-o@o%|x`s?HbwZmNTw+%V- z3$Og!yX|_@s@;Zn+-}{w|9aD$qdpIB$wa)kv_VqZyia&d+{3$)5+<3Qa-8+@n?$T+ zlk)1sdfk{e-;H#TK2wsmvHE-7o2Xm8wRg_9l^xiVb-(_%ta#$mRQKq1o9A}#?sy89 zRh*FB&{|SeaY#wO@Ty+WwSNVtl+;SXI5Y%)e26Lh!p8h%+x7`*n&;+Q@2>rLXJ$CV z8vn^>zud@76V`uoZ?1~xrI4LYDvLj!ap~A~S7*>$3m&{uos6ScfbC$caurswH=>6w));+OZMIAv-|t?#*I!#ti1Vxx%BI9 ze$QL7O6kD8IHMI4%Ud(!N&{m~wUw8vE@5X?z`*Z{l%G{-8oUsT&u-OZoGGv zZVubs+uq;10p#S64Tui<@7+?mI2@1@Et9_A^oLev{d|6i@WV_N1Sm zdsP14>iW*}b-yN8e3{t3aoaw-JjFSy&e!%WcJF`iHh;h9=HlX`J?@MDe{tUN|NDPI zy?r0P%-FkhwZfE*ju!V1pNM>#%e-K{!UQdaPzCO<2WFp+@Hq1?PBQ%U=`z(axuo?c zCo=u|d87T9S&>;q_KscgspU^N6ILZ{zP~}`=x+UWd}rTIJFUVM?s?ED*o<-7X3@7< za~R)UTH(tk!zOYj?LfucsdK|UA9_}9e3HETqS41bd+)`(JneVZL@a-sG;7nP%*XS^ zMME521^wn$39jE$!nOFKfVTE?$BiyNEvwhpl_ArPq|%SZ$vk0U`bnuznYNi-PwY`t zd~zzL+z*@%1>J;$l=_m7c=mXBJc)Aju-wV?sdAl3<}1!M>()IIuK&ha^S=82(bjJ9 z4g2=-DYANWa5|s+XdkuK?B375@`p#ZUhkdC(y`!^Om_dh-sAQ^*(KJ@)z+?Pc6!zF zGAlA>e!1ARQ>Xvu%?O(zJEu5mlkMUaGr}WYZAxk`F*uPiMcgfQ5m!fzLB2IRW4Pl@ zwj|q5SHG!2o8Qjb;l(ih=5u2)?SsK=bq|f6&yi@~b*e_`_=M@IHaD&xo$HW$=$U88 zLD?_Sr*pHFb47)VmK7{u3@({-WTD5WHwr%{XWuzjtEBw8<&ydz3ipt|!K*GA$Q2WW2`QzEZGq+CZQFfHz z|F~I4pM!}*dU31Rd8Y2UUYd7G&&U3Fr_8_5TxP-j*NZRaJi4>9_{1fXnuVLPU;Ict z{&C;;z4F!5raQWvxFlkAzTn|J|Hl*Sf1lq_`*5n4{c3?ypU6p?xlN2v?S7ZzqJYZ1N>g#b-j(_TA znQx_=Pxky~`nXp;+QKC$q3nB|%)Vc|H_BfaNS#&l5Hh+SdI4$MtC zf97R>np2~zaDd7Dmq))cXRq73B3|0&;mixi_D_#hd;20G=(^~Fd90p12cCTsJ2%(1 zd&x}~8TH2t*H1XVcV6=Ylbd_Q*e{-TdEsj0wE1e|Dba1)w;#U{>XA41e45(Ba|S0q z^YGjJVEFe+|G&)haJ_`&T;9rANy*8~-|v3+owL8-VCwY`u7c5m?t=Hep1b|wvivWD zZ}09}Zxg#9wfLUdx%)q#SA60B&%Va?Kg*U&s#B6D_ar%<^*T1CZ)QS}?lImL)xbVh zx1$Qy+&3d`9Ix0syDWxxf3e+mL%r%VcKex`H#!9wX>IkDI;FjAX}V#O@C}d9lj}n& z+g9(0QDe-uJTTY(VNkbl;K}A;pQ!ct*Lw@ED~q&B-X7ANANav>=h=(r*ldq|UhMY7DTi;ZSu#apsdCNRb?XyXUoZZczPxLd-lmz~c?!zv+%=FkLtQpw-Ys)3nx}o-TYzSyK462o@Y7dt;Ir% z^va`GcwJF_JF`{$+?vhLvnFR9IU(}x`^xWiH;znPnU#KQ-}APMOLR34s+sIAIbC`$ zXM4C>eeQ(3wa!bO_f)*%iL3dQdFD*X#NMEs+}wo1M8!L$62b4w=CCBa+Rk{WE!iZ| zO=!Bol3KCJ;Hs791e!l7w4`r82{gJf<+kXJ13YPhYXdWzZUzg@ zi%!?syU?ck^_zq{VpGGecSncZK5{%YV#-SPu-_8fq#s5h&Fyddo9Er`|It5=*_J>4)A~6%wo)l2l1ou_(L=Fq^XepKFQ4z2o_X`8 z{6jwJS+VZhHf;XjqoiHL_~26iR<T5mOS|^dEmvy45qf3 z*5)5|r|MpGl)i4)(7#8hsQ2WSLSK#A9r4B$0To;q|7~miICcF)uh%!;t+>*i{QdbE z>)8vu)*1(@8me#GoIh7(y2a7Qt8}|X80MyTOj0x3a_rdW^oePbZOx1t*LVE8^;%2U z`TN>AS3!w6F7({V&u_L}%t*PUv(!fW%jpx#=g$0f z&i5y)sl-xEyRSR_lZ$gj&xT3g{%e<(ze{%d{?F+KG5Z_Tc^m?HP6d70X7=%GeLZ_# z{qx<0e>R|E5Q?|ce&#rL7<{dkl8iP54Q~8$ntS(B}+qA`2K2VkS zbX@aF8ISgBUJg4tT_nT%)Qm+7nI+0o%`X0`DmXXiSXsh1wwoL(%6n483KO-Nc#9cW z6j{H$yBjX%;uvi2^Mb+2p5HQO7H6>pi_k<)6*Xt;^JP8khRo|8ty;Jt_=TUbvc2Z7 zES9ZlogdEJw`uO3+I=CpHGJ*VsLO8l|El;KE~k8!l66_~Xi1`(+4TwiK`E7H)8g4< z=G9(Uym!Y;vmf7@`5&BHUn5yL&+!;%#&yRze@^5t+Pj12=B$H{&b~jkv)Z0}Zd{95 zvVG6{y8pW^s@_N}5turwiFb=*6~6TwZ5M z-_M%LDz>TD?1YNqvZmxb_E$AAM@_H(U|Mm1;fJSQZ$$uX^3b?`HR0IO=MedwkhWBc^Jebv%j^feOzL8s;@DV)=Nc=jGh` znNl}r#NE%^+FjW@{cGjZ2kc>v@62oiE4Hg$v63i?Hu>+oR#kXaKuf^(Q13Qjnaez{ z+A^M~S~fNu`s&xYy{dmoSjCIo{Z2;&HM}RLMoxQv^RG)uBB;7sZPjDQyjIk7mhOuf z#Y~esOa0ih`J6e@&&@fw-0tV}6PrZ5vR8OKIKp1f`}z1f*=SSq+dDql|B?uM_n*s1 zlF`a_-t&qNjqC-7rSlGaOrCBjexbnPNc#RCm3uxMe!gMnPQ!Iey0|AUVw0-oe|)0a zzUy%QZ-z42olJq7Ia6IET~4l<}Uj}$pRj>wYFUb1>-r!QNBwYg^Ly&HGfR@5!K`TSwDoW!<(tj7~V zYr>XAO?%F|+o)lJsCVz4Ckf|cD+{%+uWMMASgaL$1FBE z58iEg%Q~m_r|1(eN6p@I zqT$K!&u%}=5xFbmoUCo*QuF=%>F{r0iD<+Z%syUQP%*MGgfal;OdjAqCB z2LJkh#y?)k#ve40ZDeWWIVjOQb9LU4d$aGiF5dpvCXGLq@n!~NQ>5`?t_3?+S_#?d zPkeGH?$qQJ8@ZTlUi@z7-SltL^10JLGzD#R3F;9)w%kcC=BdaPn+~!3@>MZ2&ar*D zw7UKLgor;Inig&27C5>;cjD{G8a@{@J&O{J_JylRmd;d9ocG4~?WQ|kSz8OU#bhPw zd#0>T55JYiZpZGI)-y{tD$=s~;xj3;Cmd6>&zwEi>#47H<)*@d(r;N>CKmFmv`w3L zrSvG9b#rcGeG|KoGigSf9^>Dczg}OsC+)Z5aKS(B^}Obd&*LiO(&H-R0v9u?7_hw3 zT>Sq3zhkp1_p%?z+*J9tZ~EuJZBtWMp8Pzgt(kG#_H7sPwgp`F{Itp`*+j1Li{PE& z>vMN(sFHK?nlV!~=Ig}!ZpoSPoc#wFddsBM>wZ0ssDD$pB9Y(f^n^aQABWQITL1q3 z_E6mJPoPR+)BAr9s(-vmx9j};{9NCDjzZ?7^LBH7_}8(wudA27)qQ%wj>w?uopbiD z{jv7%=F*)$DWV~kXRj%7TP9Z?%gM;)f1Q8+<&I;QEp?`L&Mfh9IkRcjf}=Nlf(pEu zZvTw1lw!PoEV3f&d*H>~hK)ORcpEJD@-BLLyRE@y{T23{qDLtl^CnbA9!!tlS?KCC zxoP4tVRx6D$Mg42-&pW?#@hlNZr@EVa@|h5{dRv=yMOeCgthb~iM8t$`h;Da9G6S> z$=SuM=-zx#e2+>Z(+1&m$2V7ETedJ~Z+YQ;Hoqr*qudVZzy%Kur|c@}eduN#z32L| zpgXz#53Kv`coda07EgR_)BpI#LY2%tO=mB@wqx*Hd4B!fjSIJ)az7lX*WxfQ-DB+> zo{S=I{)7wi59U?BKltsNSj&_Ek%u?h>txyU>)4e%RdtN+-B)ODx(ZyNuhu#UBKYpP5-ZlHDLCWHnJUevT z@*g|vXz5EFyvU`tI?0nMMphx&=?Y)=lvOUz!Y}cuX*$~dWT+~uTcw%GTD5yXKT_qu8xT_VjJ&DZql*6E$Q||Z2z>q z&(2TWVb$<9t-*^?Avv}$F)i=gH>Z%S%Q1fL(&E=XKew!0chUN@%_Ivak)sMqC2464 z0&a^%?pHohyi{7-S>^35CfwW-gqVKV9yILYC8Nn+{ZFPrb*+hg&AUy%Vc)c;CB z%B|3b$?@=_w!}EI$m{MkI|Xp{q=(-&%s!u>p9zkllN`@?zP}w>BIi~i0?<%Dp<&< zM;L8gmZ_vN<;>AwTepN@E|s%lQFG09ad*EcNh_#(%Czsx(euf9mHK>fg{pG@4<<|S zuyJ_lwaOSb&;CF8arK1;9>#nP`DMm&+n=0oc%a_N`FY8#E|XU|R-Y!%$&U?~d;Pmy zJx}0fPNjqk@?T1)*?TzcvjLxSWVO%y#4ZP^nV zOo9*pc|Ld{+k!F9pw)sDA=r6D|W)@-!;`k!BTi$-p>&Xswt9XtEbo%#AvHqY| zcGhc~LFPl{qpNDQ`_E5q*ed&$;RR;l8Fn!xf{?UQg3=FYK@2`>$V}FQ!vOINLNTc)0 zfEA}sb*=id@B7{A{neebS`s^EpH9@R`F=uhOLUUmxj=4FA;--(UmS~Y)mNGJ@|n{Y z&R>st&t$#4EMcU?aQS%9vg`lql@A_ryO+DScEk0yWyOnLxxc^hH6ZqP?AEHe%jf?T zb2@pX`kYj=!1Df9-}=orbK?G6hKC;CXmBecTUUS2huA|3FOEy8O_O&8;I{eL|+ zeevCsO9Ga$hHNjdl9@Oo{gjJ?dX@5=&FAcw9cK>w{^sme{>@yG?Z0(%iBa0L zZTFc}?h3nvaa=g+Ke4d*onT~X>z0k*WHxEe-dh@w%44i@~?ekamSu@R*$vWH^(#yi8r=?koT6W|w|z z|EgF%)0FR&)2&i`?BGfAX(r1+(*mXD6Q@oaXlP%V+h7Quh-(Pd;a7>scJJ z_G(qdtTXz~Qh~p0J3i}me)?YI_FmO?zxa`FZZa3GRHM$X>r1fxnSWhg%Dm>@%H1lR{{#XBho#xAmpcDVyI1DwGPLVil`~B|uX(w0C z%YFRhzuotx`XBBX`v+%V%lM_ZyY5lELE-0zF4t$zG~>yx*30~OD$OC2dzHnJ8*9rS z`@UPS&BlLqpz@b!m&X3S$7b&2865yRT_g{C4Q4(&qNbZCxwnCZFRAzqDC3KSKV_G~1kI zf4tYvUv$P|O~<^H^J{|4N-YI!Id6ZQrMcbrEBh{8lNTn6yUH_92z+`el3^5-ntWZp zvOo@&u0;H4-l-mM^SdZYZaZqEH(xy=*2b~EZ<63+b9cEodkrgKgP!-cyJzkCd( z_x7LBKX1ipc6TG!jdz)=_*tjc-oJFpsQ!z3y@y0whU~^&Q7f;8ukPP_A*Qybc+<^2 z|2FF>K2^Q`(eJ3*y*2@@z`KY)qM>}Ot~`y+%ChEndC%$gKj8H@ z*jYMZbFr_R+IHbq#-yiLYyT0-7ouAid?k$mA&ElA{C+{fVQcs@TxGCtXOyunUBAc$<-Lv_Pq08H)9G8~O4E>twy<^I2b?3#` z?@gQgTVKOB@3`!J$HQikJ1TlEO_MJ0PE~tftNz^n`}7$Wi!y6#_D_w-TW|dA&BL%w z!p^(i%+Njam#fzP_5Zp)rq^?(=lZ|dRm+_0Qx(IwX}5XpKK;8AY>jF;($XS14Ny1#{A-Lex5~~inYd}Q#f@x@T-Hn423v~tnQwn< zxX5Dvd3|Tr=_~1amvXKN7M{tdnL9PVc9MAioF%5^tvj~$^g6G(IwL|oZINV0aNsaW?<<(4vzpLNnjZ5}LhDlqcKQ zGi6iMrAJcR_a47?bMF@gqfCuxE8Z3Jwp@%eY<%-kBskZ$;<&SJa7xJS?`o?5WOZ)k zUsw^!5%%ojR<6eThvFj-1o9n|NYaVh*kf+e7q0O@lzqZcBd47%R)==D?)fCJZt<>G z(KVH`R{DJNH~Sirrlx+m_>|x5v}yL2ZG$Ji_59tU(kSYn)oQ-0wOGHFIag;@L`uSY z*&f*nZsYj>JdS(4{3;`oU&QsCG3&U;_Sx( zW$2pDo_lqR*UT-oH5ER0tyouA_tP2k`C0CjD$n*b-v9M#nFao zObGFK89F_DN6FKoOF6gnr|kS`Iq%0MaR-%o8TXFpow{sZ@=?IZl_`f`{D4$oe$^ez zMRJRFFn`wQ3=m4skTAA5bK#nF#+mrXe}>E3|#j`*e-Io@Bw; zSH_wP9+aftb}&CV|EYP9hEFO_YA`bqb4%wCSPG!4)SU>0B{*qbG4u$?nlYP5g;>`2T-i4xSpNgJ76YOi&;$7sn zTp&+w$&s_78ohpoh4-s9^7eC1J)Imd_t~Vcey=xO*m(EYoR!I?s}{VzyV|Gr-KK2) zjd9Hum!Ihvdzrn~*iy1WPhWAbjo8T}bNQ8J`menbTKD*o$IW+&Z&&Ja%YWV6`f{$p z5w_iW`A5F5xqWrx>-~Pe`t;ae@RnR?>NU>%Wy$^J_m6kMacSu%KRhw^FaCJPvgjz2 zrGC2X)3DXur~CgZOxp)4-S*vCcu-+gh`qW%yUh8|Ny!zDUi*LOW54fbH=Uj3xSz~% z7pd!|oKbeS<^L$eE!^_#?Nz(2TsyakPuv^A=6hl99mi)PdM@7=3h4Yh#T35px2az3 zTVs=RvdZhiI~E&gdU+|ywpu?h+E6>=Qpn7;<@xCauQ~iK9+WN6%-3B!CFSWYu0Vl> z(X(cXuQ&dDNc7e7@D3?KH|ds!n%dUl|1a-vDtX1Rz2<}X%sp@A<|OU(J~&mBZAFj9 zfs^wd9F6+y+q>HOQ{v6Ne`cKBa&poKKev<#q3g;tQ+^-eQ~96QSv&vMBb~KREuZz< zo<8L5FBr4GLArfGa*IeyV#DhlSDLM^rim)DJPn$8V!hx|!z#VD&q7OWY|bwZ(YhR> z*ZsUNc;CY?uiM{^w!F{lntVI(+^p?oVn)9E73Vev1lygNdbiSP!#0`OZaOKdFE<@u zthd+Pi{YnGvvnSmj#{6_+Z(4JTrrdKHojq@)RUZL<}q!-Em^-DpR^o@OUswdSag1! zSJfw9t*|DAvDcvSkOo5q=`%Pj7HxBT^}TZG+9B70?M zc=M}Ir=GL3wfk)fxDU==Z>%<1T>FxJ?)PzBoaAXF7#Pl>v<=CIH91> z^3THE9MhQ2+0?g%+x-=~K5t(GFHfM%;w@<(Z|ZOQbt|yU?vL=DPs01X3TwELc~MYWvwYwfnx=FlnL-;!1Z_KVB+^j>;WHi7S0*SeZHddwjk?zOnRLX}v^FU`ZhUU43|zxiP2JNdeAOC0snFaO@~jaRN_Z{qWx-qS5A z|D^UbXmDk2jrwZ9^Y7Quw5xv+V`@fb`pM)lw1;`}bKmSKo`3eOQ+a4xNmtw`+c<>bwq z&a8B|KeclIuh>7@=>~PO!tN1?8zR{FdJ2EU+a1_l_k6F+KlO6My3Z`mkDZ@WsCH@yC%3jW1`^$ zk%&WXQ=bZ-FZ^d*f8@{P`O7NbS#+f`1R6_5ubkAtb0C5`)QzRt5oTU z-lvi`ERTHH78r7GVTfL!hIpau^f}XyCw+9DpS9Jga>1MxU!+32>UyUd>u)UjrxKVd zw>;pGE}z2Es9>$MX|Cp*6gJxm$CR0CYHI~ZKI~NZm@NEu(R!Jq2d?lP%d6&Qj?Q=S zaLq29b~Al{gCW~>!50=!eq5ZMu`TM&?yq4fS_@wn3BT|z`4ZnFVmsrNRrJi>D@oEP zr{3rI^zQSI`=?*j&+X2UKM}x{wD#wn>H7|xe0;!#9<@71gCy;lB9P3$4hoyQ0m>zO`nw-k_@6O&k zUpJQK)OBQQ0nw`MNjH`LX%G=<%;JEWR)l-sZK?oiZ^}UR=qzyD#vzR($Gp8J9!X zHEzz`pKQ$Qv$T6sTJE8XZ-1v8i8|bw-oM9hGP4Evm{lDgN{<rHSEuX{+j>)T_6)1k@oz^mD?<4v#QJ{%)EIob7gtv|le))vF z^fi?B@vxP*Hnu)}-}aMa55xJh8>3ck@mV8ZYngSmF5vaOw9P-=ckz7t?0DhV+C|ZF z-->nyt-kog{@>C0n`>{I@ifhOoV0Y&p3l!xnodmGC3*R{p1#rTy}vJhZ5GRJjOuF$ z+k5Eh^Z5_nES6tb`nJ?(bK6Bjj_%p#4Qv1Fz5D%MKIM6{b>SyHw&wnR7ll9;77i9Y zJvlkOJSQD>1(8#$%JytLw2`aPDbh38gG&F5V+36Rg^mBqlCCIqmXNjm?tlO>W0-c*{0>?ahme z=W{#ke>0o+b9%yDZIhYLRm>h$9QpNheO>gzTB%;cS@|}feU;W~iga@*`pUR$J~m7L zufp{`z7lWcU*0k^5xHs56?1;~_0vyJ-8!;q)1EUsH>YzRW>6H3t8CHzZgb|xz2>=Z zzkVr^Pp=5PSsZuzS4-;W;2`ejS68nu{`JxR`Kxd{&pkDBR|NXTSs$7ttzYnA`n#uZ z_y6N7yIaY8D%3+|k?)7714oZKK76RS#^K_#9F7f#9!)Y)SLWID_Y4nPH)EpU+svb% zZMNOt*1K?S@|APz7x`?;&Fo!R_SPn=V$R3C?LvAA*;+Frea=L!d~xQN^YWKzER2zn z1!8wSQZJ}YmYX%zo!jBXgkwL2V}6}d-}&o_a>s_&*E?h%#d|m|QRWJEE!&sP|NY0Z{CbkD|tQF3wEs%cv z-EWawtc$1MHl{^xE;5;0IysrtpXtZymXMzLz^Ha!qAVB`Uoy`tZO}O-=pRfzYI6qs+rc zPx3z4bWh{iz3rQSMCyl5DP`JFn_zMAbItC3W#_kSo_Ly};O8sRe~177trlTt`%pXo z)Tf};S6BSsdgi&EwKN;JTloL`tdG$?n$LYi*vyYx-J5(`oGW3ap1yjke|Ab`%U=6$ zr$vr0zn-8n_hgTFHt$mYM|ZcHGYMp${q$Ph@@HrL`BNLyImFjJxIT%&^dZ+VKL3x~ z>Obqf`!%y#;>IkN^{V?-v<%tKJj;q|6ypp}Zgq|7Y;G2u6>;RPoAN}nLe&n}9(O_j0idjcR;OEfcn^o8!vUXSl6e-pg|C%cCjXi(fqx-4s0G z&ChDHZ0%gPUFMg&-}N(kzu6vP^Do!0{@MShzc$A!tXU_}DwrsfxK!0XA|az{%H8+7 zXa3z^!T!6h%-;F8TYxj)E#tR;7eD!@5t9BZJ74MHg9ndF@0Aqhn@ zW1qX$zLm!XeikvVYO~<@*sS1bAj)<8*o~=?QeUNhe$4#zRB_3a*syrN{*&qXwr7kk zt8Jb=#VsPmcUE=pWZs0aJfwI`m6d; zx&M|g?tS&>S<2?hzv4Te`N;TsE>~JolTlKWWYXjG(mZ;u@25K-EUN1tg%@x?J?Cj+ z8@tSaza;t7qV(PSHuEPXJ?pbSe)G89sZ*!#FR?72YQZHKr0{9dNA~RnALidZ*!cbK zIS0d^Rc;bnE@TJ_tMjm}vc0IWaMId}lI5JLXOC=~Dbu=zvwyNikZ_KRf|aYd&c+VM zNVYP*MeIDEkEbgzxLa8`y#7_mR(98^u*lluW+8`w?aPH~%1RwZedp%#*6+I8zqvgo zxB8l`QL9-*?6Xss=Rdym`2WOP+3p!@)(N;U?u?mNqv>CnG~wdjv@%% zC(oRGljoV88Dra?cTFK&X-%lXS}UV(l5%p-`kc3K|7mkkmqp-jk8!U2^#=1<6)%$c z4@+&|ye_cAyrA@5rb4azF1z!qS66nGR+~RRxBr~{Kl^$Ifo&OEXO-2JZM(H5^#6yY z3x59KuiAS%$L#-!>te@eAAIC-eW$3SX3kG9kH(O$Pv30seE8tM@Dp=vL1enH-RE1U zoa8&+9m*;>@>P7_!I$U%7_L^Iue>Jgf|c7Yp>m7!S9X_ec-(Amv|;a&7e^wJW-H!$ z$H3&XyRo7|ww{5JL)%KdtRX_hiSc}ug~gJ!YGP8&Z#&pyVpur;s7=gB?3g>_p{;Yr zro(qGN;X{;J0@|cs`b|)p2yqoIoq6m z;=>GgY?^oT2h82+@c7s385fqvXnowqe!nkhrp~o>$2L2@>-|y9va@PPB!w{)2k`iL2h?8?GfC-1e&X^|2TKQ_sCvdNyry<=^RZ z^Gb5mmRdc#{`%>Lt5ymuu1lu~TuOZO;r7jc)4o4=@@cNqEZ;M4ZfrV{w{*e@hYYK} zon=p==lr@-zo6=s>!B*qr7{6ckIr%C{dr(_=PzHB>lAkOnRg6Z1Da;AaCxhXZr5c! z&?Hv)DM|2T{X~z{OS$JbS~IpEd!q7Q{gdBB4uPEA9Lsq%XLcnmd2O(*dX7QQ3b|-U zg^z#L3R5R~9PhbXBw-#OvH4c`%(t~0_w78<6Jx1ebZO1b)aYFc%@}fZ&K{LKXZtPi z*}k6=2j8U5>a|Lg*(&IA`b(|#&cEXCp7q7=ncX>Cz2FmHBS%K3Sk#M@P0ov2-yKMc zI`XzNZ>@^z_X{Pnww?2t@UmvIjLEfs94tW|cO0iryzO3?f6n;#th+JG6g_d>^UJ^myq^VGn~=0r2UjmNpuxdI*6_Q!uY+xjwe!`HIOI@7d%eXv|~p5>CM{ z(muAecUiCXPY^q8zW*;z{qGm)8X{d5>)co0T-CPk|HkQuuPv{a$hw=hxw7~`=Eo^T z^S57<6AHSwMCQ1w$1?dJ4AFdd`wQ-v?r<(yFO^c9cIoBv;#=mkekPwUcz4l$Y2`x} z$6C>3o?B9PPC9P;U;f_Z?t%}^u2Ym}-mp4)r7zRQ#^&|b<+GMNS-PQLh|hBN;RV-) zOk90@?)r0>Zg&enolfF+$-gxBgv3Y(Sr%EMm8J>BeD{L}tw#m9HA8O}^-EfIGk(?1%!K*B? zbgud0JvHr*z23)~JzqZk-isZ2DSQSiO@qSLPIH>(#36IsvC=Z7u;bX&%`Ma84o_@q zbedOg^M#MA_0TW9&F6e~%5!_pzp!~;nqt+53+pCqt`qj#KUePeF@w1ki=W+4_jW(< z=a5bPmx=a?m4$-Iyb(>mUcD+j|MlNl(fvDj-OMpt|6YF1vnsLd`(_3`ajD zm*uaW@o_Kv#GtjTyj@=}?|o?*va~+h>aS3`{9lcKM}=9odRgbYC>`&5^W*GyqmS?Y z>cmxWhBt0gG{09Qth`wHq+gH60|j>WRMB+>p1~zbP9?urt67_F;+_B0iq)u^%l`;d zSCg)S>!$9>ex?&UE@Xs6t=agbtw^NZE5@>F=BceuUDmBl{^K@vZTUXg?GdkzsFeR` z-WH`lTW6-LeGt3Q%*G3wez$7Af4W|$;Op#u95VCPW|-a*vtK!vM0>S>(&#J z(-0NiVWF~NNm)|YW!1Jksb%|aEh(#GO`KdU-!Ax~?QwD$)0PqHw{3Z?|vmecd+i*r8*rd$t>0Y{%nT*Po}A>pKJ2;ZK>4Xn5P-C^=ini{7=8G%cp*np6{x2K4GgGhw~zf zBf1rDYX954`@MDhrmq*axwQGZ__Sme>nPkx>e!*o#&LU?>^2$D!&a|irU5wi7{*bf((g%ja)ovZkzMsA3HbpP6nGhjsY1VX$ zX|2K%lfB$i^|wW*ns1r0thDRQ`|xR9FIGE=Wp7&`bh)orz~gx0!>!6LQ(e1SWu692 z-2HCP=G^GZ{BqUGC)O-Ku>N$%#=CMhd%FzoEtt7MP~WA$`G7Qs=&u!*Bd-lXdMp(!nzxe-a(&k^U_=9_Imk3mBF8LeNx8iB|V~cH-nud-Zl||a? z7VlD8u=z)2`Yprk=#PDzmjAD$M^^mG7ffW{f77RH$8w3v^KX6jKR0-yV#Tu}u9kO- zqS&;9mjss9Xx^MIsK?f==C@43$tPvSx$ww2u?d-(jQ78%Tdm%~$ZPTR!>S%>B&j=WBQ8FOHBq)@G+J_tW@L_`X)j zTZc~cZck!ZZ_{+qaO-PvhJzQb&Gk60%B3vkZ*%_Y`Z}&>dXF^KGbcr`wVlqXyv}#; zQ*?fE%5jY_M;8z89}*^(dzM_h(K5Zuvtm}sD-S*nO?hF}Q^wqvym~xXSPpsh7#uNs z_ra{Mv|#OYpDBk*rqo?JwJkN^ikP*Eua-cak>oC+_s?Xi>wc#7T-B+`o%SqCI8$}4 z+uV$2N~*t8pBehte7P**roOSGFGH#KT%XVPzG*K!Yu_$a4e|)~Y!sB+mCN^Ps=LI! zYU{7u>xCYD__T3)Wb9faGqbL(ZA+KBw3wRN&3kED%VW8@e&b%=ROW*YWs(_pRW1oD zPx$MWJO9GgHJU44Bp9__Jx^5onLji5w<2w^uRu2~TauL*9SWGWu-c*xyjHV4zX{a;M3&;Kj* z@l@#_H|0)NjU7|+=B0htx9yRbtnv8adOZQtRUZ64DH76i4+v|1%rDH9Rx@h5x!QP+ zZDrfeosx?b6qMYyCzVV&km1CYqM0diHtN#X7Lk*`W!raV8^>roJGr~^Sec(u?c*>v zH8+V5r*d!jls&rk=$ohA)ZqNx+1Bj;pT^4kyg#p%OCx(m_0P;@@9O2(UR7OJ`*Xcu zUF$UKj!tKmfb}|tzYk6BIK@-7)9J>l$GrXtIy(FRaozv9_dla>>zyyb`%ld)|0AOP z+|S_iQ~w8HX_Fspws7<6{J>&flcC>U_tZdnx0|4npve)XV~!7R$Z)lHtWa+8knY~V zw34+qs<|tkadLsaqT<)5p{JfEcKJ2RRBq|fe9B(X9>X+=_tTYNzsRf8e2!OC$m;oS zxw&!5_pXZ(K8sjHCVhJ6`0ej!W)9Veilk`;rYb#5GRKc*hHOmVe>!R1ktfXW)y<8z zs@Wy(O|HnQT>N5Md-uH5TPiz49-P>^!7P{ca(<=$_4!pi_akQc&gY)4Z)j$9>dYOP z`Tu773$Q5u{&x4&@B6>&Y|h_Kc=e*N``vP(*IR$Qx32B@cPi!L^T|itF8j^zXq1!C z?K6%4|IFOt=Pk|Xwbxr-?`rrmd+ROF>@)E)Utd4ukM6ylW0t?}b!xJYa^E6G#g@$l z&n&Fp)s|mZO0F{S{@K>ICETGnvyXfJe~GoLpJ(XmFIp_|QZpye@T32Gwf)5+iLyG= zejN&Z(%|UH$v5RV+oZGgtA)4n2y9h4CsW@W-oM{zZtk`3SU`oS+!bL<3yqCvU^)6Ti1QgJGRa5!J`X{T66SQ zFPj{3tA-_^cj>e6$hfFw`$87)yrhujy2VF$vi~u*w;5|%j~;cMQdkhh^-?oLp>ygn zUCSp$m2Jn|PKXyh>8fmFYu7j>)TVOm;I^GxuIOo$-d@Ign3JWiMB~1}5nlUJVMpyJ zuf+8paZQhKU!$l0*yQz!D(0#BM*ptyKYYS1J2k3o-HDZX`&J7}s2dlodu#U7r`l2K znz@D9(GT-(uZXpDkCA!w!dri1Zq+RP`lqM&d^p6t<&W6;`d)3I-!&)@Wlytw;s>uYuGWS;v~-z5LN`*=JeE=nXp zQ>1HI)XbeqI{segt6MF8EY!}MJ?HG~7qf!$c=m*I?2NVaa=o?T^FjUx&$#E>2u^im zyVUWhWd5^5=Jv*5nhj-r&DB=;_h)eWzy%FJGa%Ug-5UhXuJFX-T*J5?CI3Ez!Pi!D_y7f1oA% zYTjil9V1evsFeKFonN)}*rPj4$0F`Dwa+fLUbTA03SnuTz$d3GmEwz^-WI<&(T(BX zC7yX+Iq!O}?Fb6Gv$Oxv4>7&EuakRbg(WFSw!V0%>+^Phw+4^J_oe;9an{|>HBw|Y zefqV!;%sWx>Canc@fOAPDe!6Dw>cGE_jaw%{cXIODq@!}UO)MbZ=!xpQqrHc^Pm10 ziJzPE{A=*@8P@f4pUza((iV;C4O_J1@~jntg4diMxw*(3Z<*--g5Bh=+SaJ4x3Z?X zt#z#3>XuqJ^XO`BopZVY(JK{`rh0V6wu%O9V7+5@UpesP9OV-y&Z`D_aZPsp6kOS) zI={f|z>!&Qd#4>(o!EUK-*MfE1JmY8JS^eVTJmOIQPtb*Yp!A`6I3RDT>rVt_0Q4B zrc+7_8(&{vU-;_C={)1pnUkS?S+uG?w9U6)@)w;((uCXxQ`5b zjb7gKT=qS?gZG5o?zVGtZAvGduX}d6tgy2~-T9Tc zCV%$iv$J0ad0oww*`Kg>=k370aNA$Jv$~C+u(?}B>^eC|;xbc1>#e88F+YE$e|)Yd zynQ&rV6R2vs}?Oo%j3K=9t|D zoU&Ob8cS5n%p~k1cTTtLG?l!&)vr&_%xm6)i=6k;Z+Ed>Hi}SpJHjN=a&42;u{l*= zMN4FgPwW1^VYZ7oRoKwUHT**^cjm#;m~Hl3CM(Y`S-C%I;R8{FK%df7N%i?lqQpK~ zKHK-HP)pywcSh}8r<2O_rBe;MBLAEdx3sqM%ubzmRD7RTV@H~?LllR$XqbS8wx*cZ zlTVe)%JZLZyKi@9+wU?Z*HgQ1m=#R*;cMjJV4D9^oBK@6KCiV=i=$$F=d4cd@a;LZ z@<_bj1Y~ZzZH4KX?S#dGcx3p~P)0?VyCY}B<&2!t^ z8+}qC8Vile9JW2)l54obY+{PLR?3%chGqZn#QCi=iL|lmSK3$@H*0>PgMIs#qAACg zYrNgb+!7;xa#B~&rekwoIxWBL*WLSN)(xe(EkUfa4TZ`xWY*g_1w=l1_0&7$&svL9 zj_qwH8=1DtTO2uZqoUrh;jB}<=F9u(mp7ZsJAS#W|2$60}|MRb>6nx1E{m#L( z?rhw1eY=n0zb-xPzEo^0^E46J`z!Ws+w;l!w0HirALi#x#of!itdb8@ z%N*B~c*#-zi*4KeGIOua(vy={s)QcV^{fB4e#Xyl;+;~fBa#E=Iq`_!_;vpN$!Xi= zvh?M&Y@!!zE0}re=;H`!1s0xOp3T3n*?RbI+O*@)<@i5p#n;yfvKxAI>v;G~Ns&6y zk}ucN4GCM1vavaJ^XeYkelo7xZ%6l*V6_j@vOH?@&u^|S;;+uzHL><~-c!Cx z{_3ZRc@wN>mZ?Q1b#|>)5a8kC7usUNeSdGC!=s&YN1Y}voS3-n&IaBj-z#eb_0CQx zW_h~N$o`kH{Ijp&{=qY6KRoq0-ucYjWeT+u0v=aYit>sSMg zkF-d|OsMS4XyOz8xp{VZAyexnKDVqK>yMEdjX_-=?pt2@{xO)z@mwrDlhtnNL!rJR ztKU8^jtZUE~sgw;^y(ZwsuJ$_*3Zg}KgcVoI zid88u-kiE;dbxjsd86U94MzSk@v3XWKeQd^i00*b9DQ?tHv9IwyZW2i`Pcn-+Uqju z?Ne`-e2L3@^0;12cXrq{nyWmgijTQ;C`rPtMG9DjsrdU8=e)@7~Gvf6uKiejoilF{P^M@^L?*>#r9$ySckp zyil)`$>mwU_m9!Fh)+9Z*1cA2NqGIcyzuw>d!GAZ4k#LK;NiS@d=XM%={ir^+&Hzk zj}#vHk^6na-?jE#rfm;5dVb@1y5sx1-IDUs@15TrJ2m|!Y%M@{Uh}rNNBiT2(!`oK zOPh4`rkvipBVxL5YlQs2%XQToHyu)r|1-y~@Xw4rWgl&R)-Y!4*1b3{tvWwnXYHSV z7msEAI2?1^EOCqZ&8K|)vE5p$=W|D`on748Bz-1U(D?ZL^y|&?Z)W5!+xDZ+$D%X) z_`Kznf0@kuro?Eye{|R6_sFn#3HVlN~Crd7fHHtexEU_*Uu5+)JmHtl;X97CcpW!*FN! zZN7K@J7xtaJ0ILL(|HQ3d3Upj>`(8SxHPX?YfyFAp!xT)75g^%T;VxcDfd|T zaZg|0hllmQ67#IL%#Yf8@ZRkFq#UEhly}t+?9~3F_^!YnRL&J}x%|89h`scB~9rHK+EgNjEoli1uoM=qV)yOJ{pb z@LsjoG5>(Di;~-n7Dqv`Ej<&hI41^cxyu|qd11NZ6V^f*Wv50imAr$hCXPmduGv8b z+!>i2uXIbapG{qS+_L1jY)`*m$u#fM=s*plKa*5v25jF~&AwV(JEs1P(XN%8hbJ^K zL`E+t`;#elZ28Px&to;NzdbRBd9T>oyM_VhR`hR;Gj2Pp6ufdNZ^Kl+X!#2J-S@sR zE;3LvYumZ_z7j{xw9>`7=WeR&tnHS0#oT=J-#3HoZpUr*;gfs!o^?u*?O0ddS@M|m zir3n-`4#VG{k7Q8yac_^x(SLYIkPlnJw#m!HY zi;NzoNvX|Tz#@^nF)-RzOgbk;_{14cC8N80rvI63%Au(#=Dp`LGrzHwQPb<4HzcM6 zteB%>W_YPlv27v;S5iY}I(PROeb?ix4t~Aqvhmqdo1&jG+y5MTd*|1|zY*sJ zIyELrZud2sK5bgX*Bjb8XZ0Rkk9uJ-lV^?D+coo21h1ZYBFE|fXqVi)*NRINt{E;; z*?1`_S}ao~P(tXZqDSKi&JVg_(H~e2O+L9K*yG(|116>J+2sbeN_+zL#`HC5ZKy6W zU;NWBYS~Ry5s&F9)^Rzh?U$}F{F|z_YSxPDGEb9w(kd1-yl<}%zI~Fnf9vcJwHE!k zNmX^}ms@VUS-8JkKAJO22=7e)2&OAUC+MQzKMd^%P9=*)EcbFuq>*eAvC zPhM7%b@q(+`3L9Y4jnPvxN*lk@4Vv{llf&_s<@ncvb!3Nc1S#8xhkG}EPSWl)TpU5 zwT)SLK*UvDQpyKzKVhfTV%!?ChUqt8lb za{%ZoAg?}!%d|zFsb)x5< zr>A@P_=B~?b}yfnQ{lHhx;TGx#Pff9CT2UZMZHdM-LP--*ZsHV$FB^1``Eu`rKz!X z^cvkzm17Uu?T#jCmc_hZ)AL1r%ZAy#X>UV!RPNPu_giTvWg?|7kvwbNmNT`l3#aMN zJ0@{CkhQh0d+KKOj#r{Rh7s8YuI(r1*Kj|zz0A2#chR>`^A9C;NSQub(Wj$vWrGu+ zN0#H%uKi6qr;hL{uv=Zb(U!S?o6a$n86CaCpW;(Iav~?3nByZ7+WI6!|4xfYn3rPg z)GNQgg)G~u#+U4qV7SlCQcLlu>JC?aU6bi=Dra4>W?hsPmeIx5I#J1*@1DcDDa$A5 zKl1E<9ll<;)iAc`I^V_J-?Z(De@ZRy+wYaTvg!E_5iZuQR;6*97DS}CkPbGMmu#P`A}&03Zb%!S5I$E8*ZE5$!y*)-$FzL#M=-%KaUFN&UZ zqQB#?#mtz76a5CaRQ@F%N@!wPz2%Y+YvLj%ANBTWjW^0BEUev~|JXLa-u%0Lfqt`d z>KY@RjVChWQX3fEj!5JO@_%@Iul?q#ZE6N-x9iU(71~T+$-eC7w|lWC<{bJu>Et;# z!)3cXzJ3XOWjuYuwX&loOG?9*PJBG`xBg1=?9TU{JoZhUd=>w-n};ojI!tu}!o#ouqgTN99ySSNFxX{Q9?&`~J4(E0|32N)1~ry62#b zdF_j^Z#5PA+cJcYr?Dt1u8+4puDxC^xw3MiMvua#lSjnYAN(71;>qu6Cxcd(sPw%~ zP-@=5q&~fYecof$#6s7`ZBh$w^KsAf5zANR?o-Xn%t;BXR9|_iFv!3)P;J8V7bg6+ zU(8NDH8L~fP_^26WqB*Bn*^(l9^d4oNe*lwrKX*w8#?Qy*SYST^lYZpMK2G-_(P#` zmd71k?KYk=ta-e);%CiqdEQ;B-<54fgkn?_GL_UOT9!+-C+SK}W+~g8_((wO(urqtT*OrT&Urqt z%q?s^+_;>be;$@cYDV;FqMClQR)7_`% z*!|L)dQ)_X_T)@=wLH#F*9i_*T8+nJ8cio0c0O^0-_N~p`3=icj$$e{UK z!o|EAlbyB^ErJ~Z2Y^zCHVV{YyrV%AqHy=>iIHQDH8XU^NFN!Mm( za{bb}y~&b$Z~S8aBM06*+Vl5^^8C18xA*@H30BzlJjUNkv#?0cFzw-1;p6{G-u;?t z|M%9Ns}-A@a?NJ{&sxX2_-%s7yxyhx3#mme~?akc}sOp&BU9^{ug(A_`mV{ zvW=Tkuh-tsf4ld*rRm+DXN%AKZrXiP?d}whiQ7C+PDzp8q-(h`)zx5<1>2;W!lna^ zlOzmU4saw%l-VeF$hdDyl-{)Vgs`TUm}*eYO3$vGP3mR)=f&@@dpx&Y>fDC*nuz7E zuGQvn{S;6atK`3svFH1%Yip}lpNp#gd%gaL*(4>`i>_i^=l+Y&UsPQt>1lOVL($B> zrOhef{k7~R7J=EbtOS^lVox!xS$4g|v*M!+lX>ldT6Zrk-ACqjoerxT9 zCvROu6slU!T#<2DK7Vs|`iX9tmmC+>!tQW}z18G*n+i(Yz`jO3yBqubkukJ$Byhi!x$863qHFe=Y0&#{bodE;qmRVZB5B+VfB6S4=3D z-|sMaWo4SKX!*8xAO39Lcl6pZwn<-}_xP$DbGQ~fIcT!GB*F507_x;4;4vDJ@T`&5U zU)A+3x05?xsW)-)Pp3XU_0-<&mv3KL`#tJ__8!T^=SOpoStq~Rbf~(2>$JM%&R1Ei zrpqb5)_-*CyTzH8dk&dcew#P-&mKOVE$i)PpO*aOIs2;zms~;ev|W;U=WhPt2!69$ z^V|O0dQYu87~e14>iKeSu+#q8zl*E)7C*lGrT^be{Wms$TlEzRmfe0iLx6eWi`;2@ z>wbS*yWjHO-QUvst!YIud;4aeeZRMDa*|E%9qy|cmu82g)~8l3+&;nk`?;&)EAsZ8 ztN5+A?_)_-Y?XaQ>t*|oD(fyQcjX5w$IjMXTs}qL{mtHwR>!Jqf;As&X0uKgQ`vHB z#scq5r4G}#>aOZik9(??q!z2Y`g?z#8phCNmwxYG_2daFz8PJMXge$@t{<25@W`TF z!b?0tr`o)kw`hxV*&nfcRc)Ck4t(?QoYB%LRpOTTc&GJ-i3Uj@OV9pf*ZX)Pxj$je z-sdXZyQ6p4Jbroq;qCbP#VTcT$?m$m$&mHmgOBR zQd+w%J>+}6=J@Uk8!=}!$-Dd2Ozn*`i558q z|K|C&>~w!2`CgLenJ4SQxot**b|F0xI(IIf*{Iz6Y7kmX!JBvNnl(!xuIBMi@qg2^jDFsa&p7pJ zN0zMl?E9Oq-<42X-c!3ws`p*bvB^o5sfOIU%Xe3o-#fedW6Kn!UY2Whj}FiIvC#eY zjRfbcx37f-Zdp7^$X5GZp7HJ5%J$^Yt+SoKR!%b#6+Kq4Vr9Xif(UoT#W!tlS+Oj6 zHo?YVtiMaQzHdMX$<6E}P-_!9a)wSJu z7Z-jr?Y$E7b0hoCA1_ZY>9fn{XxtuG*FF3C`qev^2`6==RGwp>|I6a^^01x1P8GWd zcci*V9qc^J;(UkSgL&KZ#3-(EuV0^UWlUr-D__!AbxM+F-^VQ7ke7VQ%M2DzJZ`kW z(BhJnDTjZ}3(njxivpAbAMSW^`$Y!x!YkKprx|9?S>jyoCh+mmPPuzCEBCP4D0aJW z_Qc(2PgF8#e4)Ja^ocbA{%ULNzA*0c)^`8)H8|MMIQ@d9Z|~e)F&4%BKB?y#<5?z2 z$m!T)F13C;J%mmKrxJ6XKwbHY~^U9nsV z-YXl!64Sct)o1RqTFs{7r<6IxAns9##BiCko0E(d1SlqH2@733@!Tp&DwBWG zuG>2c-?HtVy_@U0x-KNvFJ~d@~K7GfB#nU_XdiXXU-Be!OUmm~TEi`n- zp))eVa(^y7UNa}|@z41GvabRz`A8*oNoaco_Ho`WJu=PnnY2IG3%@hfQkN&Ni0)%M z$g((R^NQnpw@m2p7Bt?#W>fXwP_^>=jzKm#CTDiq zpSR>?iOrsPTg=Z!NzJaNB>!qA#IelecbNdis;njS~-)!zJ$2vrU$9 z%*xR+&Y(t(yyaH1*qb|cZso#Tg4;4rGO9^U>U>pimbW>};8uo{O60*E zhl3Z1RPFJ7D`?)w{Izb@%{w>hysa{X!sBaO|0VUaUz1xPzB{31R@Vd@@u!Y)cYceV zxBKmzcX!9hpz_vkbv>nX8CGdbuX(QSP+>d2M5pt9V=G5!WZ~Q1?K?_etEp(Lo)owK z_|5inh8Ei!BAnY2>#OIR$5o2jXBDV9?>WXEQ~9Mfrt*v8yx*6u-?)80#4SAgm#S^E zsgnfj*Dh|SSt}w}p446Ue2V?VkhuA~I#W!i9pvBpZnKba<1(X5EZHG{G}Q!inb_GU zGymQAip6pNv6S3hnO%ag@zy2t`O_biow4BPyR%~IrNE*C@3*b4>`%SO(=_|H%#ts=d)(jKN-mvp9CTBA~pPT#IH@5z0$DgY=PR7?J)|<^iTzG9Rim>rV$GiJn6gqMKSofUS8-J{gIeZd$26tG z5{nO|hxu9@mAGUvAxKF|RD05`L(;-4vrNrpy;nt>*50gp-*>blYHjy*9huaLs`F~! zMXuZTW!0^7Yu0YqwCzy-`r4Vl&)J+=n=O53XKDA7#Ny)SqL@puZzg%@%#kpNh*I(6 zyD^)`Q&DJETcu;XSLeffjOOd_FPIk+k-hQSqshy^A7HqCHMs7v^t%0D`Pgs&u6mU3 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 literal 6369 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 Xlbl-wZ*(y*Ffe$!`njxgN@xNAtADtW diff --git a/launcher/resources/multimc/128x128/instances/creeper_legacy.png b/launcher/resources/multimc/128x128/instances/creeper_legacy.png index 41b7d07dbfcc841eb6dded16284b1a49fe4e8b4a..92d92313264035e44c92e5f5d1af96b2d6560c1b 100644 GIT binary patch literal 7449 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

    & zA9ud~G>TlK@cYWs_ni0VoIf=Ex*O*JA(aRI;m= z{;ZJ3rM=TEe-u7kCSTLUu*d(?ecvAr+qgSE1h(Wqziav9=RT7!lbsTcMGds~WTd!V zoBQkW2l->Ne;*t^rM|oE&=1AywZ6gs!hZB6?T>5H&*M9(=TO@O1b(RHJ|nU0(3hv_w>H+#m#NcW zK5>Y>NYLRx`~R>e{>pXiHA~jLgnm}XvnRQ3X69-1 zuYE9ipWOk`P48Xn78ov4_%HIX{VSv0&E?z*pa1V@kUY+~$zO(T{-W@ZsKzxMr8x%_ zx;9ULxP0{_m1H;d8gWtGUq3QW@1Osnc&~#QlZ)l8hnF3G=<&oyCV%wTnt1*z*Zdeh zPk$|24kxaa+d~-M7t*aXR2#!jJ%t0)9gIIr{r<$}k?x-zI@)1O-)*-Z^xs}k zddU3lk$v9rP49oK=KQGp;qfe|o%^m$bqEV!Ia#~tqrz=}u?P2gS^4hnv}UnO{I7f? z;D<_#ZR2_;hD~h&ahzY~OYOTO<)kF_rMW)bCWE1-pyctoM&4+NsyxN)_@~o9Fb7Ef zyT}*s%C>Yy&Z`~KWysw{@o2o;M+Ir)G3aI%erTtUE%g^cRGXJmGXn`)-~FBe*X?xH!WdE z{c+L3>cQ%Z-~Xvuu6Vtp3Ix<{SN zns$NFUT~4~{FZyaH6Oiah(9&A{l3eFe;?X!ySlPBw+I_NKV zt)*rD{PNHBonbo)lSF&Mk5u&TH)dVR)4X0eg8xU5#O*e%Qyav8s<)kwWiR<>_QT<0 zTEH3I!?jHF+YUa@3=!DWwdr%=(&vnF$FDCvuleeP2zzzZIhj8{jufsrkoPa-Yqy!N zR{fk$N9|4bzHZU)nd%(YEi?D>fy_hd`b%Q=^*&fsBhgXOQoo70&!7YKaY`#e5&zt$(1uibn|IbtVzn@AeV#iYO^X@;#Dd|CJ(G@NH zoJC1L*xoVxILJ|Ts9fQSp4k-p!+di&*)u*|cawekfLoPYVDH1*t+ETG?Y^f!+LhtL zm9cT>O}&PPpWo;G_!hyo�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 LS3j3^P6`s_H+Ll|F)*uO>}dIb~IDKZmV~$ENTD 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 Hr-UW|6N=92 literal 21425 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 diff --git a/launcher/resources/multimc/128x128/instances/flame_legacy.png b/launcher/resources/multimc/128x128/instances/flame_legacy.png index 6482975c494e02522f34a10894bb434f1ccc7194..a6ad0ecc0d9eb41dd1f8a66df51a994ba3ae63bb 100644 GIT binary patch literal 2890 zcmeAS@N?(olHy`uVBq!ia0y~yU}OMc4mJh`hM1xiX$%b9f}SppAr-gY9B5=9g&Ggu&E63d4mJ36=J#UTE_y7OAU}CY=)R0N>hUh~sT{ju7Fr>A1ifm_G!TE;;qGJcITF@D`1#BC{eU{AN zb>K~~0~;XaAk5R+DYBVy1*Z)kM5Tq4+D7U20WB1e4k&kNu0?Tc2w@Kdd5={6Q}7(8K?KC+utPG&y7@s`u}vA*b5Pm4~G* z1icq#uH=7ZGQ)#;Z{*YPDOVFF?T9awHFJKhVPF3B7|RR~m#-14ykcd!h2OvWXvBBS zruXmJ-!U^hT;yF>taML!bT;0CyY}&nFP9kW54kAqFmm$!%Q`vY>O;<)o@a&UYi2D6}8Jf%uFQB7I#E_WFle4$P0x%D$ca_0V|(L5aBj2@)Sswqp_^|r=6>xpO4m8_e)lK6XKOdjy`C%hdYSG%tq;Nf7Ju57{LXP_ zypvA0^`ZUu*|n2}s$AF1bmfXLR^AX7xBYCK&i~JQzy6)~|BmST!>1}%F`5=v95nNq ztNyl;Ca`?M|M?8nc5Vk$g5`V`*omFJ+3EP)dg&Y4gNZ*x)n*z9-W6KWd%VcxP1L*FZhRV?nSYDR;6waXEb-^SlGhKfL+9r~VgnGk??iyvZWm@70E~GuHn1nNK(R|GoEXwd9$W z*pDu&>@`nuoDsjAzALg%?1#?FDK6hNV#L}X-8)jQIZ6JaYFlU0{O6VaE~-D%*=Ikl z+0$2O@bQ`HmNgGQzY==*rs{M<{Dpg(2TfbVBAD18`PD@JvTV9yVEKBQ)br*D*6jzK zrmuavH;ZfS27ztIZ&oaNAUtW`alakH*F3DReTWSC<#$(`xx3|Esh6IVv${^JZh?m0 zG3E;X`sW3ChvIMWo;57)t^Tq%;P8%k7VU?L?mxaqGuMB(eqXb7XYq^Xr5nt)9kjC$ zd;YM>ra}CpVBMh)4${YG&nWG(zg@RM>dL}w-p!8rvz9T|cIfqec)$HHQ|b2LDO#-e zc#IeEiydFLK_s?!+T}gR(-Tdj%-h&^yiPDRnf<7KzxjjIecTqVnHfQMcs_H5D;ehA z+0?jvV-=U!0{1zKOg63PZ&Q6!y5&Pf-v49s-py-Ee_~PM+F7@I_6MnU#TV~RsVtM7 z9rne*ulsOJ=F-KXhbC zsDb^l)Y@zF7pWDS+`xu{{6!r^b z()zJGL9>G0dQoV?_P^f`+gKgd^m1_BZ>HnQTqt+V@%fbcch!Q=ZvOHMWZM1oFSA%f zRZU;^M&nst%&T+r;26SC7y4?3cO+nxOW1<@{NL3>lus0uW2QkE!T+rw=e#3 z-j1Ty;3+)j4R;fQ&P=WEk~*;1VCBgqzd)mkkK21wIXBFCC8FBQn~*%?${XS38j?8- z<_A^8Z09aY$$9x+VaAb13d=Plf4{x2Vy18DdNP1{2ZP$im4|!$0yhchKYw_V&o9uZ z;NyAr$v5u47g1&AeGoC@NS;WPr7Pzi#y!l!`qxUkggzX#*M61w=%}e*AX6Sg^}!>v z?JpkD^jg6CKyyaL)-AzP81(<~&0r8-f3B!YD1rF~liJZcc0Pg3J7m>5UpyC4UC_PX zvh9$HV7s*|=L*I(T$7LNc_yN|fUSVjN61(*cFrP}OAK{wo{P##yMzuL-EZI{^t~f^ z3WL-EPXo_85nD>TCKWON5Kvor7=9mCF=f7ZMbpcR_krb% zC0UirH8f-X%ry{HTWNJ((~FBYA$rD=ch<`_G))?+6NFkS=PpvY!|?53pim2I=*0gS p?0lS{HY>~D`nR0QAQpM}fZm6>E6ryGtiJ=&@9FC2vd$@?2>_a-4a5Kd literal 6226 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 literal 3229 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_R+I14-?iy0U=i$IuB`}}=3 z1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq!<`@v^-rLLn`LHom&|b za+T?L{h1yfh2MM|_45*Eq#VTGPd*@!LrI4A1-irj+!wcXzCfpV$0PN_%Jf{CN7l;`4i-&nsTn z`TRnm?g9bs{?`m5c?+2Y_(U5DRxq?Uvnt4FF+2=lOjVxSCCpEjY^*eHIu*x%B^k4Gg%fCNQ-#glR+P-+gi4TGd4i_Fcyzz_Tw~o$U z_qpUzRhZthy*qau&tCU9Vg2nNKP$fN zv}q0E+!(<$(SxZogsn5A&21uw(nb-Xl_EwnWxn$E=Faa_4Kgw5QkZy3Ve-if8d-P4 zxn}P1oL%pmE5gNkL`ZXS>NZnGRsK^SKD}9bW9AOA#CrbJEkd~kTei2Z?G=6XN_zL* zWAVIw9<;ZAB%VH;WRD%nvoY~ zFlqJrE!OM;ovIN(u34>#-zoAr-8b3P!~e(c3Z>7_-oCT{{x!+ax4OkC*uvVlAWNr9*Qr%fG5fx0yCikGeJ!=(4AGbxF@J+> z>CG-6p^Xs;7%Dr1B6@GxF*7C^j-xZ6NZEI{bxig{GTHf8Swm*2K zcwl7c;fS5KacuW?1$Ss}zISBZlCKh9-xwUz3Z1@B=F#8Uy#c|q4?9VHTalk}U3Q(Rp#l*I%Z) zq%|g=-dJ^c|HhhJC6yq_%QJVWY?v7r@7CtEN2TG6m*_jkk6 zb4G7|eDT%@)lxGmJ;_i%KW_WWw;BuiL&B~q7+LWhKR4&O6&FJrTZ@JWm&#j@V_#N8 z+}ZozTG+Mh(EaP&HuF6DZ@>86nGjm4o2FaEZeILpN8cs3#mY^2DbJHW^+?pzy|4(; zN}KPVnWxs$KHIzh_K(Wf?=2ltLwS|Nk0|edA$L9S*1_$CAMc(>Y4kmNcE^lqeV^^) zoC_`}xaCjzP+@c9R*8LDkG@sS%9JEz(S zCvxb&T-U>c&I$S1heJh_3TIluJ^y&~($snj z%UjA9&T}7b<2!bxGqIq&^qEO`X|AkWo2%536wzj}1=%TGK)nSek5;jz0{Wy_Il0g{3DA`Wre-I!nRn9fq}24m@AcEJ7V?v zMW+h()if|LPSFzWo16Cjp7rhE-CK^nU}b2C&)Z=Bq$@q)yEc#Z+O{cw;?70I&XYO6 zC`eq1B|x*(JY=o%v}s~JeT^4PT{u3pRG(MwoRQ}9q9E+`Wi}<2imDe0VXtRP*iF0o zYsYt2SfuuB!(#Sby9;k!Z1{TsvKR{>MrimHhinosYl%t~u}`kG;Bj zSMtq6H!E^)bsJoq{4h;?-IC&6>+U9@=qHs$4AAcYh!IQhvkYUn*-qzp*Y5 zkrpb?itV$KxZ=5>vy*euz4(JCrq^4q=O|7JODcI$u(pcJy`85$Xr;@WRcE90KM2@X zTcx@9Tv^3aYN)|DO=m`D=Hx?LwH7a3%KDp6=IEE58$05S_WNHxSDjq;L}Z7B^`q8s zu}8P`_h*KN9okjV(o^B}+Nbtt0?Uu%D<(z={@xXq8WMUv>E9*O8xwX2zt@RA@ZwT= z_9JoS3+JVc#rO60cJ4Nj6IT%6`0%k^IzswpjsVk--xW#Wm#o%4W1II|k@unC#T_%I zHD*pew9(*ID4X!V!n^yG3w3Sg7r1_ERPLA|-My%q-$d*5#e;nFbN`ELuim)P%G5`A z&03wpjQ3$Xc3Na^*&m^F^p@`J2_G)Xok%JAQC0cib1dhJ>-|4HRnyX(c%-c)G}VIw z|E&74F|PX)28i)erj?vlc2cq z^v;OAN&*}kY#+wX;QXI;SX*m#q4xTKx0`<0$jR)Aw4B5FC5j(*hYgFku5K+|v2x|>EpO%qWN@)tM_X9mI(+sjXPw=|2Df diff --git a/launcher/resources/multimc/128x128/instances/ftb_glow.png b/launcher/resources/multimc/128x128/instances/ftb_glow.png index 86632b21ded4a18156a011115bdf671a8c998cce..7f9f16ee4fe1f1754c0006d39d888edb2aae0c43 100644 GIT binary patch literal 11319 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 AZ~y=R diff --git a/launcher/resources/multimc/128x128/instances/ftb_logo_legacy.png b/launcher/resources/multimc/128x128/instances/ftb_logo_legacy.png index e725b7fe4da31e42ff795a39a8b41a373f96a1eb..01aa4d5172400b5df23e3471cdae9255a0b177b4 100644 GIT binary patch literal 6664 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 literal 7883 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 literal 18321 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_R+Sc;uILpV4%IBGajIv5xj zI14-?iy0WC*Ml%)oYX`a1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xh zq!<_!7(87ZLn`Ln*_$~b^_u&5g6WE;C)Qkk{erQwkhA4e05Cy%3! zaYLK&-Ob;^?#9NRzWr`*<-dOg_gAl4w{F$CSMwIK-0AB1{_5WEcV}(>Pkx><&*u3O z&qvZ94UC-`w%@j6X0B}(I<;@&t*cG@7TWsTW!f;#u}d|-^XJF1|Ni+O4;-H_>hHJD z{$q=p{?E3gwtNXTgEJ1o7v?uyUf!$h-m~*Lk6h!snbSDqb{QnLv76aG{P}hLcRBI% z4Bz#;rf%91m=gcbNiq#FjQ-JmShR3UN!YpW*5Ih*mVAcH52a@rviHtY z@4dYImRx;_;+!|KoQI#sb!Mj3d(18TkSHrse0c}wnMO9{=17S?GXp32AWa7Etvda3 zr(Pt^sE&#KG)ej8)tlVsw3iy&zn5Ox_~V!AqwBiNG3<8BdzOnIJ~>q>thoK~ipWzz zxrUnOcgZeV&$D=wl7?IGUH%J>3-b=HpZ(1^waM_=%nwTf`fVfBc|VF=+HvyPC$;FD zOJ^p=eSUPv`<&pM;{`u{r8T{=FJaAl8o@6ASd+<}vpn?k#`-A{;l9@-MJk1Z@)n+3 zZIxDe^X!w*BRUa0j=sraJhP5O1A?O@)xfwW)LCqB+&S z-M={J_a}>kp%FhiDq`|x)Y=*yygrv@huoj#Ozz@`V!e+{oE|B9ta4_cNuyG>(@dsT z^HRaonIC+Vv@{damZYfUA7{~=c~oN-+nqZ$I~QKDC^cBWXz41++ZNh6HgeZO{USvd zKYjM-;iiSvrW-%>RQwVC_tiq}$F4~XuP^UWSGWBivLn0Gf+IBUxQ_nokg(+UE>Gub zMLHa_CRm*th`l)-wuAV(lvt;8k zZw}Qw*1(;U(k&R53Y_Ul5WB0(+B}6}vWL+W2i|~YH?hkTX4!O{k>a1Jc}3aynGx86 zTaFL3Y`!h2-)nfVUV!a}!m;xD9G3qte;OxPVt#awq7c=$bIW-o_zbzdFn)vT5|qx{m2-4?6P z_pVntwXyhLi$!Txmd&l5wae$tyz@Qa_s)YCSn_R*_dMj;aBa$2v0cX-mOt-tZ%99% zz=5(<*nlp zeCj*rMltWsher8J>$Evl9_j@c1)dI-lsaV^;I-OuU(?al%BaGhS$Wsiw>=JwYhU#u zE>CaS%_FBA56)-GZ(ALHd)r-Z9lfphpMUS3u9j<6;TmJB^3G!Uw8D88t&D3z^0yrQ z$eY~YTUOb8na#Z?UHlO9(KV)#*JrIU*w1=S?9>#zb#FbV@(H!Q_Y00s z^eCDv6`-1)bBV#U_GDPo^3)V>ud`j%F=vyFSFAEQw`P^`do^j^rB@pZCHCAm=50G> zlVOl|dk4!k&D6b(hc;+SughvY_OONd+|J@hx5ekC%U2!N?aSw2j!B@2TNnJJor%_1>xc@ktRW?uU8zf)wvRHmYGm)uz%jY}9mi5@gs zqIz;#(k9X6uhPZb9w!FhF1Wf@XX(cqC%iB3FzR%;8gu@EtJ>=9nJ3rk^QX>xv}69d zb5lD1$}Fkn-e!&>HXWz@ip6bnp4+a z$DVnij;?|!7e$U8%UGrwq~6KcvZ}PPkWlWqRn?+WSE)RJE@Y!JnJ8e zy+5r}l0E62!djuWUE+gArNMC(pHHT24W2W57$-K%9F|$CAUI)yi$I^|#S03vRQx5^ zRjrvY^SW45|EpPkTE3Ew?;JNd^e`?nYgf@qX}f)*#%HolrR=8*Z(c9AdhAs^weavk zBSZW5HlKSwU+hoHZ&0a-m3+{)^48_=?UUQX9-S%@UH#MMb*!hP>%{gor;bI0rHFB| zWO4V{1U!4&>}DFF7qa`|Dx0chD^|Vfuxj0NVw1=#qbnPkGY_%6vMAvQI~6+P#KFz0 z`TzCqZ%x?S@%mr;>;Lyd_-y|6|I05nx0IMPTYZk(1(zUY8`EAvXW`c_$t>rSw%iK7 zVsTVQfHz95$lO@cH#@KG)@z;YMNY||R!s}<>z}*J%3=Mf^+mjKE#1IV$vYgvIjN|9GC9utv6f=WPERmUXuR*P0kATSOZ8 zN3>YE`Uol?@0{Vfr*ns-SOW`V{-m8VudA)rO%~CXZ=bjH=U&*(s7HmRy!;GneovA4vJ&X?@GUNvYEJipcr@^K3BvapdAbqt!t(#oZ)zr^q=ScX}apO>wE;w4;Zl^(Ul9 zra7KGY$ZG+$Yau(LjTAhFE38zg>2cOm1%*p<)vqw1cS6>P8X&|aA^3lRo^lCFt-xtsb6-cTlAE~n&6{rq;*O?SGKq7E$jQh z6w;8Y#A0*w8k10l?naKC%0kaLBbAoAbodo*7FeV$`u5g3ubWdYba}bVQ8=8(UBmcp z;aqVgRU_v-ze7_~EP9&~Tg~4&=4nQXeGseB*}fnqPjX#{&W)6`e(x1qO)c!qZXR$w z{y|AHazg8|$*CK+v>6s_CZ}FFaAwiLn$J~+2X&1P_&w;K+GP}YBw?=A%Ji`BA8si3 z$9~@B-m%ntir5t8(=l=etUQx^q#Cl^oCJ?GBl>W`ef4rn8Sq zXY}qDn^{-vX5BwkZgQEHf~#X%kYaIUw(*Gr(#F$wvmZ8AezGXk^WC(^^CY<*9K1M1 zGj&2tmQRoGJwdJB36q1Kx$#_4)Qob=>vc1mUKIApaz^BnuSreO(-~&7)s*YbjePwx zbx}v?<+aJzOix!m``W`=WwNsUDBmZ($TPZ;eS(GkZ$nNSm>=FVmsNdw)6ShT;YO3K zizacrYn$Bo^hEcACq|20T1>8P-Og#J%dAk~^!l5kXP>I#8J|;voct192{RvCPMCdS zqLJs!00!32VOm@L7nz!Q%1-wx7VS%CyEv(RNy5ZiLKiok$(S{3r%BRM%{L&|B{f{z zvpaFi|3_Zd4`yqARtj`m6C8cbbbgb3wZ_>Uk=N(+^&GlW?5OsgL$N{n#FoOd2M$bX ziF%+a;p3e0;M1-JTa)&K9oLI#BVaK~i*A%Ywd!NuiOqUfmpr%LyY2bv zY&Xr#F%#H3lw38X{C+%a{{Lg|ef!_i^&i)t`*TiP-s-=z{pJNTZ}pV5p1az2_{rM0 zw;XzT4o`4jqR?S%rn9g9pRv0Ajo+_q^Y!EQz3!{|_~30r|AW)~{};cnsx+y8yK?F8 z_}@RZ`S<>M`SiE=#HO83Jg%)`agMOQ6mBAT+mKl>+=1)&VU7P!Zr8oLxc#f1yv4ll zyZ=9UvparXAL|t%#Z$IYVk-OwGYuuKZL^;#A|g69#%tQoeS%T*_N(nsnCG~C5!bgZ zVhIUvSH)Ssur_>?cKD}X+=aiS)GkKk;d_A=jwF1U1?gXT&$ZE7A=|P zk@xLzd)=G8_w7GR*BAbpxB2VGaQiQ(j@uPlzFmLoX_T)7$J!tB^ zZ^eSull0p}rU`AEv(#~ahJ@a^fQ$3 z#UiGm_Lt-Izi+Vb+3dgf?U&LA{-^D0K28+3tNS)F+>`0f#F%w$Wt_WGnbKMR%$k#Z z@K2XiY-zHgadb{l)XD6x;hWN2V%F|7xc#Q|Va9u&f?p*M7H<2_&u8jtr(u<-_S%SN z^QoL^$DRizuo)(&#Tvi&2;+Equ*1uoy*}z($np5U7qsR7{yhCPrdcKi_DK%OJKfrTwM}~xGx<{J&UG%^Ps{yXRlQ5>b4YN}V@Jb`(D-USR1o$I(vt#f)IC?1T4j ze15)O{P%6fqGfjfZk6x*azsDIv-oTM?*GC3f6o4luX~daarb)Me}4Xd$2J9gZVj$KYR9_B8%;sG z-WbO8hQ^#K`n5N;SFg{_bb>|gt@{>i51Jo7=}tL)cEbtXvSVAn>+o-`JZrbfK)t5# zSo&S3>pgu-lrHG~dL#PhS1xNkd2QUe(|;T;ZakK@B!_Q{|B>1U#V68LUq^AY zE)6-+ae_(Xjp(1Xr|b7Tc>nj_*YZCPX6DzuWRI)(U3q1l&7&+IyJ->}r zIkH1zd#jE~c(B%V?_zmnpoAJ6+y~cdUyF#goTMz1N%6u>SJht&DRS6Gq zc5`!6+H7`D?NqQy@Pb%we*2mi^Z(3jj_-eP=lYRTizL=`9OU})JITO+t@#_HvGK7p zb8elFoH5fl?OD%Z^#!+Y{`_fP{Xg%Z`-ks-|4!~L`q-?$=k22_KUAhPKP}Q%J*B|a zo@TeL7vD?w+ip{L`JTuAqAdFR+8Hx-q^?>BBz4SFy5~~aA=mMYi-mh~ z>-}zgF2Ap#gF}4Y%qfgBH_Ulr>Bc5}xm>h)*G|Lu!#j(Q zbqeo3JSp0QWof{ccb^k;($XTho}_t+8MHDi%W#{-_)VGp-^c3x?|IqwOCAoNUljLa z(~dn0q#5u3sD1qZcI~!f@#p5Y7mFWBw^x5>chBgs?RUw@ZNahm*Ve5)IKS@y@9(uQ z<#zr!_*~x3erA;0oD)~>b$mPPV%Zr6V2SL-@n`O^r%AX83m`C`Tiy=V^1HC zIbN8juEJ+3$3{qa2z-t^q=vCZEp5?{<2_@kT8F8iPR+4T0O zS=@2E81!RBjy^xS_`QK#&FZbw#{{gr6=hgP*|K2S>4{xx ze05m7?!|KZ%0KV_Jy(C+x;vi#L%8^n<@J{=|99nS9b3ryW1jOdTlR-XY>rs$6f?V% z{<`ekPMK#_=5gLl-QFK=nSQ(#x?_(@-Ou}-?EZ%q=ktq5Up>V8_7?Mx)1Oz%|N682 z@5>@t*(+W1S4MBTwfjtrk^@H)%e3^SwDT7CgqU5{vsgY`suY_5q|T2{DArZ#uO z<_X`z!BzO@lgahptKWBvzuP7ILBA&S&oh5DH|Mf9A0u1X-y7U3Vc|Q!kuxVRWlC&J zH>00SldyYFzTu8tT=7+&HE&Zbst;EFx9*u-enaf-E#)8eUv6-p_PwT8)_u=aRQzfIDf=leK+SU2wdb~txk?r&*} z9sF|DyFdPzZ~V@hZ~nigAK&$J*?x;1SigCt@T>!}$``r*9(%%D@mfxOr)KdgjnnLp zLLVIA+}NI+&tu@ZRP2&sieEzF+RV|MTfduLoui?iUN}dp^6@{(IVssc(cXt}Jx&-Ed5Zvs^uFlajbGcQupz zw^I!L_I8yASKrv@ws3Oghhwh`i;BI|HX2qIMLNCHEB45`xzp4qHt*T1_cd?j|NOc6 z>PGf%*8k@9HXoG4i8 zQu(;fR=YX6+7^xvPNe=n{4c)p^vXX|C-1)aGybRZU4~y%9^_kQ)%;kfd*Ht4g6b>3 z%~P9R&%gfmz((aZ_UP>MWl#V97XMaz|D*WxnH4U|nOc7Y-!2lk^6ZLA{<2^DGiQ~F zT{C(1Q^CM0N9SI?&1av}eQDB>b*Gcv*=E=*{L1ubilKS>7roZ1LbHmCymF@(Sg}SX zU*Wyxp~AT{+N-nAU zmf3^%ZJgVJRd4@MD`_~<$J6j2nZM@cxt(kHCf~fQqIPKVPW75!D_fpyd3SQ!QjsU8 zrm#h>vR#~MRAFjVulC``dsUs`rx`@{{C`}6BpfBev?>u{TI$Ln*q z&7PP4I;(dszg(AL?@8C}{O^O;mmTtT8#Pl^&Oe<}pvZ^(zi<=t&G&=H%+)I^lWHsVACAvz8=e zUfytV%S?-J?Ni_AfB*Mk;@ku7A70j*&U}@t^5V(wYCoy(a(5V8%%v_!&p4a+Z#Ki3 zTi1=Oojqp<$&?r*`|E*tIZ7zv9iVcE1B&lC6`9 zP8w$z7bWIeP1|4o;EQ$MvtwUB$#;KVpQH5b$!A^n?Js^-GhNAhXl}hXpZ~nJT59{u zgAZ%w{O`4nx4EIm;M*|Ws8i;9(7atj#wVWZWbR+W?8Kgwu>bV)pkq1C*OYZjBj#vI zl;&x1uA9wzN8(+n)xE7QF}t{zj_(=Q|5#-3ht`AVtzj?x(6`dUNI ztDmlg%eOwbQU1N|{ay3u8$S=n`$jj_*T~mA@ZHWBl~!=#!HTV#s*4n&Rxdi%wDDlT zhE-(=Ta`ZufA}8NUVEV6^)~<0^~K+3F1D}xc29f5wqM~2s!u%Edfqr=Tm1b{OsjP3 z(vX%XJB2q*Y1=5=W#FZKtUxZJ#rXW8$NlPl^YkHTFwu5-dkK3GZ*Ba zp&Pwd-fVX9&64+F3?;mBJOxRYqNQ&YW*RfbJLIj^Im4T#_I(W(oAj%lm#g!_+B0X` z)w@PF^*=a!_v*Rr@=-H>e{FR>t;U((9$a+h$;_Qaok5EZS1s_-+-$QW-P2HMjj*@$ z(y7xPetRo?KJP5c&9-0LL+xr$?Wixb-N`KcVYcU*`D@r0y05B!ws3Znm74b40JciK zJsYkx>HF_oq9gIJI<5Zw!np_X-9CKD|H=Cx`NKi>9>0CO6Sr$i>VDvF`Br_{>cQx?PwptZUWovyBY2x%LWyMCnJgLf?Y05XZ^Pig|*l+)Cj@@1{w{15Cw#a?Fyf$g; zCAU8<6Rb*?WM45}wx<1OkLDMH(z90$LjQ=^Iw$zWylN zuJ_jY)Usy#;Mamr)?Hd6wX)fGT4ei@zBxiC&UWavO3ZoERQM&&M852}-(5lX{$DAd zxo2-P@Ofo6^YwhQd9fVo(}LFgQhfd8(;l-^YAt=8^D3_~&o9k6_CZqI)+bi{uGz7( z-j=Ky=Hb%+RJs4(Jd^HMcEd91d8__Qwhw0?+*N;D<&@|C;^j|fw)#5eAG7aomwfW} z)seRIujBT3FDTave*M7gsf*>A{i**S@vP&~T;99*%{IdpJMEu#liyGOZIf~Df}&^p z6Dye|&hKP;eDAEkab~I7*If%W3eTU^a}^U?X2x_)f}ufuUc+*6=Do@bXMMe4vUpFJ z)+VcxH79pH`y!NiY+-v1+ePCmrjhC$LA}#0TIbxkWAr5OlgFnY5zn>N%bE7qyT5C)V_D4IF^VkVQac=myL-K^VwYl!rGIO;X@BVy=nl9Vp{FZy)>ldv%J+~CM zoyfEfJMO|B?tf{GXR(^BgH^(d1)a@BvPWi$*C}*Z&OC2%ZQ*mv>6?0#-I=(#*XkJG zez2?f*OrTOw+n}dIR{t0F;P7I)KyD!a`pA(H&Gn1!C9sKR}9yLJYE{GE@9?Eod+{N z>=0X-y{Y_3`um%m8}#cv%>@j)Kb*LGTcFr_?*D(f2kvX1Fc0Qk%sc5-n99K~x2Bab zuD$y9aJzWgM5c8e+RWz*o_eT8aFz(#?o3mCd-!j|lh2c$`P%7UuCx4|VyAp{Zr)o~ z#gsK`Sj5DZ9nN&pPMB}fC$o{gD{}Sj&5FIxl0I4GyJ}Msa#pnaA`>S? zf7XLWlhY4QO*A{ZQrw}<=8mZT_jf16_}{xcn7)74!PZ)*73}@n^`dVJ6@UI2%*gkS z>CfF)|KEBs_k3gcGVSQC!UJXxlq+7J$*No<@!ZE~@&&eQDISvVEY~rGvtKkdQ8w(p z!G25sM*cZF&&?LLq1V11>yF&qb1v)2yp10#cIV#urSQQpBkoO9l0=o*;}u+y8cu#e zj*DFG8Af&ndc-}@%6zB|TMIC)d6RZ|{ge9L3l*zhMd_WqfgU&|=|Y|@gH6_c`AuDQ?RjJV!Bz3a)m zV-t(a4E7}Pi1S>V^?}9a@0L&-SsOXtm0u!Ki~~dG3U7*OnKPm2`-H_)*tf2{;j`g+);fFVJ9hF)+`#0=eDA)bm`tk9)|G(?Lzp03Kot2{OnYX{-XQS(# zw<#M#>YmND|2>cS>5d&MRU%lQZC`o0@9Q?+X2<62ecD#J-ofE^Ki{#LF3Mh{9;AO_ zSJC^FpobTYj!H=KGQH$moK@~OyJWVf)i+`FfHS_Kf>(MLFIqIkXyv)7Q`)ZyOw82% z$S6I@;H_*8i*|Ua?Zk#^zFTKGcL#pIzq$3r{SypL_kW(c`}}?FtNp*%ZhrjtdgFN& z*EKD3W#6rS|LaZt*PHRy_2-YyUe)%m_v=1O;he1S%H;F+g@5SYz1^sEZ&vqH)u2ud z)u~)sDn+5wR<2Sy*}E!g_0?T>-jwO;>fADU<#-0klj;w$nSa=wl(|>;?`pc;pRL)C z&+=){zBT>9r=xEh?ybr>c;)D`!UJ&!+fVK~n6hmFk9vFAs}39W$hJzAss)~n_j(Ff z#4UdIwd?Z@!!1?@PN`f6Pn>-s_eAl;)n!G@i+x|GO}2TqoyV@};Hj@iPA9+KzTeo; ze2TF34igTE1MGF**Vis%t^SlWf5t;KN%wWHUrzok|Km`({o1p+x2|lP9$z+VW&fkR zkgLzKf8NX38ai>=#_26zGas8IPCGiy(rLGUP~feoNxc^{7IV$G@buKAjrsCi7gtDM z-od59dS#39Z?&zva~llL?yQ%7p!~xB?IU5OxfUA^=GUty`RzadR_C97{HwmWmES^z zXYca8qp3D?f6b@=ZF`y3ZXS($bN;IM@x2$n z?68v8zuErsGDw{%eWP~dPRTy)ZMH1?>wlhOz4fGL?ThO!?=QcqU1r^$k$kJdob&gi zQwOiky;ZcqWZw@PbFap^U;dS9IaDvYI_>D*+FM(6bDtat3A+7j%AaGoJqgn70=??Z zEidm?*%iJiSX;j>ru=s04>sml_YHS<7yJ8_ZJWq2`T74NKilJ@um9f1_~7-|e=e?T z8vA$uJ^eX<=ayjUXWWJ|-Pgs+R^0bHvwJej4P9T?+luCIYA>h-#Uz(3NjvnyoUK3a zy=YASt%pgk?ry%8oHKWIo?y+EPKBJq4AEk{hXXY0&?(>w& zkz>BYWPbik%zF9svZoJsKQv!#>J?M(|a&FBAkxb2*B&}z;F zrA-BiD|_$ueB32htjxS-&4p*1mT#@r*2vxS&L`;B(%IerV@)#Bu3h6i&L+CS?abL! z;ll9k6BwlD)gPZ&_x|3wtwp|H@^2Y%t-Jm^ShPHUXO!G|x2Jw@cV63|$5^)byZQFa z#Vj{i*KXUN&tl%ED`m5A6M}WukoX^_GXniXsi#-PFF9Rm+%g zp3C0pT^Id8dB#nVJ(aQN#_k=0Z(=J#b7p(Yk1OxC%FDRC?Tq2P zef8o`+kS8Prs=6>`Hu5qgZYlE1&&!hiVx?l&=PDu@%gOKgTli9f4ja0Ov`FrRK%^~ zt+M$-1Xr)+$+;?@Ih8%`5!rsi_HChova-=Ku66j*UQ%a z)c>=Y|4yWic=YSq?bX)WPgnQ<{jylz?$4*b)7LrX$={T^UuvDR_IvrN?S*^WKj=2{ zZ`oAAWV3aFQ;%V9;jy$3kF7_i=$scid`Giu>vF$kjs8sK0;?)p_40V*Ohb)=n}d2o zoLBIyFO)hy`J~XcOw$7GNAGWF6#mHDu;bd#b<-Jczx;dlNR8v#>+gM?Ht@;Gi2wh0 z*#7H3@9VoB-;cG}_Cr{I|JNY%D<9X-|MC6!y?yUrz4@4QVPmGrWj+OyCjFcbadrmf zlYixw-fKL4OLguxR(a3fho+01q!ioIc&3<`m^j&~9pOstH7!-@JNi?!@Y9ln#j*)c zbx&0UUgZCE;kagZrSPW0qZhPX<)zKsq?AujOg*&Nvhd&0|IghsZmo@S;ab9LUA(JZ zIC10WGqv)6^>esC2$t;5)!J74Jn9h7>f8hO`z8bj{@Qf7HqpDVHumJh7k@VVc~_g> zU;lk?djI<6aS7S$A4)SctmjF%kg+!IyWi$bZ{6PepBBBf@}}7V?}A77_r3l!wXosk zHd9YC$#Tx0CbKhKyU#jYIKJi8rB#xvJL;5poU)FIea;Ga+BwT*+L4LMO=k1EA8>Bm zut2>3T*VvxN}B-l$nC2Zul724JV<8O?-O_34!O4-^AN4b?N$F^ChqZxx5-nXWSyOX zUATP29j-r_m6w?lduKFf=6!hke|@&cD4OeRS!qABU!X{q`Vr{|mqFYbAc|W-=+EylE>0~!yBUhB!cGbzclG~mn9eu*= zZ6+lxx_8+^ow=Jtmfy~if8BiGxV-pb*VvlVcQyH@xE&r=Oo+r8D?&G+uTLFc=zEX{B z9;**cE7YACF=eUi64wi+PElr8)^9RMadBNG#iys|WvMLF=e^qh^G?|VWeux> z@3Oi2yLK3HYV4nR@BX7dC!0Uqyxe(k>s!Y?k|%C6Udn%PKd#~7tQYy$Pu;7`;&0xc z85tzqw(ab0fj^gaGAmEM^W@|c-bHRw-aQ3v9GV#O4N!QV)ze$3+ar9ftX~}4{+vyx_14WewDrPy@tjGXu7 z-{tK5+bNtipFA!0Dm=S4?UZUz+|gZJKP^7j%vfp=FfB}Vt=rA6JK-u}D$!G~O#gi# z#@X1dO{*vB!h;I?r)SgIzwh56%zWqbGf%y^TQ)V-uL7k{&3@N#)2Zf_@VV#z=1yKU zn_<6mrqG|0qCc)~zIEX%_~H%BCG&{GKP_SoZZY{vT;d(GBlwu2@tt?EA#}vH1U~pOfu{{{B15IDb{! zuEzCoZT>Z)cJ+QsOpCTYIRE8=eogj{osUn2UEjB?v$M83?a$HA>}|Pi0#_%k5~~R- z)b)-rE;+j4^dvpcT`9}FpY3|`qe(Knw_@$OTG8|DDXWubtdG1mf5-oSTkq977rfX~ z=+UJ9Q0U*Qi@|etIQcGLwyL-*W-AVb^YYs>y$61CWF!C3qGbLPSSec#(VKc-LrI(u5^!R}jv zf7Y*?ayCDHmh9rKDuJQ~POrGvN<}$FP0W!@z8T}aY{Qff+0XXLEYc4zjdFe3U?VTc zAKK&QtNqJ={mXxvPp%s_+^Rjr<7xA4$>%GA=kEF!KRTl%#(j0=`lg9eto;WkX-x{4 zwA@8`Cg=2J2h!D^R#=;sJWv;tuYFc;_vK3UHsuCJ`HJ-)Pw&^;_ob`ijpFW!CvFS= zVpB8N_xbJ?p8{Wx53edezG{8B_tvlNIsYra1l<0-`}WJfv#-9@uB#3Cp!Q+nkB#De zycx!awrDZjigjM%$ZdCBWtzkFGqoo$BzRWQvI)vSoul{H4G4^|DXG(Ij zHDO8uC2`~wR5X|{tCrR&TV__M4sg>waEFQn|_d zV8DzVA;IYW_}R~Rg)}CvQ8Q{w3o%V>xjp03>aqjoUURIbZoBkzcUpt=j0W|&%jdO< zf6RI2k>z$!ch~InEZ)W~6W4sw$o_koRWO`KspDF2%}wwBjotUZ9hJBImw#{j<&Hm3 z<{tYY`(dZOXuoaFZk7XiTz+B?&Mhu@zA<;+&e*VzZx7siX>(w{h0YruyQckr&&)l1 z)ym*zZHZCar>}n)GNj7pEAlw2lq;)UvM@~M{hODxXG+EM&z+ag-w~;~(dz%;31`-I zZokf{+FXkp*Q~sCux}h8E%bs2=o-co=vQV9k zq2l%5V-KB=-R#}T{A~?i-gEQY1}F38f8TTM`JbG;$5ub~Z#4*?U-#Bwvshj`Q^jmC zzsY}+)(P!da@KU3zg6^tbq9RDEPhck=kM?3!FywK<#v8A`FNcFWcaUTIVrESMb;^B z2RhE2^!&lj0J&Q`rt28+`emp#s8|cI{p<<7>G!~Yzx^MvE(u-%`FJ2&T|MQ)( z@#aY3TMMM~%jKpU#jpl727A5oC}}XWxvw+%xW}ixk1Z_oUbaU?nx?jDYOdgWYxcpc zHz2exqf|7CTg`RTPlFTorSJFuII!~3rF94A*V&f|{0VdYx7Mra?Yi9ZxC8RmHHF_F z_@AzR{`+J2{m)6|W`5^{ z--Rn{SYjM!GM!vBX;Dm|?hDDF5Nlx$i-!$gyZ!I}{(n#C$K_4a)CIPQU%eiC`{>Wv zw)xx71TyY_UGVLhRsHU5``;f>sQYBAUz(mg>)21%TZSR4xqK{@+~=LPO_%z;d{b%K z+U(hEweP;&uw}OSnezKVcX)3z`)#Y^XE;u(Fa)R^s`PMtXp7HDUzITtd&i(op04zx#yGX8BeJlDI-aB0R2Y2Peim(60Ua!y2TtUtg1NAY^@ zAJV61m}z-b&7EtU?*6CN1zHQ#2h@8#sjXc~pPjtF143-h6cF+Pyh9Yx1T)@b_k3v*BIr zZ?{)}dsEkxwfvuQ_^0i*=V@yIr9hew%>Of=luWsXnuX1=f`@hFTeTszkA^SzBFp$9w+VVR&2Jn zo}AfGzSq9?zf!@;heEN* zue9gM`8)-$rd0ehZkf3|rER*5Op#7w}FFXHo*4*m6 z<*JZz;Fbh$aBd6Rcb6jda`#l}kDC==rJEmrC;6aL{m9FHiR1Edf6b1c z7oUGy-uboG=zd`C|N8RhLdiEvr#{SoTYGMAXzcrUdfP8Y98#L*n0JUpD20(rNWnuv za-zbslv6!CkKY+~IV7DB==5-5Qk%i(5h3ZK#y=rxx~GiD@q>lCcki0_z4qL_*XbM1 z?+v}0XMgH$ZpQjB@2lJM=dP;$_kYdaZ@04luD-%@#$cI*@f^t&hON^wI*-laPF`N_ zX~O$_BfptNQLd|*Tvfn1&B->vxCdzTR&4_f~lR|5x>M z+5b#GHob4ZWkt>ZWD{cOSocpYvRy;o#QnM-P0jdS7%tvV5!R;ppO76HJ36 zRhOSKGtJCe8nWkW<@yGJn>#;V%P&!>crX2b@5iT$@BcpdJnrAz_x}%S$5*|*y#7v( zp3nV{ZU5w(|4%N||9`Q*uI9t<`&CsxZsyyY)_hD*-TTTKVsZ3_0Hb^?brPKzpi}0FZ;*aeg4mb&*SW}Uh{m|UOw;E z|E1IaeX!s6>zR6-ea3y){(oEZ?X`VP(vQykKaURD-?=kO(J-Ug?)TdM{`fob zC*QOGab=(2aU%N2m4u$#0goguPwaGdcW+}8`_z#zd8SEn=E|ps6z0GCQF(vEKL15? z&ItedCC(hvEfbLYq;CJ)^V3!fgzIG5rsmGNv1N_!6m#C_?{lv6glRDM|61x7Fn7+L zL*a72pG~g+c4K?pzk3hr|2TlxOokK19o$LoJR>DRN_ZP}O4UT^*P>1yen zHtUM^l>7+#rE~1S#svAy^G9;c^JZ3Xmsls1-;&_lV3Qzr+{E{Au>aQgp^RS|IT;dW z6h7YdF_X!D*{(N_tETCF(cW>P>*|9wlWPwr3jbW@DcyF>Hv8-o?Mb?d?;pPsotxPI zPHunE)1&kMeoDSy_lxJp`nrEh7jNENqUo&JJzXcNU(SbX{>_Ty*Zul?xBcDyIzKLo zH@9ZSgZ+jtmp?Dxu2%p5+O;3|->va~-g2b2u0dF(-(sWp!?vk29(|r)Q~UGg+Cm%V zfBfdcpN!P6OkG&=LrO}y@A=pN3u1$J=sp(vu}<*ak~w?5Doa$48g+LiyA z%z}CS49oW(IGE4A&F$(n$IID=J_gOLI?Wk&Hq!ii@0vZCH_d%>c5KPJv})&i51nAO z#H(7Do(qQmIQ3Zn-<#?3zt3Hsd;9;rz;{pcUSw>SK6iJSN37Bj-_J6YiosibR@rU- z`RrQ$+WU8YeBF9?>+)%B-evP2cz-zc!Rhy(cSld!-`i#K@7zPL;H+<&k0kdgEG=y} zUMh9Uc9rz+ChaxHMCSj$;y-QvUW?B7y2{-@yXEs#t!A<=aeY0#^z~oPA7#fcL>;C_D?;Zc%cPsAQkrfR^i&gbE zg}++W+np4-^XAR$1;_SI_Edc&w?5?Yz3ly;&hIa<_y2b_-=?}aKP>f0iRiA>xn-$d z=i{dBKDBbr^oM-wq$)!>?w#CLrt;&?)Wok_^$wQ@{aVYkFPn#F*QWQDKX&Kc*_KnT z^J`uzU(}x&BJM2)3p1tG#dy|y-#xcU{Jk|p3;!fe6NmGi(&lq=cYM936WbX+;ccXJ z^VQ7>C!1JRyVIV$X>*)VDtpf9p63}0EvxU(JRYvkxBq;3Q{8S+_hpkfg(V}+Y!vUD zo|F))b8+&7srBuXOSV+3j`aG@YPF#W0BVC%fQudKJ=xYNDuIqhp#G43@{GfcJ0 zy?N`D><=sbAMzax`Pw2+g|^4N+AKTWM|sWK<6&D5ZeryYDvG?AJc(8E-rPKeO&@wD zhAf+|o5l8Ao^|TBjDSx?i-jt-Jt|`kSS`@(XJQ#uxcly|8h**$#SQ&0mPC|h_33k7 z@tE~UtGdub)#2+3qx;MKCEs5&zUUk>h3V#lr)dt;@0ngn@+s&Ix%Gz6v7G1Kj*Zzn zneV?{@YP~L-m#vXQ_r@j#{1>G*NO5y$Ni68>A-D|4ZmG4-v4y>-qkI<2D=?r9S_lc zGNseOY%0gSCn++Tr^O}L6*Zsw(7Eo*&fm!?Pai4qMopeHou#wE-U+;10LL24fb5#Tfv&o~v;B;Sn2p+^Lw zjM6EhiOVIAainJ~b58l)RO?(VR+?~=PyE669H)A|fA!CQv&z3~X80hdvOw9kwZ2a%3dvbw zV|<7s-SdKSKwucRwsDc_nrN-AFFxIxo_AmNMo)R3>Z})TvV6T!@cN0D-}_y7_WE0G zL%dyrIK#AtvsWWLEBhUpo1JH}J@c8ET5x#Hv_1LjDt+sDT|KftPUbm&RVhtxwgk`G zCDr}C6)BF**FH~(lL~&huz{byfuVq3h+((+`b}rquFXI7XwvgL&$Ny{nW>f(Jo8t} zmE$X?u5FS@TK?j0@5wS_qfb5UB27k;=efkDWN&bLH)D@j)S*bXD7LLmCtXqn-t*Tq zQn3{WCvAQ>M<%DBSVQfAgd0|Xmlb5kb&o(jI zKCx2D?BcO6k6Q$TuPuLjm_c4nfboF{=el_D^KUE;ygSRb>hvucRmrL8X)DDui_)|f zPjgzEAo^u?+7|`}wr`+w0fN?SSm3wEFe>De&KV;m;Z2uMaYil-obqC4HQ&2~OXqod zJDv9Mp7g6N%W~?I_r478>fWw9aItn@=xk3P-d z6Mdcr&AfT}>X%4KJ;UoC&x&P!>|+sImb-;Bcg}qm0W%`!bfDp0uq{uQC7On#WPDu@hc?-uuHQyk1Fct?82*@eQWuN4R@x!-qvZ|Cp+WQg`!yx4V}F^gKZ`xt31CHzGud*i%wjA2FGn@ zK2IsVdM1GR-hwL=rbREiJgv9)%s0*-2X=n{^*)XN4D*?_pIK7h?kPNcV?WD++5$bk z&qpuns2y8-gJg6= zeZEpN9vPfS4=z#)NqXcK-?mHY|KvbZ2OX<_*Q`pteo;ul+_VU!UM-r>0)^ zoX5^*XT!pDVCIYkDLnIU3jW`vx-RZ(ZJ6V zjw!ztzOg5u^-k59$!{#vedKtvJ_lI8l3ewqi_P(ATXLLS?#b*qT-O%`&pf(B;8`)V zhX4PX{=D8N!Alk!}sD8B4f61Vm@=lP|KaaOY!-syNe_p zCrOIb_Evt;tD1EEKuy=RnpctLna*r?zkPO@xOvXW!wVYD&tw0llWi~EKJD)fE#Ae4 zDi)cjewDs8;lHfC+@#trf7m)`KcIj#8aI=BAU^KPwWh}P4K zy5_pj_s(_SHC|C}uZ;7Tzw&!ACwOt#owZ9Q+|lfsGxx_PwpMx4d~bP3-ONx9_H{^;<9Bu+_A5LAm+Mhs^fd+n+J|-Tvb|V=DXR zJtsV;rTKO3e!KHI%lWy#{>xr`-T6$ZIcxq^Pw9@(6OoEh9D3>%$2j#gTPJOv&v^Q- z$JKjH3<7Uba(uSil>e*?3EHxhFF)f`aw7Y*QUMNjNqdfEj|0LFzsxa9yf*(Lw`<48 zPW3tWYYy(L+ZX-C@B5p?+wG4S{`;!th=<3q-dzn8zA5M+4g*tB-7!{@9Nm!lO+tIJO8c^@~`F?v__^JziXYhK>;S{=Qq%`9Z$%qt5MWulxi3jMjCzIB(Vsc_+B zSng@S&r>h*WBzfbP*KC~CoyYxg>UlwBA{f*x;6B`-4(kzSES!sl`i08;uyBoZ`GZm zQ;+YYZJAWy@1r)eTim$WQGL&!4Az?Oo7|@{6i2hP#k7mZapdH)mz6VTXE!c&OxPjw z!k;PEsOoQ#%xpi^)F3mpz@=+v7=>)?N-`1gwoTvk#Ao@;t)}Va*Kgh{+qV5{AcMRe z6H7z24(IOO$1XEJe(=2K?%e}r)6?d~nWb$m_pm9|y7V_{59gPvMfb%|=XczeK6h)D zo!5c$ZU|{fc^>bP0l+XkKZ*GG9 diff --git a/launcher/resources/multimc/128x128/instances/herobrine_legacy.png b/launcher/resources/multimc/128x128/instances/herobrine_legacy.png index 13f1494c4dd62b54e2e16942b23036e2968d640d..bdbe009d95c99dd971f9a3337d5c9807d294dd0d 100644 GIT binary patch literal 4514 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 literal 8012 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 Pz`)??>gTe~DWM4fu7_Uz diff --git a/launcher/resources/multimc/128x128/instances/liteloader.png b/launcher/resources/multimc/128x128/instances/liteloader.png index 646217de03371fcbddd6903ebbe10181a7a4e8e3..acd977d7ef5a8487a8f39c0d9f15611a67cbc358 100644 GIT binary patch literal 5579 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 literal 7619 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 VFM4cZCJYP=44$rjF6*2UngBize}n)4 diff --git a/launcher/resources/multimc/128x128/instances/magitech_legacy.png b/launcher/resources/multimc/128x128/instances/magitech_legacy.png index 0f81a1997fd0fe38cf927d4d29cbb1db394e32dd..7eeacedb5b856d802f3475651248e8e33661b746 100644 GIT binary patch literal 21813 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 literal 10583 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 Mr>mdKI;Vst07B&frT_o{ diff --git a/launcher/resources/multimc/128x128/instances/netherstar_legacy.png b/launcher/resources/multimc/128x128/instances/netherstar_legacy.png index 132085f02f2673a6db43d779246ca2c36daf43b5..99e23964ca0e8c791260da0984952c789da79f06 100644 GIT binary patch literal 10041 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_U389ZGaLn;{GOk>SEVj$vj z`plU#K8uWs-*0(-)7wSl*_7Ldml#iq6$_Ox*S7sRd)hsfLeE*tEdS5=;~y~FhM{8W zqQAm-X0t0Su9+O^)^#+=(($i$QQSIx5w09>Pq~Jk*pE}(XUQ7w_p~@>x$fXT zz1!Pv@0|W#(J4ezPSmT_LG$M$%eYhtx3#H}zD`N&GiNF9IHlgKFyrtKp_KIw-?W}x zQ<)L}v37p(=Nsm%ZX5UU7t1b?ymE4PqnBcUmmO=MNJiU>JPw(*E0J7fvE|%v8IR0c zxbMgh(;bRyj^2>8II=5u&Fut<0(Obij!7z+uCeEfo4gcH{AzsPUSoG&lc(piSNjFo zQ?CDeYqNPKm+frYn0woA-Tx!oa$nyvvtOTkdt2`9d0PwpSACjWK5vcS*)wzHzn1Ku z_jXmY-QC~JTlOE>X}{pV_?Q2E-?Ex&=ls`x_jGIg!vD&mN0(oWYx=fV;L7Y5fgk3I z-<-s;#_sm@mAB14y?mE>P~qKYl{nA+j60;C%dK0ru5Qt$Rj+(pQ=eKMjg*;x=&O6d z-?#^9U;gv(e@f2&(8{meF-o1TAe)Yx;F^~nA1Z|AqEF|AgK_ui(jrJ+$_`uvB-54)}(e@`Oo8G2es}+GPpdBUAIkxY4xnv#Rb7ZK^7GjSmh~4dy=9-;^1iWQ z|Dsxs4{r9U>OW_Dee*lC{eo7{M+O2(8J3EEpJF}d{ z{2h~Pl0I|X(B-%--WV!c#l_7XzwYbL?~3o@TOI!|^Sk&?QPW}1r2V&#F5bUom)2!& z?xb0>C$GF2>7C;k@i!Tct`0ve9#`q@u#X~3FTiOll9eMU2J#fEs zpYijblhrO?dG%|TK=zSiYzOz9Y4~w#o0+Gc)}$MAWIE5BnQ~!^38$Bz*#8!mk6pc@ z_jg#FT)AdSVMk(VuJ5&vI*EHG&oG!djYsg!R0$)UjY%gqZERcpyrbi&o@#W-vG?!Z z{d;roUR>Ul3Qo4KTXnu{IK}S$o9kA5@`HS4nT8c7SFZFl4)prBYmzTF!Yy|a1^e-pRWrCr?B`+Ba#h0`yiOwZXd{Al=daqg4N`4jHnyRYB6 zb?cEiO#)w`$G&^+nD@!FbgoDZ%QKYy~!IQ>bTO#9=TMQ4;| zeRx+T5YHUa_~+6(Jx!OU$h#K}7q9NRP6Da{bDQYd#fiW|+ZzgqgFl^0y!JT_vR_ zIxPoe4hS6JUG8_XwBP>R1O>$%`&pD$xMgUve^lAe@#OjTZC+;kBJbU@I{BBy%Jh$D z>uG}nDHB#tQ%Vv)5O~LaZEM)!wGmRk>thNFPd#78dCzP@P1Cjb>lYngPv7$@3uN7r zg=@1i6Tj&(7d-vj@sOpznv-KW?~!Fm+Y0!U6dtxQtgHMIxKnCD`3a{8&7T z`1kF@VW+?)A)%g(9_O3YPq2Qx>EM>Uc!_g~=MTM(zGKri2j3~@c>gu@L2}IY1P@`s zwLG_2H!Nq!kli8_)qU-^J(FNT`FZ)wPz(8g>zN{KT^P?P^Z(+wxHF8~I29P*pJ`M-*>p5r^W#bfuh_XN3U3OkC0PolN&C*^*i^=7 zxWCm{N^I*JCJP4!8JVqL z`AQd!28|~|E4?fxGEBVqY2)FLMOs=K4K5rHm|lx=#QVhQTP|aG!}K7b@WPf^ZrZz| z)@nU8U^KWEuB5j;ah6${(c4XbZnnxTkbc2r#rf@P%y~Wk3%r6Z>8U60_VpF%FK_k` z^0e6|$jq>2-V^u54@45h51jmOe}4uOA0MCH{Oo^sULAGfTJt|z#z*$bkyuZK#4}6^ z4AbhY16ZW)`|jgfz_()R&Q_@fvl8Y%ugE=LaG`aPzsM_w=gmz|b=by+*x9}$j zZ%bS(Ud8wB%RiP*6+0EX`5$YS{HS^MPxAlef2VJ5PP`kx^!aPE|M&fC8N{N?+yodh z=h!Hf{m9DR&K(__%X@>#qqr|SasK1Is#0!w4F!Vxqf*vi6m+oLAD(f-Q%?2T%qKJV ztY-ern{!Yt=dfE&?Y1}m0{NeuJB|zN|53BlIq7qz{7R*>lb_{=%yjwq>elx&XR9Z$ z7`VUO?aV5$>l^>9mk+z&Og&U|*yzFEXHlEaS3g-Va&xuKjrUJqDNJ(z^fz@6mjiB-f7E>LMH4=(zW_~BRP@hhwBUMb1G z|GttjNys7gYfj=agT;brMQd+9xBaA8-MS$rvu<+SGCrlsEqj(tEYCS0mUGA~=SWyi zo!J|If$ynz9th-KIajn|ZAWcOWuaQR#C_u<%wHxomj2jx=y*`4V$bhz9R|)?j!zfd zW7j^OHzAOrBb4EMPibjra?8a-8V<9HW3s>fWc%d$C1?R(q65bvp}ETa)2@GfA}hUt zb@m2c>5W%6|Mq+DFYvvASEO5eissM1X&0tPNNx_@JK;x-Se1m{#oNc%`@OUeEPXZe zn?>D=I~=mlSI6F6_jq#MVTTKI81~dT#=34=z1pYftEh9!!3LA(JH(3C%iDYs&s*G`e0 zag)32{QJxoON*y`t2>lnlUMq_!fweW>8qRTTweZN$Yk(n@ft>jZTr?tzi{~K^fKXH zOqb?7j&k{QFleo?!#}6S$4P&m$wag;OaaA}FU#YNtg|K)oYL&7VL z%wj)(y=A^&a(^?6;diFfOBQz=Rac7-eVU?H!4uq?`Q=+_Zr=uvh_&}`x3o_^cWtw} zpu>z;@;|0k^)<|^i7k{4kG|sdWBY333D0D%=ZG-YWH+;YGIibK5W(T{ODKU!q5sKL z8}8d14(7~k26=bhU8{0;u;nFb5eE+&Pg}+N-y-<0N8+vxEfO_JA6s?Lym`69_xM|* zX<5bWhc&7$l`LzyduZ~nx$B?%y_$E)J28!sci$7^zT@xbXFj~OxxU17d42j1-4Aue zz12IWr`NbLy!_l)!~KktBXMJALsX;9r0`EZ_s+Kc-gq+ScH*`?^V{3+p8U)C$jh!# zaLxT_om%!pjk=;kLC-#F+sNAqiYl);(ysq=!M{VT0iSe#G)Ephw8>~%RqWZ$`8$e_ z*S|O?`@8W&Ehr^DmV5V9a^6!}#rJoXuT1NhzuL6Pk|{Hb)yw|uL8hfU&BF6iHk(vi zJf2s5=SuAEJ1Lg)d?sn%VzHdxGx_sLiJgmkqxRqHo#1}y!`0QXZFepOJ)O4g)xO_a zdC&i`6sq61vYe~4tgfwL)%)r9>!wbPijVo&{(kQ@9v9cTofFR=;(N_(>b_5{=IT|M zUtOy$|D+;Z^i}j=+)t)6f(JLV_I+NXxqvM~!SRec!zYVbnxB@RW*21i5&SvXROc;Am^ab>xbpvZyP2Q(-`RDwx4A~pK1w1}wcg@McCVtWzRJ!; z>Zc7$JEkoNe{(Ce+WMQihse*(FIl;FpVrpScB=isv(UKGx9+y(g^Eq;YM=Za_Ia5e z*%T5p|GVSEzlVO``FZC%C<91+-w|UuL80k!)wdiL!8g;APxy2uEaPzJ*&O=xywRiO zoj*L~KF&7V8L0JDIpisSc<1t6{>)0YzE|tCj+|!J^n9Xzl9QG3%X~}W=T~>Ry!RIf z|CGDKIQoXln@q2L=l|?2&nbCp^x^%Bqb_!Ki~_Tk3jN+vp!i(&(CyaktqsL7)lu)_ zW;%VlxOk0@(4WTl3a=Sh`ppCnDhnM9nP_)*)vuGEEaquE(tNwv^_R!gZ#+}Kl}!C+ zGWCndL_3!j{;*K{jDIx;73vQkRI1w`6U2UQ-rHZNzc1*o5t^QVJ8b%ihAX$d>^LU8 zYc4p{A^y|9b4|BpexZ2reV#i@@0d3p$X{ox8PD{Nd1jSbxYGi*gT8Ba?70)p!hgy( zXHiG~iwB&^S57wnc$oG0a_FPr(6h@|^vZL6)OyJrdWt>ZlxvCnPl+#LH}^ixzYsm| z#NR3Jjtkbia4uM0BQ!ndX3%^ML6v!bPEVI+&;E6I{)>u9{x8KI<_pB}-$`x$K0BM^ zL80KU84clrnOQ6`r~O1kE?90!Oj^MqcVTaG=-vLXQvRQZHNN(qkY5sX-(jCurTq!< zo3^fH{DOCD53yV?y<>4bw542JVc&Gw-KV58KOXDl6m)btxt~RaLEm?coN9;JRIRB( zp-cFq6ht)79^bR#x3G(yyWqd5ho*;C-<@jXsBqSDovohx`Qt5ni+yWmbYELyeJ2W zN=*JW@w}c?uXS}tL;vR`URS+JCv_a1y(Gv{Mo!S;$F1HV^^DC`7muHx_f%Q6t485a zyw;v0vDpW@88gon>bCs(?P9~Iy1PNFy2H?6$qyO1kO+yn&T2gZ2aN+e8eZS=XW%mB zet$>j()AU>o_iiKnaZD5Vd#?$eH6_r`|6)@#fEI-l#cA_bKY2~sP5d>%(nAMr||kC z+4W5wzdvl`$;|#Czj5c^c=p_rM%@oR4Sp^ttUiBEX6COCKdzjeo@l)0%Hv{tA6Z2v zgM$5S2Uf96=3n=8zsHaIa@+s^TmG{yu{^$&;b+Sf;m|F?o2#Qa)h|obcROV6jlaI) z?6>R;&y+w-VK>8$hToObX0fhMcDlmhuN*dUmH?x`vTJTF|5w-7f9HQ_?=-uSIo6s} z$%AG49(%_dA9Pmn-x8Xpocs1yx|zQ1m9!sb25!7+|7TrgIA~q`M8@(EyURlf2?2)2 z8NsGHkC^B0v3A3QB{m6ZRiIaX)2a3rokk;LN4F)LMFW zH1ApL&Z(Wu%P2VEe1^+`zbzXBxdWJ4SPp!jx#oS7z_Qi+AM+>v{T{dX&i$${1^?gO z7XK7meU)P#M_y@t(}s&XHQ3u(x(om78NNTV@AjWBQb~`RPj2U($@Jv%!_(7GDNA}x zJ@w(#iT+h@x4*nAHj#gweC^!bg@4w*J9e^sr}Xms+@M6~d!jvOQP=edg_lK%t!*_o zw)h6`k6P^Zq(dTT_E%4yO|1c@ZW4mrCsKSx{w^-h|9<`5-MjazzLorccYS>)M_y`u zQ^&=f&!#qgKec|%@$;+h1tmSa>2)<lE4?Xj)Q|O9N5ez$bk4c8p_`cF_xgdAL=>OH5792?9 zUA%pzhmyi9%OGJ($D|*-I~#5-m^zD@ML?zLwC>&c3P~k;Z#ybK{W<#W$;@+Jp-XCi zbX+*9Ki`kfy6B^zFGEYh<&%lm`Kk_IoFxAvf@d$&li*J?@AWp;9Q(oB5?*t7=c@PC z;eVAubtSjA-Ou(PKZOk6e%5JJw(eegz4rU*@CmUe1WI@ATlS@Kv%x^^(^=iwPotu5bk41Lps?@R^mB9nFD@4U z#|4TY!IR6`X6s(s8|%7^W6R|^@vEx^zd8C!7%q3LR}lLhQM}-S&V}7gtOg;*P0VV( zMJ>w}S!Olv=Z@38;Hb>%&*J&`czh2exg6Q@cu7WGmTbql)XGcg{&x@X&Ca=SKw^5Q z@U2S;i~+Tm`sA{WuB_fvuvW%BfoLO*L8<_32J#^I^8^Z#uU(6&-)X z`}w=iL!<8FE_}(AZN*<+yu5O8UGUc6UHOyZzehjU+a~nOs$BCXpEr|A_xTSwH`D-F)ry|5j+9{5eP4@Sl>8GdC>o4{~&Vi@-ySJ^}LE5#CA8W^M$1h>c;C_MYixv1-$>b1Ku)6Cq2 z7&e!jnZGzip7BEWvM=VVq_lPQ^k=`2;l35oH`{F9u3sIVKVEw>to?9n=gTt-w^mQf zk35(x*j`z)tZ3%hWT$pR+rw5>-%8$P++X=f^Qi#u%Xgnjp0CqkTw)1pz}!2yyF&f_ zGy5O<|0e%0Gqrp_mBH>!*Jk_2U7z+nJk|H_PU!r<(^)RW`YrRk(ST^qAKc2|>}A!w zk4eGBHgu~)Gs6|03+f3G5;_fLt5_d!tXp(<{(_q?Vm{w{>sF$-&bybj;O#Wl0LKEg zkCiPMkw^HLW;E_LliO{P`)GGN!-snlg^!0v98Q;(BPw4o#^&A(~$6#q?vA zw(Y0l?`LM#@3=K-ozMXRL?7$eH!;o!=kM;i$fLlp>VEpWAO}6U0w(+@tiZSHA~l+vFA{(^!Zrf1NnsyC$XQOF36DmbHafxxo)d7 zuZ_2!ej_Jr)ALdCS>V#kHy7_+z9jgS;=PqKn6ajp%3y|@^BC-2aux5_V*KO7^kX;6 z1y?4C9^M;GzBk%>Z*-l#aW9GSf_TQ-I*0aUOgFf~5B?TDpgKp*jbYp7Z``pAuDnb? zy0mTo*a$dG@pUM8S?_4h_;jXxiR;YyC9GE%)EZpO7{4(7TljdbIpg+woGO2t-m%O( zUDvN2%o{M{t0w1zY_*2^UAI`unf|91GwQx(QA?2Ei0e3f;MJP%yC$9C_hy)1)>?W0 zkA7wO+9f9iSr~t`y7((@JL)q}XJbm|Oc+r8J>|a3eV5}pXa1Sr-hX06@{PMXFV>wp zbxt?o^c|+MtWw^RU-DlV)#90#n>X2PxM1G&=;-GhmQ04JYWzmW3+CCsdE0N+v?a;3 zlFOe_;0t4;qcVrW-liA(GB3!KoYJg|4=*??J5yxRQuF06RwVOEIUX<-S`(+0L^3OH|yF!7cs7 zX5xSGi;qt`$;7@*yim6C=c4-MKFr?i1(ys~oV1vs$^2$|+v5a3g|kBWPS>WePLY+_ zcj!rE)+%!|zImKA^Sd1{Jl4#9f8?R7(TC`s=8ufq&VPUU@ZLbD6T2Gzm(AJ0d|#wMlv8o})9T6l*Ph;bey{w8 z%bbe5nu%Zk&HLQoE;i3MH_wstG0QojZ$Dio-EQC1d^miD&Eb{zG*s7U{xA+WbneuY z!uBPANF%P#H)DOd#$Qdo&UvIf8UN< zTMA6C*EKHXUCQ9^&w1d=#fn!mZBpmiyK&Fw_*WA3gY~9%!Kvw=%1@N8U;Weh!}80A zX6v>6`KkONHvg2g_4{exOXr>5`ZiGOcFVNPx6il>yl0qPS51wdoS|?iqFXO+X8iK~ z&b5m*if^2czrv|ABV)-6-U5~UzcI5<9D3+{-)jE^OE)oRwZ{6$IX?62G=opieKhyM zcdI88{;8a|+LoX5{LjAXf9DFB_J>{n!@X`_m0q{v_vdr+bG5Cv&##}eAe^DlxWfE7d|dqC-%cZ?;3M%)AQ<=b6-AB{<-SoZq=*T51i&( zdoX{W+`qhgSF5)+{Lk4};jhV9$iS~xk@WPP%&k0qK80UP|G)0~^J;2g%jxS@jy+87 z(^<3BPwY1?U~1P{o3=csS8=HWcNE)!htje9@$4VOnRoSPDRk#Jbmx7Ijb&dWa{k*I zhjiY9^Y=R(k**B)e_}8BL4NgO`v>=D@)Z0&t^d8~wYds&j6U}f#&uee4Z<-|MvS{x zoMKanlJnfPe(r%;V(LF!o;@u1xjlBP-nj{^jl%8xy{9Fv>&*YTapk;&=Ny;rT^+NA zrDg$h_3ufC=H9bj&=}K@R%$EXbaook{ziu*e^is=>i++|FUMM^w2dwP*M8S8tN(ZY zYta8y{r0YQ()7ZHMTf6XW%di$#5i%;<)X8j=i3)BmFG%ZPc!@Qt?{K;!-3Aj?ME)o zuG}|q-O71(4fp=>YBR^TeAnE=V9WN&>)`*z3ti6qab4te|KH8WUI+Gb|M>cFeM7yj zV%nqAu619H#2!epYdrWK`C!f$z7<7tCS>1Z{%PLsw;=EcXNj^b*V@wBzpvb~_f@4f z2kf}!{y6D`%(0ytd9Tfx9hA6X@%Ht5cl(^3{_ZuKFMq;&hRu<@|MD-pF8bGKROr9| z>$UG$|8iB|R%a~S|BY24Fuo!DJL9>k)N|ZPG7GdBJL_iI$ULw(#KZV>-}Lx*a}Q{U zng7qO?RdnpY{H7$H+FN(0cG47HYa4B{dC)RQzZ!&~Do@ktA_PqJ? z`dzP{YZ?{)uUzP{^}o%hoFg+IF?^}$J7@cUh0;l;CAT=ePTzQP@eQXAnKOG&92U<6c)!;?3>v-?e35H%Kt~F+*Rit7m0A^A3&{hP(YeFE?ITk;_;!$Kv{? z@7dp^|Lk<{Q{nIJ;!L#S-Dbjdp`q*iBtDB&I!%R)-tl*f3%J-6F6Qa&75{1e)-M)LB5mE)EzipRXUSn zf|b>_{SNFkuRm8@R9AB7>wBA0VRC$FQkj7w_iNUFQfneY|L6+5_;xpT)$`87i!VN# z$?)w}=ax!K8!Jslj>w4B2S4ri`E4Ke+E{h=taV}QRIBD$*~u}v{I1txN?{WD%PAwj z-%H%C;ru86Lu_`xBi26NvG>ITM`4Cm0p3L%?p_`N^%6C=uD;}Tm|+?DZ?C|D^NUz3 z%WnKvX1epJT=&&yW5!o~$NsUzOuaR~;X>=ws9&D94iwIw&^lA;fXLP&-3ws}OnWY@ z?)4Ada#6u6`NV5APlg{`X5O#-DfE^}H_2mjH_L~g_fOZaw3~l_=SDkw;RTuXOn-yT z7uTlWH2-mAwL?Rs(t(tpug;4*urev^S>QUyJ&Sos#DoRUek^JH^_t-B5qN8|4Ksqez`OAbtN~K$oASl@%Q)jGgm9$jA^uYKm9+)w8&31;Bn|mfANSC zrp;Ud%rh7o^5!bU9_n!Ym-Vq^$(^N#E;WUwSsu3)Zjee?dM|GM_u@Cj+!3Dq_rG8J z`g0~j?r&j_4W}&L7`p|Jj&vmvd7GM@^2)4LJ#szPqgU!U{X>9VI!Hj4Gxy z{a-%U*n~lVE#by$n~l~xTKOYcIgSKm`?$oW=4`rsUcA9+zJlgeQI_-jeqQ}sw~yh< zFP2Wt{Q`e}{QOz=r-pIGH_l1H_QxWA{rvgmPYt8PZqGs$FT6YR<<_km zU%s$MMAysSzN^3cKXd0_`D@?m1`Fw zWh13Od;dO=3!E4k>Atx>+)qjc8?t;{(8Ib@Q`s<73G1`;9)32B^74V!h6?|=7|IqsG{_vgO( zxp{fB40z7&EPgIA?dN%3j(Oq?7mjv|zkIv>{xa|BdM}fY_hl}f;_tHWnw7`pEkSF; zY6U+|R{1z3NQ;B%)TT8I4cBJPoY`yW<`TrP^8Ih-G(UzV440zTPFuTf-KU?QpPzQ9 zSoX4#!QtSasZ&MozW;8^P&Y00sshI!O*P0qPYgwTH%f=3suT{3YYkzO6jC1(l!`#sEVs808$)tVPtPGA_VYo8W z@=8?u85yC#!;A|TP5I>FA{@9cNI)=gZK;+Lr}6Qq*Lud~Q-TDI%XXbu61%>7^;kl+ocab;>7Kmu`(`JfyWH`Er zb!1HINQye66L|7}j*2kP^%__$(&4_2Zm| z2a#V`CuD1NDXpFIX|v91t))_#v;2%c^E6ZnMzR#J9GKLx=fkP&^?&=XMy=&z5Rkmj z5R$$1*Xs0hf20}o86uLNEmqp}WS#l)DYL{Tax#3a+aK>c>4<&Vn;H9Res0pTy>0A# zein;@g)%=werD#$`!{Z^Fr9tYZIVhbLt1Bsqh@K#%;_#qI0SX~RXsbie^uD(t?oMm zWsZM*uC2YFWrLf`YL}9Dmv_P!YZ+dj?^dap#t>le|Hj5-D^H>N`{;wk8W(Z>I2DFf_us#++yA~jF+!4u ztyh6V&F1`Uvtwt3FDf;tGIYC?Jh^I|{x3!5^XZ~l9c8yp6wZ5I8GQM&yVB)3%a=cWJTCwENT;y>8e_gm^H@0zQeK?gbmqIw`b%%iq#Xr( zB$CtS9NMm-Y(TEve%RyD{er1z{^4G`AM_R4;oTC?s>MVS=D@ z|GatgzA=VeHp$IetG@M`vDZpV!N`WWpT*;?3Lo{?-d``7+~&HEqpF!P@7~Vl-LGGJ zOk$a7c%rAVP}h`g7RT}U3dZ#KI?2hsY-@Hi9G&vuciq#alhyD4`gL00e#3P29T)kP znu55ZvM)w?FTXr7YpWJFH#d`mUfiCJ?f2`XEm9OL)-WhAY}vYXX9o|k_19Mm z1vYo6xu&?eJY&>hh+x_9bnWnUCq8{D(qrWlm35O{aN)=OipRXQ@9*thaQ*dFmnEDDlRDBEbu!k9 zyQX+*ZY}xq7KGKzexd7;jkSNoaw-MV#)%q0#OG|%kz*Q+%@({Wj3ZJG2j z37>XFEk}l>B0*_OBHOM=NGR=(T6^xB)!Z^WUyIBGE-4H%6gW1S_)0Rk2OjBlbLLxY zSFl2-ac6m6W#vpUF|m;K*FV?X=g-<2<*OMwqp~w2&PA*<R`q#l%A7CRfaO5x}Ux|6tDi`ODwF%{_Z&pW(7u zDxS;-RE*CH1S|-@c>hzf#@4kFszW=Xo z-PfDx5qIyo*?Uf~iajXNJVnwlaIu~FcQwJY+Do6!sFXXPW9%;+SZpA1WonS)tY!CJ zy;?PE{`~VxZ!cWvyqpV9*7T~3pb)9n5`=cnhihyRYTnQhxXu_y80gs1sF+QP<*MO}Y9xn&x& zw@xgf=(M2)G!E0;K${$LPTmzS6ZIzPUmifSd zvEg3b@7$I|k3@-8ReRTMy~b#KeTHQ?!*c&QR$t%GI{WOR(ll-RnH+7B*|TTg$l5+J z?WVxzP7cxg?u(;bH^;f($WX{JF}RqMwCU!N6p5rwH(mBd=}xO}U_BTn^6>Kge`5Q0 zR|>z4=^`@Ry0sGPiG6JV+o>MO$V zVe7SBck^Bw@Vxx>_4StUpi`F@IkPe_M8w6piMVQ=Hi}&vW}C)0B`7r6J%ss2HIt~| zh7%Fb&inZ$7N)UXRk-o_9@B!Ll@2Z+Zhn1zBWHW}f5Xk9|Bopcu=%hUvhf_SIIwZ= ze1DgD9Tid8ybh*Pyj_br&ds%MKRsRl^3TuD`4_F`YvB`R(2Lp8@cR1t$Ci~Od_vak%F7Zy+0Tv6YK#mIo}HZyvL$c3x0mMA%6Upkt}a|kRr{}V z+VD?K%vf9Le8zvH_0D#$v+Y4#lh3N{tNvxeV_aAKRm*JKcE$t0_+&OSI?TDN$j&rH zOD~M=VB%6|b_RwQC00wOEHdisSX5i0cF@Q^$HYLijl(8C6HCvdTSUMjF0?cI>3H|{eQ@pBa9PvmwqqKkZ5~SDVMpH`&A84ejN zIeF6a>F<49O%7jw*FLSB_sOPzj?vci<4^6g)*1$`S6&hFAltU=oO&j+MCp0qHSYu7 zM#X9@HIQwqc)azxfw^gGXtIJ*>ofk17arDdZHPS1`nlKesL8Y6`)19V6B52I#!bBy^QJs%%#nhV7kWa*y@EI&1G>2F8Y_gZ;!KfK*{R35Z-)TkA>gO{YpxqN~;6{7fksSab&Wg*Mkc>ek^O{Hf_*UIdI}86GN8&!!=Wz)`f6A+svUM zZ*%VVi&<()YddVx_-xK|vo$+j{r*>lgNgI7f%l{q+w+stHb)w4zM7R-U0uDxj*-Ex z`kT)A^XES=^`2g&Fh%}P^kqk;hJ>>_L9JR**NNvg`Lrj#kWAh)bEf3omnB=CSFXC4 zp^@x!@#@wnUN23fV=qj6ZSQ~AKKJK#fY()*C0q&$i(=3JUZG`HSji=^cM_A_rgJA| zp7;C0EqI0Rv!lyAhQ^MNsX?aS`8tEVE}8JUsH_fK-8S>6g|{+;i4^Zgn||xLeCN-c znPJiAE72A?Eme}C_|+B7;)jP?H_fY5P_WQo5HbAC&CSi#Al|lc{<4+pr*QQcPPOQ( zRr=Ixc@HIn6O@X?GPK=l?x!d77;o-; zY{5D~YbjgiEVXl!XRKSZX3A^fDZ3wRe5t@-FlEEV*I)N2a5SlSuG;rLoW0pm*1fFePUhIIx^S}OzAM;T+y@J(napn9-9(wH6{;- zplM7jimV2VaW8KePBFeO5qv~WW5EVCrWHHV=Q0@-oXWoXdC$BcEkVKLp2W3VC6X6R z5n`B>DyhBHXWpW`p3coW(yRO@q)N(Km+9=T`Dw(*#d2Sa!TF5;q$B;0cPJ^Dt}RtQ zy-7{5HR|;;!(|JnteRx{^4FOdoiB4ar{2luYIxt5+i_w_$C-}O&DY9p57@co*3Ic? zuxJWpYG+KyUoCf{=71N&;TVevrz~0Ct>1N8*5^*Gw%1Bd21DcJN{7CMMt(}2r`)FP zcks-{=asQ(?@}VgIz5(Of1RlmH19cYpR9FTGtT0JRrb;(hR%)@ z772z$Q-svNy0|QunzZ8=OTkx8mnCP<@J|2sE_?0P;5jSrzh}0P5U}B6_?EJ-!$%@{ z*-5u|=d#y6kDYUeN6=T+zVcK5A%mD3>u=~y?&*kc2Wo>u;JN4yDz39Yg9apwq6J?MS%uMbn3UdPmnkWN* z%D$j1DTj$`9@;%;I3sIc_~@(wPdeAq+%v7mFGl#@*Njg+s_%JOiEG7~nzA$gmqa|L zF-G2=)fmZ86fVv*hd+ISiop5XJC|PzIK#>@ZTd6?r5|6;$*%s{t)Sdg_MK&ODA(y{ zNeok>`R*DP{B<}tYsHL%Ex@x%P#ho=87DawKJD=i;8)8^Zi&zbZ4_>i(&Adcux^caF1^OxaFUDa^R5kkaI! ze9?MgiV{;i%e?2jjSt>jTr9va|IR*M#Z6~exgH0+Gd%N_brSo;E`~@pW^SLfZRZ1v zv?p`e?W`>B>iyXq{`|Rp%hQQLUV(PM_=Q-0vmV$t)8EYddx!Mj&&PE?s~VKp8 z?B=EKa~O}F^;X(%qi)~xv(h`(X1`hNlePtSCaJfs_f#z2R+n%i#)PZsy__vq;xYB| z_fhW^iVaWoO8=Z`C?IY=`uF`Y5_z^gE;{Cq!T07VUne#* z9js&6kpHY(_tXZC*{jX}U+NTI@84svKj6VBy;~P&+djDQ>HA-U`Uic6>n@9aH=MOR zGo7jWd6M5bUb}a@Ej$-^EBv^(FN~?tL zKM#t>n;iV}Z02Hj`=-ygPxys>YHWCr$WWp3Y_jj=I2MCxKYup&do@1#K2bHilGEI) z|8Pwro1*r!e}6o?N?QXiE}WA(E%Mj_7RCq`QNaV>+Z{gq+L&x`=EsL;XBGD<_luni zzOaOa!;Ec`cl)Ok+qIciD_eB_Se<=+R@=|B@8zt&J$SkIYrp6OSODfF*JPWyF zN(%X!w)@RtFn&D!`ug_<*5M3y%R3IJZ;EpjOo>ce>M-qKM(%q<2?ay8lw7WWb2q>I zTRz{c<>%V#{_}K#F7q?7JZ1=(l5$em+xGPG@{g}RK3)-4HuF#Wi^7@t*4on< ztl3o4PiHykU72@2cgDrH-#6aOTYUZf z?R4F*%?us8V)y(%sV2btMN@)T|-N%o|zv}1T{dL&>_e1{s=Oz8`Z?ZeM<4ZwQ zbaZf`%<4UI{4-8lZaar}GZ_@gxE)I4OZdA@Y|g%#Hq$|Y$0GCRZGp!#pWLxKhe$D3JSp9->U z|5>j$Bmd5eGc&qpF&+KFpuKGBwQsRgrI`L$C>=kebNa%|?-#q1j}-RQO8Fmnw#a?dRq+7M*&b;5+e{;U*JS!H4f&t@=OzUhQ}Ojgx2X^Kj`-**qoPC1p|6 z+G~?lRx*89ta0h{=g&WxvN;y+uKImxsrQx*8y2LcrI|3?|NeKCp<2t?%K3*q>}qEI zd}`fs#yCdyLwS?&7uNZ%C>jc?eD*`_WkGdS^*BG^M~JD5qY+3c_3$# z;>v?bhi}c0%%5w^eMxH4G7mQ9)y5Wg6L>h}R@)s6=%2p1__E2@DM1Gl3|0sSPM*0u zvH1S;sX@gqCjW1J`XvA4OnH8INzELU9i{*6-mP1^(7x?w;@-Y+|G9@gtqk5hN&nlc z9WjY1$#UI485&NBtT0NBF1=>Her}bWaoS?h^*Zt7dSF;L>UOr^c?ApD0^^WcP`r>5X zizFAFUQo5QYkGW*;CdPRzRn=SW$b|uub!5*RyBUVZzlhPjIaOMngl*LAIN5iyX(a) z+i>Ez`0aYTGk=UE=BS*==6-tS#M&9Rv=SAT@3rS)nRji)E>Xwz_ub!!Jo;m|_aH-* zrc7+i5%cWqvYi~O-800$-g#H@W$xFnOO4h2)^vKfxo8UVGVpA<)@Z+9? zT7Rb3|D5hT*Z9ik>3Xq?qSm?vif9Uc)SBuwajv)7^V+74WpR~nx7zC&@AvVX_Hg#s z(lx!B=N3$H+8lTMwEn)1_cHc<8{+PZe=asU)0&+AV9Rs&#C;tMQ!^JBy;W(*o;vf< zciWlvN}P{W9JgOT9JagnYZ$lmTCr`rV~==lddyMPVWOaPrHR4)`SXv59xd|qm7mCR zdoCYaWZV1QFB|R_Z!FfZ^c47W^?dz5^)C`%Im^EO`}D~uYwN6{+1fu-lq<3}H1a)M zy?*bv_1{lB_oy;F3&@8l-;WIF~fHOGS{ z0dpC(Hg5|}cQ|OGG2_ncpUPH_vzB#S7MUBzA061z`!;vWB96Uv`zP@HF02+7e05bT zE+Xbgw|ig2(G4zVdcu}B*G+m*oqoP)ik43A&!1kJcVeSggI$^bvEwUe+Z%?bZ|-Px zeK~TZh3$cGV1mmkmXPePRkrc3MD-ua9g%1*+iv|NKy$BV&H2L@fBu}fG>&Wbx~puS z(k;0Tx6G=-Z<)26cA2oI_rR7we`SSi=1BfqB@1`ti&~#@D7a-iC#?U>xu1>FUk|DX z_%O^{Z8q6`h9^IV8N<~>`~Tl__1MJAvrXZom_df)14ozL{`^dD?QB(q6dYOGvKr)_ zPK*3G$YV2)rBYZxl*xoKQ23khWPw=>28E}$zh7}CU zo*T{Y$g%h{_v%$Gxs7%QF9_(QKR1)&4Vw1pO-z4>+>E)=6fs1cqP8k<7`X(=WCU3hfeM-^lIj;pI|H)2bFL=kd zNaF30O|AVh3_09o4GobEVvJvv9Q61DuF1w%HC$&*746{a`rMgZ{`Ky6b=uEYEx9Jo>sH@RZaWt!!6cT*o}ghX zRdjOu{BlY5d&ggxJ}cx=*Lg#MU>upKBv%6>OsdxL2cdTjlSh?`P%s;sgDxUpw zlR2*OTya|Fb&-NcM>sRLMsYMbY`L~(N|IorprKOIspDdYa^bT4C`li3eQdSyh=#y{mD!vv><(hgHyEDS9oWvW@7*ok-_m9cI@^vH1T7tuMXr2v^*-b23%l#MZ?0T(XnXd`nV&sfA~cUiW%D&TM6DI`n`5!DJJ4C^ z!JnU>i~jy9ZAsJ!6ghe12n(};%an~CY`d4g`@p*~`M3Uro$W3HX)1aWPU6R>SUdBY zD>;*kJtiR7cwU$w8|=NIwxf9%$Xg9qZky5$qyq zEX{D|ZJ8>M^Uk`zzXEKT5?C0f>%|^w$2D0*rZcz{h2#4WA8+L{mUk%^R&?$4jI*Z+Gg|6ljby5+V?uev>iSR7}iN`C)c8y6XQv-H0rL(Gl> z$6tTsH)KBiSHTi&`=xx z{gIK3GZua>*E6n9RQ&l_{{N5v!n<#0-u}31`IIj9W=AiVNQt&P@4u_++Z*#S6n%W; z>Jq3DD6;XI)#uv!38|6uJCp=(icQpIn9X3eE_Uy)(-wW~ixmVI8s8^pCNg$!-dz1_ zcYXC|HM{+l!f*4+;}tY~=0z!guwj|Ue!tVnm8C#aW_QYFc~)n`UypkyvD}!*)PL$v z>r6?I^YgN}&Q{%J>v?y1x1>7fzR39PahGi$soE_4aPYW%^JX3XpHiuHzvSz_EUstS zz?cy1vdtxBcE=)})4%q;=ihQIQp8opbz;n(3d8iPdJGTVZofZm>sHgqh=_#y-;LA! zw5EFbyI6Ux)Mb$NT4|aVCq8lO`S7r^Mup{B0uPQJb=5h0_U+5}`^p}(h2`BjP`3PY zfPjdXT8`n07@;SZ9rcR3WA@mpFtX`d|6-p#q2lm1M?Kc4ew$DIPtN3<1XQv-c_pmVj`06fy(Bj$ipIw#ma(-*R3-2;8yfN9ZYuBmSvuCq8%vzSYW@{hAmMzy_-?-^oEPCM9 z*45$lp=^!|@9(;3WpCfFym|AAe#V1k+qw^L|%(QBJzVOlS z6)cURT^(EkJyq|yWEtjN-LhH2WB0byjaL^uv=#e&IPJ30eZ%LDi{g(=+j2i+>xO+> zQ;P*ppHX*;SkHXs$J2KCLn)Fr=bPXEzMz-B(d5&8`KRrV1HH3lmu5;adzhP>pMCX8 ztH0}iA%g(Jrfu8Q5+$Sd0E3yHLTXzW*X7HXBj(I^ z-y5atQhDw|+45%p{XdxG>;GA9yOn$UWSN)#{%qgBsbNx%tecsOg`F;0^T6Ipd&K0u93-vjgBpjsL z7Dh%#OJ~>1WpllyQAIV}!ru5*a^A;58G(uzmV4%d8Nuj1=i?ZLFsjp2FV z9miU|-Sb2~Gp_!B#Ivbxl7n{Y^e(T1r;S+Vu`_Piy0!KHx7YE?-oX|7@{jJj{KI`F z{{y?7e|x3|t!6N@Ie*%{KHgwjI|=sjugD;A*-H#!ybUuJEcw~J%e znbr>8o{fqZnjJUZbb8igCA9p2=GxpV-5!E=$5gK`?|86v=~5+EYknb9C67rgdoA3q zykC6xrNXPSi`|bEC!`*GV88Fz{sjilo{6R0WIS;6^#9|@#{cdA-@X6P{{NfwY9

    e|~y; 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 diff --git a/launcher/resources/multimc/128x128/instances/skeleton_legacy.png b/launcher/resources/multimc/128x128/instances/skeleton_legacy.png index 55fcf5a991a78c85f1491aaac2069ba4891374f3..416ca66e0e5ce932f3274fa42a09c8eb0451407a 100644 GIT binary patch literal 2882 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 diff --git a/launcher/resources/multimc/128x128/instances/squarecreeper_legacy.png b/launcher/resources/multimc/128x128/instances/squarecreeper_legacy.png index c82d8406db175e65b2f72bc93e8c58bcbc669c06..b7e2bdc1353d6cebf4d3fb2dbcb06d488170c1d7 100644 GIT binary patch literal 7099 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 TPmX3_U|{fc^>bP0l+XkK=qn$th_AJtg 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 U5?|yY1_lNOPgg&ebxsLQ0HO*O#sB~S diff --git a/launcher/resources/multimc/128x128/shaderpacks.png b/launcher/resources/multimc/128x128/shaderpacks.png index 1de0e91692d96a16656236d7dfd18757750bcc83..d2f1c03283673bca465492339ee631c365a61eeb 100644 GIT binary patch literal 10629 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 literal 12390 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

    -Jn}$VaHtw->=VP`H`o8k5-)WsK z8^52qbmaW&+vguU{O^D2dp!0^?UMUU#gFQfJ}MVKXM7-j;6F>zW)*(I*E!AOG}3^6k7sss2R|Htw2!%Th5v@Rv+Rxn5}6%l*vq{es^`A`AKdSU>3Z z*Es#5xBJaMAEV`!&zBjjPv3aK_;b-;?$krVmCv_X|BN~jG&AYlp*Ppa7$r_)}|v@O?ozhItz z=?CN2_a5K-Y0*Ema;71t(%b{`jQ?4GI4k`5ec$%XbM@KXoE%+0>i2!N{~EpM-;oc& z+(+VO36v`2Gc6Ei+;IIJqtluB|8*F2Z2nJrD<^YVB&4Zh@`xG;|AL_E zvoAl`@F&-|UbuO>@Ve9Yi=OQ>dDDQ=eZU9^VpdDW9Coxd$^$>DbB+1|H@6z z=h=V1nf%#6#j;?%N=juI`#X8%f5AZy0_>;#`Wd5VTiVor_qWWUGw*G$9?PEl{n^qv z6<>QEha}jjzIy(0=c4Z`8|Qo7xvp|1+rBvLuW0bQt2)9_^DEv~FJ-Dz?;Z2Ly8rt3EVCa=>)ln^-%X!9bH1$#FW<}GOMjjE zyzq6f<=>U}=O6BUe&wsBOwGF+^R2`Z(C_v)4V!9bmiIia`hVeo z|IRwj*nd;<=KudU+eV)Cu;#JriroLFye^JC5d8aVh}HE&^Z(cNiGR2i_E(d^I^{S3 zqsaNpQ=BX3Gp`Bv{x2Wnb8M@JQ%E)g1A}UbYeY$MQEFmIs%}bRNh*Vpfq|v2p^>hE zMTnuXm4Ts^k%g{-xs`#z?weNkU>ZOwtsuG>j0_A7bPWu34GlvKEUk=^}%*!mZc`==jP_;73<{} zrR(QFloabHRq7Te>Kp4B=quzGDG;N>$34JD-$>6;Kf2#08RkZa^9Y2(lMJ6%3=9mC zAU6i*rrCgQu&X%Q~loCIC{$#4-Q? diff --git a/launcher/resources/multimc/128x128/unknown_server.png b/launcher/resources/multimc/128x128/unknown_server.png index ec98382d47272f9cebceb0d2aa8e4f187fc0b54f..b9761e08f12acc1fea97801bebe4a2c0bb2caf87 100644 GIT binary patch literal 6726 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 N<{fyb%BZ literal 11085 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 literal 1270 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^PXNr}OT51_lPs z0*}aI1_o|n5N2eUHAey@SXSVe4$=$8F~`;(W?*2t=jq}YVsSck^6BiDQjz2K`;XsA zi931b$;B<1LPD1$R6}~Z*}7d^#P9CVXu2@>E@#v4ycll1Km0KqU0n)~+yYwml`ITv z+2*O38>~Jv>Dk1}r)lr*RQrj0svKcX|86^9|9R?<`YCh#b)R-UUjN%C(NRRYeeLnY z&-Y&!UfInY()h$9r%%-CLCniDci5A=wckHk9xrwE&5Ydl>MD14xlOG;d+k`h{kH9L zHCkHb4KGw4w00Kj*BgDlHFbN_%2fG@N@7d*&fjof+=g@8F16kJ>;H!5{{7az>X-I} z9fu!nytuNpKkfdGs+;FyK1_@dc{=rGVwkwM&C1p-RZY*1`PP*bHGTVbbHm3kY8N&% zc(XEV3wy7g-uyE4y0~kIp+wvqsYkbNbI*~IV_*%vFp<@G)0byiRVzw3J**c**w}vm zceDHbKB?u$eHSTkZPc({E4Tm7>Z0v;7K(G9Ybc-QQ+L9B>hG0#dp}KPZQHce__UdQ zqEKLnh+wLUctPU66Q^n>2I;kGMPwITd$3tK<@mDs%v@p;UuM<>-eFMkTEs4S^w6J* zw$-bRMT|7pFqU&{xF?*_UVP2q4P(e87Z(A(Um~ql>W@5g|L+%#V4<;Gi?1Yje`zzGy>N!q_EpC zv~E!^U_W0~^E1h>&o@57V3-#=BGZ!a&Rw&|Ru^4+W(H>0Wp?(g~iGj8=i*$uT{CaNgLvDUb zW?CgwgQ2dWVThrLm64^DsU<|iEW<5~3=9k=ASd}`Ca2~Vr!r)eloVL$>x1peEK5z! z&&|!xE7r>|O4rYUC@I!=5Ae}9(lgM{$zodpvk+nz0WYzM$MiEWFi3zb49+htN={|) z%quC%OfOAU@J!CnQwUBiS*O0xo`HeE4WTAJG{^_$uHwwxf}GUMyuAFf#FEVXJiWZs x68+4)l++5nf{X(Dg2ePxTO%X2VzA-1MrxTUwnkGOe;xysU!JahF6*2UngG3S1W*6~ diff --git a/launcher/resources/multimc/16x16/bug.png b/launcher/resources/multimc/16x16/bug.png index 0c5b78b40bb508c4b5d9e26698fa6eab7a48ff4b..d7a253f232bd7f8f6fedf7818fd218c03643313f 100644 GIT binary patch delta 594 zcmcb|`ifhmIPh{h1!vvZVgQh6N{2z0TMg_55!A z|Gz#eLN9G3`-_(F|GC2Rt}CrW?AJjlGacrFzzFq<%`B%?eowh`LdUL~{e4b%ldwNlUlsqy?>am4c5~YV&;37VeAp=Y z=DFZP4mOLz!>lzE-7lQ!sJGu0dC=`p%F&Zo^|fMtxJ;0C*<{Sc_p#~o-v=d;{RK_y zUlcGL;E!Ct@^P|MPi{Wj{OgTpb05t49s6?9&VJUNDya`QF<4w@-?q)Wlljk?25yG5 z6wYapjk-Yx&xLtzXu^)VLLCFcSwl{oKL|gm9Hf;BO z*1y~0m1k@0R0Zo_I%`sos48DjaG&s*Grq#P*V(i*!I}9+jLOrV2f(}~o z{k_%OtE;S;K0FoQqgx`r?`K%=v!z>ignB!>m@awYA9-Ckv2^|8N&d^FBi`(v&?=Yl zeF2yI{m{gp)mb?;VXcyE3v?K=Pd3e2l-Sg+()CC#Yu)MBt+&Dz85kHCJYD@<);T3K F0RZWTAwU2C delta 711 zcmaFGa*uU_ayF1V2~_vjVKAu zPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw{mw>;fq^O7)5S5wqPKOjug8=^fn)Wb%kO@_ zd$rWQ#M{g9mC}rQq&ShyDbncdJ*OuTL;L`ISk$;n>$j zN<}d)S*uPieC47ec3WS`dJ|`L!V=GYW|C@A&MEa3GAwZn`?rgnNHKDLS+eVVY3#Go zmv`P7sHqg_^R5@G*W45TNTa~p6Z&8x$f;Jjn+v_!#;&f4j_E(JQD&SYM!cjep}K|?2-sY?VJ zo*vZO?xWhU{qzNm2}UXn!K;N+_Wd*oVY0|{^f{nu@q?@MqzbEiRt?9gRJo7^>O6uP z4C*`$tGH1~9pH0o8osS|6pRKVv=aR7dfc|{V(6u=QkA&y@ ztIBuTm9#7Hoq6)VQ{=6L>*~Ha?k{_fORU+vse`AM<3;t$k4s-TDmAdmtHtd2cR5k* zeL%MR%qa!$wx#Fk96Fn&-p9Q1Ib(9>i>#n?$C;c08*AB?ar1efc6|A8e(Q1Lbq@9$ zuI>0G9iG@3lO_Bs`oV6FK=+e-gXMG&cC4Cqtz*@$%ry~z_%7@abr1c?T^TDWG~H3L RiGhKE!PC{xWt~$(698abG%ElA diff --git a/launcher/resources/multimc/16x16/cat.png b/launcher/resources/multimc/16x16/cat.png index e6e31b44b25b476affa6d4db6f53a2aa40add758..47c449549e1de162b928dd302956f539f9a2e718 100644 GIT binary patch delta 683 zcmaFBdYE;BN`057i(^OyW9g*B^Gd=++^^qzekXeSjk28EWom^+{g!?53jTt{Vtz@t zw_Saw_d030*0t^b_M2KBD|>xf`p=Ir*~vXqUnwaa`meYseQwEtnOi6GTXeroFT1(z zR-FCDd#mc+9Mwz|*l>K?@6CtrNVp25x!x?TD)$z^ww%cOA6z~Pd1y%a*@|Y@?b8!?(F}vC6^wfNO?9RXE+s)0#%d2w#wZCteUv{@NoMF!@ zg@$nd2h98a{oEWK_v69F$HCq|?dR-z9&%^FZH5nvywW6ctC+md0*VWM@?bd85dd>$X@sP@F{bK z3va)!5IJs9H9vUq+qCk3QXA|;0=3;zgGh$Br2qcRaRZ3Tb+D zBO@_KaKnCWB{d$Ats5WxI4*itR8(X7=^2t-PW7D!!Y^ffSLys;TxpyvA$aidu~T7I z`AwIcR$pXsaBWoz)I59XaZJ*}?}`T<1Z6dNt~TCdJu>NRTHLy#AF*6dSPp1=_3sdW zXxCx%-y`Xzq1X=DBF7~R5-T{eg0_Y|-`w+|aKrqbGYl%HgZ5Zyx%}+7GbOQD^X4^4 yGpz>=ArtyklvX$WOSs`Rx6Jh8l0uo!+=b~93uZmt%FDpOz~JfX=d#Wzp$Pzy{8qgH delta 712 zcmX@i`hazUO8s(A7sn8b-qMNw`5~ba?eo9eKEJnfZhgs$t3k{?Dn?vhNxjm-oi5Vh zNy0xF^6u;?UnqYd-|^0b4J8M;%$=lq1qvON7lw5QooeZGUhe!n{=Mz@(!$P_QGTD) z)YUEh@7@1geAm6dvS4+;=ee-;y&VM?1TQZAE^c=#GA82DQt^5}x%a%g-+yJ_YaKU7 z$X#%G-~NN0%Ig)>c)qdal)d}7VfVodBL{(Rhwk0p{{P3vPiJ@EU-~#FqIz@Xw_pZ+ z4vvuJudbZB%yDRr#@e63ODf%#Uw51P_}1FhXaBS(8rANb(zA}ky8HHeQ3k;?3M~vQ z3`Q-6$#X28&Ckx-UH$*_za{n62jk9H%=!Lsi=g?o%S;P4>8BU+N4Bj}Qd(aBuk`2Z z`PcTG(VMf7$-)KQH*D0Y^RV^xf6kmgw|U2gl9hooQ=k2GX3&t3P$@k0Yw=cp zw#VxJb2)+wXBMse#GkOu?z*Mb?U)=Uj+f?CSMCjn?CFY9 zT{&}=@quUQeSfc6l`U&=SX?M!+-!2!xuGhgKGSEq^xMA-2V9P@7z%E6d-`GSu4!6a zSF%jc@USlQdh%Ma()9GD|E=c6JkBm3cDS8gC7!lopGC!{XbS;REtRVi+RJ0pHhwpp z*e@99!XoJC`aw@=YK`9aPcskC*9o4q$ZZPeOO=CbRd(*56lsw?(K@h8NH>f@)X}%f zOk(Y`BljJfa;0`Mddy?rWA#cUm~(05;Xam6i!IG`A2cYO@R-=QK)NmWtK>H$e~-&k b_A?fyODs@W$B@dvz`)??>gTe~DWM4fo3d8d diff --git a/launcher/resources/multimc/16x16/centralmods.png b/launcher/resources/multimc/16x16/centralmods.png index c1b91c763d1e70a9fc36f4a588044f2cee3d81ea..cd7c10f3ffd48a31cb9938fd0edece1574b7dcbb 100644 GIT binary patch delta 537 zcmey#v5{qhay{b@PZ!6Kid#$jn9s~GWN@)Io+Del(d2fVg?Hh$``dDFgV5Rj?PX@O z_k6my^vV9?g^SJRHRWq8&iQ?r$#8wD*w3}|FZRkE(G(8*QXSDK6KdD_qW(ebK~Af` z{4I5%B`0Sc>ObN2-6?IBdfm5kF-6C=%oTmG^!tVIjOwMy3+r#Pa{Hdk`G42Cc!u}6 zndKhqZe9-Hko?<{^ua(&Db7($Tq5WEyM3n&+IK!_a&3Py&zkw~3df3H6^aL=1${l& zAMAbVBvf@U;rBEXSCuO51E-HSr?DT9c{a&=+T2Oy2W6CM*BH)S&AU*a|51hJk)K5! zF_JFxHaUEs{3TC8-ndn*zT?wImf{)S>!Qj}HmY)e@OkaF?w@2qX`VpUVa2|qPIJ22 zEqo>WTQA5nuDdC{Q!PAW8~d3=y`6cNRoz4M6jzi8DxNIWxMIz+&rjBAx?+o?afh>* zfYsCkQ{!A4e>t`+xzd3f**2OPXA;%_v-tH+<6xY8;WKWO%W{4cfFRx zbkO4w*AngZ68=khmajcfWajwivFJ|u;xj)VObVS+Du1$KN96toH@oI+IQ-<^*1svA wf7+%5zfde%{@~}SGd=CIdG?<%`mSrTN~q4vvHf#A0|Nttr>mdKI;Vst03nzJr2qf` literal 1145 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zU@Q)DcVbv~PUa;81A{`cN02WALzNl>LqiJ#!!HH~hK3gm45bDP46hOx7_4S6Fo+k- z*%fHRz`($k4nJ+y!GsotAb9kYHJXV>-wYU>tL7?O_H6 zCL>Q5#}JFtODCQ7zEUW1)c*Uqe7XIFXOsD2D=>vHiF42lqRQOOY5*|A{30{aCE zTm^EYTpV}!M!B@GE_!=tlZ3F!lr|<4d4GnZ}A0hiA0ro#MM9_-g0j0~-{ztR?Ohh=kf}C9LF_=B_!j z?##kJnwLJU7QD^Rcyvdgzz3FQk#}~UiJo(AB(UfH?fr9NmxGt~qs>!RzLC1;uD8kD znB8<{$45se@l}4iX8dG%_lD>FE$biqR?ll#S|O(VV{cbVieXgY?03(+L#~803bX7N z7d-msPn-3}&UMR~d*0Qz%-zU3Uv(viR?=^q8+Hm2XYNe*n)9(bBW6N?%wZF?X$N`_ z*1QwFRNOVaD@N<%zts~}H)L6OrCyYXSn#qzJce~<^S_0Lacdr|(os3Xyp4(LLQ&W{ zdCS~YX)Zqm5-+iy;@_OP`1*%Gja%gN4Xy`OiT}uAbUtunQTB<+*FJ7jU8Y>S?BPQN z-~BRYc3!{oY|5+3+gq&_ukCy^f6{)&`SW%w>Bt`MWME)WEpd$~NiIrFEJ@W(Ni0ca zFfuT()HO8JH8c$|G`BJ^vNAT&H88g_Fxd9IPY9*~q|yqai^0gi&_LI~NY~IT#L&{p z*x1V00HUFMi=Y#VhTQy=%(P0V218v#!w>^YDsBf%ips$c$q(F=gANK$s zeIq?X{pfz1WSAQv&O-_X12bI%V~`t7EvyVpbPdd`3=Ce{M&D#$U=RkmF*v`pC^?nE zzoIfdHBZ4aIX|!Xjl{Ya3=9nF2NF_ld%F6$ JtaD0e0strIzo!5I diff --git a/launcher/resources/multimc/16x16/checkupdate.png b/launcher/resources/multimc/16x16/checkupdate.png index f37420588e11fd5f96862adf69e83627f3c7fb9d..9d08c56f0798f4b7664aae50f8381b1058acb6b8 100644 GIT binary patch delta 718 zcmdnP`IL2nay`=;PZ!6K3dYjO%oCJ(MOuP?-!?n9E%!Fpxox@CleXsG-j;iN_8QSI zXRX)Aty;bM_tJfa><;{fx9uZUAJs4VTy$K$T0$>fp|p18^`IkvmuxjTD}HgCxfQQJ zZ${{|+NkA9KkhWLa_8NDrcuhc;_dH9jVE<#$z>W3lS|9W7DNWsH-;4o9{H(w;!_>d zb#?Crn_i#3qsP$pd*z;Ot3=kW)tzuMWy$x3S9?6B9FSNGg0=%~?5r;o`Ndy;m&-p8r^2{&Fk9z{oi5HznuF^SyiMKS-p{z+H_YTca_U- z3;t*4(;w|R7xAK^@ZqcqUdNj}mZ>qO66!nG7+3wPcF3K=CB(D+K=>B1YyIXA4^GY9 zk!!>ItuX!J#4=I4ndKK1bJdpn*m5|fJ28Z~a|9-AmTlb@BXaY7)54cYD|Y5K1=l}{ zym3U%Y4;XElP6PFhL_&IQW#j?W5yUD`Ag=eTK0s@9Ws)?x(j`aReYTI4yYuFtLUmu z&`w#PxZKC~t$!BZd36S@2#3C#QYn&aUD^&B$q4bac)nnK65j57@Sjy`E<_SF_PngEH%Us_2X6Bk>k{1&)Dhul$3e-xLO?)1BKZs4L=+u?Vb^4d}`)eoKO$=|b zaVxdhtHbk}C!{CrLD#{M6+6}*G(P@w#gr6Bt@jGceQfn!`R6^i`{~}jc-wF7Z=wH| zoL>EB%74yn_x_2R`=&o!`B&-1?>DWP2MUW$T}i&Y_r7Yh+`pgFj21c#dP}>*;{O-^ zd*vQ&@BOWtZF{`gjE?BE%MN}st8RV&Xj*rnOZ)!6ZC`Hj-|}AnZ^Hf`pUQ)-eU8Ws e^sm08y`*X5OYRr3Zy6XE7(8A5T-G@yGywqmFkLJF literal 1212 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zU@Q)DcVbv~PUa;81A{`cN02WALzNl>LqiJ#!!HH~hK3gm45bDP46hOx7_4S6Fo+k- z*%fHRz`($k4nJ@LmUDMkkHg6(GT~0>^ZaBfvQ3*xJJk z49pCkE{-72C#NNSj5We=)s-4VMR-emfD5P%O<%=XV2_W`~3CZp6~DW z>SZ}=eq~QD|1tM}V{waN+wYkbck3c=?O7!v-Wu@S-G3(QKlYCb2cPHP=)G?DZ)a-i zzZwhkuel+bcR#dD5nmKAH}3vYKUvG9FKrKw+@9HaVRfIx;x*N(?`t0mUWr}8`QiFB zjkuj2iDi?ri-W`6_kF8+|LtaDc;){GA6;KAF%#@pXZZ0bL8hUtdhUh2JigQWrW`K* zeSc}e%b0if9L?Oktsg%4Ew}Ie-A+~Ao-U7NRvW*HHC>W&tmHeSb!Yn~-UO-DFE;SG zH5=M|yQ2N)+u!z*XY*2y{cU~vis|(~t4wpx4;9lkPHw(?obRj%qYA_7{fqMFDT}R{ z^sZ_~ZGPRUvyXJ{pRMnl&vDcCgN;6~eA0Je{Y_6_CbnFdZvQLm{Jmb5RgtMXKUhC~ zsTrg1mUvg~O*jwVlT1&wjcZxXzpH5H4!2*tJl%S3>}>00|1GN1-aJW|&vGH^;>E0s zvvVKM+-J6lIdzwH^#+|4m8osTi;uhwYb#!SWslJ`)@b=xrBnL)?g_5wxUl~5^%$w_ z(;`{gTehdKs7U?v_wf-O_J$cxC%l(m{%ES_a-%|fuFpaT7@V2}gj!rres??&@XjDp zz59|PgID{KxjN1}4=Wt_-kfXJAR?rwa!H6ov#@1J;QHdskL+pUew*{pvoD#u)?}7m z`hT0gDQ3M@b5E>Ll~&wxtug2RKPEScmPYrjNrg|j97B%sujYBX=He`#56x2C+n0GB z3%c{;`TJ$^E|VV}iPjZP6zGviHuJOG!g6`<>>F2iPc~Ec41Xo~Xq&TusYdAf;OrlN zO4n{s)4iF_y!iiBHpA2mmy7pi9{Mx$>`b5T+jZ6xJC0|tDK7O|T6wzEc8cAH$Lia= z`Trc-{YKuqR6A4l=!EN0`ICe67$;8)d~7efT8!}@>zC6>>Y{14t}!q$sFt`!l%yn< zq*^5xr6!i7G8h>c8t57r>KYn`7+6{v8d({e=o*+?85n&3TET*%AvZrIGp!Q0hPD+4 zb}%q7n1F2X$xKeoD^6v|C@Cqh($@#um06aWoS&PUpI5AxUzDz&15r|}?;hZzZ=`3S zpOeM5f`NfS7^FWqzqBYhmBHQ5-`7>wIX@@AsCd;(mq!c?42B5l_|PC9xDEL!se0-8 o`RO^Sddc~@`UU#wdHK1iy2)U@`T??AUxNw{Pgg&ebxsLQ06*3KfdBvi diff --git a/launcher/resources/multimc/16x16/copy.png b/launcher/resources/multimc/16x16/copy.png index ccaed9e11ba442b10c50ffb18c5372277d1e0fa9..24251adcfa9c718f9c63bd8c016bba3b44eef008 100644 GIT binary patch delta 370 zcmdnX-ordWxt=lD)5S5Q;#TiOUoU1y0k?SnbRnY&zSAt5wcjsbTa^BRC-PVWn@!Wb z1Hvh9IYlH3UNf@zusa=MF?qZt*yL;rlc$^rZ%F<6U+Rp%4sh(S30S-#T+z2)<$!3H zSOSCCxrr*AorW{2OgDK6zW7>oWUrUNhHFYqXRCbYJy&?cX;nX$?||k9-vi9+8N&Ca zZH@Z*HSO{9&pYkK5?1&(_=w&q>YS?GnzhbV;j|Hhr^1P43Y<*>+r*@`zjQ9WzhI_H zlSa>^z3#aen6_$itra>R%3Y$&mGonSgLyC4^wiGczB22jx6iIHkkfDtxavE9*~-qz ztuDS(KO`79+{ok3TYfn`TS5Gwx9mQ)ASU&Dzc<=#%8hJUq%q@;&pkPLx#bPQjm+~h zB$$$G^M6`#o=+=(U;0Dt#LxE6ck{x3+SZ+l|NnFAhp#D|u^ayXXjsNSXC=FsP2wx| d0LKUX{xkQ>zFfSLmw|zS!PC{xWt~$(697Z5pwIvS literal 957 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zU@Q)DcVbv~PUa;81A{`cN02WALzNl>LqiJ#!!HH~hK3gm45bDP46hOx7_4S6Fo+k- z*%fHRz`($k4nJu)P6cM!8Z8Q;=X;fnz$z5nvp1Z0%tN z2F5Z^7sn8b)4h`%v!opbT;s2Mh>2w+@3~~?WM zoOS+rRLg>sDW8H|nf(6!W?VP#<@@)VXR;#G>Qhbs9)2irU>k$+YDL}!28X+nxC_^s z@3z^nrjYxL!rGNK>?dYNC0t}ISB!Spp0M*D&mQ3my1ULjmQcP|{q5VYH}Cm9Ef_bl zFOgXM>+im7b>^>5slj`{_Z&}Vkdv4HQBzyXJcXhC0Q-YAmhmc?J7co;#%Uj0aW-x7 z?)Y*qP0f}CpSwRtKQOg^2j%h^Ekei>9nN|taV5n)Wn^MyVhGXTweo`l0|P@k z$Von#$*Fn8sSFt0M(^K;lJd^YDir+}Ad%?iKppKA^4-N8x`J%kMTrVH2S~nA<8tjet S=BrMFa*wC0pUXO@geCwMO;_3g diff --git a/launcher/resources/multimc/16x16/coremods.png b/launcher/resources/multimc/16x16/coremods.png index af0f116675630adcdc4618fc718860b316126f70..3d3932dbeb1061ff4edbb0fae162ee7f44425b9e 100644 GIT binary patch delta 629 zcmdnT+Q&LUr9RZt#WAFUG3fy7oL8ci+~2G9VvE*3zkKQSU;EpBX>CSj|JA53%h?b&VP1me&p?Kx#hv-vFoyK-??8}zBRWxc=q(ddn%J>`c3}* zWals5bCQ1)?`7m4eLPA1(WB?yNuL(JD-Yyt^7;~ceSuxz345ml_3E6LmZ$%Jc>B2N z9KOTXKQ4K~*cYQ|b8=FRcya6ToeJyD%@Ybqa!K6XeY*Yai*#e|7L^He!x+v6CmIR! zZ5Aw$e|l0V;!MM{RTlN1&Pa7}1%1|d80K|LKJvfQ_j)!-jj#LK=j-0*nA~D#@YLvm zp!l)y{$rdO)0)nlSu>|-KL=a=~@sn5V3T_Zhd-=2y!muk(&tr@HKu z|J_|*U$0uD!Nv8Yt4T>TFf@FXWX6Ywjg@mQy!kcra2o%dy`R?Ku|Kebf3o=L^J+4Q zEwfs5+qt|?tlQD2UVgRwzPx1lXQ?!^%k!eYpZGudU(DY6`@2lLloE_W)AXlng)gXY zi?t|XRcc^yR4B;!{5v+DuO^nKfvG_A^TZvYB{H51m0Uu^lzN+3ro8B5R*607lRasw zW4-^`4eO?h2fp1|`TObhpo#N6J6{(+Nn5g@h)dAZXSU$i<)0YOs?Rv&x%cZQzgi{* z)9uv=AQoR z5<_w;{!L?JM{*l}f`!TR5-v zbs9EK-+rCl{224~%vFok7X6hKyYCu*`K$%!`xv&9B^qX=h-&i)Z7bLp3K{1nQY0vvZx(rdBi_5OjRM-zq;e-ZB1-#@+FlJlz#9DoqBPSrh=rSR@wwUGfT#MrEBMS*)C?=^xeE}(=Fc8`p(OfCzSXuxa@cT z@3WJCgl0yqPhPiXn#sTH@JXyp6JE6H^{xAs#^|LNzR&dP?5JQSr@G%JDv`k%hCkjc p|9*bId?CN7@t^xameKney8ScS9NVI(;Hgx1ViKyXRAX?BvQ<`=*ub`o*x6aqfRd_E#>a zLvM%dzP-a;ciEnKId=b@cVGMR{mrZ7xb0eH^FAqsEIc>eNq8-zdcA7KAJ4r;rnC1& z?tHvs-np)`OB$IE2Q7K7V#vMZh?C9kl;v{2pI!NUnq5qLDIe3c1v6asB&`*lYVG?% zReSry%2SOO6dp}I^5^KTl_h6fY6WwR_hoL0n%wJ<%E0)7Z~1E9nQU|0EwxQAb1zqG z^1ChO4(`S!`8( zW2*T4O@$d}7cCOren}vzkXcdHFaCtSiIb4S&1tE(&CC{vwDxx0>zJ0B8DMu}-s$r< zi{44v)6*j#wiB*^8=5Lr1>^Shyu=9fQTTley9n^%3ROJ83^e45Qlo}M$$&x@vT zDX6}Fx%Y47`Mju%30p+mfUj6bHp0UnL?L#E{^X4(k<5DpG`*QF7 zxR^V|{!f=oOui)%_K|J!?J3D#yFb;>)GNqVTRHvPvSoIAKAKKYV-Sg{DEj!o`lk5y zwB1t}9WJ#k-hSEQyMn9^}cnnLB^B+daht5A>&eJAP_!%-Y{uuKX&t z4>z5j8+dhker|Ya*xLZ#>+b{JhW%YJizj}b?COBe&I_deJ0E(<>*IALXXoau>7M7a z`6H)B=l{61$Er4MSy;x6j~(U`u^b^RB|qxtIJm}6pKJ5)K}Em4Nu-zi`AI9~{yExp Y2kEmjJ-zaffq{X+)78&qol`;+06x@k{{R30 literal 1297 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 ro^Ez#UbgTe~DWM4fc9>A( diff --git a/launcher/resources/multimc/16x16/jarmods.png b/launcher/resources/multimc/16x16/jarmods.png index 1a97c9c00143fdb9771880cc7034c501dc9699cb..d68c3d2bbc671fea422241ea52f20485be627466 100644 GIT binary patch delta 562 zcmdnWdWvO&ay^rvr;B4q#jV~T<_$51BEI*Yz5l%}_x3guH`8^wvlrhob9=jETkdVM zu!_ugQC7z4C$H`lY=4tb?b337^|52I^N;oZ{+oG-<>zfV+dLaz&y}0cY}TG|^mDDP zv~+cKNa)WGmX=9o&y#z^twe4}3QpXhZnUXuLmT& zix$l)cXzpx*W0loT1ZN&!*wMKja}5^8P4EzS-DXi=ukz<#?~0JF1MMt~M-tY4 zl;2ZPIL+}u|Kkt$R;(yq+ASW=QUBj*(zXCK=Y-4k|F_ufl=(BO@@^~l=Z?4o(;rW; zKmKz?{of{*(<#MTQ>DB#kH*w*nk{W7Cv2P^8gZj-!jdHx8Z56|zuZk!X9y0o6h3e_ zE>3oK8~=TOC1t@N4Tqasq(z(>9Y0*`mDcz7RtdkMy>$JLkI8Cs51yMBAKa3;d4mTF z=Y_LdJhWXjnH-vTs{850egFL2B~8%HGV%6># Z8yzY*;UR3bo`HdZ!PC{xWt~$(69B&%4eS5_ delta 670 zcmX@bvXym$ay# z9vg>{wz!KZD+2=qlar^5V~EA+-e5=nU`K&}-}Wx;58_e@U9fbb07v7MX2pxm;=CUd zOnxyxc_IIyMO}FB>m=%>`$wRdOUxKmR-L%m;EgZ1Fs zc{guHJFa92;@T8plYZ)HJHt77?GHNh0K;{gH_vAdX1J<^MpFaJ4 zGT$#-e~m>Be0)t)vL>zy4G?LZ!elO`u=e1whQk6GW`Tu%YD~5B+8NKEKKA>!=TT-O z>C2ht8s|En(0Sq#KE1-o=8uD*s9%47|DQ{1S21-lXu9)qXnjtg}m$ zTmvt$N;9XiF>u^J{<*5QaADNm+jWl0yqm?>u3@;gEh=ZSut4b?W2Y}Z%Y$Ann)1>- z>V4N{$AY&nINjN&%&j1xbp4~a*_ySy+seCVI=XXQSU4jwuWSFKzopr07v01(EtDd diff --git a/launcher/resources/multimc/16x16/loadermods.png b/launcher/resources/multimc/16x16/loadermods.png index b5ab3fcedc3af1193fb03fb4a168b24439ae4659..ad0e6237df26b43cfbc1d5830b8013c26a87bb38 100644 GIT binary patch delta 585 zcmcc3`jBOUay^rVr;B4q1!Hdz^M+VMfxCC?Uhm$Pd)usC_S!bn6}h*!<=)=*vu37R z_5Ppdd^T8BGkI{QTIH4S&HP_+d0Ddj-P!&1Ld)0GS1$j2Bf3-}#N4Ssb_g~CD zU-#?5)YQc1jYPnKO(U0(RFTH_fA`G7E*KDzX2!@o);*eSNBNaFysvX@O9M7Ka^&8S>^c-TBrnwL+`aUT)^? z7xybaJaTc4*?3UM(Zw*~oKPm)`gr|cua8c>?eTzLOJItLjFB?;pW5^eb%R;437c=u z`M;;A#yv18JAm2q+V@31KkMb%7iGLzP?xm9Ra9x|tu-^2c+GqBlzaE5A5B_i92-mp z1%GKQ^=RS};aa66G-;>D>a@?|dbV?Hk2U!n>*1WVZ<&I1)z8Pb@8_StUyz~~`Q`4^ zpTaz1;onYOe5h9EIHN`R#N>?beBoljguPURgN65C% z)3TR(iD@%yHkMD3hckDQGUb$# z9vg>{uFhf???ns@Oc|aojv*GOdxL#FLIOqpz59{&%(8yvXJy_%j#*8AJA%5!f*vTf zoN(1$m8zYYygJO$@q$`LhtHE|2oin8Us$B6ikxwX{no(sM#q9QnP| z$gVc-=e^=*iSvc(r%0=Ie7JUR(prYS&HD4=WOM9&W-=+V@N#mix;GiIPS4ax-4G_W zz-QqTk2~^`ySL12Of?rema%20W>?p1`>6Fls*g@BnA!H)vm)m3V<{)e3tty)sSrOA* zwTkP+W2s{j28n-omNZW4iRkn>e)042TYAqno3)rMU}TtHH_J$hG# zwE3e;p1*r#;-{^t%RjLj^9pLDI?O!pWjp`oW4qmEj&q$@xZl6Col#%<*y(~}n&wHT z$CsriTNP0pfkfh3a>ntFoTCKK|d2icXc;-@o$Dk(TpZeyGK$HDu4T z97cv^+zMn5}!0gX_Nd|9whC2I3)7oR+ Sj~N&k7(8A5T-G@yGywpIWlgF8 diff --git a/launcher/resources/multimc/16x16/log.png b/launcher/resources/multimc/16x16/log.png index efa2a0b57d3b17ddd38fa79ea39023a87d29da29..429626d3a9312a0065a3554922806d3de6f46388 100644 GIT binary patch delta 311 zcmeyya-3;`WIYQ51H;x|=C2qS82LP1978H@`JOjDBx)$Y@Ib%vXKcKyYv2SxApGXiWZ-Hry9@PtiJEaf4eK%(F`YQB6udSu9`J%+q|1R6JFja zIj_2X*6g^KXO@)S_RD7~`0}T_Lhk&d@cNr~vOlNUZeSE*KfgYzK7Io4p(#E7Z2j`@ z;&y5qB`)!h@U%0R7kswaMNzt2?WC4l)zKzxBd+^<-15)$X#G_A{U%sg<3s4TvnRB3 zy_VG;T(D@u*^^==VG%+r9<1te`WkAq`1?(3*AtV@i8FJ}ov!gCDJtD*`HPyMzke6K z(4FPPR1oN@R-&cm8vI{M%E&?)2juZd@ delta 616 zcmX@k^o?bLWIY=L1B3kM|A`C?Otzjbjv*DdYA2u0QgRe&JN=vYtXoWJ!Bbg5rb|s7 z-4o1DB+W~j5qZ}6j8obiojr;!ohvjRv0h~7c&nwrwX1OHaO8qD3}4vVu=))Q4SvfP7uRR(jk{br?|FKw(?g@Ve%vAf>#tk(A3vOBGHY@<$9oBe z1!58Iwl1@4w5BGx9GLhn$82_thKN<<0XIvICSDdL=gl{L+!hPU_aC2`Vx-Bq>Z;cB z@4s(epC&l@qzkwD{9U)-Y833hAABRn?D5gdl7`*p4VPc0Y~-AMk@d&a=M4)Q>Sv#A zOWSfc@28L2;SOh}D_N#`0vrJiH9|%X+=-l%-a0(~IAj0r-N~D7zKLdwTR%Nch2@dT z4^|HUom+qOZGHYcJ?_i-JNNHng zXgHjSVG7X__4_kQWVY$E{S1aU|{fc^>bP0l+XkKnwBF+ diff --git a/launcher/resources/multimc/16x16/minecraft.png b/launcher/resources/multimc/16x16/minecraft.png index e9f2f2a5f583aa14c5ab25a2e8c75c51fa36a736..c1226d02777f7d8c275ead354d36210c3ce5f0ee 100644 GIT binary patch delta 718 zcmeBUd&W9JrGBlai(^Q|t=`GZYh(f?TBR3W^4h%3Alvr#w%prpAt16tnp@iZ+sm~} z&5zmMe_vUDyQ}<0?M-Q(@7Cvz*(xlrzZbLpnefDO_qEEDk9D0lMKHqar;(3-d4xFgy&Yk zrfdDr`lscqB!2NzyLJ9Z(u=BN%Res;|GRzChHtT~v-sQ(N9!`5-y(3I!SiE@!loN7 zAEZQ$!f#xtR1?&`KW*`MuX>@Z{+|Y43^;4UFHOAkyg@O9qpiTsrRnJV{fwJ3ofS;I z*w;^Ya@i<0bF*GZ4*%f`y(LrLmMZVN%fot>&Dlymi=CDCXk%+qEqloE8O*MUVoPRi z`4GkGk-bHEi%VmNBk!C{uL4nT#V5LLE!$a)4i?Q&vDsnT^uEE1NuysqOt}8ei47+O z7EM+@w!YQArzz@Wd)(1RzcURJ&o@PDHuxTF4LtOZPosAe%O~fO6JJ&a3Z%K@&S6$n z6k8%O)qv~ff>fsnQIQ-ky$nlnxw#x_tY2j(JiE&BO6aXdr-@?Qv_(3nS`Ha7pIWT@ z;kCw$r!^8PF&V8q7FTO7a0xYqeUY6|?|H}f^Qwz8-?@b@l2*MK7UD8HP$sX%U0dbd zri97G4y#)>2+RmP(-g0N`1;Oo;#h delta 758 zcmaFH+Q&9QrT(g?i(`mIZ|&s0-7={R$Lc?SJh#WX_;+FT^s}`)l7t*}Tmn=Q7Ef5R z!E(A?2D;O@4sihW@q#B+{3h7-MMK?gnj2dUy|81Wm44Iwji#hYG=~g zeg(B&n&V$?T=)L1__{qwjC1PhA8(9&ThN(hoUrcE)I+qSRxr&c~Vm^#Zn?8oNKrww+UzI4&*XGFo* zPy9Kxx0i0ds&10U@_=cIm6W@5Ro0<|R}R}wCxmY-N|{#@Rq*+-SoywJ1`@|~^sd!g znrJKQI?w)izai>y;;fwl(_h~0TM^>4tuAZx=DUe|A}`#!;i};*+4wK{(3}qwFQwi; zz_94a<_l9S?oQdO&wgT8dseUH-?WGgwP|sEi*pYha6Zo!vgkcyQSwC9vY>;=DCcsrS|-RjceV$znhWl{kg(O;j~dr;DXOhNok2(z3*>G=qsG&?y^z; za`)6e$6UX-Z>^{OmY=tnx1hA|El1Gl^hqfdP668NGh&QAgIWqCkDUDdyTN;Y{r69& zY6|8A<=PtO3%CkSoE7v-R^E=~311js)-hb}qZ` zx$Wj%0S|8-TkkWO=Qh7R_tNTz$DV!L`oH$EedWt5i`Cl;i}r1mR+Nd`|F8J@E63gY a8F~V}?=Osz>}6nJVDNPHb6Mw<&;$S6-tA7mojT`MS-|aWvZiUtqKUb;^CE6< zo3DTF+?Q`TMZd1gyn8Tv=6r@bwfAM&I}7%%?3HMcYzxxVy?p)S@pIh|5?tSKb{(NId!C|{k zBW?F(T|=(=zQ1`FZ>?o2_&wMB_D1*lC+64x^%FA=$^P*}bLr2+2VXT@+Wm7r!=KMD z859)kUcb8i+lhU_&lA(c-Op~=(Q|qI0i!Cj-xKeht@B!N?eeelwGHgI?=sHNk~s38 zA+qh5RA1$ROPdpgU7lTHS;dgDv3};Vj;>kD@9Y%*Jm0s;BQVwNw7FyT^)TOw0h(bR z464UGmZ?fv_3bP?pjg+DBzE%q@t^ZT3+hF*MJkx57V)jPIjwTj(fv`e%RjrTEcqJy zR9W!*ttjmdjz=>0rW%@io!#cNd)?Fd=hIexlf7Tnm;CRuWL>oF&5+aEnfqH<3>fy* zf43-9P+*yonRU(c#lHC&^~w(a-$>g0KcRi?^2T333jQBD&za!G#Ns2O>B8O7BP8k4 z`Q+UvmHq$!F5CO*TH1cO;y*ss^PG)iQ!zO zimF(!0_T*v$?;b=n3!g-QP|0rt=1%RIly7ki?pCH1`fMFKd#@e_xtjlf8ESeZExn+ z|5Ic6pS}0q3h@TF#f8se%kLK^zqWSWw1`>asJI@7F44$rjF6*2UngHulF{c0k literal 1175 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zU@Q)DcVbv~PUa;81A{`cN02WALzNl>LqiJ#!!HH~hK3gm45bDP46hOx7_4S6Fo+k- z*%fHRz`($k4nJa0`JjkVvN(h?_{GImLGH0ero^qsSa_m_D7^>z7bo_nw5Sh@AS7p=6KQ~ZkK zz^D7)^*aiVpXIl1uFuS!ddRLB>;?Y;I+iN8XQE z?4z1yIVJmsvoYLW|Lyz|qu*;!+`l*L^}N__hG%_`r>s*+){Be$@nI=2F7Q~XvQ%i}90kb-UwFsI!pCAjoUVwFMh0ZO$+=UTm(8adDWk;B73&>qMnQ zp7#ltmTagj`Y-G9af_!}go3n=f)Hb?!Pg)ao9_Ew0)i?mO&aF}i{5X}e`j{PS=gss zpV9AI)x@oLPunHGuFvu~pWWcqv`R>&p+Ue<>_qLfAD5XYUUj9EV?D50)pZBC#lLCC4a(4y9 z3T80H{XJnf>ENrh(+p}tEF6v#cLg3>Jy|N_%|wp0zUylq&tq{6-JiW?Q_#klOWd_C z?~SWv>5#ggpO-81`YT_}?O%s~3UpHvOHvt(3=AxF4Gnb-O+$=~tqe@83`}(m%&iOz z^l$F9nN|taV5n) zWnf`tYyq)h`jV$d85kH$N?apKd@_?$^NLd$GD=Dctn~H4c4d~OCg$?Z|=o{%7=;vgyt$&SLsE-S$(%=|7*MPjN5gvid6+nBLntlZoYO{S3tgw?Z=fGK!p1_V%(A zM6w3lk?A;)6l_v@RB_uSx!k**9qTqYXZ1?&`V}`qH~qlc5gB?3~pB}R=yK5 zH9yC4&R8T{;4w+ySCr|Sgxqyv^8fA~J^j7>!PH-z;p<`&IoA8_^mMJQuQX9Ll3Z)b z`6A!{w%U1C(T4hK;Wg$J4ZHpG58M6Wecw_R;In$!;(bbNzE?j=;XM0ssSDO4PC&RWCOI$4-Z^UXi#LcR;`&-{stJN^!P`p7wrS6?h z-w)DLu2mQ77km!*dpI!k#YOl3^USBs5N-3^aE+<$M7Qv1&g7*>Bd%Vqf36y=F>&AH gGxz~}U&3=B*mo-U3d7QMZb_xcA1N*t?y|8lRc z?u8%+MXg5+buJPm1?E{Y9kcaz?cO2L`%%B3pv>4!xc+g{p#_GE6xI0r__UTOHa6;O zx0vN-R%cdMzkgdR>!l>xGw@szq3D;8E#c!TWaCkk_$!vEgheWc$F@Gp>+1R=xFYr%%1&m(O^+vEbb!4(7w0_x46SId<2$ABg^SWpKj%#AovO8SO>;*APsFy?&9TqFRLoks^=rR*zJ1k# zRR`xu)%x$O`Kz+{c(6z@Z&afYi*C|Jjatvy`uD}B>HFN>xoFk9_s?$WZ?s>N+GWYR z{ifiAT-Ob6zsVZsr|gTe~DWM4fFl|5O diff --git a/launcher/resources/multimc/16x16/noaccount.png b/launcher/resources/multimc/16x16/noaccount.png index b49bcf36ae68fbc9bc5225702f87c678edd51987..62388fc7e394a90ac8e46ba205115d76940c4ad7 100644 GIT binary patch delta 174 zcmX@dw4ZT;WIY1|1B2C!1$!A77}`8t978G?b5As~wHk;pT=*`U8RcsDtxlDhW1@jl zqlALOjzv0I+zoam@2eQLGh58pd2DlDvU`!mGaJv05BnGWSY(p=Mz`+Xe(3~aZ=X&y)QRYBQ%uB e^Ga!{?<4k*CDEl{5?iK#oaX83=d#Wzp$Pz!;z$Po delta 318 zcmdnbc#dg;WIYoD1H*)g8D9s0WWg4zKlbV0^u5ebIgdGWmfa}sk2XzXmgi5a^AcomOUhtmBmrvcI32^T{pJ;=BvGbI#+bn>!?pH+j1vA&uzCq Yq#b_WAnNK51_lNOPgg&ebxsLQ0AKur5C8xG diff --git a/launcher/resources/multimc/16x16/patreon.png b/launcher/resources/multimc/16x16/patreon.png index 9150c478fae1b5da24d9c6c4921413e186571b1b..0c306e7ccbe124a0549a535a9dc10b21725ab55c 100644 GIT binary patch delta 250 zcmX@XHjQb5O8s3=7srqa#^ePOf6Bj@{d@o7GhdHvO>MxFIeTUQTmQ=Y@&3tg7LEUJ z_D?<^wxBBCgn7@IMy`L&1_4GKdhedxWxDc(U#b0of}z5^rppW~&I&r%MHuJ3ncI1r zL4AIQSNqNq2v;HH;{-@{D6E^%fbl`xE zpyD)>-p0ggYv$%7vMn=CIkB<*3u9}`oi3O(|L?(nsUp@PlcEBdgg#y_Ptowu@nZ2d zZe}vk?QMK`xrmMJo(CJ-Lv9|Pn2Q4C4UE}_1`9lS)SVa@if)*-ES7iQ%)r3FS>O>_ z%)lTn1j3Bz^Dos0F)%RPtqO@KiSYHYO3u&KOH9d6O4X~#EdT{bYQSl}CIf*zpGAFb zFSA}@_I;@IG0kM&9wsqWFYjAYukL$S&dl)Nz4`LYo2k=oEz8|;a$@d0r{LKS{%CRg z{l0au;i7|KKTABH`j*LEi*;{KU|25a)Uh(#_597cU-!y6_es}Z4r*BU+GD#~&|QU| z#}Z8(i%z_k+*ijvIXeEuRSl!pDKXPm<@xHe7S+a`nC@vX&*HIkuTO04+!i(GjG$9& zcUYW+4lH{6MAoZ+)w8{uFZ(;Q)!&%IT6d^t_Mt6VuM8v3O{cw`8lzCNc48Q1Q<~hChM%2yj)-W-yu)3xnl4i3z6gs=j z4!Ug=&2iZ<(L~AdQ5^T(1$$yWPaIhN?##}^wFV1Qre-jfFg9ccd)_(I7S^q`B#(V# z$4uutNo9*phiQMd*uaqa>-W;&!v&^RN}_8XG?|h+RuJc=n&4IY2Gv%un8+@KbB&-QV(r`Oa1( diff --git a/launcher/resources/multimc/16x16/refresh.png b/launcher/resources/multimc/16x16/refresh.png index 86b6f82c1ddd53740bd95cd9a252d6d0341b0656..0f6275f85c9aeb17e730fc2c99b578444e0665d3 100644 GIT binary patch delta 806 zcmZ3?zK3msay>J%r;B4q1!K-+=LIV65)J$J@5+`sA9H(K?)!VmGRd;VoxRCD!8y0L zz15ljtM}H_nGsKa`5GSk@Lh3tDpS|twQkvecL+XyR%%kVBL92c?~@1rvd>p~toFI# z=d1Ev6C3`vH&{6+&bel|@9`el?y?=qyW9-c6iZCo#L?8S{(J4&`n~J#NPnxnU#@4F zzpW=@pEcK_4SEe$n~R>@O!c0w7j2&39L9R|f3MEDil@!fCw;H4@$b7^v8VRy+wer@ zjz?d12B+&qo0N9)X)y)~R#jL3th|4|Lr|?}R>SpIj0V-0Vr;7q#S|q6aFqG}p0aM? z+UI^!*0JCDzD!yw`F_uDzWDmO->iPiK61(F@BPP=t85jqC&4iHY;M8 z8Imuj95(v;_o2Id(TfLhmmj>^A*Al_S~=;bSH2`iHMf7w_m(yD_DNme;h__ubfa(m z^_e^`rC%f)NIZEyzwXHQ($Wo5XIHxKNqcCcV>UBV$@y4G@Rsfn@6e`y3?~h@)t6nl zW8m%4+|X>xzR}3l(r?}$<=EbNw^z=dy8O1yC1%0))Q4apX>ZmsZ~<^A$^4tW;i~FnD~haP8Hv z4?bO&Sm%;A_2#9SXV2!^p7NSCYp%cnzsG+B>$fkMet90(+zIASOH8ue?E>>x+kP@o zdL;7Zt?uGG*Dp`}c}rvB`$N-8)_+}jOaJ((xJ2>GHsSjZTimJ0=vvQhV!>*aGk=M> zu~?J&6+i7s{{+-twokSAXQKJ+ez?8A-1@lLHOsRO{@Nm?mj3&%RpHyJdv9kk^uFch zoy?tdHcY6z{^_oR`aT&YT$iJ{{#|*|{ANu-y_J{)Bg6FX@7CK~{?#kJRf|77dx@jO z8@`wFaj6Lr9vih6-7HfJvG2Mb#`eg+;W^{Kdp=BaZd`d6_o8?EUcunmp%#`)?+7OU zUGk!GZ_Xz3PhLx>#4yB!ZMI?ivA;}?S%!JdhABD*Y$tnvGE~S*{zx@$kdjwk&CU>5 Xlr48VYO^#00|SGntDnm{r-UW|tzC`W delta 910 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 E07t_WPyhe` diff --git a/launcher/resources/multimc/16x16/screenshots.png b/launcher/resources/multimc/16x16/screenshots.png index 460000d4b6656bf7eb59796846f36d14a346ffcf..f0e5e439eae7e5987cdae5b53a8983a7d9f6a55c 100644 GIT binary patch delta 508 zcmcb>K9yyHay{c6PZ!6K3dW_EjT>ZQ84i5>pRksHWA5#&B=yoe%foy0w&mX5mOHn0 z`>{8(#c!X?|B>VBb@F}yoB7}C=^QIRu(v$(d9gI>@BF@Jo0w`syFWer9D2j!*w6hD zOJibZw3*eOEArNu)VpZKA1>d`8%htS1qB)9SiMh4IlAMw)8k;V`qfiK7Msj3dc3^O zRQvshg-sDL0)MwlRxVVL`@{0Fk>!1ToE*!4)&(tx6=oGqnHxPV=&!vx!>UCe4ledE zED2RzR`KD%@+FrQv{yVj>>n8?uzT->+||bx9eHxymSM$5c^ked><3bR{q)y=bmGdp zmjC+hH{xC1br-uFW}7?f+K)2UdjInNLy?;V9V2^mE}!1X{kvj9(d=0dV=i$Q8yxby z6DA&J62Rc_zl6hd_4Ma|js{!IEoBYe_lWSQ&ny1 X&h^ve>%tir7#KWV{an^LB{Ts5f582q literal 976 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7Sc;uILpV4%IBGajIv5xj zI14-?iy0UgOhB0N+>!+^7#J8NOI#yLg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3 zkz!zAkOCDJ@D>a4Sm8P5tzyY%0hhAXSc~B^mie3?+%h z1*t{5wC+YTFfeF?BwSL9lZ!G7N;32FV1^Vx4M_tTqNCuGn3n>!Ik@GvECU0BB1oHa zQEDPck3vXhZYqP3fuWJEfvK*MNr<6=m4Stofq6o->vIMM1}~7};QZ2}-K0ugh|BA%KW}DW zVDJQ)>YQItS(KTcQNj>Vnv|27tl*NLo0yrW0JSC=?836tez z#rg$c9VuW9`jLnKonl~M{O{@F7-G@8bn@wJ;XsjN_2p?sp35p{EaBhEyJG{tV0ac+`=hI#sZUfhFqHJ^~ZnXm9_JaUEAoxx%W8BizGo=Z}&G< z*(p`!A-pel|GJuO?xejsUeM|Gg|oZl9=%(8TcrExhL6^faXFvr9N$|=82NU++twGu zGuzhstO6g$tn5i{uN3Zw**v;&#j~l&#maHvJf;QquP$lWKm9jXv+c4N!>kNpyZyJi z7iOBc&ap6Ko_0DZR=M-60=LQYb;bF=gchybWz8VrdHA?|Btuor>@9(hPfq2Wb4H*q zcJZzW%OCELIp6zd?t{zC+!4&bSFVl|`^)k(ykA4)xkTxzDbuuf^tqpTbI^rfEoqCl zgzULbpT6o$6MgvS3Fouz@`{3zPh9`$&U|9{<%0N|OUXXY{BE}|9&A69er}%SDTn`J zd3JLi-hE@^ZQ8!iuD7dr=7y^ZGw-%?-Fz!_jkmKU+_E;SX#%71`TGL>sg^ZH-OI9n zTuR@`G_+wZp6P*Zi^mkIk^ zy!hk2Y&1XCc1{sm`e(t8rSYxF&Y~ATB_`+ZkoL;?X8oT@ZR*bTQrGt+Gk_A9tDnm{ Hr-UW|zHN~L diff --git a/launcher/resources/multimc/16x16/settings.png b/launcher/resources/multimc/16x16/settings.png index b916cd2450cfe3e19d5933734cee12a3e1a725d3..6875e80062fc8d148b5543fa44d9c22b3d7ae185 100644 GIT binary patch delta 890 zcmZqTp1?jqxt=-P)5S5Qf-z~!rcKOOJopZ*U6aUQ+numD@9oY~Y4!8la&K?T?VSfA zSLZ!ns+pv_>AhC^GoJtdjZI7LMi`5A-xKd{jgl=BTz*#brb@ep=cl5#lN3%)3eVke zxA1xFeVgBJoTC|LtX$A)tv)I8MAIvl%$<^RefMx)dtdP3p!(yQ&u6dKXU#Ix zHZ$KIw0Z5?$uVaCryq_>jqK+xO7##;&^x)V_y4BK@TSS{%e&EB<0(K>Qv ziu-lnNuRs#i*Z+;mVeLEFW#Q@T%dl^46B2ijkR_@(|B0Hvfus%`$2W?`}L0Xq8r}u z-FaB*FsaCRad1ihKbIw2C$By9HYa4ha-#0zKR=AD?l5hdm{ykODa3M7o4@yeAEShv zylne?$LR9gg5LH2baIr=U%X{;He=QF^7{GLzXq9wYNd!j7Yp*9eED+s(bINn ztmO@9oD{b3(`)mE>)4)dsz`6%yE8)Jeea_>IS##f?x_i#{^Bq(3xck#;KMC%u`l>6`KG*e4 zNAic8syUnLyEo}g(w_BVR%d|c=cn%a>Ff7=YI1(Mtm^Bdzw38>Ipm5**XdC1NvY%}h)xPCE1F-R*qt_w^tC z^#=z(zFzdYpggI@czd~tn0AI;XA2z)75j5t7njk<0RGfueR3~J$v)x!iAmf zjJ{=7wbqQwcFMi9y>xwvM(UxT>)$tAZ_kT-AtvFfvF3^8oo6aR@w??U!bMW!;-Y?) zt1HZp-#^t$S479Vuba;kJl*bMfZ&oy#&e^`=JF zs|%gRFR*CW4(NE)E|~9+FQMVf5bkIIo67MRU8s+yzy?)O?>R z?vmDiabv1-YHQ_cRiCBN4rXDVdh0xz6sn%?-CS%32_ zpOX8;bMEg+OQar5zimEw(}OA{fjh=)UfwFt&R)G-$9u+^=bPJj5*W%nYgWB}@UP$c zmQtQtoU>^7$QG^v@X-eYJX@)^kL5_w$rBdPOTXFJ8TT{r3#dzx%AN8D$D_ zbDueTcE)63;h(3&_5RQFI5Y1_No{G?w}2y7Pq&M%b}baj2%3{;lPB*GYw_p6%XjbQ zt&CXnGs?5`zp+3Z)2y;rs}Cs~{5D+3EF6GL4Cb1MS_ zm30pvz%+nVT0wL%7#SEE=o%R58X1Hb8Cw~dSs6h!)cme5MA49&pOTqY3DsbzYiJl^ zU}-)F|_~;wy8R}af+#&(95n>quKUK?5zrw)4APKTDI6tkVJh3R1!7(L2DOJHU zH!(dmC^a#qvhZZ84X99rC@L*VPG#^bEz8eIT;p&0k%5811R)V08sr0Wa(Q{VUS@KB ro^Ez#UbgTe~DWM4fc9>A( diff --git a/launcher/resources/multimc/16x16/star.png b/launcher/resources/multimc/16x16/star.png index 4963e6ec97c21fd1a6f986841e4f2b751f3985ca..20278be0cb7e2c06504e6e5ac3ad0c4e15957b3d 100644 GIT binary patch delta 603 zcmcb~`h{hJO1-tGi(^OyE%EH^2xABKb!&9D{W*2(k@j}J%Z_o^J2fA+t>pgd`zwjL zxX5b>=lO*XGNajFoM)Dwx@LK)$muSDA4^K+-aY(f`g)Utck0cwMELezHU3t)amU8b zck(Wt?>e%jZu$33ePJ`yJ@zvN{;yr%6*+B{L`Qvy$)|hbNALgLcA~v8gQsOT&l4lf zb#ix$ENh=$ar=F2r|-Pide#NEqIF+e|BSBvTmRJU;`e=`-q8zeHaLj%`xI=KC&Ie-t9Ts z8*ct}D&Mxc--p+`UfJ7VV1OM%T$;O>;o7^?+wbqI@qAzMNM(ZS zlRW2C!PoaR_)`2PS#F$^`&sSF?Wz-*r)&#cD$ zjdzc_(SXmQ_1Up) z$rk>9n^(DRsF}qds9-mN!9yhEPhP|y1*t!Ec3lw>{=NbX^W#77D`e!KBeN#DDRQsC z^|)j3X#HVUF<8&_HdITqm96w+A?#`!Q+blP45Q&`DcFkq4+Qvh1D;=D8 zKP5Xe39j*Xo$;nwUqn=~R$~pnqe|-1coszuuCs~jL}EFAFZdx8^>W$mJ9Dbu*H)D+ zf5}n3v*3ZN6#pX@ccexv?(Q*Fh^ef{di zXObT5XL!7}X6wC@m5MhSH~*fey7Wr;_wx<^)UKXea^{f!t-Y-q4{pAF@$KBglC;#B zM?3d3SxI>;QH;Dkr)I~Z87?jw<(o7PrGy9n{<3BDn-ifY<=H9%I#tYjWgb`*g$VD~ zwfCAIBakm3WO~u?bp_XkH}MSh*Iz7;oL{_2|G~U%CntTm_A#`sfA99Ir7J64uP^?} z_9R4xVIt#>1*HOP9BiqY6DE|pBqru@9m`o;{vlSk{MLlp6}E~ePb6+g7QMWYVUtug zgX@{NX71F7b7oF*v)eK^bl=BiZlQBCt>V`E`na-gV!Oq#AjrcboWbU^+^?ORuNKv> zDO(xGcx4)sV41rK*K)rQ*Vo&bRyi}Iip1o`syN)ef6&~N&207KeYG*Gc75V`5+9vm z!~d#AvCiW7l%3p_WeWvwYIysc_2J*)n3nWvVq!su&lmoaFQ=Xr_>tQ?S8R){&VtGn zsgI9uRN4RPu+ioNr<3FsobUR!T=vS36RRvX^VJ)0ADG!)5OQL!X8xItLh{T{Z>pK3r!?dhu{@pjeABxy z{fa{js?}Bu=bwC>zW4s0?t2V-HborVd2#+MrVFnsH9Bv~Eq%T5_dC07?KVF+Rr;B> VCtR)n!@$76;OXk;vd$@?2>=XLP|W}U diff --git a/launcher/resources/multimc/16x16/status-bad.png b/launcher/resources/multimc/16x16/status-bad.png index 5b3f20518930b93e40ac9245a581ef6935bff8ef..c71142b8ab69246a73317703314afd21363406d9 100644 GIT binary patch delta 374 zcmZo>oxnUnxt=lH)5S5Qf^q5O=Ds5dBCY55oO(4?E$TMc^=-Mgx8=@GlwVl5>$%$B z-DQ*47nk~#vbQDfS;SqC$u?!=*om2Uqs`p^#}%X` zV*eagKC{Z5gL%@ee;N)0cba)-!SXeqNXLd%<@G1_lOCS3j3^P6Eak-(K~mteMWGi$kBRpme~PY zc4=LD)O@DVraAVOZO0DV6AQjNif(ohoUYg9EPhd|q<*!S?$$}Z8EcxG-s^H+5!c}2 zn-(P_6)V&A>(layuRrW-k$Am;ec#(V)#uC4?On9$%VL#DS&sV{XPTu%IdEtBu4vs* zzz1IeR!W^r}St0bvcfhC7_WcWy4RX&Bk#+R*mW0Tt4LWNp=CviR zSoiqFvWI$&aV^px%~ITY&R9&~U^2UQU2^`MmZPo=$JEtU{Ics*s8`6_;m*i7J362~ ze^*)j!A)Bp{l4XT^!wI?$o+-)8snO()}$`_l^@f5^?LJV+x6xlRMWk-BrN>hZQO+3Y_m zOgBzbPnOG{bZB|Uhtv9huI%CCHh*;JSzZ6vzuAoOt*a0EtH*uLtM~XJEAa2KU3}=a z_@~;x;}%bv_2Al#sCm3*jIy8nH(M*}6km&)7JOJQ+|8zrbyxHLiC2229Ql5%^?Y4o z@5hLg7z?XCy~jJ}6;!1~8SU(uv$trQilw-yn00jG{(ld*KaBd>#2WP=$4>ib(nhrk z8KG$w`iaLA`sC|$lk;V4>MqnX{dva|{n32?3I%p)b}uH~^RYJJT&+#4B5zpCInBQ8 ze-gRk7hBYph9=p>+3r*QBku0+F1V2~_vjVKAu zPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw{mw>;fq}{0)5S5wqPKOjzsKZ4iR1SB%Zqc~ z-*MUUY>W4F*9(p_-U>J^7H@82krP(5jwp$Gc=lb{g!;&d21h!Cgmy)=crJg#FDt~x zR%ZAzXf~(ht~<}Zy{nzim;di{X#9^@xq0WmfB*2?HeOZf&D5$I6{nl8mZrF_^q8{A zVJ1)Xq=gxNo?832tgpZAuu$auVNb1Z2KSoy`#Ix;Sx)RuJj*-ZMwN@la95psU9*>q z%#X|pws=*?1lc?FVy2;265`tR*F_#P+vVzF!XVc=X+=@fv90?LGwkABZmt;PTVOh) zL`^=sZ^3F-CHtByf0@@g<(M2xI<9o|hM3Lg=^B^TC0_D&{tmWn6qecIu9_;20yZd3|x|Wq~JEq^4U$$2# yNW59lotZbrDB*rnp4FT7~kZ9)5=XS}}t;bdB8E~tNrHFWad`csLTyLn7@cAq%- zJgs4}oXQ>HRUM&h9&yDy57UFTa~eLjt$JM@FIblov@T>~e2PtN?-~^mZW)U}!AEH` zCSP3daHEXb=)JC4y;<3W5Ur)J>eqfz`odqH%6-!EVMCQdP3`2pD$)&#vh(K#CX|`l zdc|#FnbO5+m^|CzNEb(FR((6eJQFEi-oEn}`cD`+J)HYchP|WV1goOfUN(+~6*qmS zcF1V2~_vjVKAu zPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw{mw>;fq_ZE)5S5wqPKOjZ-%g=$nkpPn@esl zTe~%jgOf{FrQ&PQFHJeEDBG%)tzK)y^OG|BTN{ox*LS45UQ`kj<)4=&x|A!g_=8%U zkLzNOlTyro11|I4y!mm%CAHkH_atijW0c__A3qoa1ha>nfSPmvzPlWsSp0 z{WBG=u>=K}+wj-d)iw7f@tuG9_|?TdUyNTV=DIai+;G1o|C)J8iwC>O)^Y(3+Yhon z&-{cq&Rv%LtX}0F4vrdd$Ld{#f#NW;a@dt}$#MW&DL>rFVB zvLp9tgoO#y$=G=x!{wILy-8kPzh=6LtVBw^(1j1m+!qgj-F?mBqwtij^*b(A-~`grzfB-@dK85gZWH6!g)!@smbK{jx7fEKA=dw)kBXVlUQb`G3~^Xk)Kv#QEm% zO1Fm3OMY{0ZSb9NwSRfAgMGn;`y%%pqdg3rcimq#?LVu=s)MKA&WQF z)2ut2S?LjLc&UNk>IHn-7dJ#VPCjciXU(*Qi5n%dR!Ow2-#@(|p8xYQIrH#WI^h*=Oq2H$0vCU<=!`*wtyv zUrI>5*c`|`^ThV@rdr$Ug}ixnOksRH^2rlsCfzAezoFT_>-924D~pSd`<^-{I_J;u zUR1P$VbVMysTa=of7_j?V3gVr)ipWa{kLZ)XHiLsh|mk?`|AtmD#)ux==2#Mj4_mw z`~6rVahJfWEy}-C<*cWl2+sYWBAbkDZIw9Y=ujgac(}y+@r>~xo z+qB8n;{5Zea}Abk?h}3VYy)r6_4NO>d9%5#FYW47x?`cu?&I*{e9J=Nl@o1DUaa%u ic(QWw+xi!;7_;)`SCn1ZXve_7z~JfX=d#Wzp$PyPTd$`8 delta 566 zcmeBUKF2aaxt@Wg*vT`5gM)*kh9jkefq{Xuz$3Dlfr0G}2s6r+T9`60Fi4iTMwA5S zrE)SPRA4c{t6dH2iDk=u;K&RI6`jYHn^$P*Yd0?{+TOpf#gDVWTq>AK$_NgD%lq z9@XAGJC~VTn$JIcbkZ$}&xal!_&)dh&wUT~c)85D@=klIlw_A%LGJ|PWP=L^if0+J zZcZvuyT97g;rmvtmJLGw6Rw!e>2Uwr%>1GD$G(2?9*y)o@4pfUqC@+Wm+yG3)3kKv zs)ro=>YC+kSIw;7bjO+{XMYIm?PqUyb~nt*vzv0@S^A4_J6?t@S+~zdeQ9o#___%( zKaM}yFUqrUYo~czcGwC{tMupQ%tw+ZSovR)=(@#`ccxG3wfw`w$8w6FX+638z+!>O zI=^57OngegAN1!YBF9hWZQ#b}!f3DzG?%bDaa9gJbfVj5g;i^LH}6pY!K$ XKE$CNb!;yK0|SGntDnm{r-UW|v&jG| diff --git a/launcher/resources/multimc/16x16/viewfolder.png b/launcher/resources/multimc/16x16/viewfolder.png index 98b8a9448a5756451eadce70af3772be1f543993..f5f4014272a2acac47568ec0ab093161daa63ebe 100644 GIT binary patch delta 293 zcmcb@wx4N&ay=uPr;B4q#jT|iR0CWC1suxXmv8Ratr~Z1?z68~fzj>yz?wqKxVBs;{Uo!Dw@MDr|_Y@9$xj|bd%y3(2iECN+gUpqVT}<2f*2^ui&a%6CpL5=uyKQUV zwJl*<5U}&-clF)c!Y$7pyp}uHvj6?0U5B`{`_KB#o4oYj;TQ%61_n=8KbLh*2~7aD C>52~k literal 852 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^PXNr}OT51_lPs z0*}aI1_s{iAk65bF}ngJSXSVe4$=$8F~`;(W?*16^mK6yu{ganXt$TMqkwIC`MbO( z#;t-bms!^OCT1^QDxV<5{avsNlxfkli9>Stt#!K3! ztm5@&RV!{XX%=u;dFw;W{e2z5hWnk5a_)?fXpdNOiBs8i?LU{tEhkcS7O?HD{Uh#j zsL-iHyt!wy!0dNRjta%`9AW3FbvU`JBwTjoA$A_s*Jtj1ef&BrF{>wu{qq80%~$5< z3$M+L&Afj<>{j{QnX9jTVLHHg{KAU6yKI8ImOej|GvAw8vt;p4#)sSy&084e*D)|K zsFt`!lq46WCYGe?rX-f6G8h>cSn3)Y>KdAc7@Aud7+D#c=o*+?85nGP-X{dp08(iM z(Zyh7U}&IgV5n)Wn^MyVgS)Fx7pbPMMG|WN@iLmZVhkl{rp4dl22xG zYF=?FLql#{y7#dia8d;ed=o*+=85rD@|F(&Nfk6`F#^C(4 zlJdl&REF~Ma=pyF?Be9af>e;xX1}wMVqjnphA1j6N={|)uc%B<%~SA9&d)1;BeCuU r0|SFPLOMP)$Oq*d7q8}cW8`}h1#UQ@-!!4|-3|KV9&-H%m|f5_|B zPh9=J(ocW)AFnG%B?N8mKYx6F|1|{;7D1K(2bK$_T21fUKkM7pSDf5f7ovM9FM*rBTs~g8L2F%<|%o+?o+o zsQ>k-)FVk3-iQxQ2Omnvze)Ypex6}M^SS-L{g!W)%HHTEx-evzDzDr3BjudkQ1lS;X1}YBdB5kc*rGIcK?VWCoVoXX3m?a= z+wsk1UiDl4vS-s~$h=+_wL(yZ=}$@9opt^nu6lnyEN_{k&gRg#B1-+lbIEz{)XmzG zPAk5gU~eY6LL__1WY1l`GgD?9TfxPkmCak@Ty|J*mF(%I;_|*%HpLWu3{+v?Rey53 z?pcGBg*O$QGHxaIXhkevU8-#=cfWRP-+Hycy18U|rliHM7EPhp zzdu%WZT8v|!+6Bv!hVy*h7y|*5|y{TipO)GKv*?GE=Rneh;n2)nr{M)g((9DfNaAE0} zgEoJEh`+fNoSL;`{)s~l!!O z^QGow)g8YPVw(}@n`V`gSuD=%fCjC&i!mykToHcOQFTq z_VV%A`X8**=a(L8oV@q&(My*eor#aGoBR9MRNk$h)-ff%n!TUVbY}cgHlH4I1_lNO MPgg&ebxsLQ0QnelU;qFB delta 848 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 diff --git a/launcher/resources/multimc/22x22/bug.png b/launcher/resources/multimc/22x22/bug.png index 90481bba6fca36561a39d26c4820f16133bf0210..2219dcebb3dcbc397ba6e4c03de62020cadfe544 100644 GIT binary patch delta 1001 zcmbQk`Hy{qay|1=PZ!6Kid%E9G8dS5O0<7WuS#Egep_y|#@yU#=eFsJoZpsvd)r%y z*E3)KUT!wOb=@!5ieG1Er(BQ7j+9SW=riHf^&CYrp?@Lwrv7~0&FnU3EpNTz?KQG& zb(2>w-EJ{kcAjN%+VTR6n8_zoUb*qf|GOd^d**0=S?d1w-A2!!)$4s>n)QTv=EjAg zYt5}PFD>b}E`OI({rz2TJC9`2`xoz~-G9+oyIcL6?nTyn_c-fbKHDTy5PnQSZ{gI$ z1A@ktpPuODUJP99cJtrg-|I`_-cR}NQ~t(McBA~aLv;$d;P0v*}t~I5eM$w;{BaEKkHBE(fO~s?rNXwZxG%4 zjHi${K>dEVc>nQSrHKckPQOZ@B7KATazU8-4EgpMjUCL1g{jY3nx`FK!9H)=>!apf zHC=YI=ahR2+OjR)R~Rv0XA;-7qoL7=ce z-0jBSgG$@2`hwFV-dZ?*aGvgEX=!#};@9?V$9$hfAAVA#Hv4Q)$MT=o&9`W+JGo=G z^qe`Y_nj`}Rdjqj@Ojg2#tXc`Da+Gse}(GQgwU4AE#GvtqW2N& z(QZa5hsoxLi&Z-q4>%WjbiDc*WVhzPWEQPm zx@7Kk*0vIxbNdWmyg3lh$m`G>!JM%Ac>d=l$7^5xc$?VPlCXx`(0+lZc4k($`SuBC zH0F6+UQwYL6?=NOXkC`Pk-?g>E${vAAAY>PGQ#!bX@!LE9;NlXx>Fm(Uq$`cxG-{h zi28bsdkMZD8ijxUGoEkWSZmmtT}V`<;yx0|Sesr;B5VMQ`g=-yRWHk>mC2cP-yO z`{m1nt^ zYP2TK;6H2-A=jUqcRJ5-qvYoYtu_`+VT#N_t<^DYVpCgZPH8@nw;(O#tH}mljsD)= zxBZJ|D;6|Zn@%-NJaCSq=5lZSmFVt*HFuN!5_bEC82w>8vvSoghE=neUe2ye*ZX$o z*wIGOeNSv^D_Spp3_9rfnsxJqb%}c#Vs;-r%ED)opx4}9beFrLY4_3O-;HLIm5l0z zMU&pPK3pKD6KXY5sMvu@3@6&o6^%qRpdc&TnnQ7+RT}QQYN-6|qFxB5H zt`3>fSlYky&eu7On`LKoO}#pmZLwuDhfAxHD0kszw|m?YXQPgYMRD1yZ#ddlf3Jt1-^X<{Y!SvTJM+%HU`eYPh0%Wh-;u!8x( z^8@XE=eeIZ$O~D-nB{z9sXtP}Jb7i&*2xd*FN^Xo>d2mXsYAFR=8j3~MW>sseV6QJ z74ZDH6dEczG5COF!<9+--0~j!{@=Gg+y5{;M^g-oj)C=SbgnmqxmUW)a9k;!nq43=A W$3r;vH4&scrvt2}O4d&8+@?H9N6e19*lKFm;}`Q71xo9@Q-^>6Q2{;<8=u47eS zasK1>udgk>Ec06TINSSJ{)^cRo41{{^fI5nLO6P3;W5TDvRj4zTJgKSNK2fp7jwH^ z@$6}x@J#znrW}t`mb?pi_37BHmAiMV95|c#`i*kw^o^^{eD1f4PTrRE_DXEWn?v0^ zd!EfJ-nC8l*vR_-o9g*zE8jh{?;5E`{^=gB?)`mt4E_dVB%x4EZe{Ps!amLbnT83t5Qk1glnzl+f(yM?9)rTH%ob^Fp4vHG%dZduU_~?OvIH{j=OFyTb$k>Q8weT z(VpuSB|2rU?Mc(C3?f<1^BJUmsOfoU{dDECc{&PP(tqFDx@VVVzn=8P;y+*g#9^@$tktS_MuWS_SUvb}^12=MERE zDhNGbXzLIZ)jm;wPH*?oDG4h#J35wcdHnknNBLIgZTTFheHv~n2N-VJo1AiPYUnpv zz6r^db9i-|DtntH*+0I28~RYs%6fUjf%1fF&8G`QbW2oal~&7hKBzfeP^WdeTsbIW z>4EN5I!~vR@H~I-uw(xA$v;oOc+p%}Ff5$x_EV+%Dg05IVF@)umOb=6K7L&^b~c{{Jt3x8vF|?;HjO O1_n=8KbLh*2~7YL+s76F delta 1012 zcmbQj-o-INrT(I)i(`mIZ|{`T*)gFq$L;qQzrS-%d9I4DbW_BoThsfe{c^~>71b5M z6|`p2g3`-MI|`IJVs{ii^l}jt2`uOO$E>Hdj%B0B%B$P5Cc8~aSk}L!(ofE~`2C&g z^FMdaNSU)F^DO_lM>Xf)*Zi3G`S;w%E43EypHi82UU1IlJDT^?>TMO3)aBmRCcQe+ z7<_T^ZoW@f);V99{9;M)?!986ZGWG-ET86kR5$1K&EEGvIh^LWoYC`U4ECkyAUbHcQl%(x3S<(-q!c&+QHASF@~`m{9Lorb?SC@ukd^C^<(q=b9aS(`l-R^&)?5G<-fSj zBgS7hZj`+Iyjoejzwi9LJ>jo(K6I_pUTxM=-6TDA{d~C{g-=&EUb>ni(*FH(f$WSN z(Q7Qyj|2M;Z`X_a|FV1H$AiBar$0V_wTWNBqdr)GrS#o{rTfpT6o?ivEPyT%+b5I#V-1IZ zTcxb9W2Wn5H49bO4@n8vBHW69%vCJ(kKQNC@LH!gJNH1%Nt#`2 z!MXTdv4NpAh9W0LH?iE7*_G=*;cn@qTEUabk7nvhOlA}eT(e-~iZj)Id2CthBvUw+ z$lpnr`KqL=c;zm(h$SCamtZ{T$LzzR4#wWc%N4|y=y_ayv`V47YwbDV hW1QzWn}Uz;udY6)zpb6eje&uI!PC{xWt~$(698;c_I>~W diff --git a/launcher/resources/multimc/22x22/centralmods.png b/launcher/resources/multimc/22x22/centralmods.png index a10f9a2b93cbcc2f530a293ae237832336545a89..a54fdb0b04f2bdd0c2ae7130e2eb207abbe9666a 100644 GIT binary patch delta 963 zcmbQqbAx??ay|2WPZ!6K3dXA!m^Y|+3Lp4b9~S!kMP=^oZEx=$IKDaeHpkrD+uL%p zbM5=mt=6C4Rxg;E_NiaFChv9ey;|*Xj;c?V*(r%m=sy+TRu%mv=vEv!2B z&I?Y>)nAv*_o27D_Wa};MTgKIrcDes&p)!h-2DIZ)m2dk-+Q>Mn#-{?+V4d~xZL+s zJs)PXaJ_zARBCR!cgvN?Wh438WFPOE|=lZ6bTOPM(FnoRKbWUn=iPEMM zk=IqFIu$hRQ>MxJ|JOUa z&v0t@-}cPY<&S?YkZ=5Pe|j{_R>AYCz7e@%7yb3r9&ro4pRJlWxu8aGYveZHx`N_V-%FaG>OHo$igqe^`g zZ$i!Y>6(8Zgj}0dcjd^hiJe5Hx-pm3XhUut_v2~y7Z&RsiTYYCU@M5 za5?d`^~|E}9wx6{TyGoBh!D|L37qXHD8MReQomjz+r#9o-o6uK(pl2}B#US@ro zE%xbG?fLpm8@~Ma_{~}I#6XMV)vRf|w|K9wH5Sdh7r$z<&) zS?Q2?%tq5SE0@jiR5tA1$R=#q5o}_>QmGntuOn@0XpJJrl=>CkSL16=m1VOSocrwl z^I`@2zO=IR+kZE_J;j%M)41vWjfbmr%n~^^c_kJb`nW3kgum^|UGFJ-@cI*@mHga4 z?{M>R96Gl-v9fc$WOShA)s6*>IyIJOU-MtjkNK8X^{^o_)tTK-*O-%=)7d68zF7JG z6!t40XFgi~G+SueQ*Aq&3y-Y(bE_0*Yt56teyH^L{^0l>%VytyHZeS?+T>-}Cf8k2 f(-SkfJR9T^xl_H+M9WMyDr zU@Q)DcVbv~PUa;81A{`cN02WALzNl>LqiJ#!!HH~hK3gm45bDP46hOx7_4S6Fo+k- z*%fHRz`($k4nJ@LmUDMkkHg6(GT~0>^ZaBf$91(U%bn z49u52T^vI!PG6nsnG+T&a=iZeo!|F@>pvh1{P<+P<>F`AlTujv5 zk{3yvs?8D*zAGstynKgX!L1e2W&&m{4Nhx#w3hj}Y6SoEI&HrHdms0TwE;p++WAG3 zt>^sL|32?w+>iaHl9D!`FXppn7w#%Zc^6W(dEx7SZ;qb3_n#$h`^$oz)sfk1AGjp; z{#C8Bt+O=r$h&YuVrg$4OWe8qx~K1EGSsC6h6aj;tjiML@-%b)yz++KQ-znM{rPcu zXQuM!`U8mq9=3jllcOKr;qX)ZaPY-evAz42C!`7Ib(b0c?-JR=(d)ldt2DL1=DyO5Zl?Gv8Xu;+_!ut~YIPF%v-^4MMA3iMv#hT*Sv}LMowV-M zbn_do3ny@js$4zrvp6oKZ`F)6XGK4^&HGkXbaXzI6HBQ}{CDcPp>~qylXRVj3(wV> z$o*{CeCue!wr;O0Wu|<70ghKr7S2E463)=;bWrusoKJeU^y^MNiR?b%8|_hdY;}f6 zVho$%nU<5^ZO$FutQTNY+wt)7>>savCjPyAzqLTCZRfF=kWV{%9|*{rea68-6Lo2&NU4_xXNvf4=+Nb~BT` zH@6um&3W@tmv4IbrB#CQUMu*Iytz^J^Gb2FSAPH1t6EF#A6MnBXTP)~?zZgpZ2NxG z2-CzzQlbZgUfc~|mj3(0(aG$m_ImG{J?;MXWuBk;K6$M(vH9_~lr@4q=ZUS~j(5vX zSpV{q-T36gxyHR$gFY3Wd$it6POfizNlW>g8}U_@Uhao~6*>AbP5n5paX%wdYQ?%a zZ**rfFfgc=xJHyD7o{ear0S+5mZUNm85mgV8XD>vnuZvfTNxNz8JOrAm|GbbTwnF* zJWK;fr4>XMgOP!ufv$m(uAy0op{13vi4}+o*5J$QhN2-iKP5A*5~{&a*U&J;z|zXd z)XKyXV#BnStC9>14Cx>z`D7-i<`t(hWR#Q?Sn2D7?aC}mP0r8F&Ce^=%P&gT&w(f@ z)=#R`El$)o)-%vo$S+bLMu(4kfRDbBo}qqpzfCgCjS%M{g@S>Zu7NSgjiwe>hK9NZ zW>y9UyID)>7#J9YL2eArFD*(=W$>@4Oi#^I@J!CnD}E!f?gaw_gE~SwJ~YS&=8N+3 fa=m=8YTZnbYOpuno3AC~wQX4MuDCK^TRXFR$#p8M^${+uHK; zD|j3JH|>u%ad;Ooo$a1o;&cAnw>|!>`+h&^;KFY!JU+Jxr{~(%uis#vUn;%vzu4!p zZIZtVr(Y2KxA5Dk_uo0zCK}CDo*Ot>x~oY+)nZR{ecbWe+D}#$Eb2WWf3#n2Yv%Er z$|VhVrds}Q2w8b*XX946TjsBXn0yZ2)(WZ~mZqBu`cJK1sAHEZJt}V2=y3`i*2I%%y-9=ziMviuVHJy z!G3}FmiI}GkIOggKiOB7x7t^uW{K^Z!{^K2d}Z^rlAgF?r`X3=+6x!k2p4U;{ZOR- zx6G_MYfVMTTNzm^mrs~^Hq-rDp8Mg@qZ|3_gq{l)Ha(L%vU;t{no~i0Lgp~k&hNg! zZ^0*eUUx%xP0O-pRU6vRm?&E>bKX5&;gz-;kgO#k39PF_-Bp7rh8&4uk)6PS13qu?>ozP!a9%fc$%f^YKu8v zFU~yc*V+Smq_I-Uh*QpdD0)BJ0UaqT$jgIWN+-46e)77>gAbd zTuX{$Q>*^gzYDLGtI>XU?xymUInO^f-T7KA@?)R7-Ok@7pMIa1eXt^P2a~*R_~WG? zZGNb~Sg^pR(qSj=a;Ssy&)_O^3_a_~xtXxn0v^vi8p^-1sQ}sS*oklZfLlcek}u-t7HR z^gCTUul!4F)#_SNW@G)Gm;Sx{!u)pkrl2-|JMQ}u=g*%qW?*1o@O1TaS?83{1OU7@ BKSlrm delta 1619 zcmZqWe9SXJxt@U~-O<;Pfnj4m_n$;o1_lPk;vjb?hIQv;UNSH+C?tCX`7$t6sWC7# zv@kIIVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3~Wi>?k)^q@Y8vBJp%&+XMsm# zF#`kdbr5EB(wJQV5-cllOlM$V5Ch}-J4ateFfgzz_jGX#u{b?-N@UKIP>Htr#pm{) zy=1hMTZBt5;I@=kphy6R%OcGM512SRoSZyNjvZOSsir3`v?!+FGKcxAR!?CbLqQ(4 zBMrVig)3)ioCuQ=)82CQ(!$Fx&)6IP|M~whYbtm5LzVkyPfmZnr*i*y>q8QU=g!H^ zzFY5i+V>m>*J1k?i{gGA6F;^;a{eA=Erlu8*p1Z6)>iNySt@W>k9^PAXewS>@ zYb`@nk*vn2N9A>=ezLxQXWe(M%*36A%g)yx>n+JlyDl$#zvk1XjM|sU!gqxB6fT~y zQuvkY=}!CfMHzLAe(B}Enlm-2=C92A+qwE{m?kj-zTfoPW!Yg zQbUzPZ{Cu+EM}v6uDCs4KlCV`nYXy$p@r3Lcaa{43HzD)jMOvd?eCgjmU~cZ^-=Gu z3tc?E-Y_Z=>Aby6>BJnyx$KJrgA#WeD#bc*cs_gKm$Wmv=g;l4_r84>j1$eQo@3~<>9par z9i|pDb(|S~@4I*KLu-9UNRv~Bu)y*?`=;F$|6Y843Hy%!_grlzNw7PpmCw8PPfzbm z_JgS4qUO z>e5`E-?cUo+uPV*Uo&{~{o>?zDk7F?=JrzsoZjBpv3K7ewhfMgQ$9`kllbQ$W1a8( z1F}Cd_hlKAW`V8c0y*;F6EM$(t&_f1TZ+$i=)UK)AJj z*1QwTlg_ZPZBFNCYIx-$d|7?nfk}GPN@m&>vR>^}Yf?xssBYW%bgN%SrBmEihn~LB z1_2ID!Jv!bS`VxWi~b1|?(S;!mELgWYW?vbJ?`0N0^3)g`02dEZ%&eC#>DFmPhW6* zWGXIo(vn{5+~vsE=$iex+9K>v+Zn5{IoFG=!SZDMWM+|2%SQ!z8cyjVBA>;4&M4xSFjqm$RD zr2qC;ZgpP3%p_Zo>(Xl&{;sv)#Y_9xFWpD~Ue^?JY6*O>+U2gY!U2hc!dqGE-u;;p z63IGGd~rbisY|o%y0X<7U--(qvP+%URIW8Vd;jl$p4*NqeI=3woIDmhnw$Er-PCjM zJ&DEZz8c7Ge=#e@@$rbHA59cxgMEjX#Es`v9X> zgUEwEzTlX3&z5d%SNAKoU*Wk_XzEHszeC-O6SRNu@TGb&&#YgVQ>YSi`Qo&@={<(w zVO1h|z1LD-lrGXBu<;;ny+v*DH2B zV1_ z<3odd;8x_Pr0S*T=cnhS>Lusr>KEvz=jG?7>L!CV>j%hgeGMw_Jzf1=);T3K0RYfW BzuEu* diff --git a/launcher/resources/multimc/22x22/copy.png b/launcher/resources/multimc/22x22/copy.png index ea236a2416095e4ddfb76524e325ba3b35c447ba..74f2d45b7e00889d030d4914fc5633e76a73ce44 100644 GIT binary patch delta 436 zcmaFEewKNHay{b|PZ!6K3dS{)61kcjL|WXxvfWiZpv^INMetQwr`_KF;?3`t9blD~ zdl|;ufAT>7_5Sd7fdG-Cj1JB3i@JN*RlZ*8Eq-To-k6{9u$zpX;Y<6st5*3jtW%pY za~UV+o_Po26#iJX%{?H+sy@L|lj$_Wbk!S&4HmrL<*&bv-*!{|)t}Z94wAp`eb2Zp zRz0Ws{rPF1Z|ykx{#+=l(}DSOxMu`D=UnkR&02iJJ%>4;%fE$jgxqSmWtAf;b$jQw ziM3kW7FIPhrPgly65+6KwbrHtuBYpYcYNmxTOi5pHRHS7Im@2M9qBcFoQst5m&P$m zRy{t(Tk&DzrcFjRwZEQ7PpGVCzWLztty{M;4Sd(f@4r_4^HVBci0~#=gZIs`T$8R} zyvTU@c)$E_Sy9nk=9K%5(mYT0Fa&L$$n$|U$kL*Q!ARmsZAHs`i^@O#NlA-zFBm>A zbdzf|Xm`KTFK>U~o_*Du7wexaQP~~6J#YSz>3y6n#!dg<{w{B8=a;YP>*(0RtUK+# xI7gbm7Xx<&pXv8^mw&(T{(gO4(qwi9t37A09MCP^%)r3F;OXk;vd$@?2>@V*&QbsX literal 1004 zcmeAS@N?(olHy`uVBq!ia0y~yU=Rag4mJh`h9g^YtQi;>*pj^6T^PXNr}OT51_lPs z0*}aI1_tIb5N52s+H?jaSXSVe4$=$8caFY{U|?W8>FMGaVsU!yQo$7Zp^N%?RDHZV_u=}T1G|Bv5(ycSUQzPd^Wh*K%e8?7Sv^XhUefG}l zuk)BHgoWEyEfOtbmo5}!^kj%QpW7U;WZmo=1&9CMi?#4nP}1mPn*90mIj7|>mG$-2 zD>rNMCeUfGIMULGD=EwH%8Tu>h{hRr-E!l+ge{-c&)R&pvkB!PQ>n@v2d0^bX z^VZAIABz;l4UaGUDl(D7@V(Ic5*h6`LcOLQ+fvsKdV7;t33}}^Yq+{NgFFH z=AV!MdFPhewJ3>X2cg3c1yl;lrp4=B!@BHMTA@>~MNLWx z4UN&8KF4o)NNC^Z^0fT-2b05<9o<_DwuoDwd90(f zWAE<6SFdiDcXvNOPsH`($L&?~lY=Yv-+wP(HuqRm_vzE?^Ltm?w|=Wux)_WM3=MP*jC73*LX3>9jLfVIp&Hn%V;WI3wH$SgfFTW^VKL?_uSU;&! zw>VMXSkFLTA-_n07#%+D0Y3UhdWQPZ{Wi%kH$t3;6bc5$x`vh^h6YxqMph;!x&~%e z1_lp*U9x9jV2}j4F*rZ1q&%@Gm7%=6TrV>(yEr+qAQj}a+3#$m7#J9YA&N?il2aM{ zD=O1d^AtRj^Ye<|NUVFoz`&r6kd6-x@_~63WLQ2}wQeRzHON5y_vWikgL18>tDnm{ Hr-UW|D6M;0 diff --git a/launcher/resources/multimc/22x22/help.png b/launcher/resources/multimc/22x22/help.png index da79b3e3f3b103361a80031815eec14cd069465f..a6ba7c65ef548a3da984c824cd2672486925abe9 100644 GIT binary patch delta 1198 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 G5}E+4`tXea diff --git a/launcher/resources/multimc/22x22/instance-settings.png b/launcher/resources/multimc/22x22/instance-settings.png index daf56aad3dff7b7dfe8232f5e9e58c4d4ed9e078..cff081eda92f5bd8282b4a95c82ebdabe73e31f3 100644 GIT binary patch delta 1413 zcmZ3(Kb?Dmay@IDr;B4q1>@F9%oW+uQV!P(&vDL*yXt1Oe&4p-?3~-%a&2yJ%atyT z4{qz-xm;rQ>)+S5eb?ty{87JP+t#h0mp}PjnPXO*92|W4;-g1OvkyNE@VR_N=kleJ z!^>XHT9`R&UDmF=j8#^#1}Y~@<`*7YIX%AgYUO;kO$t&Rut{dj3g{*}RDv3r-!F5}BZKMqSx<%e)}d_|RU~n>kr! ziJ@121h)trdA!j*UiQJq1@`2I8yoOZ`0u%fW-(m6RuZrA#N9)G^ z`v2^Cdp`d97olUNaC+0B`Kwl0olHquu)SI#CVYFtEGgy^$(UnPwrR>f&}%rPIhWPq z+0x3p2bFH!n!X|V`NZaBnbphmsV#k%RYug1l{Te97rZi&%dHAh~{zSSdxe6eJ@e|?b=Waaf<_+ly%sjuG6?5BYJ4=*H8Cm2iYvvYhGm8qSibmJY-tt ztVmu3_3AhUS*{5uKekJpeVUMxvZFfZ&in%P<1^HG89k?+lYX4t&GbZlSB09!$8WN0 zW4=stdiNuRx1RlaMZu14pVOPP7_O-5+xPx`aC>8}4aY|grRj5x+FxEU9P9yD>klaYDz z+JAYlbJr?f_CLZ4Q;ftI_8eegkav0X*w}K9a3??G`}JRC_WV$mKX3PStA5wR%XOM@ z7IhvmYfe6zecZq6d(D?%!G!$u=SBCvuJhO2|MTnAb+Xoco}ZtI28M*REz0ni)N^Y7 z1jiG4mn&X>JFC5aQ^j2&*842=&FS+G3isO{?Ra_Qf^S*Q-RB#E<3gRgofhtPHPfD8*U{3Zz$f~3-mdp@zdnigPrDl8EnI%@*pJrd z9}gUmc*$Qs@z+-Az}5q?5iNHkJ*@O6idx;=tfDLcyYX z?_Uf;3Q^&?_e;**%dcDPJdek)?y2gLy#1}}HHLrQ|6}szms_4QPxy4|#FLIjwy9i? zKB}yIQgSCf&~x*FrG*DspWFQVdA|P73a&$&e;#<}{k`V*?0HwX&p+J%Ea(&e{qwfW zk7q`Qzv+~T-m=G`%XR9*3YO5|4c2cP5{yLDW}mHJ_?q=hsl=4&qDm^PzQMMWRCFKB zxpr)I5&s>nNzeZ{{pimVah~V&ak6FFGMDT6u7TS_Lax+4xUtdve)Yef*Hz-{Dm{MG z2pU?>6uIc()zjPR5*|K($J=eYKgIw5_5IK5Yq@n749=Wq2#vWN^m)>cU+gYv|BWt& zCX36L-ab_3`n%3B;JAEY^t9ynuddEM_wONpz2&dT^Z#gl`L=!k_ot<=x7~@1zFo2G zY+9|v4c;pZTnySNarLenbt~K^PK-#;=s$7dJ>#=a>?;3Qcq6{-cC~5@I&kp56VuU_ sP^n9t3s?jG6&;zcSkfJR9T^zbpD<_bdda}R zz?S6g?!o{DKb?2iGcYi47I;J!GcYiCfU(=jY&(!(S%G6Z$Sg3vbM$2d0|V<4PZ!4! zi_=@DM&^XHi?;3Gecn#)nDq?98wc5Pa>AI``Z})>(c(DhrxAE*kBdiW5bM^Ukf(~h zQlVY5_J!Pa>3(I>y2Xq0MD7A5hsZ@LUBXV>e6!7Mnr+wFCifq|Zd{!H?oRb@2PsL_ zp!rox{y+72etF`#`Y+slk3am^Sh%zDY%TBYZG}7U+?JM>{vH|@wxh;w{*$uZqW!lQ zubAZ>Ch8j~5*ii~8k`b2RWwwXrQFm1{KLn4_qxZkbTMqo<^JBtdssy%)8@miZ2SB6 z%g-0QcH@y@-5hX4Ct}93)`=Tucw5g{=5X)Chp&BE*S2i2xpljG3;PaEh2=pfe;@d{ z=irwwAy-U3&#|v=eO~uLv#8W|oBNT%odqVWDS`s;-}sXdO>3r#cmJHt z5TqgECbCptg@dVU5$kR1ZEv-?r++%OlBMh|*PK~KD^~7U{>o@Y1WTfP1=Ekun%mYE z@9t@m>~LFLyDZY9n|t9R4aL)1Z47P7>E&PhsCB zCjZjV4a-uMt@nSen11_hm6XG}_3?j~c0ViH`SIhA{qD@FjnjUq*15TDR`~50dhju; zFYDo!k1G7v&wPk@-W;>j?&QP6`=$KUCQoO4GI3(#dWLlMW5`tuV*jOXDQ zY*mawRvlU|B)?tr+f={y!1uVSxvN~Y@+?5FC6)JT=dCm+UabGZCUVa~}W zZ`TVhGLgrWU)bEAx6IVyyuaVlonqY=J|D_rS`}OS@6UZ_2dBK8do0s9%LE1XeJHZa zzbDtPo|)PAK>zwh+c=s2V?y<_#IG$mdG<)Xz z(H-Hm%F2d+b$8_Ym#fV^r?fLV|h71oC7O;vXR{oVp zYy7lsxu7zy_w8HP=gHOnK09@Gme=h@GCmG=B_bxrG*k3re5r^$+jnravC^a*vZex921 z{QJz9caPq@QC%KUBEYA#;K78}S-;wL%`g4`<7sX8^s8K*+|OtH`W$H2;}`Vf-{~vm zIqqdLUQVJFe-*j5Ib00Xyd@-Qd-ls+$Jd9w)vNnuEWadaO_i8(OJKu-owdiE>nmSf z$hZ2tO2_#!hwtRfO1kJ2+T2nrrP;?H_uFhLf856VdP{*t$11IkCI_|I$$5IN zCQ_xpe(5bgH^OX_T|H3>;9;ZVL3=FCzt`Q~4MX8A;sk$kNC8-QX1_qY8hK9O^rXhxA zRt6SUCPumj=2ivj0_A7bPbGjjSNDJjIE5!tc(mH8ft#m7oup$ z%}>cptAuJW)HO5=F|f2Uw6HRPYB*V5cAkNO!4%{qpUmXcyy8@bjFOT9D}8;iU72O6 z$@#gt`FX{9`9-z&($v|%FjwoE-BW}18dhWv)ux!j~P5&{an^LB{Ts5 Dp|@rs diff --git a/launcher/resources/multimc/22x22/new.png b/launcher/resources/multimc/22x22/new.png index c707fbbfb7946c535f738d6825916ff64e4af65e..d132ec1fcaafd204168a40218351debaf2955ff3 100644 GIT binary patch delta 885 zcmZ3$-OWBhxt=-5)5S5Qf^q2;<~63TMUQ>FKkMdkyREsq9eX#JJz5fWWkr0Ckz4Ne z@WOSu(evLXzrDHnoyz1nXSUAUbF6;-_nVQzAKw4}`#3c<@=sO(uieZk4%=9rougkb zR(@Tre$4-#y>ab_d*S>3+{&)nTerY}%_ED#|3|LmdNVNow|zW6y?)>0-1ooEoR0g& zCAe_)8vj*n%X4zxY}vZ={H36DRi^(_d6nq6D|DS9M2UF-u}M5q5j|V z^;f6w|M2zGmn7zuS~FL!%Pw8Vas2D4zin0SQ=SHXYI$`){=ls-?bp+n^~VNH`x=+T z|4vme@4@n_424Lymb(4=##>9hBkIL2GIX<+?hUqBU{}(&^ZNR3iKl%Mulx7^Rd(H2 z80^v~xMA0>Kg+nQC(K;X8I*Of$oEK-QD3L>eOA+D@x{5^OMf;LomJ&x41$PP&Nby^g3WYWEl@1^RGR<^a@U$4P2N!Me$GB>eapLxM)X^Tp-LP$dKV|Am; z$}3mBW05!}Q000(nRCLW2?3`xrt1G_+8S#=`KxCClBL!65?-|CH|TyTT$J59#evOh z=He$i&TtAG-Qs@v*)t8Dgied7lK(b>OoEC@GR5_m_I&XXFjOhNyVBYz_-gZGhOq0) z1ln)EN?8B8Fj9nr(XdIJquVH4RR70BHa54oKWc)t+~xMtJ^TN#^WE8ge)GJ_8veq> z$qLeY*NM7{xNt1gy?p6(;6&HQU;AC>TuD*6Y5rx=_7ihLj_f&lGObO&VRf z8#)*S&reqCs4q;4ic$y(;f%~4|C=tI$ zQ%nx@^hBn9+v`=Y3)ye2ycO5Oab9s&mq*5A%_Nu0uUEbPxY+UbtxDdU^o%9% zRyVFY9;-TG;o>XP-uO&@%YQ@J#fQ&mb5DoaB!x*6IE+$QI2cs&oT}NGUo^RI`}LRm z-Tlh@$K!u?g?DoJyUkp=bM>lK+y+g)FCIqz|8aZ&zm3~=*;!gz{=4VH>fjY5e#!Ne ziqfm8Q?IT*Z})pn{ewu07Au3M=gB872gh^YZDD6PtGZ{;&ihI07#J8BJYD@<);T3K F0RUxbzU}}3 literal 1440 zcmeAS@N?(olHy`uVBq!ia0y~yU=Rag4mJh`h9g^YtQi;>SkfJR9T^xl_H+M9WMyDr zU@Q)DcVbv~PUa;81A{`cN02WALzNl>LqiJ#!!HH~hK3gm45bDP46hOx7_4S6Fo+k- z*%fHRz`($k4nJaJPdn<79{SV31&0fnz$z5nz1h=*tKO z2IhWG7sn8b(@UrN=1Yf)w9PM0S1WsSqi=DW2-6bJE~!ak0imHCu3{k@)*NZNe_)Z& zt1i*Mj5@!VBNQ8zCfwMPeZ{Nfpu2gj$x4pSg^IbJua9-U?b)AZ(|&Yr;qgo^?!I?Z z*QGtP`+la{ZXH9-_rIssJf5-o?}qxogNzKmZ1b*XryIXrTa#D5Ii%*t?~^-k@86ZD z;K1;RIdsC=numGKH)0r)pS-$Rey-M}I!R7YF<0uX(6{WxbNx~mUjHf<_156dt-96b zfqDOI;-dB|FDjj&Rd6SN-oDxTYx4LHBud21u{As&S3BK+Copu8hSDYG7Oi!gd!N61 z&}*~oiEZiU-u1DsVs2dieqUR3{+|~X7sUeDHr0LJGGBkqwU`EtAa@szCWg@7bpC~% zC;0kqs&{E|@OQ|?F5h#*O@%w#Nb1SCID=)y?k?_*3^n^JpDp8Fu<8c0k_fk3bjO>= zCxla;Ppah?@xQw*V8Nap$M5akbiMWSfuC>AJeqz$&OowRd3T_)w5|w;;iUs>oaUxMRgL!*e`SfAgI_9shTVhjEC4lG-(MMs6jADURnBUJ)#7l=70-SZLJuc;2F$ zH{`gUO*oeMB0=q*H(MfC%BebO_1&wKCROSkZ#StEyy7?cm+-vM6)HzXWf|>a0$-N+ z*o=V=Ds_D?o=+DvWfE3_u!;%&ZJe zAsX1MV;WI3H0YkCB^#g0Y3UhdItJAS!^p{7DDVI;H7uJo;Wcu zFo=UJ49+htN={{P_w)C4Rq#yC&r=A=NX<<>_){$tR8k_8#D@m?z?_v>RHB!jm!F#o Vc97ANiIt!N($m$?Wt~$(69D??KGXmJ diff --git a/launcher/resources/multimc/22x22/news.png b/launcher/resources/multimc/22x22/news.png index 1953bf7b20dde8c4741c6e11ba1085b5736fd80b..46eaab869829573fdc099e8881d34f15d3c5db39 100644 GIT binary patch delta 911 zcmbQrxrBX!ay@glr;B4q#jUwhnI|mq6lpo{Q|ECo{&5q#%KUg)#rkI%Bv;=RGCcQ&W0-TmOE^iMav z;M(d3>%YH`+bF!>`r`kx^dDZ23oMFxS7kko(3stD{8{pfwe{hT5{_woD8FQLJ@Jfq zLiQ&nm7V&B19cYvo^vpAebfG%TXSE={VNE+CG;zy`jk@0m6XJ3DI$&0QeQ1*Z54YS z5?vUzk@IRP*OIDr5BnZ6$j#^zm|<-3dhUbMv*v27K6fDGp+V73yTotY$FG-Gzo_Xd z&|sfJShCuvWwQS zK6c>f9JV=}A0i(+bsx&_clPZRip$pdx5E5j;*^Cuy}UozlnXKSRb=g0<-u3K*{!3- zKd4|s+&_+&o#rdD@nv~aZ(xW>L4a9M()vRygbpN5+W0s*Y^ng;(Z>%S*n}%t zmd#xJAn~c#kD!W^Pj)PfVeSq)^2ztX&B3z9XoU0Y4#yqc{lqs`$q346W*3;kC zy`N%NTFrWEdwzfH^JUISw;ImHS|y#@bFkp|QI@jk3YL>POp?L}GpB@zr~cbtcJ<25 zEgXBf>uap*gulhlY~A`>E$P{$#F9F<4HKF*x%NI1+;Wp&lj-B)%N~9EIA;H1d(wG) zZ_j7t%kA%3xHp$4oNtwUaci%zrM!7AL%H9BT|uV$bC0cm@zC>6WIn?z{f>9z8=_a0ns9UPIXS_m-imdLMnJsAkNOh_`VLDz z=5E@?YFC#pr$4_zds}}s-?CE2d1dTRD`$2H&UJ`gC?Fl?7j2Rhw^r z-j<~;l5pNr_iB~M4!QrklTYXH{r%>f(Gq>xSAX`aX-A9Q{i?3MoZVGo{C8gZFFB2u boa$#T2WhSDpU=R+z`)_@>gTe~DWM4f%rw6F delta 1153 zcmZ3&K9zHVayr#tz#v)T8c`CQ zpH@mmtT}V`<;yx0|SeYr;B5VMep3J*&QLNGRHr@w=C8x zes<bon6nRq`|RBJn%-h(}}o}rA;0y zHoQ@46Xa}*nwVL(`OY1;;`isy&9O9o{_D%3*r{o`2ifH+DlBR$&b|NtpGk^YDetfI-=4Z!Z{zlDWw(--W>z1amHI92?S#GW+Dyw#6yBWK zv}LdNt@P?{=G_sRH=MKC!(Yt`oB8{(Wdv7~2cyI*`6qJ^-!5dD9&w~%BY%TlwnkBt zuKk|l4^P@loR}85{YTcZS-~<=_Dl!XD9+`cFS&Qw(Zj3XC+#ScF0^plxkmh80)o-a6LDhcDY07T8}^UVP{FUPh)Ba*|KIv;-P# zH%yV||Lex@$}nxk)7C`SP={$Av)Q&r%}p`tT%|R|>#j@UnI~6FCaDOvDpm!lE1qsC zyu(=T^6xW|-7>HchbT%h+yPbN)EL(yOm(zT16IXX^8u7TR%E ztkZ?bc&gK+B{w-YsZ6|5ni9Ee_k^Qb&oWJ9O!j_$RsP1J&wKI9MOj+v|0EB4sII&& zJ8NCL&f)p)|Ca@vxb&@d&$f1zlRkdeB6cnL|Nmi9d0&iP^XqLI-=_&UO*mbexU6K6 zM?!sMrBUYO2#yk8Mvay^g)_zsm zo|`YXz{;pG$*tzkH^*&e{7-mwMy7GSkkVn$;WH)@k^GKf3Ccr9e-;V z_lM`L!I`}pJvZyWALXdCUKII#=kJZ73>mAsmaUvp?fvH7XWQ-fiez^^3RoM~9O~SE zpR=d?=A$#Wuf(b=WNJLoZNBy7Cfnjn&XmYwrO_uQwXEA_X=+-zw&+fmt#O(5cSLYUM8D0)nzxn0Sw)V1jzw)ZgAI!}@bI>VN zSkYnWj#;O@R-dog@Mm5&L&TNPCDyZ---$j{7!wwAOFXwO^|-QrPUZjD1(xCm>mOeD z{CEETo7E2<{G7LJiKpXg#T% zk@8k2=Gff+>)eYRjhN1=D;)e=!LBkj;M8$0HqoUHr^P%HGGx5!S$8x|jFPEKKRf4H zT)9D^yhj4#e1+gg@h#``xjM=nnY{O$X4t%mDSx*4!Kdq6uE(``a>cP`M;gc!CTe)} zCGzvnp3il5@->6PnUZ0xg%^qv8qXa(eE2d${NqPEcB|~^=((e@JHPc&P)1zUx1|@1 zy1wi&c-?>Dr^2-61xuJzoV735R9}7VUy>wWK6`Z3-{E delta 918 zcmX@Zw3>Z_ay`StOlRkS;vjb?1_p_#$q5NIXBk+0_;`4BR;s!>zVqV}oEXT(F?$(D7pN zHg0Az(d}(~c)5s;?Vbl4+e2<1o|uaQaI~wJer*-^{?kz**oC zSGSI^1u-x%+^q_UD2ed(u}aR*)k{ptPfFFR$SnW`NNT`oz9s{KJ)cE= zZ7;K4VfKBf^fAq3-X10~RWI*bQm^iNSI*4v-@W+x7g-x?lIoIrr5|Uk++m_u6B-TF_mE zp2reR9E(o8m)uv!Jvlo5#Z?WX*C{d6SLONYvKH0GotW-vFwf$#bgxfr?c5eM=Zv6J zY;G4CXcURE2Wq4U**lg7EbJ|x&^Al2HORfaua055pI({v zrGsm`7YlguOmfC zn|Lpw(0E3-cx=J44PRL6_oW4v)K(u`YU}y%w&WCRmaZ9*v)%a_SMN9|E6VkEX2RKh z)r@)4$rfuF6Xdw}rM}*AetnVoBAv)fuP=ott#MLh5VLkTc&6aj6b@$t&TIdF{961Y zhwDtl@r*eaQ*PXh3}0j6-}d*c{DE@E|Mh+?x~t|YnOdd!&h9i|_@v#DRu=l(WYyD< z8;fo!Ce8FwzQ}p~znzqZXy3y2|9jJlU(RiCy}Bt*?~3FT z<~{*U{+L9W$2T|4pW57>Zgh~LEMzaszU}+2Ea_Wx+s58v-o}XizfCt@UwwL>%6~?_ Zs#2$Fe)$Pk85kHCJYD@<);T3K0RY%{k1qfK diff --git a/launcher/resources/multimc/22x22/refresh.png b/launcher/resources/multimc/22x22/refresh.png index 45b5535ce420dff6a52b31609225245a2174de59..bce4cc512e72d8e2e1b400ad0ff8881215311dac 100644 GIT binary patch delta 1163 zcmZqXn#Vaoxt=A})5S5Q;?~xw!3ipn60QHE-K@;Y?nvI=mb@^zH~03o+}qo9_pZ%d zeE!~-MaK^v4!4VsZDiOZJnyekv&pGt|8$z)YF$}+;rP_5@L#Ko-k9sG7@>rRQXtQ(&T{w(?R zU{#r+;|^7|jn-$EnKq}-W1lCWeezMG*I%uLuh*@6v2*=%d;FHOJj&-(Dzj3Kq$Wmxx-!rWw=} z-zI{hUnIzNp{7dfE)J=#^D;BV}7jv|9Oi1KO%4Q7G zKDchnv^PJm>r8VzeKjDz%=U)ar}yRs*9x!QcrY!qu$uKicn;+$T_f zc&CEXuY^uVj|~`rZy+o6WN}+cb5@&PghtU1zan zvncN|^MZu8Nvzpt7r1%acLXjvt}H9#HuVa}$J&+s3}&+zKG@Whv7z&MSh1LCL-wwh zBD;@d%1?h4$`#5Me)9Omd0yIrUOg7i3|FeP)^lH9vXE)dxvGU{W*V(1TEV52zp`gh zardF(2K6l|H#M&;G2Drl%s)~w!x$)^CKi&Z31UqOPQ+Fn)@tbX{%MJmcCDtYsIniYy0yI zH>W(T-zcNbQ_vac5X))ObHKjE&e!QfiusOZtM7mMHv3R&J+H=`tinWp-Kbr{23Iy+ zEuUw3BX`=gwf>W%Klq6Lmz%aItNNtoGJ~SWXFpE9=*>3U<{ekH%&VISHR!^ z)BA7F;^Qoj#WTk0YV1DppZhh}dui6`6*-UZ`;^XK`t`%iRJE!nuddFEFw^V`x|1_2 zcAm-squ|#2HR2x>yw-fGcWo_YT(QNH<7qid!Kd}iKQ|x9|FJu}by`IZSKJG;ldIS6 zY)D%9=W!By(vl74OLj}|Nt5J=eA0Gds@;kWb^=e!eky-i!QVCKcu+sVTH91 zwyTE!jMKVw{qoA1|( zv;VpEam~ABP8xSEf36nuJibzub#DRtLXWIm&(QrFN&*7wb~Ps5u6a;;w&CYSrv1`l zQ|>)u-#nj5Iq=^s@nyp9^*`61bkpK5d9w88gPF_h6U@E|FTJEM_wv_oCz0F!f+j7~ jFFmfTzGwX~zy08;z0>t?Ut(ZjVDNPHb75KMl+XkKx34-t delta 1264 zcmbQo*~~RTxt@Wg*vT`5gM)*kh9jkefq{Xuz$3Dlfq}UUgc)nEHl1N$V2~_vjVKAu zPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw{mw>;fq|vL)5S5Q;?~xw(K#WZB5l|0z85cB zzTEio%$KH@#FoeCh}~Y*>2ir(q17*a+1#L0TfW?zvZy}br7ml$kf#aPQz5SfUK|P` zQQRh7MV(zP&9i=75O7|UZ)2h+;n*mUY_-4oSc_-0V|>MrNmKV;|8?$E)XAGH4>~`* z=&ri7qI27ZsxrIm;A<(4{s%)6{S#Hz8^7PS`|Mxa)rssH4xiJnO|6Ogl(8|uf8UW~ zNA7dS>$_Zis8v#1f2s9teE#us@5>hbKV6q2bF*VAvv%S-a-_2B>V?)+ z=F@8FotiGIVzld~?X*+A^eK_MtY-7$!XtK{9&LNBoHX^r;)t_(Yi?|3>I<_@>zumv z(bJ}VOeJ&PJ6u1yF7r#=E7$L>?;@YuPOrL9u!wQ0v*?R`H+ZWjo5rrGzv}UHo>lmg z(j}s~$+?Et=12BFeXr+UR&BOr0-L77!Ql6fb@6tu+FoBMTc>;OX1zz2Pfz#CE}q+2 zf8$Qh6Kd&iO>Sv(^2qmN|7_T?lxaz*lZ)n5rHeCKCANt1dh_eK{!pH0f6DT#B;VmI zgU3m$9cz_0TQdJ^{@1?a^<9C}JL(VU-}Q}J9H#$9-Eikj5oMM93AK-y7tU?WO^hh2 z;rz3B&ohzdJLY!_KYFxe!#~$|Zu(vKHTxdkeZs1p8qj){yBhOZ@5n341k$-kVR?tiX#jo52 z^>wdZ?rpUZsf}wnw7GRgb%vfywCsgzrwTWUh5Y+eR$-X`+2+ZWKNqu?w{bS$K_(ivudok6U7F%(0uH`zSAYD6U#?*^7)r%ia zo5kYI$+_#*^e0a?99-7Vu0O!@zsJg<}5tSyDNZ+ms_ z3O^-Ywpk|b@y4ps%hxox`HvPY-C(-ViLq25gS}DR>At#R@_|RuVedcueEV=ylGfts zJ2rT0PtRNOZFc?hJMFo**Ep{Aystj}!>mP9{EFAz(mQ(eiE?-U<9!!(o8KyB#GK-u zV3d+{u#i7!`z(*V?Y@??dsklJ6YlO?cIVSPk9~H}SJcjV{>E48idAg$Hq&one_JE> z`*H>Kie6Ltl*jmtQFPuymJd#6>|Y*xba|zQ#pJ#}{lS(OEqdoKy<7jRTsYGGZL;M1 z=-qR3w|&=e`DuLA@JK^}V)16y=L;IoD2o-@7bJf4keX*Zzv+&)-jkSOmxqN$Vjnj@ zcf0gX$KvHb#pUNKTmP7xnZEw->KW$)#F^e~T7A@P>hAlkdmf7D$oV&a&oVMn*Qu!U z>NxoL#?8~oktg02{W-`~GBqsdS7!Y_1(5|oo5S{|<^@dLfB(Sc$9fj(JU7%tE7r}f zNV~%vJ)bGL_m6b`v(UbO|K~3=Sh?qc=)JQmlIQ+2=HC1}#GC(3=`UZ!6M7TpZ~LtG hw!ixGJdS$i_JgPPp3M3Gkb!}L!PC{xWt~$(69DMdX>$Mo diff --git a/launcher/resources/multimc/22x22/screenshots.png b/launcher/resources/multimc/22x22/screenshots.png index 6fb42bbdf585f66b45c48bffab1c0534c0cdb8d4..780eb43515675711c297f470473c904595f85098 100644 GIT binary patch delta 827 zcmZ3%b&+j?ay_$zr;B4q#jUGTnKyj3kZ|z7^kr7|?QKgB-rAOXds|!f?QOX)Z<^hT zRyqG7>eqRnKefyArWm%>GkxsuTyIx=esYVi-~kC`g|2yK=@%}3T{$P?{$%}?w|@Ei zpFh7RW7poTK`n_5a++2w4jgq&9VK;_QX5&tFP@eCm*%zL=&#vt>a%h;+`IHg*5>z> z=0*Q@UVkja!?3qjcgvQmL9x+amwOeT{?4%D9RtIp!YzCmx#2Zo_SWzJO!(_rxwT3$ zPvgE#P@aB#`j*;-IdM|E(wP=K;q&WQyk)21skKifC$wI?Bp9Dk@`jz!@?!HODMbn0 zze?woR+`D}`CKut_NgAjop_;o^+$zWVfHIbrcJSEOpv?kv^z?GQ77?lgUE)MKkU~$ zYh3CcMBDxSBI}j=Z^jKtVQmAS<=5snJ5E$yFO#Z8}$aZi1b7sBad7I38)qi5Hc~`Bl zOh2A`xARt`(7a$%o%M^4y*if9Ww6fu#aCv7dJC<-{_ee+AE!mHIe7j4wT2BB+=`DV zN(aXUI`3NDU3#6X@+-5(>RX+5<#n6FSm)L1*7~vc@hv|WA$I)8!7avh-}mN6q`hQ~ zOq*Hhscy9A=h5djU$01i*|y8z#lz#epI+)^S(m%5{5d0a;pvZimwRfO{tR1TqR}jP z?}y~_NrudbMij$DO}ll$xl?F5gfx?*RWtFS~ikli&FT6~#_jdLm_; zb6OVThgyEtj^uB#d-9)}mYsRCD1yx~KOmUyD1nD=xg2A!~H$dX>qVmW6#i#~(TM@YR31 tKgFo;`7gNxHV0mmtT}V`<;yx0|SE;NKr^;Nlq$*dwxzzYMw$sW^zes zQL2JlQDScDr#EF&85kINL8=@}OEU6{7)lcBiwjbVc4^&>W?*2@2FbXj7AF^F7L;V> z=fO-VfSQs9GDSzhCowMtY;|zUZCM5e21SrI=c3d^kRFAQ%-mE4BLhPtT?12HBa;wA z11kdyD+BX{XxHZq3=Cc%#liWdMaiiQ86_nJ^;Y`&`30$Y$vK$?iA5zK-{_~LmLz88 z=o^|F7+M(Vr-Qws3w4Ap*b%x(mAWN~Ag9+?f8NZ%z~Bio);YhRvM4h>ql6)#G$|)D zS-~YgH!(9$0c4MrzJ4;;iDjwD`MJ6IdBtF>a_TdaQ}c>bi}ee@T2jC|^dk@dJH^1j z9Pa7j7-G?Tb*isVOsL55`tSR!_axpsV9?Z5c&lq+1k*%`2b3LvqiJ{SM|ml3yBs9-Fc2 z{b~8DpH6*opLuSv-^zkmm%xrbr!9St*2^7euy|my)8^jo<@xK`*K0S5>F+B#Rh60Z z!LIJhy|TPNJrOf^BxrY-=V$-sTNi$~bn$-{pIdhIws-v>Rf;lPxz}<{v2{|?!aJ^8 zqih8tvMXoYELf1argwMFn9nQR zqWJcao>x{&$LsydMqie8&9VH;_`L2H8^im!2TO7%Z!L4Mj0k$v)--3Av*%Z(hU9B9 zK?j1r$ta(kf3iMgouO^*%qYW-gL$RvMb5IPSiV@Ob?cdQ)oJ7TTbCu@7%Y-n8u8eGleM_0XUfuD_DAoiq9n!LO=*y6tsPacv9#%^dN}n-?c+luegmiIbgke*L73%)}j^ZFbH%eC7Lm zgKMuA%e_6OJtt*n(BX3Nla}U@o6I=#S|!e_e=28KVb=I}|H1ryA7wUQpXLyevAFX6 z-RU#qBMxa!m#kGx`lR(l+<#O3TiJzYqYn7j9Nf0MZ+CT6cARL68CyHAWc*v&uAG>ozZC3nZ+2(pobMu~$VqUV#UU#17_#^M385-VNox-`s{ zuNAhTEsgHko93Q-Bc^=5pW(vQuN>#?YHRjqe2ZN5PEvUOslDCa3m0zMd-RsqM|p+b zw2u4io4I>$_a@0{Cf(FjoSc~W_WOe`*NvUr1t(t1kX^V~Bd^p&LGayLwp3gp+Gu#N$gfnEJv);T3K0RS;_MlJvV diff --git a/launcher/resources/multimc/22x22/settings.png b/launcher/resources/multimc/22x22/settings.png index daf56aad3dff7b7dfe8232f5e9e58c4d4ed9e078..cff081eda92f5bd8282b4a95c82ebdabe73e31f3 100644 GIT binary patch delta 1413 zcmZ3(Kb?Dmay@IDr;B4q1>@F9%oW+uQV!P(&vDL*yXt1Oe&4p-?3~-%a&2yJ%atyT z4{qz-xm;rQ>)+S5eb?ty{87JP+t#h0mp}PjnPXO*92|W4;-g1OvkyNE@VR_N=kleJ z!^>XHT9`R&UDmF=j8#^#1}Y~@<`*7YIX%AgYUO;kO$t&Rut{dj3g{*}RDv3r-!F5}BZKMqSx<%e)}d_|RU~n>kr! ziJ@121h)trdA!j*UiQJq1@`2I8yoOZ`0u%fW-(m6RuZrA#N9)G^ z`v2^Cdp`d97olUNaC+0B`Kwl0olHquu)SI#CVYFtEGgy^$(UnPwrR>f&}%rPIhWPq z+0x3p2bFH!n!X|V`NZaBnbphmsV#k%RYug1l{Te97rZi&%dHAh~{zSSdxe6eJ@e|?b=Waaf<_+ly%sjuG6?5BYJ4=*H8Cm2iYvvYhGm8qSibmJY-tt ztVmu3_3AhUS*{5uKekJpeVUMxvZFfZ&in%P<1^HG89k?+lYX4t&GbZlSB09!$8WN0 zW4=stdiNuRx1RlaMZu14pVOPP7_O-5+xPx`aC>8}4aY|grRj5x+FxEU9P9yD>klaYDz z+JAYlbJr?f_CLZ4Q;ftI_8eegkav0X*w}K9a3??G`}JRC_WV$mKX3PStA5wR%XOM@ z7IhvmYfe6zecZq6d(D?%!G!$u=SBCvuJhO2|MTnAb+Xoco}ZtI28M*REz0ni)N^Y7 z1jiG4mn&X>JFC5aQ^j2&*842=&FS+G3isO{?Ra_Qf^S*Q-RB#E<3gRgofhtPHPfD8*U{3Zz$f~3-mdp@zdnigPrDl8EnI%@*pJrd z9}gUmc*$Qs@z+-Az}5q?5iNHkJ*@O6idx;=tfDLcyYX z?_Uf;3Q^&?_e;**%dcDPJdek)?y2gLy#1}}HHLrQ|6}szms_4QPxy4|#FLIjwy9i? zKB}yIQgSCf&~x*FrG*DspWFQVdA|P73a&$&e;#<}{k`V*?0HwX&p+J%Ea(&e{qwfW zk7q`Qzv+~T-m=G`%XR9*3YO5|4c2cP5{yLDW}mHJ_?q=hsl=4&qDm^PzQMMWRCFKB zxpr)I5&s>nNzeZ{{pimVah~V&ak6FFGMDT6u7TS_Lax+4xUtdve)Yef*Hz-{Dm{MG z2pU?>6uIc()zjPR5*|K($J=eYKgIw5_5IK5Yq@n749=Wq2#vWN^m)>cU+gYv|BWt& zCX36L-ab_3`n%3B;JAEY^t9ynuddEM_wONpz2&dT^Z#gl`L=!k_ot<=x7~@1zFo2G zY+9|v4c;pZTnySNarLenbt~K^PK-#;=s$7dJ>#=a>?;3Qcq6{-cC~5@I&kp56VuU_ sP^n9t3s?jG6&;zcSkfJR9T^zbpD<_bdda}R zz?S6g?!o{DKb?2iGcYi47I;J!GcYiCfU(=jY&(!(S%G6Z$Sg3vbM$2d0|V<4PZ!4! zi_=@DM&^XHi?;3Gecn#)nDq?98wc5Pa>AI``Z})>(c(DhrxAE*kBdiW5bM^Ukf(~h zQlVY5_J!Pa>3(I>y2Xq0MD7A5hsZ@LUBXV>e6!7Mnr+wFCifq|Zd{!H?oRb@2PsL_ zp!rox{y+72etF`#`Y+slk3am^Sh%zDY%TBYZG}7U+?JM>{vH|@wxh;w{*$uZqW!lQ zubAZ>Ch8j~5*ii~8k`b2RWwwXrQFm1{KLn4_qxZkbTMqo<^JBtdssy%)8@miZ2SB6 z%g-0QcH@y@-5hX4Ct}93)`=Tucw5g{=5X)Chp&BE*S2i2xpljG3;PaEh2=pfe;@d{ z=irwwAy-U3&#|v=eO~uLv#8W|oBNT%odqVWDS`s;-}sXdO>3r#cmJHt z5TqgECbCptg@dVU5$kR1ZEv-?r++%OlBMh|*PK~KD^~7U{>o@Y1WTfP1=Ekun%mYE z@9t@m>~LFLyDZY9n|t9R4aL)1Z47P7>E&PhsCB zCjZjV4a-uMt@nSen11_hm6XG}_3?j~c0ViH`SIhA{qD@FjnjUq*15TDR`~50dhju; zFYDo!k1G7v&wPk@-W;>j?&QP6`=$KUCQoO4GI3(#dWLlMW5`tuV*jOXDQ zY*mawRvlU|B)?tr+f={y!1uVSxvN~Y@+?5FC6)JT=dCm+UabGZCUVa~}W zZ`TVhGLgrWU)bEAx6IVyyuaVlonqY=J|D_rS`}OS@6UZ_2dBK8do0s9%LE1XeJHZa zzbDtPo|)PAK>zwh+c=s2V?y<_#IG$mdG<)Xz z(H-Hm%F2d+b$8_Ym#fV^r?fLV|h71oC7O;vXR{oVp zYy7lsxu7zy_w8HP=gHOnK09@Gme=h@GCmG=B_bxrG*k3re5r^$+jnravC^a*vZex921 z{QJz9caPq@QC%KUBEYA#;K78}S-;wL%`g4`<7sX8^s8K*+|OtH`W$H2;}`Vf-{~vm zIqqdLUQVJFe-*j5Ib00Xyd@-Qd-ls+$Jd9w)vNnuEWadaO_i8(OJKu-owdiE>nmSf z$hZ2tO2_#!hwtRfO1kJ2+T2nrrP;?H_uFhLf856VdP{*t$11IkCI_|I$$5IN zCQ_xpe(5bgH^OX_T|H3>;9;ZVL3=FCzt`Q~4MX8A;sk$kNC8-QX1_qY8hK9O^rXhxA zRt6SUCPumj=2ivj0_A7bPbGjjSNDJjIE5!tc(mH8ft#m7oup$ z%}>cptAuJW)HO5=F|f2Uw6HRPYB*V5cAkNO!4%{qpUmXcyy8@bjFOT9D}8;iU72O6 z$@#gt`FX{9`9-z&($v|%FjwoE-BW}18dhWv)ux!j~P5&{an^LB{Ts5 Dp|@rs diff --git a/launcher/resources/multimc/22x22/status-bad.png b/launcher/resources/multimc/22x22/status-bad.png index 2707539e1995690d1c95e9b68cf1fe9ec232b9e1..9d001ccd2d855988fa95bfc4c9ec4e18f6d63437 100644 GIT binary patch delta 537 zcmX@XzL8~uay{b@PZ!6K3dXHdoBNhHO1S24c@|xIqj1x<+}qo7Z{K5&xP9*}`-_6m z;&&fT+ou&R)878d`el;#(h%kLrFy@Y+|kQC7xwZH+so%#5nk1dH*wj#z^0%wx1=B~{3ikQg^$$(ow68R1oF#bW znueXzam$ylLl-S~43Phx$k(&<+NU)UK0gH>eX$d%H3|&z{>PPe$U`P@&EBAY3}@RD zKe*4hxGneA<1)4KXZvQ{Z@p-+rsnL{iF5DjiLOiOT3-5M!Zf{@8E!msbIPo>kLRYp z`#eMA{yV#vy#-lor`&e=VCHkV{{FGn`hR~sk0x#Oky~=^&T~V#=#4u1i7GsYSB74i z^LFOf+rlh=LQiC$`Id66nvLhEru+|OKIXzxfg-mHJCokBIn+3EFPT4G_L~0s@T|V* zp5V6b$G{ymmtT}V`<;yx0|T?Gr;B5VMeo|H{uy&zC60eQuaarD zZnmzj(#1<#uX^cou}=1O$X@)wut~je?~83q*tsnwg6fObO%daCn{Y!<_sW&Y3oKvw z-U@cy#2e%&5Z!g#xq0I?v+NsZ)g<|UAKzZMT3lY@-uK#PwfjDwdvE^Ur^E1-h`95K zYm#y4E6yd%J!pDG)AaTs+jVD-RO}C~eZlh2sO6&7=2Es@6OJvuaU}nTXt{K=&Q(ck z*~fqOH|^(3bWcc|TVEr#d&AntH7g!j|G6QNuEzj|<}6*aZ(*ig`@FQ{YUh>(>6yM) z{WN`6?b<)e6>(5QP)cq`C zR&!PeUY9swaA)(u0I9v5FW;@cI^|UA)vQpp$%R=}yBLqJe3?1Z$8Bj);p!N(h}BzP zU%Js}&GWP2XZMlWon_4tDss9ak51K}^6D`>Hg)P$_ILeaTpMrHm`DB={K)b7uKve| zalhpKYYGp@T@e$Hjfg8NNO4h{eDU_})j=y~NXUP8+W2C^kxg00VfmV@9bDIgHFp;@KMRV&1xtqRqRr4CJ3kA*bT%J3BPRZ(+JZV+Mi|=C2?VYSH8yTA`{eySi z#*oDN4nryK#4X+H?;SAatT3FqX?@t|P5bZO&+#g)x1Aca;_9uR(m$A9@2N98_Ve4j zGK-e;o1WbF^|*9NFVk=NAFXqb?TY6g`?2jvd&JWlv8U2M7B4E$F3JAKcFuIc)4aZ| z_dWBzedlPwB*_4}oCA}sJiM@)MS$!h$m-x${C9GvXH^(zDFfe$! L`njxgN@xNABJaqo diff --git a/launcher/resources/multimc/22x22/status-good.png b/launcher/resources/multimc/22x22/status-good.png index f55debc37aa1861f71ca3ee5a359e573030544fb..9ac765abe1b6278868e8da82205bad9536f0d3df 100644 GIT binary patch delta 701 zcmaFFeuZ^{ay`>*PZ!6Kid$2sGWW;@inN}eb$F|Ywd)O&b*5W$Z*R-Z&edF_do(V* zEAZ~U-IxB%d2;6Q&v`6LMH(qHwDMed4^4fMYat)o6+E%mLg-@0U%{m}Qu7Xn6$?z8 zxypF|<1>pYxOZ-ppD5_;(Xa4iRm-FRr$mm2yPPbR32&2b@jd2Vzvim$_Jj}>=@mX6 z?wK+Rqm*qvs@k+C+dkRUo!Ii#Dsk$(KG#_f1$uni#ExHG)KvXbA>z!ul_m`vTvc_h zXR+q7rypIi*kIO&E7!cgS3PjPapJ?#sw#1Vb;l!i9JSpm{6uxa)WcQBw4Tk=zskWa zvU+Cc(>W%-)PiY>0M++IF zJ%82bf4qPH{G6=jH{WB2+E2TdqgvmiWLabkw?CYdXl`H1pZj~$=S`lHOSe>9E4GNg z+xCpNKK5mn9?R0Np2{gF|LklNn=TrBsYB(^<7-y!&a5$9cCNiAIA1c!Ch#ucua~!* zV0up}#p}IoOV>I!&K-g`vP_g#i~eD`vO7P2)ylP*W_3S*EoH4cYa`bEiSA}&-pbZ`{${5&GS#Vm6u{p?Iv z&%<{ej%x3nyE-CPf8ow7t1vAi8RHjy?0J@n|MUk|J0H`FVdQ&MBb@0DP@c!~g&Q delta 973 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 diff --git a/launcher/resources/multimc/22x22/status-yellow.png b/launcher/resources/multimc/22x22/status-yellow.png index 481eb7f3fae0a1271548db2640463859136b328c..e125cf098a94f0bdbc0fd262900e4ad7eebbde49 100644 GIT binary patch delta 568 zcmZ3?c7bJray^r{r;B4q#jUMVUCX2$1={{UD6MI{V6}yJj&uIC$frEpj`}DY8yowd zIdev1O-XO(kuUf3*ZkTQ%AwS?s*wL)p2df}qkLzZWIxRj%{CTW;~S-*t(M{TrQ*2R z#y^YecD{9*H(}F5mfR|b-Kh%>OI>KZ5XG5sjZvsT%Ft2rlCpli;Sc^exk|;i)er1f zvb0t?m z{8!dCAM!a9{UPt*vCdO6Z|dK(eSP5|%UaPcscq7I?zg=1-vtTzT1oS(|0f!+@Mh=T z@!-1myM?|#7rc+RyZB!I{v^TMo6gJD99!Myd~642_U^0S6Q0Khq`Gpd{!EDewv%~% zc+;*e5rk zfCbjpPp{Pm=Vdi_^aVbvnc1A4%6RRb35Vdq*e!|u8ONL3zASumTUX*tl}U?L>4aas zFI!t`*?hDjx~$BsxdN}MKltr=e@?FCDb8*yv-b~kStlG}{Fga%vY>sS@usNFb^o?s zWczEp^||u;y$oK}iXDfIU$U+Z+wkM>S6)Nwt*b<~^&ack?XxrI$XipVO%^G=N8ew4 f&-Fdfq}u()z4*}Q$iB}b?*_M delta 781 zcmcb>vY2gxaymmtT}V`<;yx0|V0nPZ!4!i{763>Ya^mlka({63(AT zoT-1c3d4=w@Gq#pYS!SdTdA1CzHhygTK7|jMYWxRa$fIORCs8-QbWqUI1QGLoBDe<*Vlh))r zt>&AiZ|h;k9ltM8vE%5kr#(M@FzG%pkmV7~%~<6Vm69k}H}lNgdQ0coL9q(YDqYT- z&GX|bc*(@kF-y(xs_2Wl`~Tj1bFM4j^uWN5wT0ms-?50V=kJ&6|MchPZ|_sjd~LVdeB<3IatsU%44$rRelF{r5}E)gqf-+A diff --git a/launcher/resources/multimc/22x22/viewfolder.png b/launcher/resources/multimc/22x22/viewfolder.png index b645167fced9eb97928af084f6f907e7bbcc3fbd..8d5c2e752a6b29306e9cc8f837bc288412837044 100644 GIT binary patch delta 450 zcmaFIew%rMay{cBPZ!6K3dW>A|Nq-F>mCp=v#36|_VxRH|E@K77Hl%!FE0A<%PXFV z_Kp(|8ctsS_lubz`xZa(_Aur^hPMC4#gpzxypz6@*c;6o!Tlz)UFd>XL3w%k^wlS2 zYMMWP+V^6|anC0VJ3j6>ds2G+*#ke^T^Ft2o;%Z8%;D!T>-OS9_2tIusq^I-Tk5ww zez4fEW^s+MYaH9wiz(+GTRdCdwYUH0g_Q+<5?WvXg^RAPdBN%;VYL3&>8{G_s|9)% z28n;1t8=f)V#Z8^9u}Xu9MWNa)z(J+?h&84D*u&zs5<}f_Tnv~?pJ@ZGtV}#Qf+Y% zK4&>^|H}zSqB5tc<-Y$=>AkZ4b((1P`-+cj^S4ggHZAj$S3=S>htNjDl8H?o7nFSG zWzJORXIZu+FhRl8WX%oEI+uG@D^g$Om+fj^+A05l(`2FD0}i|Mi==0HefPR=IsI6` zRg*c%1xb4ShghfH+dTP|df@fY$47-_RyirXO|E)=<6rINYq@-xR+qXtd}m0e-m>QR zKR?e(Bdx9D%;~NqvxY_!3x$P$|NTuh-u-XyBMyzsa}DKbVYMt$iOYE3YHY7$U|?YI MboFyt=akR{057-M>i_@% literal 1006 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 x-G2oa_})GF{cnBz@3YtIxDFicPGZVeS6!| zebs9Gl3Rnmy8qa}SXzOZdBcKqTOF?amcp-_6Q@KsF0DAd`?T7@E6Y?3*5&c}WX)mc zoHu1@*OFf476v8{mJ7QD)lAQ}H_YTvw7wa5!H>z;tYOiL?3%~**K6&Rf1G^tZR*2w zpFTdfI(=O3l(*hqbK4o86XK74`LddUZ%I0{&b#|O-oLgVcw}d@=vmp?){R?@7wT+g z^SR1xa)>32rE@yt$x;S~4`Pf3p)>DRl$CwY%u5Z@# zwZf&8BHjhpP2)xGO%Yi)?^n}(uL9q;u$rY|At6T?!l!4{g>)aD zy|(Yu$Mu>`ucUa^-;r3bV#A5Ijh9cvg=~3OZ=t&5P5M1e?o%CSHM{Djr&=ULipYKb z%)LnR2t!}NJwcQ8*>77WOtqPH!m~8*^SPP1rxUYIC(Vd3mk;y1`N*ttp|#<;_Y1dL z{JFA~&BRr>EscZq`Wd@>*Hb2+c^fnN*_t1Q)(rg{a_?Q#cu+KX_r_;?XD4R=&!i z^N^gxIOzb>Qv(&xrXTNTu`w`L*m1Zig!M)1vEX?fXrhNb&vmvEn!43$9M+V1=FT&5dUMWp`#mRW%y`D4ARkdZ$RNK<5FNt=)Sml~?)_+f0hsK;wyIKCY z+j;F5-XGg_KkbFW1~y^VKcCOr`!yTt>M`~RxLxSc*FEysPWZ{~kB`$;s=X@QmmKX^ zjr!xVto6I7SCupKOG()!?HhHLZ`9HLIQyTAL2=FmQ7PF?>58 z5HTZAscuTEmfPf03K^z~7gl|UkY!ja^nPm6k)1!{R*9SJmoEur?^~J_m&5YG{+Xfc Vw!GZ8;tUK744$rjF6*2UngAYf8G`@- delta 1232 zcmbQv`Gj+VO8sh27sn8f&Z$$qGh{<0j@RF}{Jf($f3n)fjT?QXP1h!^UYb?ARbxd* z2e+fZbiELfT>>$jb_eEi$8u>Y>DB07X;oU3B)BB(X!_QR$0D*XFY}$HW`1&S`MmEn zde78ywR*ocOP)J3=W~6{{h9A0O8XA~PTQIG**E9K{wWt1@Bd(5pX8mNd-lQE==U~- zXP3qDtiOHe+QPSIw!h-Hyz@)P-`#dX(W<6&+iTy}9GAFUxzuDbtJFuERaI>3rf?^m z_`E0lSM_x}o5=Y)m}4H_`0^ukVf@FuosZTXXV`O8)lb&;YTUbfmG(^wR&h*tCi%5B zv(Hcd(T69B&t@2`LL|KB>hJMP8WuX7nboV)TgK%*+Nj}+v70DoHM8O;>URNKA%4)qUYNlZ~kuQ9Kl)f>Zg0fw};pB zU-PoxWBxX??`m;dvDdwGC%Rd*+veS3UGrKx$@%}$#7W!dE#rN^_oHTH%mTlkPyXuH zdv1DmA;!j-Cn3f4$K`m@3~Tr3;*hVW=Kudy_C9{{;&7%tzi-KPT?w3@_37pB`$20% z_?J|^c394)9jKu&SJLSPd!q8Z>Q~1%+WP-7G<>A1|0l@gl2YZD7b_1d%Qh7+^_cdp z%hBP@-d4FwY>*VJ_R~X8UWoAFwC0$nkL7q>=+UZx+^O)Iav`sN<}(ZoX;D zGYr?x+qkz~{kYxFw3PGH(r#JE7c{&VXTPb`n4x}K_9;`uW5ZDUZ=bF!&(F_XdiJxE zm|=ZXGQZxVEpzL&Ij4Qet`rvBq_p?>?&j+E*6{@mveVyImHt?ytr6omQIu!R`}Y$t1&+11sQ)kro7Hg`Oj<9yy{wZyJPd3y49zWJ$k7#w>PGkaZ@zh^_ks-)ib zjnm3@OZ@u$uJDJ_r(;(8-QMcW@cLqGZ0(|`mA*Ph>Oc4R%O;g2&NBU* z-JpIt?fb!f=A3`HZtLyr(~A2s48Y_n78v14 z)d~?+o?F8e;5cKZ<-485(>CSQzmA+ZZ<-3*ls&s;T~>EGb#pXiZ@1V2S9&`fHFZ~O*O&X(^lUwH z_UDbKKTrBRk#6qcJfrRBdb&9Fla2a^+EqXPWv$AV*~D2Qk>c#M&2*`R+Y)zICq_XN zanqH7QcRNt|8*Rc3Hs9EdMs&Ea_OUG>9vEY z;0l)oYhZx_tH+`pM;vn|ggMR8nIO*966Y{!`5)%|EuvkoEl%EGU|?YIboFyt=akR{ E0DW&?f&c&j diff --git a/launcher/resources/multimc/24x24/coremods.png b/launcher/resources/multimc/24x24/coremods.png index 90603d248a325c97bda9976c5162cf9324c101dd..ed716f52f3ccb0b8d5e81939ff300273e7c6173b 100644 GIT binary patch delta 1155 zcmZqVn!!0ir9R%%#WAFUu{VTyf=Rf<8}kU+;&11>b8qV$)j6VdWLxfSEtb|Be{yHP z-gxh~k#YO3wVdm=SN(qYd)INE$44sXzrS-h<>j|;cUqF8jOND5m9OP}w#s!`c;#8s zru2LEsb-3t8WQY&RfV&A5?+;uzx(v#!INdVC%AH+6)eB^^xeDp_4@V6-!l)2`!c+9 z6q;bbSF!EJ#bsX-!gAeC>MndU&3Rft0hh*a#vE^%mioq?!Uc&6!Jej&UKzFYplTF0b8eb0>(A4(+}1%sLo%kH?-XF7GAb9`3zQvNHF*W9vG*wr4h za&p)I&o&TDm|knDx^&@B(Jnn_5ur&khFMaYuCF*|$2>e@s#kt!R>b2fK0fRB^_yK9 z9;^s{BBHa-c=GGQ!W&22X5C$A@QiQfW{ZYHhDWnGl25ds=3tTQNNJcdZPx3nZW4~B zJcf@J%US)J5XjMcbwUb%w#SWtR8bij)pBE|{x&AH`S+HV$=@l`-0m9vZ~dzKk=J>f zr)!!CZ4~U4YR#5&{d~hFjGr$hQc2V3n|ZyXfVx3Lb(7}KMxN7O)8s6Q=NGSkvm!hF zyWdnO=M)*&v3tNQRba?;lx8Vjsv@R^9(-Edm5gi zp0fRHz3-{FFLFx6XM3OBFS6D1=CMx=ZQj8a{bIwS zgog$UENsiPco^Ap<8pLY_+7uZ#_w_sL)Hm}C94G@gbf>S-YPe!WZhTrkT+J!;!cyl zUdM`WU)y^mJ{mFev&8gf>!?;f;nFucW-#S|pxZr-q_y?icy`50y-iN|*swr>an)ae z6LTiKJm)t_D#f%szrJKBD^H(x?|jE<%Ay1+LWH1ugS3IRCufVGF{{6 zr_N@{O9cPQzxB25xOiu_(~3y1Hx&{6lh`>JpQv4V>oUhkS$xN)ymsZn3TwIJ z|8L%Eka)s*PJ{KZ=+@~=zPUJa>M_1v4W5fL4}`9;s>RX;!Xz4rU;;&g$$O}4k=CN#1wv%FgWXkF=y%Q1_TTGX26 zEnM)zT9@U?;nQ)qW zW>|RV-umde+OoOT<^^2rbI#NsY5-NWqozBHk>S3t~3CG^07MI3Y2 z+J0nt`Bd|&zudZ)6~FfVl?Y-oY!Hc24&3_bNxi|H%RdbYXY@RCGYNd{WMOB@xYyk+ zyQFE(UcKO7Wyeo*Ew@Uq5?|7G{hQg;yMcU8AzM!!e{!q3^Ngm|Lc6pHoYBgaFRcR) zyq>!7`Pg{rnd+lAk25>N~8lVuem`r;o}K z$J1sG%bGV^)EjFzoy}5MBU#ub^yivMP;*XNl9y}rzpebMZbz&)VN5&5#C=JJMP&Xu zpOERH*^0t}>Rg)LRUf3vPlPcE|Q-lCx?;I0u7VfxS`AkKleC-|?(mG$=*&rqrAOQ~l)akRLYxjCPA`o+jj zznNPyrI_+gY`*%|GVEsDq`jRiqVkuxF61tB*>cQTL9p?HSTs*yLe;!2a*k6%E`2;3 za{b1|jqWS!A9YPW^DN@j>RViTVmmH(#Lqg+!Q|?4WwOLlZx$7&1#1`f&WpWNdD7bO z%ef1-)10a|X&#<)jGtA%y?)noPNUAA)gONRJ$&@LRW6US!-Nn6BMvsTf5xtlCOutv zT-))!zj>XHenE)E+P;=}|M+|F^XJD(+^s*WUvY28B+=K+jcmz9n{R8|-MKa~=kc_=5&I5A z?bqGZmiqU4v%$A#2ksWSNgJKv53kv>_;k*^7_gl|Ix+3z`)??>gTe~DWM4f0Z(Rt diff --git a/launcher/resources/multimc/24x24/jarmods.png b/launcher/resources/multimc/24x24/jarmods.png index 68cb8e9db795e79c296ddec5ed001986f776167f..a4824c27647a4a1b8da4d30495409e51da6ac6e2 100644 GIT binary patch delta 1003 zcmbQl*}ySDxt{sBr;B4q1>@Wh<_S8U0%u>nlq)XXmV0|!uJ#w^^xt|i%P-vAmizmf zS=;T+XZM`xS{eGjF4bk)>%G%wUgbTVEqgm>bJg>2x9zVLpHQs*yL{fOZ*vQrR%Z9x z)-Cy}J?naW`~jt9`usnpXRnuC`fl@^r_=LO)@+x1^kj*{anD7mZ|fr}pU;*3xO~3R zmip&j!ZY^mH~sO?Ey{-P-w~D{+jv>{BGxiZbiBIhTV#(zv|LmE>Z|+Ry_WW!s(!yP ze-=+y-BPByg$-Bl*B}3`H8ou>vh*tJWs!)Qim9PN?8`3Cf5FR}`Nc*$<~nQa`IhVP z^>bgm+nuc>;^ft@@O4u;J6pq@dc{qgvt~b$dwfe+IBavOtek>{_S}0frhUDZomch2 zk&RKw@zv9aRoit`=BrIusgxWbH(8-C=!UND2Z!v}j*U`0)$<&+4(d;pn8A2({w$|e zjL+vBXV}&o!_Kz)E%QXhwZ;0b2Gs-`bjAUPvzceIBm*=S-I`V3 zGb3h$!Y)ab4$g^JCwVSVGLq1qby-_!Y1r2{EIcx{-{Uq~I2WYqrOV9si3|Mnx6R+@ zGUwV&T_I7-p{qm}gv2nXZsn3_Jg~P&(!TQ!(9|e#K~`4Ouin0;K1lP*rOcU1R-IO+He+u~$>GESJqWoso5J!5W#9JEt?*{d~83|2a9CJ9E?cb{<^)MC`f( z^PXF`R>gJJd$r0KE3S^4^>OB&=Ti?k-7s5p_CS`udF}p3y?srWZ=cSW4?7ld#;R>& zT-4>By-6F7ZRJUxYOnkHy1%b5>&A7z9!6zvU94TGux} z|9tJ~@uTt?8q=MXgwL0i)fN7}af302`S(|^rw8}zzSd8Qn|%3OOX8iwUn5qrzCLuZ zcvdQ}xnWOkOv8(uRK=p+eciS9W3$(O?+wvn*rs%C&iTVHnVF?uZN6qx#=Y^4qSFbJ za1B?RG)0eP*B;NhCh|jEurcL$)$$ngfHMg)-R~_sCI~3)zHtA_+Y*_3b9(J;%buUx z8SeCK&io~&@z)eGO4*M*z8+k$`pm99G80*pG-}gkmFu}2$TlpBeQG3d^3zQBxWDp| Y8Vs95FXcXGU|?YIboFyt=akR{0FwdiZ2$lO delta 1150 zcmZqRn8Z0jxt@V7$=lt9;Xep2*t>i(0|NtRfk$L90|U1(2s1Lwnj^u$z`$PO>FdgV zkBvh}o9A4?nKuj!Eb^W%jv*e$=Z2lnjtLd{_pbVL+N7B&lWwR8t87!r)fBs>lVi@B zEv~de)}US)}H_VzPqc;uy1zF=d*t=9%8!rQX|URExGT=^Yii#r)mo` z+>;lRe#4?5Xvs6N{;%Uso|V@h-p>7zCcN(=gSBi%^1RB3H+>9x*|m?~hh?koD`=dg zlCa#lGx@|bwXa*V_Xr%1uQM`V-gY#vxGrXOuYL5|I2|AV@Rzl0&t@2yOX=C8X@^{#&B&YjDb`Ogo# zBK2k7m8igMk4X*3o_J?ph+=tav}kWNH$#>QTS4C>6|U`h4`)Ap`u8@&zfX2Si5!_* zJ=QuVD`a|gG(T2Dd&`#uNX^fE05mOuJ1T7;Wne&)LA^ojwuw*@t$b>D!$smc3bVWYfbl@ zTNPi})@=UC@Zjyrl`o!d+_*hT>9Y9bBW+uw&h43QlYZBq%XDWxmpT&WSZ#t}o2YrtGb* z7k~J}qB$$nk!4!S!AX<#!?e~<>z8lOH`(#}isp|p={F@D6W8`I3OcCV&-RsKX2@8- zZrAne*YDp9*O9Y{(2@Ihd1v(X&2PLC!zJWoX3p35o+NNi^M1~=PZjH{dQ^Qw>usui z**P3m25}bj*)M&WKYh!;Ka;MBIj|gHG+<>AW~fh?KD|2l(qyLC&Z2Am237rS-`6e* zigZh3@cF;N+a+oLM#k#rd`qq#`fnK3Z5y~HfVb(z%ZnFhsxMmct=rJPezpqF?Io2f zW9rsMX^AQ_sd=8;b^A)g?2!?27W!BZbPyYR_^;FbXe;NOnYrndg z8s5CNuq!@1O4rwS{=rp%JH(XwI4Ke0_+P_0vnBP6<9Xr=DIKXEK7zyB2p zoXNB9=6T8L@Ji-WI(tavl%(iy(_CCvo=jZ6^7rAWkSS78`=pfur=O^w_kO~JM!7F* z6*pCFi?fgBYr5s|p-)?K#e%I_Z$rOMIR7H!yL@|zopr0H+!p;{X5v diff --git a/launcher/resources/multimc/24x24/loadermods.png b/launcher/resources/multimc/24x24/loadermods.png index 250a62609d96fe0f6b5a1d835d79c0004c45a54a..cd4954d5a73e07f7dc0fcc6cd65f022f5f9adbb5 100644 GIT binary patch delta 1072 zcmcb?d4ywvay<*Tr;B4q1!Ize*b(#i30_%yEp{i}`l>#+`~9EH$b#R&W#^|}cKDd{ z|C4dgjxUCS$vZ-C1@bABDp*I@Ej5XX)VdWr%korcm%6#jJs1Dhd@gb8U{zN!2CtQD z2@iV}_K4fu-XD2;Tkh>`hAYknny$JVn0tHM?>FBM-M;R%pSG~V| zN4H;-DDOd`t)Y56{mTu^Rwkx6-L~Keye9ouzwzPx`2Syyzx%NJ`282l6)qV_D*CpB zHQf81HD%xLH&b^{zyI=D=Is!s>Gxkg`;{6V@ptF8V_j?}Q ze!RQOaq*%S^R0pVza76|E3sUs-fYQM&L9<$d;1=${QG+SU9LCN<}ka0&a>s#Ur%TI z$Alf_WU6=YS$2p+wK$9Vf?}E8+IO2Za0YY-=?SRhaqav+ebX z`zCR4G)`EkDBW(@owcdD$J5kOZKF!ceerb_f5Jm&H5%^Pb}3xpskfTbsgzG4KJ`ml zTJGAh3SZ|?Iv^1#Gf~7_W3h1PssmqF&3=_-GlOG`K;-mGpChzRMx|fR+_rpTa@qXV z?k*B@Jq{+Q8RWke{<|)<+}7`Sa&Gf|`}t)i;Wv!7iWPZ#OiI1S)TXJNey6MHwT95A zjSZcZ_sg8!Pp!_3T#^+f7FT(rkK6B6&dQMb@3z+MKR!Ll6>ysL>1M0O`>m7yc}w4L zSoCh8%il}lj>&WVznZSgm7Y1p#_8^sBcEQ&?!35at%1$7OEZ7#KG8905e#yhk)D;T zRH&_WSas&a8`tgqUtO2C`Fmv6Hq~isv*XK-7Cbq={#dnroxACoh}6B!=XN}v>bz~X z@^lYHp(B;`(>#oFk_;u69l2z+`}mwG_my21u*+9}p3Ee8TC3!7&rDA8pRMK%%Uk<+azg#)Z?>wJwFUo9{qTK% z>xYlG{q61=)gSJ?HCtQzUfr8ji+9`a{4bWc@xhcC(Tspt-NUguw)yfI86@Og+_H=vg zhkt*o^}lgRbVLj0Jm)C6hFZk9kKpR&e>} z{LfZpG+I&p``5v**(*8zD>fZ9O_dilluouf$q=fk5$*kY(b@CqjpzP6-ZXV%k-Fv= uiT@V*bNw7PWR>Z6cYn)2*8Aq+`+e=A$BmgBEEpIV7(8A5T-G@yGywqE7aPO? delta 1221 zcmX@Yaf5S$ay# z9vg>{uHxOV=JE^-EUBI@jv*e$d&9gl=7fs;d-s3F8RfI5_xzfWDeY`n+vs+sYi)FF z#D%$fF&wTMAuNUZtPAx*VmMy81+X}F>0N1!*m@(ZenXaPwn6KZjlCN^C(k_dxc*MH zoL-uduW{$u#`)Fne_Gxze^-8P@BjP_p4IQ3EY01Q9w+VgeDveo=+9EibJk4Gd!6#Bo11&G_;Rhi3~|x= z*KYGL-h9!Zaf~~%UjFGU=dF$_u5dn`niq~pW;G1O}r>^V8=$$=k9RGL6fg;pp&e>iJY%Y3PeW80oGDVR^1)Z}5}b+lqxpZEQG+k1`)(w`F_ zRIf1e2)@l0BIcUJT6n5p$*d^0?p3ARYp!w1XbWj`F=XamD-q}jSg38XK}F4r^;+k$ zX}p{Q%XwbA$gbSzcV*+OXMPtxY1Yeh8?6>(ZOKt@lz;MT*Js98f(NY{OPi)_u}u%$ zvZT3`>3WsBPJs?bE&rLGr@NX9x)=Po&{t470HuhMf5h!f4bx}ySJ8RkBy=*M4 zPl{@I<l0bU6&mW^Ws&N;hJj&SO!kFV|9HEJ@-p*Z$j!142=}_Y zReFCs&!ImDTnbI5=O0;fBx%~~o+%-+s}sWn% z?3KB;*!5@0SCsbYe(*bx%M|qFSJ&>Q9RC~fH6rLscKTp?}h_;n6aBQ>x{B7mbcQ;O4n|$7?-f^p=0vlIzHQ%a& zvZpHg?%m;j?%m;g{v5cGyvSirk+h>o_Qev}mwB_<6BiyoFVYqsFUr%8AHJ(x8Vp%N@!y45LrVXi~uF7d0Wv7&+O{SfQnj=y-;q_~UfW%#f`x)$Y z*6gkgeK*Bpsk2fUuZGEON4p1)mR`F0Ie*{N_ST7^2eUu#eSA}3SyqhZ-yE|aJ~)AG6wf)?F!u@h89zPgGWso%W&Ja73U@s%#SE-TNP z=%eIxWUIT7-qeoWyRG-^e_Jr|{mpkXcYc0S{%($M!THqve}66izoxMKU;MAF^{>VJ z{F?aB&(~A$dHl}SMQ!QRyZZALIN4Th%emTGF7-t`cgg-MF7uvt*T1j&_Dq-|YX8aK z|1PZm)OG)}^q!aBe;m7iYhBE=^LPF~VGKHun0|sMMk>xzqlU}mi;72|68BU%BAA()zsp zk3U*#t1uXlzUi`I9aNFl&(HLoBl20x4$)^X5A#wfR9sE5?c@aG3Ts*DR4r^ zNw{j63ImV3aNoSEQcj(1i+C3NKbj{Oc571YJTHSYhqYUTnG(V?A8g-z;QHC=w~yX1 z3$+d}RatZ5;nnwlf0!~fWxM6ao{e#z>tCGu<)(Q)^B-OVM(e}hCeQ!Nz`(%Z>FVdQ I&MBb@0KRfKI1UxZKW@zW0+ zKRh_OTfFeT=n?sX`x|5RlzINO&bw1S^Kc0Ftq7$5!mYh~*X^)0p{_Gs zXHJQKREnFTl+n}ISEr|?Rn*$vu6|*)W?Z{a(%a2D@8-Qfc+j!FI4o?MbB)1=#*D12 zOI1}>Up8zoIJ)GZv`N$TqHh&8kDfktjfsn^;^*g|y?OIyS$QTCGqbF{d-wW%@_OLc zX-FjVL8+&{0lP6EAxhCf2=7v6h{=C1HB_ksvp=;i}c|Vi_ z9Oiwx)zxw^p}Vs)k-_TpftN2|)}+r3-`QB8ArzN9-zLoC2OHU2dnLV}HAt4j;)%F4@ockZ;DD#OR(ASx>> zyD{TKqsWE7e{H$-jEyHRp5Xj#@q>+9wrt^L5L(9@5Lh3$@ay;QuRjPlO_sf4-}sML z^vglUJ;}F&jNa?&>q~$B{8>x1mp33TZe8HDuV>Htw(dzyT~s7s^rfL&hgEw?k?>A0 zFRw>w>|GPMLlj!d>gvupy?*_=n)!hW!~7i!SXIPxnKy4)?0Pu)hU0vnb#G!>HtgN8 zV+9`%&kcsu)YLoO^(&Za4o!60ykmOEkIP~Xi?6VRPH?OYU}tB~ZMbwPXr0m|>u^pR zM%e|dSA||pm((%Ysm3cYh5hQof*TB~s;UeHL7N|YIcht2vu$ViJ>M}msX8^)RaQ=J z8zUDt_tuFM1!X;j|NppL|NhLCD^nc%t?cabn4dg*RwpSX^~?8EuaQqY`}Eij)9uXr z>o>pexifplj2~O~?fX|-RCI~$#L1JLOX^>lN7YrGovphp;IZxQr626o)z$Sfe{gTe~DWM4fJzoV{ diff --git a/launcher/resources/multimc/24x24/minecraft.png b/launcher/resources/multimc/24x24/minecraft.png index b31177c9cac2456db32e062614c322e993a323f1..4bd9fefd3ccfe2cb91e1f72ad5a7e79a09c5f61a 100644 GIT binary patch delta 1434 zcmcb^y@q>&N`0}Xi(^Oyr&E_s+gIoKz2FwlimWKq+Vx`6 zms)TA^NFAG>(2c27m?1(NP1VF{9WHZq+_n}hg;d%8^2yRe|NvCK3o3VJ?pmI?O&50 z_v)_MwW{Z${Z7Z{5`t^xW6BKXTSy<}Ty@-2G1%MOxL_l5(3x$SXE{7r!s25OKJqqB za`z8dzH&0t`uz*%#TG?=tNiE|)qT|Ah1#3_^-S99G>o3w*Or)VyKi^kg!$boX|bIx zix#}BXW96%?Hc#~s=~Z?8XxLe|DU+K>EScBy3dbl-s~%HS$VG{S=#!&Op;dmf9pdb zT?y9jBvQ6MofdcP?2Y-hNoFN)4Zhv8Z<=ps-q^d{+~DKlCwu1$U)lb{YO#H9^0)cH z5tXrmyX6%cqN`^dH!)qrd!{<*JjeBz;M8ov3US8&Pd-Y%smx)>&eupz$Y;2=sGh0l z^>({oa~5npa5q!GXz|{2{R?9gef}D@rM4H{C`#wHuTC<{(2-=+6k|>=S)r+;S&uuxmwn;y|>E`l=upfM9 zq)sL_P295m^6S!t*Ye$}0vwhdTfE^y*TdYxE7z?zzPRuD=V9y8GrOjmrx|`&q)*CWK3T9v7m}SaQp3N_OMyt~LvzOnR`74q()lYS{KC>|Av4G*JiCs~F z#WyErzMLp;dRXv9)6C$*Ns|v|h8|is%`xB)gPmXNr1{PV*0^o=eQp~{8x!d2IZ)wFt6Pp>Fg=3RX1;K`t;g}%hHE@4sr$_@VLY`Kag{I zT+@W+_VcF>Cr>d9&|lxQ*SoJLxIN|q-{yxL-M@sd`Ngl1-mPXlLvP2#vKJRQW+_Zs z_o8=0^5aN#4egc__w&}WWSY0PbT?0Z^I+=zePXz#qR$n&&7BgZ3U z?>}myN@AvwM-Tem+`&_%G(|X2yh-eB{loC1Zzg@;m-wk-*$c;s9@EVK&d^~ubTyq@ ze(8nPhO8|u8;e*tXHOH+o}eKuk{gHA-s3v(7Ra!e?4R8B0`Z+pEldY=ET9ltE=XJ_upnsT-{WI@uu zstVPhbL-NX#bUo6`Wt)Y@6)E^Kl-jOscS!QI=$-tadqJn3_E1GzfWdhU|{fc^>bP0 Hl+XkKrKP@V delta 1482 zcmZ3(eTRF3O8sI_7sn8f&be1l=Es(c9{BiP_P*@A`w8*({*~*ToMNR`o6OkeaCm{2 zV{b$#tBOj*BwlVVFR?$|7g(J{I#~}hrM5^r+T`L}P~<=XOj zbvj*1ElNipdF;RYeop_niG6)XI3IW0N7%1l_3FIL@xWPUpG~h{Z})Zb{<$jtRX5sC zU)Qry_PlhuYf;P$AGH^|`W{>Gur>Rh-n6df|L6QaFaI;``}yj#{N&W1sj=7RoANYU z^m$&MV$t`q#L8s0uZpJ=$H(IaJnQ#-YQ4X=RO!K|t=#h&_DxT{*(Shrdee%lSv_vb zDUr*f)*8+9G2m%lq@mH(q*34HG3kk{@8x~}4(s2o_}qA4YJA+UE$>;^-`G}r?t3jm z&h0d-xtDUxUY70tQe|sqW>ye8y}6lLs+Y})qe(%5gXxk3Bnh^uUadhZSsbRNp4fEeTm3h) zu0;jU&P0a99$K+Vru6um|D{EbZ*4cTU&{36zU=&BcEi8Zyi=DR`SVF<<9wku#mH%a ztFH<;J+R=L>&LFhGD+p)+p@^&65iEGLY)1D`ChMk8MoKf_aEH%U!{R-fy`4D=l%t2 z9&Jr-on=9s$8C;6j@h|urfzkSq%v$jgruMO*ddFAoPucpuZLpj|z|L?h%`uXbj z54$Xv&hiU2?pAL4-uUD^)7vjR&n{~=Z*Tii<@0!P@tJGFi>^*N`m|E(s^l$pS)2Qd z?ZTh_IX*w}M)A!*M|J;wYB0+qJAPMnyI-pp+wjiw%e1zh|Bs5_ zAL9r%n_(ZFzRTG4CFds<<$j}6yE+$%uh`_Kc*M})Tk^Clv9HINa?RDg{hG4eYVv;n zjIE)k_BBmxO!B@l$=Ar^WG%n<3X!NjkD^t^W`1{5EP7|O8Mb|kSH2W7b7OeGms=8> zTvo;{-j`)0u|sB8!WEMDKU;Hj0S^5HYn)sO<6*#@4H)tpWZ>$E!lzuCYO zU{)d$xyYV##t*~ae>r#070i%&K1)s1)^+8pH9A)>Y;LjndQzABs+O{-W!#hrX{>cq z43af0`kW&)jvvU&_nDKDW3#I#@)F16DGFX3k6U;o8+(?W(6KaLG0Q2cVI@bsj;}y^ z(?^pd7er4jJ9ojq;I8J@NhLOmRL&ZfO#OBt`RGc6=#3U{`W;1Nd~5y~I8IDmq;lM> zluO}sP?fU$<|PX?Uj6QGYMh<)N-OlX#k+)?D-~K2o);WAzukL*ncT=ZuyYW%keu;iJ5s#Ag;9Z9`^8|#KORiFSd|Xr5-f5BphhrcI z7o+Iy`Wur|U$(A2{O~frjYa&<9~002y!EDB_4|i43!NmMw|E}=^-3pM|JhmVTouj~ z&OaKC*G+t4U9Ue`tKb#CYv=9%SDE?G{XgcdAGhO4_2vBcC2Fsit^0K2l}(q@=h@r0 z&tx(Dy2(-C`HHfy*Lo(!-Q9EZ*VpD(HeX)s|M4dI{Oz`Xvd#&z55CwY=wUPhO~2E)h8ufM+<&U3<~;`7oaC;J_~Flq_y_}qD{sf&-FYh8}> zMwO3?j`qr_wa2nV&m@()3}^n&Yj&M^aEath ZA%-_U{Vi3lTIhjX<>~6@vd$@?2>^RRM$!NP delta 328 zcmdnRc!OzzWIYoD14F*(s`U&E44efXk;M!Q+`=Ht$S`Y;1Oo#Ddx@v7EBif0VP-?2 zHGSviGB7ZF_jGX#u{eG9itRaf2LZMZUnP&QYQ!9n{KB_Lyw&=Gw&*%VudUhwof#rr zTq-}r&(GFf_D#+Ds{YNBY4gvdshs~Tk=(QKc_o8uV8iSBT@AnYF-A^f3=M7kUi-iA zhWpo>u3G*_y4ekVg$;O`zvSF@3+@*0)%Fc`xL$f-TW-Sra)(JO36Ww8R%rz;_Kci1 z@uJLe#*A5PYhH8hSjYXP_J6$oue>aqK$+tXBCZYZf2#yuFLj8V<}mO1AwOMDp%aBN z2R7*}SeJcCwoTE1$C26K{N@e8kMHNpxG%_*Qs7{^6f44N`RH}XfsD&06Q7=6og4kB iF7A1yP>1+i_Us4Y@4s#Pyn%s%fx*+&&t;ucLK6Vuq=$9@ diff --git a/launcher/resources/multimc/24x24/patreon.png b/launcher/resources/multimc/24x24/patreon.png index add80668615a7ba5de33bcf8216eefe13eb26e7b..2e1cc0548096ef090b080cfbdb45ad54d6fae760 100644 GIT binary patch delta 351 zcmcb}{*!5fay_Gir;B4q1>@T*j4mvJ0&EXd7ftfeU{P4-q;xLptxxv)cV}6+6g*`a zSQ;1<1%wzJ4lyz*KJ;*4WEEg!ZS?#8Tuh|W`nSNv56q8i^WVSo^By#Eczt%Sl-qLGU%;@8Ec=gQT5;sG`mDHyUrx_yz z#Vofnye)9Be#&q%)xe=DpWzG7!vj;Fs=sGvUgQ4MVUmCIm%YEzVqV}oEXT(F?$(D7pN zHg0Az(d}(~c)5s;?Vbl4+e2<1o|uaQaI~wJer*-^{?kz**oC zSGSI^1u-x%+^q_UD2ed(u}aR*)k{ptPfFFR$SnW`NNT`oz9s{KJ)cE= zZ7;K4VfKBf^fAq3-X10~RWI*bQm^iNSI*4v-@W+x7g-x?lIoIrr5|Uk++m_u6B-TF_mE zp2reR9E(o8m)uv!Jvlo5#Z?WX*C{d6SLONYvKH0GotW-vFwf$#bgxfr?c5eM=Zv6J zY%T9`R&2`iEbjGwye9q6oLQ`|--4B8mO~J4 zQ_%WghP|c-83WcwC+t}x&;Bf7LIxEacX?xk^%h+npwre_ev%yynJSt@?hA zX2tFan?t!>!e)D0`!O<1SHGNa|L@DP1Fklun~S)noR1fXS=Ok^Up3F7Ztzopr0Qje!zW@LL diff --git a/launcher/resources/multimc/24x24/resourcepacks.png b/launcher/resources/multimc/24x24/resourcepacks.png index 68359d395952942ef7c90937eb56521bc74748e1..4b7020b272352c3ae1b48d0ba8a416e52b5557af 100644 GIT binary patch delta 1663 zcmcb>-_JWixt=Y|)5S5Q;?~@$%oUHL1&-#ouF1W<4TP5O)_=?Oc3;WFTYkCLTj$;~ zOTYJL{@TyA`#GMUnXCP+f0o)!*BYg~kI%er8D7$1J$v->j1SBoC%icJZ~L;gKDA`S z*?Jq_Zq&K+^NMmkZ?g01?frVMyw<<@KWSs?niKiEdY*0lpSG%grR5yXR^uo4>ZiQl zez5-2jkkjL-hWN{th6ZU_Mt;6FP=PMaat%4zo&xn`+NI_=5D+F=}RX2Y!)~C#!;>Q zd-}bUJ+lOgzg)Z&RQiGU@3svaI99D*y>P(-hNR@=gLm)Bx+n=2FmBJg%XBqAZr2={ zHD=FQgrkI$n(7<&PWid|RVZiuZO5vryf{zK(5+jy-nev$=}vK8o}Qb#`{LEBwIw7Z z6vPYO-?Q!M@6X?D_jU1%RokCFaC%XBA-?xPihOQv`2HO?b}f3O^rUC!tM0BY16^HS zRUu9*E32k?^W?Z#m^N(QeE7|qoG%8vdiLk+{)r?M^{m|fJNQ56B4e+3S(zZFKlOhV zHI7bi~CXwAHRX>-Nt$NxI{ zQqp{vRekxB%n`s*qTg7}w?Nx-CF%huGG9n_%T&ZqBV; z%2P7q5>o7@8$Xv=d)4%YqZ^wB%MO9sN70WyKRNl}*C$nxK<`Oi_pHde&_rx`>#*eK}H|@@u#(y!~zW!e8HQVj%b?asbPl-r$KH;NL z{H`geSWe~kxkImZtiCZP-$60%OHR+!#N7%H{+{g6n)m4)+p#B>pF3xrI3l93EIs=2 z>$^#OJTeydFJIogV9%cVKjw_Nt!_7jjD)gmekV+fweB!~*W6ksy-}}~-#6vnjQqB# zh2@T~c5!W5=F7)+jIW6Cw8i83OgcYnFaM0)B-J3S3=gTUi~|js)-xf-{kUUyVpN^)e><- zM|smOlbbgb$Fp^3D1?P@6AcS`2_NBNM4e8=ID7N zb45pZ{PM!W@O@euXAb@|nNM%3oF+{as;HOZFjN$K@bKZqvIhqmt>5f_@#p8~_&ay*OmNz;W=+p+ z<%q~YuF!+44el2zs9EMV&M3%#r?K9?ekI9EjtZ;sT)1#y#gf}RJA+MaZDlz{+ST7tN8ymYR@9wS2dIM1d zv#|Bm<$q6Dmv=3Ff6wvRY;%RB#p=$XqCue{2TCt4IwRiIwaWY1nL0nUgv3O~d-v|$ zm%kfQxY^-@?~6mN-2C5PUtcfVe|+-K?_59r2z6nRUk~9tH&+zI|`XwaG z8Cf=Eqg~09*x=VU0-v9~v5`&c^t9Ti>tla^`*ddJpQW}{b6zQGpZ>ei-f)716OXdn qpRR}Yb@%4Ka4k`*XpuR%kJ)N^vR+^Gm%|JU3=E#GelF{r5}E+j*+k9& delta 1987 zcmeC@y}&;~xt@V7$=lt9;Xep2*t>i(0|NtRfk$L90|SEx7`vU!wgU;46*#6dFfd4f zafQ#)Wef~#^E_P~Lp+Z6hDPUvTo;Y~y>ESbo8h*N$B#%_OWeM}YM&j)xJX4q#l$yb z?Io=RUV+^Tfy_TMGA^kt)n6I7W;c{0-Jg`?i&ol=PKcn{+O&TKCZZRmawSWsqaNuzvNA*2-m-SsU;C zn((@SyTOnlzx?se&i`LxeyxANo4%SMhoO<{kkiZX@EI4|_ZQ#Td1+>xxn<(#-n@sG zXNSu&*Y|AySKoB)T9LtdvE2Vo7Yn1gS6e>R^*=4Doh|q=w*Ksm8Rw3g8eS6O0#VS|K7v7Fm&uXlZ@m2Xl=xVb5nqt)rqt?9GF zetk#_@ZtCSbN^ey!uq1Z_uZ}Wb)Fu}zO=k8I92-4_;9#L84KgI)PsdGJJy|^I(2GB zR#uXuK)}|B^SyRwZ_dvB_Hu)+e66s)&)t^?1qGCTsBvhA9}m04y>|1wxo>_jOkOFn zlyM2;IffMW<_TV20&7-1YB$ecwriQ1nCrwDk|rPJzQ^yj*zw&rJMr|&`dzMy9K zuqI4z;dtek!Pwj!J3qv${>PLihR^9ork+euSa!K0<*t=Z-3LbjL7Vf;H=Oe%1@uuU9d(Z`;mpqUb(1;TyFfJ)FAoa+#~i zDu0QIO-$X5L^ZEI6`q$M*Z8g)^*I$t-)zQJwa9P}8rF~QF z`~zl2ZLXUZIR`N{ED&&Rd7Yw|9j%!2O~NYb6Z6bw7w=k}>>nN;p06~q;q|UFXLvY#E`}?fl+s?s7CKSlW}@GnU3}R^ z4Y|ovYVWrzPc7b4Qu^R;Q`6)}zwO&EUuY^jeuVv+<( zsdygh$x(d9pmNxEUgP765B0Uu!fk9n8>buEO+C-fCsXnE!b0c$Yz^lH|Cr5uWAo^@ zvhnkU3m0B2u#nN!)5{ZLX>Qw6P~m+|Np+Xd-v|m z@9pcWyXRY;dpBxIctpe$LtkIuY7d=5~-Nf@%`XD_HVTn zea(&EzAY@CJNNw-bF&?~(q{XDVq$ulnwUBkaa=aJ`|jOm@jf}*Z)NrM|95w~95V6! zEH{5i?17)Z8{HwwdPjc?Tq<9(gaj`CT|6`^CPUqEDZGmNto< ztaeO2skT-=-fyW|J7Wby4nr_Q&uzVa9){+5tV-V*&!6FH&00E1$Wv2qo6xFRea9cq zoY&Ymd#|vt{L$L~$4Y*6UjBX8^TcJAb6-yRO}@#nr=H2nnz41plaJdN7#RFZTq8=7 z^K)}k^Xf|&9Ft2j^Ye-o(lT>$6q56E@{1Ibit@{gQ;QVJGxJjN%N5d!@^ckDlk@Ww z+!J$hQj01TGD=Dctn~FWlk@Y^6La*E^K)MnVphYl4_M)l$uzQ%3x$* zXsByop=)FqVrXJzVqj%tsB2(mWnl1Rb^bO68)O~1`6-!cmAG|G{dS#;fq{X+)78&q Iol`;+00d5soB#j- diff --git a/launcher/resources/multimc/24x24/star.png b/launcher/resources/multimc/24x24/star.png index 7f16618a6d8557c24eae17b40429720c319e1b24..8527f5092e2b3e98d6905c5be51b97bb1eeadeb8 100644 GIT binary patch delta 1042 zcmX@exr}3iay|1~PZ!6K3dSS}lLtq`%${v$H=W#Q@${)#nOM?SL&4P_{@b^Oq$%!= zJadR`^S^(I9?Ms~mS2||TD2|s<=^k?=l*y2@l$Uqzk^}usvi$tF^MhPzh7eZ&d^#G ziU0o+Q+|AIZ;U=W{r~&?W!G+dN6z4UnXb5|;bK>)hknmof0+v&^_C9aMXrG*_p_37 zZf}#ly)F0lwv7U}{f=$RtyPn(Eh`V*YrW#?>SMOc3-b!+yPwctc$kuVXlvEHz&L|+ z34=ao?uQqWKK^b@F%XfwpYg(XuhU11eFr?3o}B&TnUZ?2<(AW1^G*sf9e!;!Q`HD+-BF!5xs5;SAD%L~_7MvMJ2?(8gCQmI-k4&o4dLzl5Q_ zBJV@&q8lrNPHoS7^uPDB_USJ3Il95~IOjxe4_%%wz1@~e;2;y{f{2Q(Pp`@)+}CsZ zZjlwh)Aai4A|=+!(_0EI-WO-djjq>@*qKvuRf@NNUDV>WUJYwPHf4&k-r#>U_x!T* zz&o~nkycA9KfCt_U!C8iENA-CkiY2XrD zvWbN`^ZJWRh4E|3F27s4c%IQpg#&^9vzzw6+vp!}k@@Atyv2Q)GQHQ?RJD)DbF1|7@T0)BBW{*Y;PD%l9lh&A0PH-44gR7Y0ktM(bLAb8%u)oY25{ znr$UZFry#mtXqB4o-Lee7R6b4RLuL?tJw5Ci`UDPtuDx!yGOZRS8ZdM3ZGE8YL<&q zMLBnuBg+(nCT@$2Ox8&!4NRZMP4N`muETm-fpLO@hlEPkb*XypE38ZnO;&NT98HrI zX9_3WHtBKsFe$2{yd}VfL+FE$_B?NfD@_?bSGR2qJoon2)=ZIJtrh$0jykDyc(6>A z@Q|3upzzOjqs60?j5)#&QdWrbGV85)z4P^fD{Sn0wDPGVd(oWyw)puwt^Ji{9S4 zEit#o`5f3r5skF)JswfkKB*LyF|{CXZ(C{`aDe&6EQuJ)L! zuNs~E3S%BTncjZ+@zg|@6AP!e309?A%)Mu0S8-|e@rc52m;J&O&Uh)y+8Z!%GcYiC My85}Sb4q9e0L}*a&Hw-a delta 1198 zcmZ3+agcL@ay?6jr;B4q#jUNO)d3-?BKFUBSKm|@SnqK_L{={CQirld?|~WJi-N@r z4VPKIly5VP`X=$adH*b_v`y_xGp(X#+0IEy@XB`cNRZGz(aFQ?HIuP0tR+fN?Ay_I zdzTl#*K4vZo3mwi@q5efb@#vjp8NUtxu0SW>-T*~Q|GIbRXth1ZKw2BQ^)f66Q5lD z_aIkwN0CxicV*ejIETi0_jcuKX8)yIwEjn6--a*ew?kB^AX-f1M6>J(+VUb))g-f?GM4Z2i)57KpRgue0>+Dsl+? zSgo|{(Z`AV6WX231?E%+dkHhir(IAwnG%`N=|4ZU&wFa}yHhNSuX;7i(lY2gSFiua zb+e7p!>`TRADAlJ^;ge(*xlD~{OUpJtBY2BadlW|ms9NYRKogb9nlJoAuYM?Mglx{@E6#wY&J;pIKXccAGJq zI!vkPY?z>b=--qX*Hs_MztUX!C*)?hlbw1`J#$~)uA+5yvS#~rdO99ed=siJ^od!< z#wW0^H2#mXSbgWbEl#}mXTAUSd%^CH1;P_QE!g)YWU9x+MNf{gwrX!)dvT?d#lpsi zPA*k!64SDSs@KYYSrIBbMM9>LpFcieXqtIJm1t=GOReB1E+w2Zaq zwIe09Plmb7w3n(d6n;_kaEsQZt!7F)+Z|;K13vV}Z`@ma=c&}PNv8S1ulJip#j1v# z(>_sQ{&!xC!_4;7T>S`k!Gzhjp(c{NMfwn=|G7hjQ>_~1j7 z##vo~t&*EV1|aLVYpJ?4>>ZU%WZie%(@d+0a62;)4Lm9NmcC z-RWw=T^Vy5ZYbS4&;8!6$`ld;NFMx8pnSrg9^gX}$d>x%m1HbK@Wz zhx-hNW~xa@y;{!S%l2c6xW=FS7`gdOv&C*3>MA!!r?wohZ7j&Ke|x`7NK090PjHW@ ztF+L)-M7l8R_$KVefrOWZQpPEAKd!#bJ2QX*t6>Id0OGKaHQ4rb}I! zE67=P^P-BROW}d#7C$^*)a_&aBk-_lu{uXe;{?swye}PHbF0=lu3o+JwLhmbqd2Ex S$9Dz>1_n=8KbLh*2~7Zjl|(oI diff --git a/launcher/resources/multimc/24x24/status-bad.png b/launcher/resources/multimc/24x24/status-bad.png index d1547a4744ae6b20201a74267c5ac1b71b364704..eae695286ae2f1916f999d353976dc5799675f84 100644 GIT binary patch delta 608 zcmX@d@q=Z8ay^s1r;B4q1>@GK%sq1*MOyuPBlNfJ-FV8Pa%1-GZMh&+CY`s%@bv!s zn)zvGpWHsP+amqlpP*@}OE-m{%ANM<^%76*C5yY49;!6x{%VpWe3EzhGM!$b=IkYG zzn7fcy+nUT%IpMnna1V~Vrhp`B;3z>oT<7Ltk}Fc=%C@tjrFa12aA7j%onmdznv8|ERy5(|&6J>rTGlM2@|GFKS#&V1M^pW5^1L+H{o@I#dg%pg zKmNHLIGb&;L~>%T+{J**OD|^aJMl2`0)wV~i+p+Z53{#_zni5_JpA@_n^et(YfkI; z^GnU%aPmnV%laz^Rv(h8eYE<}|367h#~1(jxlBsm`g_#k@L!vZ=Pqq}*JElwBZTd{ z&Yxlv+ez0;Oz%c3>dzPMRvtV3g7z6R6^L;4UhlJfK5LUn9aFmB X-25Z&Z$vUMFfe$!`njxgN@xNAOWZRy delta 1082 zcmeyta*ktyaymmtT}V`<;yx0|WDEPZ!4!kIt>r;xnR4MULC=pI!aD zZ0otO9;0QCi<$4UIGci<59i(gS$F>a{Z1i4 zsguXOTy0-mxDeO0qpgg0M?k^DEp3O4&g|1HS}NGK%6&rcsjNmtaW>P4)CXn{$`2!pX@bdnXhqm7oXo<-fPVbh20NCFCGy2Ae$jR zufn|J2!s7|xgO~RTLC8V1WtR|t&doDdHoUlAhSVGr}3lQ(luI)221J{zZnQ{GR|T6 zX34jBo3ABH9GhG2?ApG=ofDWvCvhBUaAZghS(zcp_MZ72S7n{h3@QGkaPiW1pXo!Bn3jBaxGT9ag{p8Q`^2gFW&2ZH3PY_N?b4C+HoYn6yztNhvDZ zlb_#ve=Z1BRYYvLrlb_4Q!lpkbm5bn6L$QQm?}BT+~&0|VVv8)`BIly!On;$x4*u= zInN_umfCG$&T|?^*^V#F|6k{G`ABIjU+QKPc}pj!*Q@@rJ(wc@_WMM=ic;mAN|Pzc ztXneA`q-V9TpBh}rR>d$rv4P881LmTBjeUxTbJ~|`96#H#N`jyp1rVT=Q8h}`i7KU zZAT1xw0=0re(3tc_=l}rDlcHie{UuKgT@D@tu^f`*xpk7uJYchS!bSn-jcaD%^&&y|lBDpem4-#2-_loXeF!)nEEuN@TS z(#y5Ba@8o#O;enkrZV|pX{^uXlyWUsMY;OtRVVgw?D%)yX$kK?rYhbJ8xffZb{GA) zlrNW5=bZE7OWk}mFO$FY`nBBKFK+Li{#;$XQe{fx;{&M|*uE$#y=lB2&uA$oHBH`; zkDd8?{_P^gCA%3e<=?*a)S}43BKo3iwB)AiE=TtJHg{)klT6y(#Bo6W|Nf8SzPW;X z6{eQA)Z6GY$}@Bu=wC2YTg2O7C>Y!HZuJ6tem)@yv#X5iKdyx^+r4bg=HI1#du`V5 zg(v24@4eq}j?w-)W3I}6hWE_RYd_qJ$ymKMa;Co4RjwZGj#7r)AK9DZy8f{|Ygo_N zSh>KueDl=EiE>NV2=P3;|8g4V9qt^iFZ-FpKePuraLX7QUY!PC{xWt~$(698Fa;~xM3 diff --git a/launcher/resources/multimc/24x24/status-good.png b/launcher/resources/multimc/24x24/status-good.png index 3545bc4c5276cdd01feda6ca99fe8294d9a32033..e315beaf3cda43d4e77daf0d16c1f49ded131c30 100644 GIT binary patch delta 771 zcmZ3*F^g@2ay`>SPZ!6Kid%E1GWW;^O0=GjI=oe6p;OB-)3`euw(Whk=hn8|+uKBE z>r3aZ(e!)&d-~=%d6SF}eSi8dT;XPBfs(T9@gQc48SfIxZ}H}M^Cl*HabySQC8Ta@ zjFY07fGdx|; z(z{pk<&DYD9&Ng(Tyg(l?av1fnfoNI+br&C+??rf#xUm0#Y>HAS2E`KtIl)#&hhWz zW%fxav9WVKmZ+95?%3(JLzFS0c2l$N%Amt#rL|AF@A)bG*Ar-DUK6&tX#2~0);%o2 z$Cqxpej$$OGvoIu9{W~bJk%r|u-ULB+4JoKcR!hjzy05{s!b~Y_i)l%&O}F!72BLG zbeMiBqF|{+7_Ahi% zj&t2IeGVfxyXdK%+&lhg_uSl-zHxGb*CmHD1~F^=a`Y?JH%Fa|J#<|y$jf;1*`m8j z7oR1rdY4qw=@v7!=;!IJ8H*y))-{!HdRP%<7*@621# lqEfWh@{?cfWzom-4zFq_?qcNhU|?Wi@O1TaS?83{1ORP-bOrzb delta 1046 zcmbQmwu)ndaymmtT}V`<;yx0|WDNPZ!4!kIuQ%d^2J~MUK~h-&bk; zbB2naXIlpAX<#xl6{uV{C42(p5k}!|KHpBeBS3N9Ra7V zJnt=BGyl*F71qq-9zx0wCLW%=TH@r!v`wE5esc0W7RQtovQsAG&GE^0JbLq5C$J0h z*EG7SN3b5~ICz4gyS_X9>7*I8tXKN|w{1)`mWWyz(fUHF#WvvoZOsFln71n%2s0`N z|0p@_UcPRsNIsi%r`gjz z>*u!FH?r~1;$HAFeEroUrr-aFxW(|Tu@|bzDd<^uPVZRTagX}hZMP3xW)0X8G53;4 zj*$F{FI|jw8&KOFpa<=uZ)^7S$dlcfB&3L73RjcfR|uqx_aX5-br4}aFon`dm> zGhe2CImZJ-?hES-CoQ?9-PV7l_+4vp%DwXwBz#zug4q5TM5j9M<)6^9J*l`RNY_W< zPt%UO>v-a2#Io0Rboe||Q@uD*{ z{m##n`}EU>VPnJ^8w-}X*Vq-78=7?s9xkb{UeHqS5n0e+e@H=M%h@c+$hZTOH{ano zT(e@yiLdeNr?b!JKbWt_!ECf?&jOd01%_8sR!$C!i()Nzx8HO?H)Gd@BX6WP7rbCB zSp2}tRA;4TilyrGBRSh&2VXREI;YZZGrjL?k|3jv!jX3eHw*tOPQ9>ht)13l>szJ` zHM@#<&wn#|EK$F2W!p~Kmq87`8Ggho{#YlK*UB^Pp0C9lQzL)Z+YadgTP7J?NK$zA zKDMh|=EvRE*@*%(nQrSY)?VuV?AqbWr+orxHhYoiMawm3Po*!dkN(HJ{r~fiEBT*x=`t`dFnGH9 KxvXg(x-WG{ zdf&UvZ>mvX?XqiHG&|uz`EiAVwmu&|?A|;*Ax|wsn{!uD(>@E<`eRMY1w_SmNo^|R zPFZ|9V8e{;NgtjIJ+$XKyZ;&IJvlQ0HSL^F#yVH8E2+dSTK(bf1;Z0=78Omc)09v)f+$ zu#`tcM8tw%aiNzR&G)HQL@l~=bWR9++P1m8uP!I%2(wS*xn^i%ymx$AlKq&aLwpb2mfwD`>XzTU zy&nGi{;3|kxnVKi+ersiDz2zMe0jH?dB4F7hA&Hb3%0(m@3QF)n)v$W0t?w`vzT=@ zZ9KqNE69HSZSw4M>&`W5o@RUTS^gQT>xc4pkLwp~^<+D9rv1n&f#h7BDaULwLTfaG zFZ&j*g7(f7}>bR{(=J!UVq$2m9e+}O*&z`)??>gTe~DWM4fOdDJ{ delta 1039 zcmaFMx|m~vaymmtT}V`<;yx0|WB{PZ!4!kIt#n;(cOVC63k`f4|q- zx>c8h;{-Erf>gG)O^5FW?`t<)gmW%S)dtD?9Er%iRj+pKiv5(_fFx5l!L=8UNG-m& zWSMW)N;?T}jie6!Z4#c^CRcAbU1vR#8~NbgTuJ$NLR}lUZBM35`aRe3`Rtv>_j?qi zzs0U&o#kMvRKn{ds%*005r-|yD)xoDGS*wq_H@$uS^D0-*JHitLgfVt*FVixb<7CR zESOv;EakFFdL>`|rLg;x?F2z7=#Zdcg4#DIa-v0%;8%icRbythz!N7opbGZCo9)$8w(0~X(_6+ zw59QV$@i3&XuS45AyXsXR-Z5A=Z7j^k~@9s`~6I3=iRJDPjUUQqL!EDZm2R9;*Tl5{i#xDP0_V=ht-GZ*I_Hs=5 zX_=emGW!X%aCo<9shdx*T`V0C5phDhdj9j<)8!t1Y@E*d?@wi0&!>X{YL3&B(k(n9 zH@xf1>MN0Xw0f;-i~swk8yB3Ko-$1FY++iQe=8yK$LxzYIBdJhrr(t6F8udBF|NM; zyTS1g*~{O{_0%-P4Hlcd2)wgWRNBYK=flJF_)jMfh)jQ%%dTFYxo9?v;<{TNrEL0= z$7Zvtt1sU0yt3xIGk<K|J!@# zlkZo5akW~Y(QVtxZXG)8omhJy+~^D@?Qe z9VubS?lymMZtz^*LkVBsInK;`B>rIASB1Y)6&ovr-%nrHY<+sVI9t7WA8&JD!VzwT zGc~E%Z+~<68dtgoguE4BGrRGkL7CvB#|{5xY->w@aO`)&hf{tnmd8qDlJ@@$j@1m> zEFj(TL?WTyFKOrbv#rniKRmeJc0%~L;iUy>hhzFVdzh@nQ`)Sao^^P{)x+F(YPbecYRz^pVHVO`c;#^r%>FZ zyV0({X`g>{hTGBaniqa2UI-M}a)Eo+>&C*STyCzI-H9H%3MYIs{5U~iD%)E5Ejf&5 zOCBdI5^kHr^yueSVfLz!J;H}SeVCeCR=dDcFmatuqcMBW^?Nl>mUipRa(oL%Q-IA#BSr+pC`ayKKSTH~pmaADAqD|MPXf1b4Qz zpT92<6iitY*%DNHbuxE*h5e~Hr#3w<=-I4x;kwrJyE4Tb;n&ROW;p!KQ0FtVncCTL zcA0z7X;fr06%r;B5VN9WpU`?ICfC63#lf4zJ1 z(zrVkS2fwTYNcpg3((+{@M7>-chih1e}wi!}~k?Khlqd$Q5!_ugx4QZjZ^ zqLTwmlAjm{KS*O+c76FR!#z5V>Pl~-nr>SEI&RH&^|w)??7XElpZ@U*7|ZNge#2=8 zf4h6jtViAVX3t5oN?!A*hmBprc*1{{W3iuZrEN9OXE=0UwPPx4eU?dm#e7db9-W-^ zo(u}-iF-Wc?A`=5V2ak5NaONBRPKAX06-L$1eqJ3G@?^Unt ztIrBp*AzPK*|e>B3~Az9CA6ihe|v_?gl=rz|J`wF?|QMxY$Z{*e7dKWx%>#XnB|%C z&~?TamdR;L&F^0?n78J%ZeW*Y|DUt|iA6~kKLUBbeG{(WIe7iK>704n>Zf*UoLvX!DG}WOV<^V^dCVfp=Y#Oef8V`8;`RmGG>!m$?EQ zBVVQd+r}ovkn>k<-(y34uLS`NMeC<~F=v9|EdFQPAO1sOVM3CwY;6n-3=E#G KelF{r5}E+swul!1 diff --git a/launcher/resources/multimc/256x256/minecraft.png b/launcher/resources/multimc/256x256/minecraft.png index 77e3f03e232da96142e969a91461f4d3255818e1..0b24f5501ab5a91ef6e03bc1d9d6fb79da01ea1a 100644 GIT binary patch literal 42727 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

    oGM1nx<{I$Pi+iRc~tak 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

    4_#%-Q1jv*0;&raX% z$K)u{YR|jLaiX`!1PNj3O>3|GVlew9WLCDXacyt@L+KkAqLLT4wzAIhxbQ$oFVc}| zR>H%7FZ{l-&3g0aY)bkwAG7r5bN;`%^z`DxDebqea=jsU_MRCB7aw)7E{39U5pDhOk+}*>%$_aQE|9(ot+KyhPm*w?@`q@*{L&LUQL**y~AM751&6gEiXe}ZOq=Cw{hi*n3_Y^ z#m7K4Re%V87e>edXjn7Iqt4HYiFjfZ=Va> zzt*&sobj~L^>^irb6?Lh?+p8Uo1LxuYw=0p&3Ek6=Uwn;O|%OCFP(M$d;O=*ACdxh z-BO*tovwG@oW8rrA!Lu;-GcQ033_v9cg1tq>F}@kx1g85hH>{6>Gf4nf8!Y#7#KWV L{an^LB{Ts5CF6OY diff --git a/launcher/resources/multimc/32x32/instances/chicken_legacy.png b/launcher/resources/multimc/32x32/instances/chicken_legacy.png index f870467a6204f302e0c62f708200f09891622b69..aa806bec4a4307621d031827aae058559ae391a6 100644 GIT binary patch delta 966 zcmbQsd7FKLay|1RPZ!6Kid%c9Gr!RZ7ddwR%(*Mua&K>2w9HT{v@0t*@vVn%@;}Y{%KJ5?lj6_Cy!pAWJ2YkO(kMZN7_V7ZDsFh?zUFk>>N2yV)A2?N z=j&8v5ijoP!OABzV{B3mDj)cG`0(NG9QLHo&(1C`l(}DU#_;%@`e$N?XGteChfouw{<+%mtt8&sneUiMn{G#_WPag?!xFbNP20ekb@Wy8K!BRg%Wi zDD#3_|KCse`(@Rqrh0onr_2O~3(MB*ee?73&&bR3JY6@ZpI1xfX-&K_r*WUT{%xYUx7EQn1 zxr3v58qWrU3tNw@I)8Gq?~!O@gY23%qlv{WOBOe5aV--+BQc$E!<@z&wysN76qg?m zDlDAbr8zy=Co*2hU8YpYHE`J;zNP~OH@ny_)iWj=uTB=6{C4xogCT$Ryp~_I``xbY z55+w(YvT9U*&k7NI5<_k?}E6yVO_OhP;ek)08?iDrRQIdx6hx_W&h=Z^Ao$451Vrm zE-rHA?#O7rR>cw-dYkd@o%O%<9qJxV4UhYI;XuX&?h}Wu7}o#uJmkwDq){jKXAhIj z=VQ_(mwzhO$JTs2`sGG)zhK?}ow6_5e>knFX*EonJEiEvR1M<&^_J z7ptrfbiX?Pw1`n=x3M+z+soYs3@eT-a#cJ3;ra)KBX`qsm^$k_3$MIvuaFn)WzG~# zW!n=wA;C*&Li@pu58j+Cx!QC6S(oyPjf_d$A8n4rsirfAoZX+6b4cYlPuCh@zluZu zHZ#7Prp((^XSSf>*`;L*&oh=~FtbP(R#t7AW%0Z@vEl&d<2~*>qkn1Vop5MX4pjJ` zBXYO<(f0>GgLq`;?rFWb#-3$yOLX5x<~>iX1oMwJ)T{io=qvYR(R*&SCHZ^gTe~DWM4fy*k}> delta 1162 zcmcc3K9_TXayPZ!6Kh}ON+_vgpB3LLlJ{9dn< zpV@5M8x9rm838Ry9EyUHTIP8_gmnS~cX)_)wl%f2)!*y&?f${-q1BZ=iQCE1DP4q{ zg;CmC{J7!2#`E9r-M+hUNA3Cd=gPm`WOI|+JNNFzn*GMs)!VgKo$^#tV)96v_u`J` z-9}M|-3&{`8<|!xEM1U#U`}I8S*>kCBg+O$!O*j&Ear?KxITQkb}h{JKWk)U7!YoD?> z-Smx+iHwi`pO%#L=x%qDzP|qEEn7mko^93Wa?1>t=wj|WWzW)M`TSmFbo6cwyYB98 z*UgJoP1pD`vC*bFWBPw1gQCPI_b%;yDl2?+-TFW7EPkm|a-DzvuU86qWjK9eLQ&DC z(B=e+QPnsuBas?*9%f=d`cg3a+jC%E0ir+}_cC_dUrE zrz3@4d#uS{{aNLy3M&ECJquHRdlzc%;yaVGvG`5!`8c|G>b%jZ7UuD|!X z?Q*a92Rl}4#oOFa|JXdgX`k%`PrfwUj|@{!Y=~x-YuU$gNx- zbEF*D+f;s|wr19g0}pID@7%Pscqhs@@!(XJ1?`001u??wwD5AIKF1tzmhgD0?2}g@xxx8s!*ekB$b++mK ze~dnyls5M9_kX^h@$~7_^<5{{b;w-Ww?IyL0fV2ZecZ;cM^-LQy**2?lR4q^F21IX zU#IBrpVWN*%$bCqg>mcc*Iv!~-Vi^x_`GJ$q!sm9AEn~h)-lPSKYzad)n0d(fY3H^ zaZd*JC5lbTcQ!V*A86m6m)Mh-mDP3gW@KAi+l<+>v#(@r{jK!LA@u#y%wNVE7Oyf> zXZX2wjmvL8i_D&#i9I_x_pDo`y!xE4c_Z@!gPPficUbl@tqR18}=}}vpk33iUG@ez~PYiww&^e9>K}&&&XH`7S8m=ikVEE4< Zc)FjzJJqngB(X8m|BV diff --git a/launcher/resources/multimc/32x32/instances/creeper_legacy.png b/launcher/resources/multimc/32x32/instances/creeper_legacy.png index a67ecfc35c853f69e202eb3ed3c8a87da13f8138..571d2de197953735e0df8afa8160704c83aeb4fb 100644 GIT binary patch delta 1343 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 BQaJzs delta 468 zcmcc2_=tIeL_G%+0|Ub!iMNXx7#J9fgWR1M)}51i$-uzClJ4m1$iT3%pZiZDD+2=q zXMsm#F#`kNVGw3Kp1&f6fq_A)#5JNMI6tkVJh3R1As{g`uSCz!HAJDzSkF|?(7@nJ z(Lx3W#z0RO#}E(iz0-E{G8qcE+~w0%m?$_=xzUAFyna#u!y@LYh1P!N*Iuq|D?K7t zl<@ZEnYy&}yLRVq@40t5Gq(S8UF_ra*AM5#)y0Y3&3($?H2L?tiEq|FJ-)uATku1D z$-b$~C&a51Q??s#wpqV7@8{jPW+#T!+^D)Qw^mQO=%_9!ubZpPFfD4H*6c5;i<=jn z-}jA!i}3{G`}F5q>%VtJJE>1+Hh8SEde`;RHlNG)b{=o}Zui09KhJ?Ry-)i?Pnyj5 zcHtyXWz9^Lb1QVJ7ibnguU=-@te(2%K9|C5_A4IY7YvU(b(t|0=HMB?XH9UxWv&MO Z-;);I{B9%ji-CcG!PC{xWt~$(696zs%3J^d diff --git a/launcher/resources/multimc/32x32/instances/enderpearl_legacy.png b/launcher/resources/multimc/32x32/instances/enderpearl_legacy.png index a818eb8e671a46e99523f269234f60dd5c4ff32d..e0262f659f3d57219c9fffac84c99e1c32c3863c 100644 GIT binary patch delta 1879 zcmX>h@RV~J-_o|@48)guU<8mW4Ijk>BFf{l~uN@mM?VteB|*ibur@|Kjz*4XdZVsd%1M^ zt^-}mmmK+YgsZ4G!_%jm_4Sog3A>}j-aUI%U3dI`1@HR$r?!_BjlTBZ@m0G2(M5@| zNkg=8>(x&e_IX9VC|PP#(i$YUr?dP0Pucp%rhBG+{}6ZV$9k}KsY7d8d6TZ*a5?z@8^s|3V&H48~q}M;(x~KiS5nJ-#aI;Iz?M};<+Xzg&yJpdp zcK?YD{oE(gvr?a!uU%IEDSxl!#4Wp|68TFHNxp2mdY^0aX2q4}YX8C>Z@gcj`~KnH zo`VrRGy7bsK6Dkd2FcxUDJ$+}sq$y~x9EDP>e_c|5zTK6roV09dWvI>X#2yS?}sE` zH`Z_Bmpsj{nEW(wMy>9Djj0dgEA*2M#FF*glz16EMQ?HyH{I7_v1_3m}P^cBo?LXmj^9z6&3Q?~3{wO^unqr~Km zofD@ycx`=HurEk3u62!T$o%ZiuKF|EtX^dID1N-9E8(|~@%{30hn*iQGT3u@leZd1 z*q+^R>vdwO*`b&D<(@j;LW^f?{H1cHe%-QqiEcy5*%C*hS{N=n9o^;SfAx>;yEzYT z>AimV#NPhke2+zsC$~S?{Z?f~dmeA?Q$>l~tp=|j8@zgCApPvXs|*HD3r!(ry-riL z=c$iukEyY3d^R=d;Je2Y55#P>KR9c)uIYv8?+-t--_K`P_WOsWhPWI{>1@*lyjz^s z>$S(#3pN^Bv)Rfu3+gj_-Y7PHct-oUR#2a4o1?FRnPG>iK6gz;rc9RW0%tvo`KHEF zk33he7v0Bx?vQDHO{Z!6PWDq5t({^$UqwZ8>IQM?2I#Eju)6Qwd?9tIhY43_S=u6A z9rt5J&NDW?vRJckno6>8bHovqZP{iUBi0FVubKO*{`1X=_j6XR-dSV6$KIyn&29hY zq8r-+j_+D9wS9q@xP$JA##!^3Rqds-0`0C$a{5p$WV|Y=*!Ut#dO(Zi#crOH44xZY zI~{eBmTh=>-_1rUIC)|1QIELv`L{1!Kj!!P@b?!#1Nv_<&YEyh>rep4oY}0Z)nZf5 z%=~b6*28_z%PVizD+o?Ix@K+D)hPDe+gZ;QEZ>r0ZxklgdT+{)*%C*T)Hd46C`E;C z@S9S_cK3|HvxGJr-Q#f}GF9YT zhIoggPLj~=!-cEP@s)G0mOiReSL9ZGV)a80_M!S+zO_*EHY5e6I)@OhZFLu>8ElW1?wgWW$mBic zfZU>@-w(cQ_2gRZdNoytar1@-kFsUnPM0~(@$5*Qp}Ao zrH}BTW)Vt0f>}IBWZHnXK z)8$dgU+-^v{Zjt)^ndb`m;S$=^YXuC?5q0o|5?{ez0W<>Fzylq0|SGntDnm{r-UW| Dh)bUJ delta 2108 zcmaFLcS2x-ayFdgV zheL>sTP@6{X(A_XQ!Xej|~?+R-gU8HtzecV}3IBvt}GC3z~I8k;!_C z>#9o&Rw;D|Cb21pa4H^bk@R_B|6&TKu$lw=)Cn4k>V+1$h-xi3=IJ~;{PvQ<OpXPu2I=h*V&ygih9Tw#obmXp3J}k}Nz`JxxNzbn|y{BTa z+YdiV;^&y}_M~2@UO@2h%8fm9e{Jag+p@~9dsb#BpW++#wO`A(1)90+SS^&-d1CFR zbaBaywV&rt?OWA$-qpdSW#-I|yz&#SPd5t85KZCxGDBf87jKKm)fN988ZU`vXzk+q z)VJvKv4V{{cdVDZR104xGJnaj;~X6w29`4g+MUB@IKPd&VA-Oql;%-C$zqa z(W_Ip1&Tl7Si5wB%Zl(Nw-3)?S(&PIE^^M+qrZ-2Y}~V}e?jt!p6HSj>YunKPv%zo zq$nh>bl{AS%SD@%tMeFt>YZ3)VO{^`m8tvUHhVkI8P<(*GDqTeHR{}NUmCh3v_bd- zqluD~UBaCQ`=a)3FcFM;%X4B)Q~%-nGiFAzRLLtVC{0_r@~_#p;tY%SQ)^C65{zCy z)4=lF$M}C!KDzgRy#75uSue(Ut+Uze3ptBjJH^<9wV75l9qD^>G4pzKl%(dp_}Q*b z^~byJetBEw?ecErDt3eFOY^0?V}<&d(jC)OHyz#DfP5CwQ}Q@_N(FE>bLI@rdo!%qvEx=GV?o zU&Q?9!K>3Y|EJq4|F2=*S;@XFIzv)RB0bQs+Kh`yP2Q@W_^zn(T)VK|?o|K3e@wHduTxwfHh= z`@%hA;t9t!3%aWKQ#oy4t`2B2onc~F*Imoe-aL(WR`H`3WvtCFsK~u}C>V!3no);HdnMg^< zGrUZebf0IRaR2UU4i?8K+Z$O6=jORC_&;Bw*=EA$E|H8E&-Z?q>e(FTChJlE(Kt9m zcip}z@~z6ABD|_j>|3rZa>%jg3Oy2~(rdU?WOAy9P`GxVVD>?YRe?*5X1|-ocj3gr ziOxIL+ccfzb}DASz~$}iIcbHmZ>W{E?AIKn5~uCv8Cf$0B0YqTXt!|eX^;EpSm(^Z zTOHVGD*AEnCF2t>7~Rg#ORK1v;wpcmKCfKl#e$r!h0e29Ei_#3785*0wejtRv&|Om zE`n;k6QjC3g;e@}X|I!!53N@5ouIO^E;@SRW-(dGr2ppfkE7$~yIwbYu_j+|SEaxW zvDA|t*_UR7AFgzocY2yop5`vGTW_7#++;TK>`@UE+PSxNb4PJ#)}d*L=3g>ftY@#NDmW_BvfORlRen_~s**`}k_=>ot4IT0i|;wu(Pm z!Tji}-CK59H&}&+3cj3be7W4`p*}~^qV0PwZE)_LRevOJ``RzjzVjRS`2|+3a&Bk4 zFxh>j?O%)M^J<#X+4(=+d&Z`3_g{UR*t8F8!`LGNzBHA;GY(xA4u6nc-JwEZVK&VsI*MZ?@1ve%T{-b(21(&wJ4B?*GAOQbBETbNv5* z{W|gc9Bhmh$V9DHC#E(a_OgsvudPSR`XxJLlI& zPoL#ac6Lv%{D0N^$@F!P#oq;)MK7JU`@u8S^>y>2l9S7&e%%Q9^Kjvn`HYtAM%@!H zR@9gjvwuIGr_7b<^yAavmWOPU#Ap1z-BK-m;*;&6S8gBHhKZ+&eo=bi9rs52$*vC< zPyYDa`}7>|%r#;&qmpji7wEH%F`aL^`#XpB>s4>_E|l#KcyIqX;@?s088wQ1Y4I}- gzx@BW;$M8R&ti^4lRZ@!7#J8lUHx3vIVCg!0Kkyo82|tP diff --git a/launcher/resources/multimc/32x32/instances/ftb_glow.png b/launcher/resources/multimc/32x32/instances/ftb_glow.png index c4e6fd5d33296f75d83d88bbbbf3a54a5e299d3f..7437b27cc16f4d70da7ace91371f178fb14aa2ce 100644 GIT binary patch delta 1498 zcmcc2`HcnN`iaeU;qT9Mizr^^f5v$6;uL$cX-YR%MERU~J!?DWo9`@}MbFNjTp%Rexv1nkm&^4%PeWA- z=Pq5Oag4!^o2kp`SWcd*vsV7qou30YZNBZ`=jVR%>|3?U%D{Dxey^zc%DqeJFO59G96SS{Zm+ z_V%>wl9|PDDaE$h?&QZd-monSsm|NK-#T*Z-rOmBZ9OcHSY4bvW%FK-op)x}Pno^< z<^H*;CrdcEBEC0I-_P`pb49h2^n&vDbDVXKy-4wYap={14~eHfGoCp`yl{(n>v!Xw zr^ORji|4*G9=qk)F67Sb`S9xL!zDkASrWXMK87;Py}3tzc7KVIPwHn@`7_%${&Y06 zKmE+ShSU45M!uNTk*Q7_*Zt#|pTfJIwc&1k-T@zleH;(ouWRKfyw+kO?IatmWwcx= zQFL~G>gU9BEsQ*-bFM#@%-JcODth38+`kNib7H$@F4Hg&=9s~AV}0|&c^4QaypQ>N zS3A8*aNCBTb^3=?#Ak)=v+>o42w2a$=IffjYfA0xOxRDH|0Kn(*}h8Mgn_57?363p zjpNUj@2TfBj?FC0(kf+gF_~jJduwB$I-^(GD*QS4HI(yQeA%mYeW%bSjThfkha8!-Eu4d=o;NhioeaiFVy4MV+{bd@b zuUtBb@6YSohR@~nN$c1x4zjJ9Rd3z!;zhNH=x3va9*@r5m)ZT~_t}&c zsZCCQix^^3n`g`O@=Qsnj+pVKxxXQYVD@+d@&dIMZ^p{&%+BeJCBe>0LYT(56joX>+{e0N!k25Je^Yd$8QSa1R%kyDT z)yFGu_dj8CsAAaqMfGITWg+f{_=>sdTo1O0Y?$DAGC|?x&CeTW6l+9!r=D6P+_0j_ zQ@Xz3)z{r;n#+yQW^A_Ehcd6O@wXi|S0+YH?v({)c`wW#30% z82a~5UTML8AZBH$*~xuroL3f3aaWYDUw^tg#d_1JzYFHS`u^QO{)uc~pqeQwga3_~ ze+|uZG}EWoAGBG}_w?$jiR`m~cc$!adDr8dP(GKrExIK^WYx*^j?X#!4o|*tGLZEH z>wHDQ&M(S}Pao``x71_Xf1mrgZG!i%NwC$kbp*(LQGD}7Wu?8;?Rx8met|5=^}ihs!fg0O%Bw{2^=}5sC08$a*?0*wEz5@7j2tu USRUrcz`(%Z>FVdQ&MBb@0MDt-T>t<8 delta 1732 zcmaFOeVKQHaymmtT}V`<;yx0|Q%tr;B4qMC;t?r}L$+iyo^_Pdo9@ zdC|R1D$}-!uTy5!d~oQlNML~G?VL-!*CR!^{;-=kgx4<%cfGZa`^brXcS|oyZ44Bd z`dF%C_Kmz(Y+LU}>9+u2v|-i7VFDU);N{Ni(5hb~I3i#^PA z$;+_t-JQStE&cen-EB_&niRQgfBx?VGqZ%<@Al4?;o7^*`2M-)?^~5Bw_ID!_VCW0 zPKIsoCl|=HZN8ak_cKNKxaR{4v%brpkDa}I`9h!Q@z*O`FCBUioB#6A^a<+q0xp?; z?1z{>*rY+lnf;ovY=}(TZ=kWfq-ECG;y~ya#^Wvl5_OqRs_(ZHvp-79( zYOaBc%LZNT-p3LGn>SB5xu>#tEnBv8x!(1v{R^i?$#AV)D;TuEb>?gn75!IB3M|;! zqmR&WA%>?J-zXy^ii-tyR~=y!`JKW>dn`Ea9j8{ zabAE+-&xM*A9zoD?KOMn|7GI;N7Ij0-ZBdBpJAqYA=xqN%-(Q2< zooDu_=h$)R%p0B0E8CAfw7+%X+Jml{@|$;jnsQovfAd8l=e*fl#YE;gRFfXeCoyBQNuT6>S%Jc>V}X>ObJP|Vhp%=p7j#QRmS{l2Z6u6|d|&j0)IPe{!t zgTO_7=IZZ} zrhomj_TK+-WZ9XM$ z(Wh@jwj2B3@YS26%y#4V#`lbq-W=akbcvb&=0=7os}`xg-CnwSYxeqw(Yx#aIX+L2 zC@|n*;CLdU!7U{z^;F2KU3Kn?%6+lk zNv*%-UQ4Zdn9cv2`NJy(-nxX#;wS2Vt1R8C3xkI z%)MV$OG{?C2|QprlC))&Tu>|H`7t6ka-TDwcflue7W-yN6Qn}+8OFkqLnS~nq{*m?`hVoo_m^cos0T? zw)~qXjA|b{-0?rtcvwy8Q}_n%30;RL@CqyPxbM2b#G!cQ!iEJ)61Lj%KGiWvTj)Jy zo}>f&QRM=z2^o%2j!KN%x)^QG{(k#e@3V-3fq}u()z4*} HQ$iB}w1q(W diff --git a/launcher/resources/multimc/32x32/instances/ftb_logo_legacy.png b/launcher/resources/multimc/32x32/instances/ftb_logo_legacy.png index 20df717107b4aa636061772bb785c4116fa10c52..fcd37275696358d9e825b1aab1cd0145f3c5e9b1 100644 GIT binary patch delta 1435 zcmX@kvxa+uay@IYr;B4q1>@W4%oDOtiXYqk`<{yN$;&h9*Y#dBzP2s*HWUf&ePQ?%(zD@-IH6cXN{WFX#Nw->`ps!-T&av!8c94cpMCe`3aOo?G_c{TbUu z7j+tPS8OhL(`Q|!Z~H%7aDmcZ8{rzuv^(5ZM&WHI6YT4m_iN5_c2$a)#BJ9cwym+a zZe{$tg#8hm7Cu^cg`b}8ziUw zhWTOhW%qBm2;W}qE?T^{M|Y|!W9nK_<;`_9e-9iek(bfW*Ek_~_A)i8_}S|F-gt;n%fHJ|TWu>S51f-aL>vZK<{OSzx|4*HK5@WV>)IV9lGi@G& z*MY3Hkz2PONwUq|cw?Q?)L-RCZ*5lAj1N9{RB?g3%H+xNvke~3c>R8N{&m~A%?U>L zSIEtnQ8$(Ozx{^ux$ElJ&%S^7$NdF&FWdaKG5+$d=&NkqyLj$A8^(QB0>AI4)(TFj zxXbO<@Z;{^zvgyEX+73i$0WlK?hxMcv)(xGdfu+u}1DlSzmsC zZ_~LSZT(3q$EPz~`*8oOzis33S4!$lJ42WLQK(VYoGU4GT=7jdQ_qw$(-U?X%uyF) ziRDn^oB4P`TYLVgr+R0zVwX5vxy~|W?K94|#tO#o=WqKLRt|NNM$-Z}IKP+8U zr9Au0hABn?=UdiqGfx$iso$|XV8^GPl3!XoxHKw0O*nV%ueh|?n?I6|KIWGFda?NV z-fQdYg`67BH~8!By((qD^Vx;#p&^_r-kmvk!!S1Xq0n0Y?3JIbF104S-*)qJBmx`uNhz>WAL{JN)yUu0(w@rwVovza76+TJW_XfP=mDxS~n+ zoa(2-&)-?pAGvk>>w^EL6aED;@bs&^SoZ8x^L7Ro>(9*frmbIOjclhr^9^8N+}kUy z@yY*S`+}fYCdbKh%rXP~*Y6K!U=?VxDBZunTezo3YMaC7iOpA28dy|TNqINEa8FTK z@K=#FDAtObXKtoU>>Jh^+euo#7k>S}?eG2aYxebi_2rE53?lOuDeYUHA9Is|fq}u( L)z4*}Q$iB}EZpEi delta 1591 zcmZ3(eVk{4aymmtT}V`<;yx0|V<3PZ!6Kh}O5$V|(U?inh()d;b0z znH9!9>9=OCRK9v)k$6l=o8PjiMnPvEo(UZPOg^@?xYYMbEe>4hvi3+S1~Dq~dQ; zuVdd=-T(Ub@tL0PpFg^z{{Cn9C(iKX|J1|I`*%M*eDMx%Lh^&-2ana5i0{pBzrmNc z)!fbP*LS-=@{9_ld+SBt=P7QSzGa@xwEUB`%8Zk4rfk=Lnpbo$H>5N7+|IoXH@I}R zJrcBd9wYE}_4$x~*}DIe<^R9E(CFT@qIE&plU>aAKM${Mw+oV;U#-TnlPe=Svsjz$ z!uIdKLT7m#&pxbw|L~kCjPpAtt*}^7`t8e_e_!uC-Yx9Ct1I@XnZoyc*7^YRm$Pgw zKR?~vKVOFR98njrY&Dwfy{eTlTeY43^L5><+kBIcwXU@+CW$Z2KrL zTjZ&;b@O8XwB^GTFeo@G&EKZ3op|*XFEexWu2WBcbvrxjJ^y?2 z)s-vSweJ0=F5UUeFsW**>zVp9mj6|o>oX^PP}pJfA_2TuuUrYKEXxk#36n3Wa{`2Ulb+)@oU(ai9=fD5ebhCwgN?Jh53t`t|oZJ_q{^ zTpD)uyDLARpC>P~B|pCMso4VQ2V=((W`wySK z+kMmx>i)UF>4NL7O)ghmS|k=T-a7HI_1wAF!V^DrdObBiu(bEtXYWOGR|y3(uzl$B z|64G(qlAHP#>ocG2b1cb@(6_RKF=tAx5;|(F5i=zZn2%7u6Ga`|0mtA|NOXJ*J^ZL@FPk{5QL#+jYS4~(ioM@amv)C^x>CJVC%Ggqo47N0J;{?xDZ&EgH-|S?f zCvh{q;GAytPL``vR#nv9wZC#_Pu-4?TggiAXBt)KS+vAY)H8lBHC^oc!u+zQO}G1# zh0`tyRch}0)XiV;=z4m1(PqYq1pzlQ)3&?rFmY0yU(cj(^?aGoX8Zk_W}CE+CC{p> zXPRNbuW*7N_xchkXYR(K=VO6gNe%$G8~eElciA@?Ci z&9}v;o2Hcbi5i`cTd+g9G<0IfUpwunsDd1;)8%|CX3x}3T`+;wq($}S!Kp?QPCxn_ zsm$#zzS)h%Ln_&z)cg4EFH&1C{rtcA2lvw`wg>zF#(b%F6PG=3pK;zIrF~nbOsQjF PU|{fc^>bP0l+XkKq7Dh8 diff --git a/launcher/resources/multimc/32x32/instances/gear_legacy.png b/launcher/resources/multimc/32x32/instances/gear_legacy.png index da9ba2f9d51e05489a238664b90e88e4212f1c8f..31c6b702b169453b17dad1466dd240a49c933a6b 100644 GIT binary patch delta 2270 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 delta 2404 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 diff --git a/launcher/resources/multimc/32x32/instances/gold_legacy.png b/launcher/resources/multimc/32x32/instances/gold_legacy.png index 593410fac9a7a929696dee968e112d24780a01da..99d91795cd11f8d099f9e6dabbae02544f1b7f4c 100644 GIT binary patch delta 212 zcmdld^n`JOL_G^L0|P^2NcwRG1_tQ>pAgrtXVic0RlYpU=>Ojd|Nig&|Hl9S4ZD92 zJkIo~?`1i*20Y9MmnU#76yRE#z_mz$tMTsMyMM3CGAM2H zW!b{?%Ov&NJ>#YKv}dTScV$_Zn9aRmbA!k8dz(TJ-@M&?T>gc(@9kT=+xF%<1~|m% zI;?Hms~XevEqq<@tU!k7=7@6BIgis9hB@4b_GSuq*kFFb^52D95z{v2UHi&!9JHvV V*M95zhYSo144$rjF6*2UngAzlVQc^Z literal 2366 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 diff --git a/launcher/resources/multimc/32x32/instances/grass_legacy.png b/launcher/resources/multimc/32x32/instances/grass_legacy.png index f1694547a419523cce164ff7a698c1692c2522b8..3a28ce342d2f5699ec1e4fbea0f86fad8937df98 100644 GIT binary patch delta 393 zcmaFGGJ|=7WIZzj1B1(wu44=g45a}+A+9A`yvnxu6mRxSTV|8L-Zg%{Y0es_x_u#8 zs~pmo+h(q`Ph4moFhMPMt#j#C@2;IujT-`+Hw8!9YG$mkOIl5TFHQ+%teUU;@hH=p+LCWU>3!>%cv3x$ zuAZLJd|vA08ZMqQUq#HA>t&x=T?lEIxRP(Jw$z1(T=Pe4*L) zGhdk$iAo&1uy(@#$bul_2Gla%AC4j*FR785kHCJYD@<);TdHGywnr C->+r> delta 604 zcmbQi{EB6QWIYoD1H&JQw~HAV7#NF#+?^QKos)UVz`($g?&#~tz_78O`%fY(0|NtR zfk$L90|Vb-5N14{zaoW!fkCRoHKHUqKdq!Zu_%=xATcwqM9K zLIwuLo1QL?As*g)r+RubI|{Tuzs@0NvrC{yTg#2VtDY@TBw6IKP+%dWepd%alYqz> z*8;~oM|U_m@Kk+xH2>2?@h7cCPDL+x?k{}#@?CgnZ0K9v{VfMxMVm)dy!lCg$kct|8Pc%xci00<@rcT|Ok48IZCT8M z_a?kv$4eegU?VF zm>UeA{&89*TX1GVUdo|_|HfRC?i(K1&wNr#z;Y$yoR4$31JvjJwNUHsmvuhpnx4Q^q%8$(Y`KODE| z?Y^DjXZ3xzmS($6)k&B=S1vvEPw1u->$Cq}_MOY|V{c5DkL|YJpwGJ3yK|0;U6!b5 zbmd&}cGuZcH>|!_Uo<)XscK>|qqO6#6Q@FUbE$8yn)bYryD@%S{_2AtXX~72U|?YI MboFyt=akR{08Xb3#sB~S diff --git a/launcher/resources/multimc/32x32/instances/herobrine_legacy.png b/launcher/resources/multimc/32x32/instances/herobrine_legacy.png index e5460da31d7df8e6d20fa59fbd3b3b8f5ef655df..8ed872a6f42d5f9da6391b7b9e80e6b1ac98aaed 100644 GIT binary patch delta 828 zcmeC;xWqO=xt>|l)5S5Q;?~>i%q6OZ608rTCRe&G`}Sb(R^2Jtx3}d&(C3KLH<$d# z_P<_yE?jM=xn{Dkl+-MhPdC!0?y&T1y>lhQ4>BIa&lik+QyM5I$XFFjfK#hS}c zuS!UsJbU-*tGCaTeirC0S|9XcR!MHYZ&|Fu$*wakb0?S8&)_xKZ5$+brbG0s$BOfc zD+Sw+9P?V3opdZ{X7N+*3rbs9-rUO&2}wKh{L97aei7S}^=t2GS+1L7C#6uOByeIU z!@aqToX@%Ce)Zq8+V4C=^tq6%W!w4nSAS(K=H}V>IiQp6jnY)*hwBp-8L>7zSognW zVu9r5Lo!9DM9-YycNec;k=cJ!ChZKz)P$x@tPJff&tZQ!f z(|8%#kC%6wu4KP)VYS=|@g?jl#eT#m+&vIh)FZ2G)wDzYzQq#dhzn~O>u=a^la9Es z%_->L0w(G9ZPWerX0q^|ljq*n^J3bH1CQc-pB8H`Ykd2-y6NcLRZI6eoauWncUM#W z`yJ~IzV~kKH)XZ1tElnc^f+JU4%_nSS&jc$#Z368tvs5mbwd4FAJcMiU*@^Z+$Y|8 zJ?(0*d-Ld1XTtZEbqOwWl|D^)^>f9RdhrF@zUQ-*@xNwMuxNBnwrWUy>%_qMubImy zGbF6faCM<(z^#7P$66x(UV98DOHXBRUM6tcNn%)1E|hPc?lak(t&syHJz8N@&&!CATV=JV|?=0kVIh^^7|Lo`UkM{C5IWjOXFnGH9xvX;fq}W*)5S3)qV;U}`Fv?tk$?Bjy!qvR zX~)VSpNymZS_K!Q%Om&Jk+b@fEVh-Wm&vu?GWN?^?7(|&_m9~(D}UF1-nad=Y}X==y-Iz_ zuPPH61YHHUZ+zvb)sXJOI`zNH0i91W$2YPjEY?WM3Rmb$X7piw{CMdepI1jGxE{#q zJjg7p=a&D;&Fh5@wmbpk2L0|^O(}S6BK`|N^j%qf8yNky)b_w zk6rEFX+L6K=OzU(I5c`1`Lu8RpZ!BU+k>fQ#s1wtPX11pJ;%E5P3xZ-hkNhl&R6(b zXBPg>;?KwMjq~r{Ic@lbizn8hemblCyxPl&t83fWU(e$6UMYL;&NtKAC4U+Y*T1XC zzE}Nn%VGJNeH+@}e+XS58^kJM|8s`4_?G)${kC?Ud9m*6QsMqxg*zWl-BkA4%4n{f zkAvZKW(J!&wL`-Cd#)L0{(HoFrv5)KL;SbkK97I7v+mn&?j64lUtfDsadX0p zdZt}E5s`b?7$Rb$j=Z|lGkf~M6^EanuVx&cHZ_~_n+z6o?Hry69hI2s^qS&6XiP+ zn#_|meVuvzz7pnX5|epa3fL#N{}X&THUIi|e?tj2rgFx(jXt-%B<>0o^nLv{xzlD* zxRLfchAD<0^9s|R{QEm^cQZ@2!8J~k;}23NPxrm<7|QbUaMNmsPrKWqCPkWc9h5se zV}@?a4b~&Gl!EteE?aW5(n9rtYveJvb&-z>j;LMY`%vKZU5bC9&I}d*%&k&O4s7|! Zee8e1DrRSOO9lo822WQ%mvv4FO#t=&*b@K% diff --git a/launcher/resources/multimc/32x32/instances/infinity_legacy.png b/launcher/resources/multimc/32x32/instances/infinity_legacy.png index bd94a3dc2dd1a7a9a6d7c9f02e4fd9d33f793e24..62291c782ea09238a6ed06c3c175c75dee6fde11 100644 GIT binary patch delta 1311 zcmdnQyPRu+WIYoD1H&JQw~HAVSl)TMIEGX(9-Ycuo}DRv{J#H(tR5>*|5G>0vTk=o z-riOl`uNti+|RSm7?+>VI=A=e2II*6TX&tm_P_9dXo&?&V37$=V1-Bbg|pmY8{Y>j z8I>CdPP=R5a`vVL%ahsDR5|`O2_(h{DQ_y@C>U6)(o)(lv+-*^(@}RP!GJr3O00qV z?WHbO7>G^OQBmgUR&qIK!p@k~EM6>F`+SptfldZ*t;3}~O0GG39lpOTVKJGtE7kGI z*-runsUNJrtrkc)Jn7oJZg-xT6OKJ`SCtiJSx9x9xOLL0A^kP$gZ`(F`Ew3bI`kf> zW{6PQkSKjnum8E?fn(L%>f;iQ2sJhEZ}2x+uBgB%AA6h0-lC@czM6v4@{WI8j5U&7 zz2+Xz&;8cDqk6{f)2-6}4X-!-|8mk{cVEYQj-zK?dsZqRxtSezd;RX-`QPW*cu7Tn z%iUxY*3QIS%DKerq;dM+>GnIm-d`3j7c44&MdZy@vA4XMwhPu-Dd^;Kp9!c>zF_P6 z$h=S_y5{A*`iW87R5rhvFjFnH?`_wk%*eZo79>vyn|rR1bIrPn^Kpm1XgfU(EG=ty znApL2ICB$A+LYd;nZdWjuJo~%zTfk#qWIRwYgdlWb}T+`b9&m6Yn+vnTIHq+NJu_i z-|@{?CsD#pWm{pTCu@D_&N@Mj)kmk$sSbf8eYgPHSt{|cF{V9{Dh^+5uVYs})V10PX z>8Eu{2BinLKjt!D9(v$=v9`B>Or}SpLDGpezLS0~H~*}2nd`Hk>ut}tmy>*Ei@*4K zw*Jt~CH2#EB>yQ`C`G0^&&Ugy^DgDoa*kCR*97>Hdgt>-^>KC$)pm5XUzx^s4} zJMe)o=iSWNwQebMCP*Dy+L!h5)<))J?TFKk`#GE^G(Bn+j(89vJ9S3-R6(trw_8_b zevYg7=X|wGW%bBP^dS=pTePpu=i zxlYY&-;+G&+V!XL>(j5iu8&YvZRs@5`+WYcR{7`Bze#d;eNTP7P+DAaSm^JBB^3@g zZaHOdy0qH(#_{7yd~+Yj)V(#Vn>G1O%7+v7(^Nm$3uc&UZHoS}tupoEq-B45DqfkD z{t~SGljiU|GwkZ7V|Ua;J3F#=`J2p^&{BJm#d6JXXRc42?c#SfN9OEsn76O9-gnM& zvvb~`vVU-GHL%R(Re=Q_nDl%2i#IC&PPd~kNR(~zM-t?LH^$#%;#^t icy@Y+#8W1FM%UxZmaR`;xs8E=fx*+&&t;ucLK6UV-iEON delta 1709 zcmZ3^wTX9vWIY=L14D6D)fWZ^29{zc&kzm{4vrd*lnw?42F?PH$YKTtwl^TmC|7D> z%D})NS>hT|5}cn_Ql40p%1~Zju9umYU7Va)kgAtols@~NjT8d|o4%)uV@O2n*=e`) zr6XmJ+ZTVVsM-EFW=^;8bGOV4bMIiW(wiH$xaw?pRL{DFfA=HCidOasVNQP-Jvam& zwbr_L>`^?zEq?IuA*bC!C9_j^`>xNNeZ*7t{-fQ;jlcD@w_m)marUZ)35UKP{bc#P z{Mq;4bMF6~JO9J8_xm!KI~H*?q((Aad0pCf>iK8JfR!N(9IZ|aJv}`P3tn3>^tvS{ z$d|{L?~Bo6p5UWaKey5^Vv_;~L&hw&134Ou4mZ{_{pHB}|H6!6Vtya*nsU#%@ilx5 zr_H$z#3{2otPEjN5a3`~puxp(H}Cq*|Ml{h>(wkDmY)0Yi+>&Shd=&d3_pJF{m%HI z!iJe`)vF0B|E*y-@TL4Yqehe|!=pu$rM*8!GW`2?Se9XnxlB@?-qrehT1@}hSz4}N z_rJ~X@#<*?nR^x03676^)hE5_zkEDzL5(tp!|&&Q-}>vSxf&k%8#62sGGr**^pw%M z{Ld54JzsT~^SyaG=l9$>9ZVZ6UOqXd|8EE5fnTeNuf4MhKRj_~QD=9ZtGqmcp{pUYS1}+X$6u&%;-P3K#$MyJ0 zvGEpbrD>W9N(!E03&TyXv~sc6zr1i!#;i%j;Qv>lhpN3XX6KqqdfM1xg+)A%D3{lB z)~xbfvmkK)vV>QEuL%G9@^}5M2Xnrv@4KA%Md!}#D3#4OQ}P#gEd2TLhsvQ&KI8c^ z&LXZZ3FpKt_S$kS@_qWrcTGU=Z25DS*K~>4ty%E=_KmlCz6VwI$tX?ZTI3=0YF*!! z)bB-$+!NkSI{PJR_Uv-MkN5O1=lnNyclc_sd6P?h08h}qs@~q!s(yP7y)_;tyNj%7 z=ePWOD7j_DF?Q+VH+#Yt|H^C4yRBv^mZl^0EN+)W=I;sD+)L8*j%oCI{wSU+*Eo;a zdwNdU_vI)5Y++mE^m^j2(gXJEf>*MwytDT6 z#+`+F>y}MedeBIbi|O-6j(yoyZf99;r`bPNuHJt1+WYU4ygw^ab2onfxcHN%kzlN< zWvpY@i6x&y+YcOOe!lh7Y&jn1MKPB;A{p;|eE5q&;QK0;rlhpK+a_y_7@Ip2;C+(Js@?X{{f9t4ZbC24hLRW9{RB&ZC`*=>AL1r&kI{Q z&;E$`@y6x-WB=fiz{3V9vv!JA-7ewylD0XpMzDD$ck-K@w}K~ltsaJLcpA>@rYCV{ z*G?bP%Z!(udbM9nX8Qits*zo-K6dr{j_Ui?k3-*Vt(E&%$z>d$T4&@|q;#wNKvg+Q z_S%jo-A12(nQSbRT$&ef_fwd{$)4zrv~i|e!g?F-^%xUSs7ASpKVU*4mj1XnD?Tv&%wIA0p}!g{-((o7T}Hy~0j9 z_VdKkE*|&aZuraJI>G*wre?PSNApwzHBFEAB0F`(A}TB!Sx|aA;qb$SZ467)+#@_(0#gM&MXK}9Z(P4{)rmb5WS;){q{6$`ck$JYUy3M|S=i0(EnfYY1Qg@8i_6`*;|Csa1@rM_?^xdm} z@tyO1&4(8j_vdSV58Gk&v2VrkkD0RP3)ml@QhmIxoU`uj=WK`llZ)QoIdPZk^{XeG zHrhhp*R)sLf8Q^?@b~X6cM6WT7r%PK$-}>6;_h_QH-$g$OlMGwsIPf?gEw}P-o(V; fiI>#<9>j~!pCfa(u4)Mb0|SGntDnm{r-UW|#`82Y diff --git a/launcher/resources/multimc/32x32/instances/iron_legacy.png b/launcher/resources/multimc/32x32/instances/iron_legacy.png index 3e811bd63f0b02e3246b5c13651a3249e5029229..ce6bf918473d6fdcbc1762f06c7f0b7114bac313 100644 GIT binary patch delta 178 zcmaFEdzf*8WIYoD1H&JQw~HAV7`i-N978H@CGV>EXCol%!sMVgkt0}tnWYZT7B+#~ zb`M$e4Gw4U|{fc^>bP0l+XkKN`XWK delta 1767 zcmX@i_=b0aWIY=L14D6D)fWZ^7LKZrh?1bha)pAT{ItxRRE3htf>ednip(?yhKgHj z!?UM-R^$15UTYVNia`I<4>rrKUwo=Qc%yJm%A=oA#@jXsINi~H*pv1D&)uu>J0d2B zhSd~YwCp|YCT+P;_)FQ*pDMY}i{tjRefYN|{5Zp%EauE@;q&XK)i%Y+34b%yuzwvI zp)50PvFQeDljNrxqioqZZS$)(oes>2K7RDU`GwC!vm)D!r<6|L_IARxq{p#yMXxb0 z)!JZm=Bz`n`fSn0o9|kzA9$)A>g#d8FBK?|bEk`?!6r9Qzh|;r zzSLY?=k6hnx!ajl-XEMVP(NSH%-!XW&4fSiUWq=rm;GXI?r!gEjDg#YyjIK3HDqs- zoG{z+>_Xn;<^iryiKGrj6-95}uno$b@`ecOxc%l|m8YI2-uz@B69a?j2aPW^X`CZ{u7H{S8; zn6myfqr#zEO$jF&7~h`Yu)H+yrZD4ih9)7U^kmCsMxlpY3OA)5M^y6JTstP?e|cJ~ zEWhcwWr4287S3am@KQJ(<@m2cdV;fOPei?7;UiUz&Pj6$uXPrm+g*4lhNBI+NXyt3gld-esb_vPXyeZrD+8V$Fx9Q&KVzzuA)YRa|BD;V9YrJB=i7uPR7b#k*>K zx1UUi)XIEI2Q`sS(Lb5Gw!WgQGqp1Id6WiT=sv&N=2}I)&ilC=U+w)G+O+mN^Re7> zA5P}2J|3S^{Bl+2yM=+<=iHfKZ=F@vuXJ^*xc?`X`8SPWbc|P|AmToe* zRDOP)_L-Wn6`wnH^t+$1Yl<(`-r?i_aFz5u4zY6n--1NM%|izhGYp7Nu9|B?$z$C@A4?b-c(M>YEoY0+h~VjnlGigdG@DX?j0 z=)&isjxGYnG}u(rUKKBz(e(VsuJ-=*<%RQ}*1kJ`arqNpwjV5yB9}>vePsLiW!ci= zd+L3gCM^+|FWfI#;`qpY-D$o3g?d(Rp3e+ao;**zPl)>{-!$tPQ+cLVbXhE0A@#KW z_hvoqIomB(PnF8PJ9)pslps~3xVtuT#+-u5PMiyVAKhl();KSALFD$g?~`xm&0}axf8dq< zdo^#uv&mnoqPt}oALc%Iv}^6j>H|;tF8p8O-S(v3gK^eBC&mi<#rdZgCq^$QKl^s= z*8a=v3eK@h^BS6+6P9?~d@c8$uk72m_cO!l?VE&)*4`<9(#pWVz?S6g?!xec;XlKF zp}Ez~3=9mM1s;*b3=DjSL74G){)!X^1_t&LPhVH|Cmh23x>8S1F419NV7Th(;usQf z`0aFGuKH#Jf!6(Ef_FRgRz3gluYJNg+ZI<9Ho@DWT^;rtrtS-wl}x6EE2NE&mUjoLE@ZgoI$ZXABGs44$rjF6*2Ung9>VP!j+E diff --git a/launcher/resources/multimc/32x32/instances/magitech_legacy.png b/launcher/resources/multimc/32x32/instances/magitech_legacy.png index 6fd8ff60465cf71651ad4db3502d296bc88f084e..bd630da8f6db7356f3e443c12075c707f6a9ee8a 100644 GIT binary patch delta 2494 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 diff --git a/launcher/resources/multimc/32x32/instances/meat_legacy.png b/launcher/resources/multimc/32x32/instances/meat_legacy.png index 6694859db96b06391866d074da591ea12a9a352b..422c88eebff03dd88f80efc305d213d159f5b162 100644 GIT binary patch delta 1109 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 O1_n=8KbLh*2~7Yq-@&;6 diff --git a/launcher/resources/multimc/32x32/instances/netherstar_legacy.png b/launcher/resources/multimc/32x32/instances/netherstar_legacy.png index 43cb51139e7b412d5ca95bbde6d814bc96b695a3..6f5c6f22b495c2a61e995fd15bd03fd79c512e5e 100644 GIT binary patch delta 1182 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 C51q{b diff --git a/launcher/resources/multimc/32x32/instances/planks_legacy.png b/launcher/resources/multimc/32x32/instances/planks_legacy.png index a94b75029b0a8fd4df03fa99848963354b000429..0ff6d19b0c92eed65ce35785bcb3691eb75ce713 100644 GIT binary patch delta 210 zcmew@_=s_WL_G^L0|P^2NcwRG1_sdppAgp_Q{vb6haQ@nG_AyOev5Bil6iW7&hH#~ zZUzR14o?@ykcwNW{f4{_fgH@)3&rNK>Re$G`=I~u`K0|*8xQGD_qvw+&z4uEI_Xl- zr2}({COIrS_~zW3yYDuxZ;bn}F~yx%$MW2fX%*Zm)80OGyvN|J7&U2e;{{3M#U=;3 zEf3Di{IKEUtPrjROYJtgG>acuR413t7{$IYCCaSekkrXUDVa^OS0dIQU_bped}aHu S23ZCM1_n=8KbLh*2~7aaYFbwS literal 2299 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 delta 683 zcmdnRyn}UuWIY=L14D6D)fWZ^29{zc&kzm{4vrd*lnw?42F?PH$YKTt-s>RD=%g{b zf`NfSvcxr_Bsf2(yEr+qAXP8FD1G)j8z}|`CR0xr$B>BDv(tBX zDLIO?oqwsd=VEM|5?fx5^l6dX#aWltAk>z*ztJ!*coVo5W+|Rv`e0^(#PRHbvDuqfD6|OCo z<6%2;`st??jR%A|?i`5YEJ@uQnRM)4`Er4#i2JO&F1ou1KX+8?x`1)5B=Nm7ruMf|C_;UQyrGM3INgE|T_W!PKIPT8y*jD4; zAD+K;^Xp!3eE#ko-?#T=yWM%`=rBH)nPAwkeEHc_i2xlj`?dB5Bvlz2&L-SanSZnX z{mTp!rGI}vImz_8nSc1eus81ggZhN}xcJWY!w=bvBnx7{uV_3_?)ZT1o7aN8g{3B@O#e-@v)BjmsA%;LIe=Eomr?1)+`)b6yfnfXP%UG07K zzT=PCZ+OqGl@}t?Qks2*KeqHoY r(fqnCZhh_TZTk;AGgTe~DWM4ftg$&I diff --git a/launcher/resources/multimc/32x32/instances/squarecreeper_legacy.png b/launcher/resources/multimc/32x32/instances/squarecreeper_legacy.png index b78c4ae09d46cdb8184615248eca9e81c8253e26..258c9b34d6042e336c16bec3e303fbe88eaa3ac0 100644 GIT binary patch delta 1380 zcmcc4^M-4JWIYoD1H&JQw~HAVSdBeh978G?w}!IztDNTjw`x~)W!d2~XU-^aO;*tG zVri@wOcQ9CIkWX-a$1_*zDny|(QPwtYEIvOecIK_*1sJpluy6j8aw}VNU!l6N=q4)D{PFS0Bu?qlM5amKd&9Ad!qH3Bj3R{?y!bC%bZu()lM(tnVcp$xeD=>i z_LuHZxB1H17w0q8$+>ckP5m{~_C7fwucWGzkK=e!Cq91MXD>O^y>b_?LqN!%cTScC zk=J*(t?GRCGEvI$%&b-~Q6=ec6G;{p=kF}O5{tXj--h+O8`;Y2dMK1N$5hjXLFCQa zFD{p3((hf||KpT?iPEzMBL@b>eKq&_7qy+(v2pLizyA;4t}_c>z+{rZ!P8OyeBNK1 zwC1`)$@3E?dhjy@?fs%M`L3$2OU;S{vjvq3vLBeL-nwLZDCkJFQk-xT({=Z_phFjJ z`6u7zSuxLa>zB`$8S|ZfJV|GGV85U5J6qqyy^N-%O!ov1sh?qgnt!ObP^flJBm0M- zZ_}#d?r^aD;1^u+_^aRdJr7sEUajXN%vyiDw3o5@ZsTJ6Ri8E7g8o`8xNzmnzU7k| zXEXi(D*fmC^&RR)OnkR?%=BlxBN=IZC2zaiGX{70;tjfi--P;?C$YptKDu`zasdO= z#hzg61cp4Fg6Jm(N#+WIB3WuFcbd1I)LG8G%I+Cw|Hs4kEk7mee|cMe|KXv%@BjSt zm>|l)QLpjg*lPRd9edw>3Nrih^mnxZ@B2Mp^`0$be=PL#STtLXdETCE(_b}>n?5nP z_4x%p+vu~crl_kXxaINQwMSaYmQK}BPE&GXU{sZpjQyO#-?b{i^OAh#wfu?Uf4cbp z)oLcJTh^hZ!1m)z#(|UN|FcvRZIgd>>!&JR{dW5H?=9-}wsQ}C&fBx$Zpy-*?e=e@ zR~Rh{UMOrR8qn5x-Xk|^jeyphCC}b1n#FtivxD`rD}P^H;@Bq;+!`n(+)`*;wSu$h1XdLZZt8$K!S-UwLi` z`JVMXDif&tqh#H^jf-y1S#mJ;$7A=JAANFG&kDTn@9w*9_(Z!adjcy?=< zUy8%m{#7QP7FMlHDhcajwJmm~#Y!eF5IA&U@9JZsOy`q7ZOpzfdGYS;2`u$X5*Yaw zIPX|1acGS|XuRI#!>Izo@-n{{tz5Hi{g0#K;$nZr^8fr_zGsv6^03}lA$(j#4l`_+xQ%x{xFUohj8 znCKE4%EQ_4;ys_k1c|9mOetce^Oaoeg%)!%n56RuOgXtjY+;vJ19Ohty=BswIxP>1 zz8N36V9Idv+tiHzJ2(q`O=4H7YCq6S|M8tc@w=Vmn=4WM3=9kmp00i_>zopr0C)n9 At^fc4 delta 1617 zcmaFEb)9E|WIY=L14D6D)fWZ^29{zc&kzm{4vrd*lnw?42F?PH$YKTt-s>RD=%g{b zf`NfSvcxr_Bsf2(yEr+qAXP8FD1G)j8z}|`)+?Sajv*1PN2i_d zPIVVOZXf#n-n*Ie{s}HW-Y0ZcN$Z%0K#asx9ar;Rr|J()U3bJ@`C#va2VNX529YbI z&38>{SfHW7mcq2S(~fA{6zafy3+`1gBNU;keF zKIgOTQ-+WAd$Jmy$N$ih>o5OVcJ6T@N8+ZMi6?G1SD*+SBg^5+O&PYdx%2Rg9lG0WHcr;F1Py}GB3Gt??<_d zN(Y%+UzP zx0dboInWevLW_qZ=Z2con|=FlH@Uk#-pf?-ckyl3jOU$mnc~)7IU-hHW1Tns`|k4c z&Mp?#c{@K^8U(7I@2!?^S9$m9up;BaLq=ORwR@NCT+?%gW9^D>uLHS^GK$K9|qFx8JgpQ8~XJj;P?agNWvs8c2iMDpr z1!V$_8b1zJ+aH^K_;hhmS&-1z^!oGrk4@#0Iv{hVVdaD1{5q+nJbO0poqW=Rn`zS2 z9p0ycmLJ&Fo*()_R7P&c(<9NQhXuYKi@L~74!~^kre>nRxzMm2h73L6@GUaOO z#ZdP6V;|?fe|mC%)!o9|nGA7{@*8>Cz^}%Vb8EcN@?y=YV_@&|X z)cWP@VX{5;GSipX*x2bj4t2cxIh4JE{qpBb#`>JchEL>AF>0T@o>~>6z?g4c_?6dP zb;sM*cE`KZy8;$4-TV6J`g-e0&Czix?u_sMm+>wLRhYWt+vW7}uV?l8H;XnrOE~NNw5YB8W**s<8X?b-Xha}Bik-k9h}`o2wE+{nwXt!JJ5zbGZtOuB&AhGXws_rp=4R;stc8svW+ zIQ;CA;Ku`AQ{NxcFT4NLVS7aI!Ktg>*R>s$s|e>jEFh6S*?1A_xq3Bzu9+7rwq#iG zoX4Ysy0S18IPO0tzI#iG%$dYo)+Z+)*y?Xc5vX*rK34Rm`knckhX(9Tr&;uv)w_&O zPkkVJL3=OLy{(VtR2)`0qrT|G!;g-P_hats^vwT#w%l8X|DF7_2)n;Gmq#x$s4CoC z&uaSa-p=p?^7rd(R!crSsXmY8!T0iiGdM#+TU{Uj$#B|q;*ZMwhaO6Emh;Ry^5%uo zWJ5#ynTw~C*DdT`)7JSxK{UxMP}+%Oa!1i-m2;mC%wE1q>(#PMkLSleRxkH>bnvFg ztuo8`XE*0d%M@}=ORXs|I(p_ni}kusiN*(?B(P1Z7wtICDS4u2=GpFapF=ziT45%< zGaG!5KKUzY^kLP6M&pe;i*)rflHOlq-`Os`X3d(Wr!H3f-=h@*e@o4rU}L`S-IJe9 z6@uK28JfZy+LnFPZRDKuZr;;90e%9Uv$Ce$^);}Z?{xdv^U|E>T_S7Gte>NwUGd&~ zWu#ZDLumUnhgPrG92s28|64^zWIiuBH}&}yU8Na2U6m(@t=(GR^ya%(reRsG@XEDr ozO!3gc3ANK(bxB975&3r9HYm0V3ueb0|Nttr>mdKI;Vst00xZ^Jpcdz diff --git a/launcher/resources/multimc/32x32/instances/steve_legacy.png b/launcher/resources/multimc/32x32/instances/steve_legacy.png index 07c6acdeeb9ba480f86db105b6493f168e7722c9..3467335f0aba8ca55831191604ba2d1e0f5ad5fb 100644 GIT binary patch delta 734 zcmX@f{*`rtay`=?PZ!6Kid%25Gxw;(im*O-wehUm*Bje%Z~xo5E%$cXmTe;IbdN+R z9!fiWapv@Q*4qM4hS$BHC#E-j!UTgAvt$zlPiQnG*#|N>Ze|FvQF7`O<}$V5=C;l0 zwUCxhK6dNY67vkXjW-&K%dRm^ZBr0w5dHow>{&(J{LPy-9X6AwSA4Y5_o0q%a5Z=F zvVx#YA(uxtc#CH@MmckcHN3rXJ6m~e_rlhKg}Up1-<)}UUG}NiRo*g3W*s@^(|d!{ z)Z_F=vpx6tW#cNC6ptwfa5T+Ww9bh8fZX1YtUm6O+xFZum%3rj*kQWSd;1 zTIR>x!e&NU41dJALKKmM6P>WUYhv>Bw_I*JZA2lr>vn*etmkGQq$r-``y~P z9)11&>fW1cJ(e>bW6II(UN`x6tem5g?$#5(rd%+4D0MSP%xzjK`y`M7GlX6Tshexw z>O2zla)L%D+rh%wVNcj5|IEC%WHCd%-<+jSmq>cfyZTp5;qZDf(|ZaB(tdfn{pWO5 zvX1$qu5#e%(=RUPZ|&o2cvQNt?p%GqW6m{`zRFeUFuV?FapIgeO(*6~Klk~Ke|z5g z|G3ItcgXw)i+F-jcEAPIlhVSjk>O98yZ=9a9PIn;z-*J{TyK_c*myC~am`xQ v8(ufh?rp97@aEH+--nFP-YeGNYpOCbZuR@pqnpgYz`)??>gTe~DWM4fT0~%+ delta 948 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 iWBdXh7Hxkd|IYTd#_sk@ delta 362 zcmaFH_={K zLIwtgm!2+;As*hzJKid>x~RWB(wMQkRYO46T#!vEtG?4X;Iu-_GY4IZ3}rqSZ6BA0 zj794d1RPBQ^z5=24=Tv=E;=aSvi;&gOM?RfZCnYboLmYzjT59?Qn@GeCLdrBi0m*} z=9LnevR1&|IrU` zEHw%poVg9&CLhsfn%KIdPhu*M$@YZVAa@yvur12VWmH%d@RV683+ld}YZ=W8-4+LN z^M!j)_%^ZTh?`7@+01SxK^1d{Tg$Epr7xJ~xZ?~XL-r%HhL=K%>=+mr7(8A5T-G@y GGywpC7k%&m diff --git a/launcher/resources/multimc/32x32/jarmods.png b/launcher/resources/multimc/32x32/jarmods.png index 5cda173a96e9301a2f7a56d9868e8e81ec1aed8a..848be629fa82df8c7f95f98f5efec9edebf61af0 100644 GIT binary patch delta 1388 zcmbQo^N(wSay_f7r;B4q#jUMj%xkoxMee4jozga$yFAYB_O{*^(HFPp-Ui`qxpA|P zZYh5De(JL)ssH9)zZ3H&<>`j>^=DVQF;B5iJKy)$GX0!s&wI&EdvTo&6*&+8ewR%D zYgnA7_|hvE<&+F%kYg)e9pxXHIvi`Hr z{`K=sPRj5xO^|lt78iS-f72C?oC!SzYEBrMtEfn zLX2lpT!2FW$LfVL%GatqIdAq&ezN;`eRO2y+w)hiihrnnZgB3=&ztt4p>w~-hF(oe z65PUGxp>W+HC=o5bPJ|m+OkGz+dNU_eJN9>3#S^XJT7edUD#*pCdeUBX@Z{RPX7eh2Q>{zf)q>Z*Xx| zQ?}uZ=xGp8RBK>Q&=pBoCs!WHJ?T_bPeA<&5zW(u@pBzjl%HDMW0@56XhA@Wlh)?O zeR-jZjf?I+?^>YrP)W5!wpxLqLihuxqSCIoHKJmx+V8w8)qbCB%5muEDP;zh_lfqG zuN*lwb>XV5y%LFgV&nE*KfUor;$q(9EtwLbZJDbosv}u6lxm$8cs#J%rK+=i_H53F zk1i;kuPp4yiKt;u{QC27qLan$C2u@F*T3f}Yc;eNxuw4+N7B(U zChtg60{8T@Xwi-K=v2dSo{lewX z<2+M37YIC@e)`nEIYlQFm)T{7_<4sKt-KWSv3+Y?)8?u?i`!XQ%gk?nTkn!$P_y8) zhmlV6-GnEcfn3+WdaBi5b-LT@8o7?8@T=MZwhddu+NYFi{MNaXv>{h&o^!q1o+%pJ zpG~>*Tua2x?7{|v?*h$^Yq#AM%g!}Te0t!>Yyq3rc|lJmR&-S;Bj0bJ~{|6JI2qk~-l~%yeJ$ zs_*MpuU=f5Hm&$x*KvL04`z%1zMMBNJFtE=tCLIA(i{tGp`C5|{VtbJEL^dFNz76y zp(d@r|1xJ*#IQ4VoXvRX^ERVYhWFm1BRL2A4@Pyqdh5mZidRG9>J}~&M}dGx1|gCh z>+a`ilsx*#80MV!@LRr@(tO8zj|!T-xD`*dv9l={g{OXqSdqy($)okaXaCM#L%pXA zQ=ZzT`Wte_a-?kEsLqt|^3UzNzEZq?OWau_Zz>+xeQO?vhu+ck{~x#=^!Y1yZH0Sr zlveSakGJE~C*O}|Q9d=}e1suS#HkqvID}N#IV0pH)L!uX;uqCTdzx6kK!SmRfx*+& K&t;ucLK6VbwW|#P delta 1550 zcmeyzHIHY4ay# z9vg>{Hk0Owhp!nJSXXaOX`(sGnwronmn?**LqG?E89Ff zw=BIZ{n@?Zni+Rb=I!#F^`iCkxpT7TzR!LC=T0^2Hj8(%RwgPf7Tga+8knYRTJY7# z_&?_Zt`0qsWy_|SZ&KdIVrNt&;T8MVw$kW&@e__K-`*x9JIrG@w&#C;jQ59m{=J6= zH9v3O-Y&m3-8(O^zM=cv#l<_n{IE!|;tgJVXo}Z@r>P1P9bVlqjQIJdPM~(nM8&O< zPu7>en{uY+!2VM1Wl^k63^HvA$p^k#S@0|r7rQWHrem+h{)u~iwLkP5{@59_PvqR$ zg?5&lStbs>Y&S|5$KP)+e=DV<_@(^x>G+(;#@($>^Fv-Sdt^4ANPku@&`@~Tpj@4! z?8H2|h?zV$zAu(+OSsS8k?{5F!TGbZ_ssLE{ZVK3JI(3TDi#w4B?p7eOB>_e-`}4f zVa!>7bMNoRd-v|0zx4QVMondbWQFRggr}bas=qNrHQVH~#$<1J@2oP}L5Wdox^n2N zuNp4CO;u%LS6^nnKOUufJG8O6v%clW-S5@y>}(gRf0^7URc6k02wCmgaJD?hXAZyN zN`oHHjfNjLpLyEw^5vD#>sxmT8Jt;^(W9DUo%H_q0)-BSS@X6qZ=0vdVa1RfI_pVv zi=yfbN$#lbbu3H_o{BPww*@N}U(DQbHlq5?<;=6|PTbK;oc(<@W0L9& z>!<7rn5L@9SO2&19^NC=wB1;8_xVlx?$?KF%-P7sR!~>8Y06ZiY<~XoruBV= z-hzudA}(hOFa|k!a9)#o*vu|iV8p4&l5ksF@y60A9^OCiO^kWxbN}Y%1zxP@MY$@? z*sk@-8Y~T3e&wyv_R3p9>|Ts(x4rpo;O$*uVJ&U2`9$=zxgJX$92-&>d7a=%opE)> z<2{qD3YkLcS2o!2XJv3q5Ly;dqjat?&D`_I;;9|$q%|2Cf)34}fBgB=PdhoU@BPyC zc#hQ!pM3%8-_~8piWd}E!8Nf~VPZubFJF_*dr$w}j9Idw?yEVkzRo=xd$ii-x1F4H zbN0ONxl>=fOTE6g^k(T>k6IH37Oj-9y-qpJL52SP$#<_gCD(6A^DL9m(pjBtovw6c zW;54CXNJ1svOG7o2~rL7=C(#gy^2wds@J}quve06cQ}XWmP40v&2=P$<+P^$ivGIm z>BdUuT2@9{cx4RVw?~ieabBMr zVUl)@$>DR<`Ki4NZKLGNv_-#0uQmI9LL&c0;U%Y)=e!c)s>_s*@+964l&;sC?s!#8 zYOB=04}bT|XVu0sCNOy0U&(r|9`ilOt)r$h<141x94e4YLMJ`@a)ZduXulHwy`DrV?D6+%-YZWbCehu Q7#KX+UHx3vIVCg!0GK_@$p8QV diff --git a/launcher/resources/multimc/32x32/loadermods.png b/launcher/resources/multimc/32x32/loadermods.png index c4ca12e26886c1463c6390e54c899411f8de6f6c..73d70a30a6fa23750c61ecd9ff8640bec7aa396c 100644 GIT binary patch delta 1522 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 SHDO?2VDNPHb6Mw<&;$T7N<2;g diff --git a/launcher/resources/multimc/32x32/log.png b/launcher/resources/multimc/32x32/log.png index d620da12248d555cce0bc4c4c11283fc869c0900..4fc265f2751ff41b10f311cff86e744e19fc8ffb 100644 GIT binary patch delta 838 zcmdnOeTi*?WIYQ51H;YYP4x^6%#xlijv*DddM7q-(uovsEidoSHMY3)yhl>z_OBN8 zKL>7<74&4^4x4>-Yx>ddU4mCjXIg(sky~psb*k96n|ptzUEH0y_u}srW!u8}P4;eP zx*qc>=g0ZS*35kG*fMrJYMO2%^Y7CMzJ_qVYZjB1`(0$+b84zi{l+(Qu1DNd(A#J) zQB(P!uVK>eyH6AOcO3s;b!73s^K;)NFTKBa9)tOFh9eFiewKAi=g%w1xshxkZp+X& zXXE|V>vppwoGM{;|2&Yf`Dxo7e`RtM|7TorAW zpFY~(_d3p?|Dh=`xVdmzSIObOYRm^p&u=j9`Tv~n-Z$&&_gnXt1Th(;RlQF%Fg}vG zu4rQDzwYNVN_Wc3r^I~UWS>*5%2)C4fz@&LK)wS@j?Xw--E_Ei&jRs{$E);L#Mj?F zcx!p?`t3}cLS8?v-27unruxl-E3JlF-;BRC&M8UwH^n}`TA8onUBcai`$CyNMBbh) zsL*>_DSI+SZ_w`+8{y`|xOPx73bZW-j!w-$8)F(YXq~g$$swZ;gfcGtiElVbMc54+F zhP2JK@>geONGE5CkmTl%B@fhHU0e+;RM znVNR*&Z+z7<1M_)x8%G}JSiu!aYOy%lC7c>I&Zo3X-};7{%hYB{-|O8|9y!+o@{9i zn9*_a&Wqdf`n<^vpY5uD&o5D%yJBmx+^;`Jzj1u9=LlZLwn99~j)8%J!PC{xWt~$( F69BQjoZbKc delta 1453 zcmcb_wuO6wWIY=L14D6D)fWZ^)@n}|$B>F!Tc<~Rgl38y-yXR#Gj5}f3(p%*`K87N z>-Tx{@8hxK{QMwy_0p-a5^s~bCeD+1rZ}VhqpR#f0YiCFr@(?Tw^U8liQ;E2eTsW_ zF>=4@=aUCF?_IJbVe|gI=l|{d8vp-m{OjL-6Ta@Zt@xl|t*rdGem!&2HM!i>)YQ_X zq(vIKx^MgMp5ruXK0RIk`u!b+i!=25u3x{dJO6z8+I8!q=G)aqi3@z2X`Ej7KaL@e zG2uPyfm^p`Sv`-6irSQxo__uQ-s0w$Dx zc;F~o|Myqu@swA$x97k5^5J3q;i~6%r|ZYB*|5RDJK_T`FYnWov^29fQU|WC4u5N& ze{Y4dnBkU986_oKn125GxtYnLVNd#k=` zJ%4j^Gp{w%j*^#?zCSwJz0K!RM*;&wadGi00~Hk)KHe8OapJ^Z($niN zPynlA3Co!|gDqI{)sjRAa$rKc&Nx6OFEM9%8zl#`|E-7hiw> z=#wW;N~P2X16ETL$Rw zyrQhEd@87>X3y2@*Pq)|emYY8`I&DygMov{6gj?5E{6a< zjmz>02j?p)*;Rd6!CKv*s><+GI(X6=b*X|QHkS&S8Ryv7*Wc5=a^v@n?rkQA?=5!k zH(|ZLKAxYY;N2a|_fxgQ-+X_6KYN|;T4BzKip!=!3+Xcn&f(7-k<(t8OcCdVX_r`a6cM?(Wc*--5F<@2A<{ z%*oBo%*F(XaU$m^m4E_AY4>TJohwq4N0AYuRGvO-ENq z9p?J{gDrvK?aP;iOGIqT-`y!>caX2B|NCp}s_R#*{?6%$nDKpubh6KBvvl`&TQc{t zE_kWB=3u_e%U!#7%UUj~e0OiJG{=Gk3mha9J|{TJ6z^$rdo{zz%ggK5g%-;-zg{Qq zPG7Th=}}2Jxo=mlUfs$3z{71x-nO|C<=JP?p6xT(W6B^QF!6;klQVZfmqu`K@b{-O z*;!fjMNh80UAcZeKg)#q^WRUETl=58Zi=aynboAE^LwkmGci7S`c#v_tWTbkLGa%G zdV2wfyu5YcR#S3A@^V(IZT|V!?`+2@0fzryzJ2@m<-^0n4h);F|5tKhaU+7S3#EpPGtv(=2-^_JRdR-c{o cKmR{dn^H+E&ufeti4?%HMyl z-z||0(@H(Na`&}8k&>T}?fgD(^Z9$fMLx{$`@Q%5h1c`GuC>1LrONnU_rZtvCH((9 zI-A<}c;3_B|FS2kXfDm{idx(D^XJcxr%rjXJ!zg_b>;n^|J)3#>c6;7`J!tn)uhni zu;BV@$I#G}=4S~KZW>*WvhSDgm*4xhp6LN+{EnG-vbM&#oQz{z;Ba5iRq&BTTWaJ5 zliu2(uMsgZE*m3Uw%4FtohDE*1q0(5kNpXyCt9cE-t^0oe|M8dhtRMcozaP4UVf}>E zpQ2j=Pc{iIeNZX4EOQeVzno1++3vGKsbBPUbrTIF3@ktWv|$cfe?9TGnblmr$!!cj zSpLbT&nY|>9apwlpQWDl!BqR*>*uMxEY`hTnX0Fr9l5A(|M?~nF4nNW8757O>NRv; z{`ytL)^TxP{r|c-7KKfX7BxQ%WR4#^caG1fIY@C$L(bbnhm_KI4vTWXyj>YxcfULD zS0p!s3&V?;%lkKMSui(rmGq44vx|3ICu|8S3akC5bSiSv)vKXr&Yeqpmp&;cFV84V zBhu_V!zK0E*00xWzA@+Z4uMcU<#hjz>-g@~Z>VehDZ;?LoH1vZF#v1?*BbSLl6Rpv1;Ry}z5URAg0>U@3IvK~)^gJ1LZ@=u-S#x1)jmRV?C=(5*V z#^S7LY4tI2acKuS%APg)EZTX~^2sO5Cnbz-o`+lQ_cMk6&Efq!RbZZ^v$m&z)47&OX3=B=#)KP4G0Lzx&Z70;RZYKuOD!A^!g zo}E2Wt2-9nJ^t(@x;+mh&Pl^<*KfADgOaH|#R!em!@h6!Kzo&N_*s|ZYzrj>~TgIhXZs5H^$q5-F3l32LYw_M%xpNWD9$-HIfaj9p1Z`+ z%R*;fR9@+px@Hx-WK!3)nr@Tr0U25!>iyVW#9U-7PfuEWy!m!dz)n|AsjbhhT@_Q? z%_qip<$-cj>h6vvmQAyRzS`6*ioPiFVIOzgGlevEwRz55KFl{HBQ&Iz%v4O&2z$6h zh;1(4F~_b1-4+$WtKwf4-r{;<(OP+zrKXQzr%j3H!HlbJN7^5JlIhBlWJS@Y znx*y2HvMOt#(kPsp_^%v$y_#pqnxu%rpU~i)nB&0f6k%@Y~02ihgfd!6+9z1!7O`) zs`3LaVNM&D%pQZ#gTWt)^j2HArhV`fSrmA!Gp{eB|KVxFOnIecHp%yo^Dxe0TJTJ@ z#ia7=Ejh`SCmJg>B&B?AAAa~#>XFH13&jK#S5N2G`X{gYWjzA9>M|CFg)Q*1beSwr zC*yeDbA_nMo0(>J6qs`6H)dXnvwmb$@59Vs@j<4&$xBz`!;Lro3j!v@a@iF+SBN~B z^VI6uDz?6ylFp4Hn@gG1&X)dC%du`%_iBi0eA6%Zlh5xh&&1^tAu>lfA_BeQ)XGG7 zcI{ry_<<5!*_TZYJVm6tUbu0xAyyD zj^0IlN^F6rgq`gq@1zH%I0P~I=lB>ph^(Gs;BbCRo(;~`qXv#<$)`%Y}`|CUvVU|E^XVQbq6kd zI%B_0T=`SZk1+W~DjO@W_s>|Eo78Oc{2wR7Dlf%jfo?(f88@Xz0UeWtLy5Q*#1~P{b~Qsvy8ec=6!T?eG(^; zBk#&FbLQH+rh)n|Z(P@Kn(X@L;SaHOara%PmOMW&(MQkv!HG#n?6|A!J|FunqhE3M zV%hy;_a&JA9ovzWED=|o^Ypm6_5YrJ5sP-dqMy=%t3O>?6|$FU?urmmN#)yz?_Ed> zebSj^t6#6A@ci{tw;Yd`?h}uF-}U0hweMBQ=6}}bot;;AUV7!TwEu_Eibg?leXUeM_#|{>xzFph@KyqIjuL`BJKy%qG|GzBE!wt zSBOt>5or1DEAu{g`n)@DAOE+VSM*(4qTH(dRBpo XU934UKX4rb0|SGntDnm{r-UW|!$ObPo1^w@4ct~{~urf=g(00cDBFN z>C>n6pH%)+U9fl0o}MX_R;}VVEKq;Fl=JX}xpQT&UAy+7cK*YHj^~w$vDfwAzk9du z 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 F1OV}%pauW{ diff --git a/launcher/resources/multimc/32x32/patreon.png b/launcher/resources/multimc/32x32/patreon.png index 70085aa1c296206fc2b4c84aec77ad3e2136b81b..440195d2e863495f19474b13cc19121d4cdad50d 100644 GIT binary patch delta 416 zcmdnTv6Fd%ay?^%r;B4q#jUr~n9s~{6llvn)|+LVqql1R%=zW!!7jbQ$1xoyZ=syzyxg?-K4gx2~Pk*bv5J?NBA9 zlg?Z1xQj)nH{Ym*6atB%>tl+^uL c{8;zhObz`>3syxjFfcH9y85}Sb4q9e00}C>!~g&Q delta 1066 zcmdnVypLmoay`StOlRkS;vjb?1_p_#$q5NIXBk+0_;`4BR;s!>zVqV}oEXT(F?$(D7pN zHg0Az(d}(~c)5s;?Vbl4+e2<1o|uaQaI~wJer*-^{?kz**oC zSGSI^1u-x%+^q_UD2ed(u}aR*)k{ptPfFFR$SnW`NNT`oz9s{KJ)cE= zZ7;K4VfKBf^fAq3-X10~RWI*bQm^iNSI*4v-@W+x7g-x?lIoIrr5|Uk++m_u6B-TF_mE zp2reR9E(o8m)uv!Jvlo5#Z?WX*C{d6SLONYvKH0GotW-vFwf$#bgxfr?c5eM=Zv6J zY_ED8-2c=I5@V8?bzmoDF39Q(E`>f?)wi9V>>(P3ew zk(JIaZoX1=y{_17k-ID#gV}p`iM*P>He%(~C(l3pncT9i(!BD)g?SGT?tXsnbM1FI zy_g%X5*bcC(`#6FJvBu*Oe-cc%z^ozVT!YZ)Wz15%yx>ikBbEG%##c;kGfwk7SPW;Met<+|F{QBz0S#JwsE7Zy-x0tgp zG2DDM{kGtdkZrCHB;82MkX;AUo^hUJ-i&c9jHv!frCFrE4(e$Z|1gRg4K zPd>@J(&r*};lKgLl=2^UpO`&b_3Q8Ab4>La&pD3mGkchz@=@o#9>eq7ZU4KAU%kIC z80m2Q@8OPj&y1Ci=Lzk;G?CRq>*}9fmTpJAUBy4FF%GNnc-N!HpuLfM!PFN_%ZwI8 z{CqZ5nfu0@C)G!iYD(5lil~*0RM_$$u%>4AhMAJ>Vhn#GcC**?GR80b^!eKS`6rmZ zJ$fm0X=}X%%ds~tZAn^_)8@>>;HGoczsmg Yylb&z__Ce)3=9kmp00i_>zopr043wsNB{r; diff --git a/launcher/resources/multimc/32x32/refresh.png b/launcher/resources/multimc/32x32/refresh.png index afa2a9d77403a12cf6808fd4e551f8582e2599d6..960ba040c0db701fbddf472781f8719a3f842520 100644 GIT binary patch delta 2063 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 tGJd)|Ijr$u#~tOvx9cqb*1xjbB+H-j*AkF<-YN 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 delta 2811 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 Ib4q9e0Kt)H`~Uy| diff --git a/launcher/resources/multimc/32x32/screenshots.png b/launcher/resources/multimc/32x32/screenshots.png index 4fcd6224669e2e08c3f39a476e2f818ba3c9b3bd..64970c72a0ce956489207b3c4733f1c861c8f442 100644 GIT binary patch delta 1370 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 diff --git a/launcher/resources/multimc/32x32/settings.png b/launcher/resources/multimc/32x32/settings.png index a9c0817c931c2251632083698b571da359b12fd4..3447c5543a4a07b6d2be1d30129dfc8465e04f9d 100644 GIT binary patch delta 2419 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 diff --git a/launcher/resources/multimc/32x32/star.png b/launcher/resources/multimc/32x32/star.png index b271f0d1b89c88a7d466066dd653a34c6566a2a4..6ea62a9e2a1eb18cd7a3b6f3ddf524980c83fe7e 100644 GIT binary patch delta 1475 zcmZ3)dxd*~ay{#8PZ!6Kid$EwF!z{5inyJx4ZS*}KKJ&vT*X_x*SCQfx3|?*=d7$= z^=j|#y)V7AjICoHs;K*)D33q<{J+;_>Bmcc&Sia;Syz6rQu_WJ?;p!ED@=En9^d{u zY-{~)f8WE|H{WK(^ZnZ?uvI^G+Nx?x>)pFQ@w{DU7yUZ!Txk8(Jrg3Q)i>Qd&+2$} z^Ue0z`|pKzAJyI(u<7aTy<1-Gd?UPhKBv*2yJsqlZY=!N%DVX8Htj7JY9nuc)86`O zsq5pJ{%pHHmK!}ytiSWc-FW`?KP3%fxAotqzy9I8Wy`m>SKON{e_GEd*{?oXo`Y}R z&p)5mT_|Z4o2@7JK-B8>($JFnPt7xv)$YCLt~V8a_ig&Diu`4(-cC>68c_al!8U&z zPxU*qSIXCK-)~bddjIYl_WSqW>HqyKdr*3F{QW5IQ1NLt@!VIND;vZ1?wvgC+rIyg z-~QvWzZYgz{rbcDi}@d4zqUPBF*&D^1@T8JDb4dAmSy$`akxPq*nX z&X75}j%`e;_Uf1bZ~=bwg09Gj;}r)T{c#u%fr&Zw|Y z+=l=DO25d?zH`wf?6~;uuE(>r?cI~3uSFHCT$Jj`+9vO3xm^)#4Sms~YRSpOTvWK4{|l2r0vc=^<~w)^i#v?{DB+5tDmq`-SJJKVP1`&9&~v z_UmTiH_CY$qP{2I$@Z7~|MRvPPxis1Pp>qGtep~_a=|S2I-`}hOv;a^dw=KNxLUqy z^SjzfyKekTD!sO=n)~fTRr~s1%Z_c6H1S)yMn%ba);q<()4Ou!&9|$sh^dyky?(>F zyL;~*&0^%?w2oakv9!uHJ^B4w`?_ypezygC6#_dPerYdDx%4lum!pS0tZ;4ckC(mC znd?{W*WUJS(p>%P6IhrvcgMc%GP`CRwR+dQ*kbaCrf3pESc)* zc_!cLgN@6t1E$UvvTy&fh5r|b`p$9dmz`8t;0dnHYQe(oRafqrXPGm9kYth0w*64` zdCf`pb6YEnXPJ7qO+2vBv8O_C22%#RR>QLUMIRlTKSk(lDdh;9_+2)N*W&SM3TAnOrYf${;>DFtss;?LytM873}4UmNy6 z+a$?+Z2Hd_m%K0f0uuu#?qp)rS;-f$Vy3Q5S#!aqc`rU%FXE3;IWtG$0fY5{08XtL z#(l>H6#728m^7>YH8;C(BdOw}-NTLDB~@R=t3F<0e62q{`R%g&FK?FXU*hzSQ;sq{ zy}<2)hNU!9eN$k!{j2$jGQvj}USC|fX=7oC8OP)J@Z34i_J!@(%M=%|@bMAzzy|5^ zC*thp+kLLZ#?4*hetvUH&cgTe~DWM4f DX}{@R delta 1683 zcmcb@y@+>$ay?t7r;B4q#jT^$d2>WuMUMYB-hF%b>#w_gbw$?ec5#L{@U)0+n8FpN z&}8V#(Zt~rAjqPkrsn2+C8MY50ee?(gGQaZfS{vhXiJpi(pd^w3j^%5beHbERCIm! z?YSS{)_$?ms1my9dGGAKdvE^Ke|~nhx|-*Iaq{%v4{pkq9Sf%dp|aqpW@5*r zJGb{9UuWU)`1q`2s`2T?Q_lKG#c&m$T<84zLDrq0`vj80;#$vFyE01MyMAo-v@Pd1 zAJYq-sm5ep%DT2XOmf%mQm^`hCilN-vwip-y(;!$P57+`*4=OV7z6k3^pkh4zI#l* zb;?rav|m>LOB>>^Yj1g5ljpQ*u~GUNn_~~UB^N$Cvt9Z@W`2ZA^v6>NEURJ|CCv}$ zPhHhqxKBU*$=<(fW=8Jq`)FZ(A>?z>W|5?lhc}UG$*n8EnkT0Q<(X%I+ud28C z{mW>Vw%$h-=hqLVEc(OhU84>Am9_+Wyf`ekV~hEsWtJb9-WoKs_M}hfZ=cYsuwVT0 zibq%WEV?r1kkPM`FaBmqz6#kQbFcebn{Diq&c7wA!=!%18AYnAMky?<{vqV-;v2ZT z>9**Gpkp^hPUX19JiH!x>35{?<5K|Z_g#;eN^VYl9Pm}k%1~GM#&!RXB5ZNN1<8ep&q5C~Po9xv z!*f8%F-b9LyTT=pkS+s<2eTF~-Yxv~>g#%DVb_0|W%}XAG-qvk`|IL%wOc};nVP%; zVmiOEJpK{Qe`3be*}GrvUv_VC#D~x4O!F?jof)+2&W)$@7rip9pB47uXH?Lk)6RLb zmP80`;%xY-xQM|?uJdl2$48Ip?o1P2uHvbGKm;e%*TF>S4d-+qpM=HhHpBS>W8{752vq z7s=gTGUf8}b<<)eR_#^0(l5TjZi;l4TPV+Yf8W>qUPl|GUUU9>AjP_=JI3ee`RnzJ zH}CS@yy~%fS@k^!sltnT@7Ja+Z`JF5AEE4jEbA-Rhle%$o8u)-w4VO^w{vDgYqP4y zkJtN`3A2Pcy;E!LE8v;&+pqJI&ZK1{SFiugme1X>d-+~ILGc62ZZ284A+%Nb zX7lwFZZ8>=3sMHFL|B;Wi#}H?b3EuTVfxTMt)BCO?1tcUOTLhkrC;7vobUNMp^$Np zWwXqgo6?6*-^g)K6Hs7kifm%YVsSY0YN>U?S--x$^H1p>njpH_>|h6X!d;UUA!6I7 z`lUX-`Axy$k*Y$)hZA3w@@`e~AMW%0(Z}HRY!7>W48v5>4O%i=C#P>%crvDq(Mez% z2Zw6K6Q{iTeu3$F6O;}=Gk;>ZUflUveapHX4A<`UiD>QLA95yj=PZ3T1s1_qC%G?) z>)yJ&`@#7Y^6T8&S3Ad5-&fD*j4Ymos>5|{xu+*(sc*<|} z{)HVIC!KVtlWV=zD#4HyZDw5fZpoSGACi7YSwAFMuG_SHVPX9*owSMT7#RE)?@!jd zH9c17EBn(xu07>zxXdoI>~cSz8}cO0f^AddQDMo`Z=Dt1UgA%Z+vC6O^6FcLksC7D z`;N12_>`7%BY4WMncWi>RmdKI;Vst0ADFQSO5S3 diff --git a/launcher/resources/multimc/32x32/status-bad.png b/launcher/resources/multimc/32x32/status-bad.png index 8c2c9d4f7852a6ec135b9134521dc221d68ccb24..d85c1d5df0103ef308cdceca52a2167be300e3a9 100644 GIT binary patch delta 868 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 bKlSyyH)@(yEjrJ@z`)??>gTe~DWM4f{O-I2 diff --git a/launcher/resources/multimc/32x32/status-good.png b/launcher/resources/multimc/32x32/status-good.png index 1a805e68ba793bb6bed79fcef67bed49d0a76678..1927ce78d3ae89664787a9d714180b36fe703564 100644 GIT binary patch delta 1027 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 Z(BdciYro$7%)r3F;OXk;vd$@?2>@*?lZXHS diff --git a/launcher/resources/multimc/32x32/status-yellow.png b/launcher/resources/multimc/32x32/status-yellow.png index 42c6855202e88458a2f3f68f86e7fb07f655f600..ad58f37c23184a437f1a3c763248353aa294beaf 100644 GIT binary patch delta 898 zcmZqUoWVXpxt=-R)5S5Q;?~jWtYuHq1X{E|7%b;BE~@LOXqbDteeS}rPYK>T>o>H@%t!j}&QgCz>)4^*q#LEL(pb;rH`=~zwUuw!D;0U&_}{-3?eoorItqW1H6H;DTrCI7xWx$c}mqB^JHL{90`E}Lw= zvliHjzc(yAYpb?D{^XIrMz(Y6<-Q$w_K9->qx4yavnG4XSp}Z16}pmfW%bq#*AE+Y zEfaU%korsTfZL_O#WL1RcQl+fUHdIJ`SuE)KDYHRx4Lu)I`J%5u8eN*X8qA@eK&7f zaq?TEPa4LCbJ-bh1l;;BZETTc6US|pcK+9w10P>Fo@aAl6Dx6HZrEJe@iOQBs?hoe zAG3D$FtkW`xa%-jOlS9ReLA!F4@3X2>x^udA849~MOf{%xv|uUbxu#(Cq;&{hki$# zay(?jm}lPF9P;pw+>O2KG$yt0IdpIOD~u;+dL8dRA(u~@MFfwCjXAh%n7$kZtj1(ve?V}K-tYT+jicP<=b_c z^Y=gH8|Lx{_Sr7^vc~3#=zdOib92SrA%`l|-efsczTuKT94N;8HGBJqCk)H(>$s$` zeaq}OUT9SLr+(=U{S}OH7r1XMOqwEfbR)CQw9GGsXFb*yPS6cXS#5iKYRtWZFAl$r zc=cS>F=g`3T{bf3TV3v*S{QRX?xalIbdU5r!8cz8<4->8o;oL~FIIo)-<2y0B`m^A zRE!n-6?SgEzBDB3;nkhf1z0w2lo4H#k!?4TTl$8F-uv49GrlZUs-9`ocxL(`Ik^Yx zR@^umq{=tx{qLhLT)93@Ist0FPu7~R{2jaDc;Bq9CHJrYFK?Xh`z%)__Ii_z(%w0* zc6?c`;KtCu$@lAVZC|c`-@f=fnSQzA>xPm`7L5#Nr+ELobnN}vUp|KHAOG-MSslo2 U>E2Vrz`(%Z>FVdQ&MBb@0C3;KzW@LL delta 1138 zcmbQi-o`mWxt@Wg*vT`5gM)*kh9jkefq{Xuz$3Dlfr0lr2s1iq%&uTyV2~_vjVKAu zPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw{mw>;fq{kD)5S3)qV?!>e~;vFkz@7GpQ^r6 z`6tO9_2x+9Ii4P$g-5L}Tx&F1EvB=hD0t!02Re5|Sn9={-zud99&CMZ$#u5|Yjl_P z!p#MNOSb57g`GMup^w*C_VTLOjHFLKXXaP$s?ay=d^@Al%f8}H`Tg4OHTSK*&nrJK z7`im@&)42B;ylV+%x*73RdYnVCK#MjYunm%^ij6_tE$CjPhA+blk(pitUJ{bxK1T6K=KV zoD*#l(&m`F-R{!w^Xdv(VXs7&^%kAixZ%iA)+}4GZS$!UPZO%yC;eWqEBib#!Rv<$ADmQs!snQ%`5^tvRsJh0>yFp2nkguH`ud@! zz_!}87YcV)7BwUY;!XE`{$AQgI`zhNwzswl`<|UVy&-o;-Bn>l zp8qmwyQ=nVV(Da+{1jP}{`+B&enh%MTyK(~TwcZLg?qjqi!D#yB^Mzmop?>7WM9R% zCl9I~y%JrYY`9xUbhpxj!luH-^<=<2XSDgG3Q4y}9z0lGCg2 zgiYaOxcOsJ-NqkFmx>f!(lR(}F{1hf-g4TiFUdS}&Fy(?(^wapZP$IA zq;6pukb1<-K!Gb)JWKtZ^@o4U*D*|db|N(P(R%ylb>9|0mwl^XtzeKKy)>NRc705J z1Lt066`{<&yUr$3srMt-2?}TwYwq3FxS>^A?dvN>Hgye$=e>O|@#Fr3 zW)lRSrY&U9)pcinS{ff4YisKHS58YrYdhy{joC_f&Rpl@h;2CZ&S-wk9-qn80<1OD zvR6y}Y_e|KkU4#dDfhjzDGT;$iR`w1@cXCQ%zFO=b-R=b&N@YgwC?@;S@E~|n`JR& zf?{iTNlP>5vYt&-&Kx*=|NJrGqe@2}P4H?K zoOaL0Ak;Q)wy66Ri?uz|rYud7s{6}(Y38$&m-%ceSUme}gcG*xGy8G=(39iSXRy8F zyl|H_yh`Cl!mej2iW{FEwO(-OOv0jrhn7g$*XlX1I>S`^fGhjOyQXylEKKglv-UCk zv{_=bVfLCMmJU9No2t&v_hvZY6_QiW|5(e1;kuS^f8?jA>oGE^>o%00dbCB(zDDuy zJ|Sf-9)`URH>AB7W-nSZwMJ*3?X`-^fBbV*&n@>mWR}3dz`)??>gTe~DWM4f((w!% diff --git a/launcher/resources/multimc/32x32/viewfolder.png b/launcher/resources/multimc/32x32/viewfolder.png index 74ab8fa63a1211ab1e0936bf19d0549971d4561f..25f2ccde68b9e9afc78da390c4f770360df73f33 100644 GIT binary patch delta 937 zcmaFIy^no@ay@gar;B4q1>=*+&6};$C0gfyRy>)SdwZMdI_nj=+w0xjzpmJ3y(0Ja zwnEGA;yGpew|j2i_AShR)3M@jXZHMgf6*>|Pq&7q5K~Y7#FnS53^gVbH(z0D?Cy)4 zw4dv3`LpUj6O<&Eitu#EJ!MUE*gSVe`i<{SItSw$zgcX}aad$lf7ws@q(NZPf`hZ7 z-q+1DpB`yo_1q)vkEY6#7RSyqo0qwBmh5c1(|d7qtBY{K6phoFrN!23Cg1M8w{Xe^ z)o1*3HvLaJkiR_V*YS+@IEMEo=l>|b``R16>U?y+k#S37@r@&MmZ;x95p}lj?af!W za^rZUR6hPTJiy6&^{S8C>4t`SM^4X%0|y)?@KhbVbnEnyW1rubt(P(LRoJXqi zAosK!?;afs^_a}kw|R$ryxKH;ubn%?Yo792SKN8xjQE6xe-ExlPg|UR|J^!+%iA7K zk>K}J;N;nKhv6`fM&L{-&wyz`^B(gjB;2>tXI8eTz043fZ^I|O3*Vg@6#rHHm8e&6 zjGI!X-XiSCcZzAjWNFRDKwhR#ECE)s0&TBKXU*MaaAKF+!&STiDhAGJ%NDvdPY|~> zteD)RBpFc4;2Fk!?$^75zl+bCOp7XbSQ#FfB)9i#rnJE-*BPdFy5IYp`Tghddeg(3 zy3c(7bi!fQ>&+`WFYeJubL78g?*3f<>Bipe^$}%SJm!y>*mJkL%&FEW`*ep*V6)?= zzJ<5v{oEqvllSSN`KMza8oc+ivCUweQ(S5N+ARL(hRb{hf4(ex*OnyMy(i!)tHgt| zH|MPRPiw{rkrA1r7}}uMfbkX-sNBF&R7Qa2iaQ9S^S9MOYAvM7x`mOy2lL9M0!2rF<2bM z)78S`uKSIN<^A!qF%!@1VQyjQSv4W?2VW~H|oDJL{mCC%8MBzq%|VL|Q2IQG(ae;61T7(8A5T-G@y GGywpi;L5@P literal 1518 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 R0|Nttr>mdKI;RB2CIBmbBM1Nh delta 2326 zcmbO%xIk!vay+$7CG*c?|9(yMgF+kK2{a39Xn3Oq_RGiSsRkP|CmqmW#9TW#Xr(|-8T0H z_rLIEjcks(EV-n7g<6740?V9mvoB&xObShz1(-TmuDmY&@Xk5SR3l6@dcBdk`MH?P zSz+340TX7Y|CLg85jwcK>t)pZPJ_Gi(lhIJl{z<8m3E%G!*cI;$c8&j9M4yTY5TFQoMHVRPVSvRjmd==gPF2`X665yX(vTy2F^eHA?=#=R}^X zRo&d-;sV8!mrQc&=41)oaIRU)QDOoo^Pa68Y7Hr8*B;}T`bp>E(v6?CeO10}vZh|y zpwr|>{ukG}HANnNb3|HBbVJgNiu^eRl{1;k`Hby0o~X#2xbvsf zwW?QNC6ph$HoSV%Rj;GqczW5TX{R5UY}^puU+*Y%<(hhj$wmb~N0B+~i%-TaNVvTB zq_FtSIG&0R3vF|5o1VB6)O>W-<4-xgciQBBZRZzK-qP^s7gO!uSef6iGrfeLN=JI_ zNiyLLn|y4|1df2cFZ*t&s};m?HZ@!fcfYZ9<%zGYY(i`%NyqQ)-gbdU`4`*n!1S9t z(;N2wZo9dqK2`Q|aH`tzXOed|&HJ3+XJj0CjB%Pu;L?3QX{XgUu3R1Ck^5dmg~Q_O zDUR=VERRHF&aBxu*QuOcNWv(v!}(@mwfy^-8L1^X6YuZ)p{Kv!^j!Aw&Pz8i}97eYq#-~8ii+mntJ&63$1OzaeXJBD&^h2=Y3@!D^Km=*A;Ki zu>5UyU3d0+M>9jAZdUJ%top-A0?UqzzcBx*B5cLFC+X6KO)5^!S8T%+Mf_jB(s{k> zwuHnxh1sWtqWRq-Rz)8&NGNb_Oio{JVIJnTSyC*SyHPQxJ3!gzoX+Ol^KM3o4acUf z^cI!~?eIxrd>-_~F7VXP7Gby6kHwRFVrDEAt9Dzj7ZA7Zalo4Pm}r;$a`yVCN3}k8 zhlbhw$Z@zZuQjJlL0a)`3Ds{o*1s`+PXlK{m>W9St1L4X0fI%JN@RK z?SYBc^#h|air&3q$_;c`8RN>bZhH8P8S6Jyt~jCmJzshHdBv3pC*4?PPFSIEJ*7}ICWE7yCyD2tiVgRzO)18T%k`$6Omh~~ZBf^ceg5XjYR=2{O3Z3M<0LkC zWtPpXiJz#zRr&jmOtZ7?o&EJQE??K$(qKPl-ooXZd%ynVxV7m)Y*ggb1C>&xFWzuy zp1&?w|C~cv@y?EQbLZ__Xu^8$R>y{@k0BX8`T`vS(e7pj2`%w^3i=Lz&t16O`uux; zzsuL}AFbKyx;2fnSn`M!kM5Od6)~>ZNH@1*2c2SOsS2BL?hSr*R_xVenf=?u*0rf} zIfjdU^wN_~5_MCbzT^1;wSN_hj@VZJx?y$W=(T@->%!`1#mrkT=pxq{UGe-wU<=zc z-d35#&%JM)GCC?CwU+hJ-RR#pw^!@0VD&w<+Ba98>j>Axh8D$Scl}K<-I^uk0WWfo zR~;{iXV3Q!uY9ynmZxlc@%G?l(~|xCbc$YONuJc&mbf$fw^iR<3FUzHtpO+8Mc8(6 zcz@RB3Cl9syEl-#{?JvqyshiKrO(Cw&VPL5qxO|mzOSB2X$Kzpx3{@vV^Koz#Gtc_ zUTK!4{P?m>?iO=m*}hW`j@jt%FKxZxa9ZnJ)FB1u>ji?31+>T}|`3eC$fD&)K6D z^Vdkf+)_AMmVLXBmA43+M^5K!-M+XP$;JNC@6U!Ax^Wz8P%v2`@r|cmtm4bN#B)CD z7K9b@c3ZedXS}$*Q?PWNf$)rzM|U1oRuL(&`3yX4bGo2GH zSZ^Kn>*bY|@;0T97p<==`Tl2P+bSicoWEDj?~~1WQMal%IR5>@^LbB&Z&&ZM*xQr6 zB|Vr zl0Q-MtnJ7Qvz+X6y4UZ|mHGKE{>SzG{C|XhzHBXJ=V!O(VPIfj@O1TaS?83{1OPp> BRd@gZ diff --git a/launcher/resources/multimc/48x48/about.png b/launcher/resources/multimc/48x48/about.png index b4ac71b8e247bd07e4abe14bb095fcf55e31e2d9..f6d4d11cb894e2c0fda6dd962b26c9d7819d1557 100644 GIT binary patch literal 3331 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 diff --git a/launcher/resources/multimc/48x48/bug.png b/launcher/resources/multimc/48x48/bug.png index 298f9397c3fa707df8274f9384d2f3b96cd5473a..8de0b0755f0f5bd15e67e05b4f836b90d5a2c6da 100644 GIT binary patch delta 2672 zcmdlY@k3;Say^&5r;B4q#jUG1nRk57kUI7;{*s(`a$@f7Z4ji}lRJC9se8s`wVO4! z%b%UvR=vzR{cp_m*vJ2#*TrpFDejuMR&;7BN5C7M{|~#aXZ+Dydategk>iYG1wSL+ z{%2w+KPde%%0|fiaGV6k%0K6sLww&gN4LCY{Nv0JxcgE4f*1Cj7a|YeU{zkR@!PlG z`HU_df`8R-uQxw%%h4&CCDiNvx8LU(dU|{BvLw{h)U0RbxA{)29yc-I!g7k8H4(cGVP<7v2d&N&Aek+qiJ z`nE1#Ub!dpa2xNoyt}LR@4tWKNQ)8c!{R+T4;MYLs=Orce)k;LlM`HhzCRv!b@ONa z2%T*Ih$F`}Y|7SKO*eOD91Fi%Gw*p@d;8mMxAWB0)vvxTJ)0IhK{-3Q_G?GILantZ zd+YDNg4-n@TowNI|KGZKzix5%%Rgo~({fOze8zsYZ-@2fZVsynJ!>w-tGegYi`TDT z3m@P3it%>D>;7BEnwvhZTGf!e@!)R0iWkqzKR#a0SFN_L@8qR~c!r&N|5~;``ZjlS z*q&F9gi3Z+dRz|SR5)$4dh5MK5xO&e{}TFMfB($s@&Zro10@bE*JpLT{nsIwU;n(t z|0<{2U5Wk2?^T$*>x~XeU%Ml@uu}Y9^LNeAb7uQ>e*g7ddgkm|&1jdIP1>uMG8E*U za({N?!Xtm}nw&U;duwNHOS-e+{M>uC50jN`WcG6^G(D6~h%(?Wy?S)%;!`u-X5_xv zcwCN+o&9V5D$kix=duIWZVvvnih1`6o;Mvbj_U%;?}qnQ-oGt=C5mBAC%0jDtzB4{k!gFBq@m$(`O@2me?w^f~&*@9dBQP3Qzb<(bph7S^I z1nwVSXc4xusOrv!=kuy>)qcM_wOMR$cKytZgaZXf4px6&C|O^(UtE9Ini=bvIJ!El z9Nw9pxXYGvMDs?2@S(SBGaPv=IP#BIe^jhtk=MQb?8V-1x4bzQgsom!e%HY3lg+w| z_uDF-Xqd|g^sq0!${Vsn{z~b8PUo_@eWHvHVse}|7t3mF==od_!eEt=k?}&Q;U2eK z^;1v7;4P0_mV`QqsJisk?^zHUkimVrD42-*wQQxxD;s*kt=0gY)8-r#;tTp)#s}*8J-=0bbX_B}L1Tm{gO)<&%ADnSTV7szbny9HtBT{^=OgR)=Wm+S zFCN)pX(ZtOt>@F9vadR|e_byAx-rlByAXWa(vzb)Th1ytmGzj3AHNn8cvy+-!rU#EmmoMn4l zl>2vC{mI$lKfctQE;iGP%z0-br!a{@WYPF4U7A-5O>Cv6azlu@P< z`1j48MNSMWRSe};UaMniNZ5C8r}(doM=RGliP?p;?X@KzUC8El(Cvs}i=b`O^#@Zcb_QwcN6ufJI#uM| z_4B>2&K$AHnoyf`ie-zIfaj;}+n3)KcxyOuyW*^RekS{vhf|Adsye5i+Z;53n_*+5 zO#l3c;ub4+iAycpeeG#|i1IztN0QBZYFnzmOm5ZJ=Pg&e$i~rszQn=AO2KFgSKVcX zgoO`wOqtMh@dU%PLc6|Wg`o_qsuwPJyOW!_L3^KuM$O6%0b9?qccfYTVsx6cZSo6# zf$qxcxgM(pSbtx)3j02T$8uJyn9!Ld?rne1hAk@AUvkCFZdzc86rV#>Nxid5>{}59 zC!xfR(OjE@MIQ+^-&xZinRtV=u)|=;v`x>rTU1BM zb>pkJ6|0sW>ECqdTf#2sMY8L&Vy`SRS#Kh@jyYh*+_uuB6)h1vYM5_uHcn_*yK`p` zo8DoWOCOq-mDjdDD|*;`_Za8)yW98TMCwHG6-fDfV@}oe%9^1rpJw2trY2LH?`%UHtcQs8e@{DR-p%wph z*MoA-{2LR0Jn0h^*EjWAU|=^%`x=k2VyBSPx2auP$mV4!8r{NL&wY(c;G0L^kwgnl>5Ci__2Le7+UweU|2^}) z{JhPI67jyC_rexW$UT?)|7TIrhw|xC`{Ombj0;To4n{`sxYy~XXH?Bsd|9!tt^C1N zgHtar=gjGlSZXIEEvM77?Zh_GZTUSpH)m-7jXox{?Lke9K;HTm#%x}O?A0H{|4K8e zvt-U~?7n!&AwZT>%%J<{f=HdxEobXR6z1?S9)DOMBjz9$z}+=*aVJ|)$_eYJXZCyr z=6B?OFX}8VVDUR7^XXjJn;iEa`AkP74x4V^4~n_4vHs`uYw-*jLHARNg!N`KFfcH9 My85}Sb4q9e08FAZp8x;= delta 3120 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%0A_{I@mgAZj+Q?7s9_VQTn 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 E09`urP5=M^ literal 2658 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Y)RhkE(~Ds(|LD20|NtR zfk$L90|U1(2s1Lwnj--cEGuwK2k8al_Fr@6GB9v>dAc};L>xXE9-AX`RrKGvxi{y| zy?fLC_Ux~>_&Q}LJIvBx6>(XzDkLEERewOY%hIr^C!CjtD2UFhc-7oG;n$^o3%uTX zFLiTT)H;c&iEE{ju5K2~l>a6cM-Fa$-1~Ox-g|TZ&b&Kw=l3rU&#f`n%Uz(q_tMof z8R_r7&wXF>{LbzpXIO08)~A)|FRoUuI=0k%`lYK`rkgix$Xvg!%ysou-t4V@^*K6s zZHtb4^Pgw)l9{7J<3PH^mTm?{50~o(OlAxTdG8`$AH5zof70!D;#Q1zy{1|68XK+> znar5AGA=*TtKM$5ft}BC^>uqb9`iR}%wT8CDA>34xd)wr_`On?F z?(6u4@uhyBB6Inq z!A8Z}{c`1pgYg#Y=l#7s{rIl^A8TzJ98vE-i$BdhX@ zCiCl0jveh6dmX-ddG`Dr%NwV!`>Sr+F|$`ANzj)q!T#Hg^~dK|e*F4dJ#TL1lV`j8 z`lXKwePwFW7hRI%k>+tSV*E(^f3A3gI z@x&WBojfs9v1hgT-&;Sw$3?7M_n+nKbp7{gifv2O86Ga~|EKo(w*8*(TQB}K=9jf7 zOj7Yleb{bodWgqBf>Y5T(C6W{+Q>6+Je4yiT;pp9;#n!dd%t1ME>+9AFE?tZZoKH; zu={wKw!mpWhAS(Bm-jrMU;lJP=!t(B-_BWkUpjSYI*;1kqBnkF4wm^3t+!AAcwz5l zi=Rt1-$-wEWbt5Ia_OT6!#WXxYW~Ql&71FQ`}y2qw@G-f=5TRW#ji~L^e1!QpTAT1 zreKkUTkT0^Z>_WqmxP)dI+M7Le|x&I{K_%e%av!QT^3;RI2o{Jug}CJ-G~A{IlU?0 zr`APiw6K>6b1-%UFZYvlS*yHs@8tONZ|~+;DK5RtH<;(k{em)6r+&%Zl+#RP|#r1FP^trijdr3kS(@LI{ zc-KwG7jS6>DTVZ$el1t`{g_somziDM>jzF-S@o}o8g=x2QDLf@6foz`^dhg%_anZW z#X0c4ox#9x;m^0Qg$71dO7Saa?47Xn6OXK=u?R<(vQXE>SFAsdCo#*%-!NjIo7tT0YLClF{c$!EE4eBy6Th!0sDB%*AXz0t~d}GF~LvNw(+j3bq0 zg+v!;(93)GUV57B75Ez}r;1MBtoT6|~mJtn}yS39lt=7Avd4$c)jcUnqrC|r9z zbGz^o=?OtmRpZ%BL`J74IshzE<@tk>DyZ#uad{#dYH ztl0K;=fBAEr&*Vm35d7~=Q}ipylA&7(pC)cP)|_*5~!3Yz$Gc%m-?zm#*5YU{5H=Q z*H}Rk&+%~&t$Nvh} z?ID{Cc$t__M5s9}Ey&%?f0V~rpyh(fq-BjZyCSN;&z<_Tb?SWfyT+dj+0E8pF8sRm zYt@Ilm(Tray)V|Z}g{O;y!e+~tQB|dq$apvNcrK(@}+*y+DN}pT5rJ!)DtwEHG z?&iD@W_=DPv(yH&@GGBw%m2B%_L?8_`YY{>ynk*-yx8_~nReR#-TKovrp?_r>Eh&D z4Tak$b8#%W^!&gJo&}3m2`o7|gKc5L>@NG5f%mVMIYSf+5pQ+ToFfg3wkiJhNoy}zpR}PpLm(~nBA0h+CqEJo$;{CP2VKhWN^TznfJH=(=x>gCcG(=*t)hk z_-(zoujJnDPtR`GN5(}|-HG-8$N3}q`{f1>bD8q#-BT~w{yg>KmFwe0!#75i&c*ZurIk%2*>)AqYhpUS7> zZ(|;6mtFgrr1d)F%#>8_rUwDvYS(YRn!iIly7$@Zdu6}ZuZ!MYw0M8&{PqKUf-+?d zCuNF`dAO;``n5Y%JlVRoNH+Qs>n^a}RmTY8TV2~|wjVN)> z&&^HED`9XhN=+aoaB?4oSIjh%8*e~QedU8 z54J0_EHyblH#a}8STDaQT|Wn+q*&iQz(?Om&px)}MiaK>}o9 zaDHh~aw>yoUP)1AdTFYHXL5d?LU3xyI`xJ23=9lz2sQDcK|U~d6=&uai+p zmSpDV>E)%C=x64oq*mw^WE9vJB&Mg@8X2h-gAKPeQp-%SHJa-9^BAbD=;`X`vd$@? F2>?Wjpwa*U diff --git a/launcher/resources/multimc/32x32/bug.png b/launcher/resources/multimc/32x32/bug.png index ada4665309921d9940c19885e01458524aaa198d..7d3cd30812c8b601fb13e882df2f70d2c9c1100c 100644 GIT binary patch delta 1568 zcmaFEyMbqday{#JPZ!6Kid#o6F|SA~6k+*Lxh?nhw$1S|`S;AWZ_71apL=`T+nnvQ z%+Fst{_6VP!e{m8HmY|1W7r_bUMOTe$v~8614FckXTy!C)dz%53bP+pORZ@<8>G|M z=6mV~Q}mJ`o1>m@jxL+;DH*Pyub;2S;PmBwiu;1Q%aa)^sx27m)A@fTUyiHqx&5xa zD*pCAwX3oFA39Z6S65Y48QIzGJ2}H({{8Ds2WJ;qFS)7vH-2hnT*59}KE@To-}Qty z2_Ek=zm#7Q6(zNJ@nT6)(W}dJjHZ-}{!$RBx$|h@9qvrMQcI3IFPg)Z?-+13tiRE@ zR%hzQpi5QCvFoo(PMSS?w?qBIGbc{G5Ys!;!Sh_1)$aon^VUOJdxq4w?VMv1cPOT3*Yb<3Ln!o%N;M|v|xzO{&F0VQK zEdD>5ont<*GDPp0wsn%`x4mK)?nN{0mX?*h^5xM=yR#2B*B*Qy_`rQ?g(#oz^7@}@ zdRu)SZjg_7eMM|v=&Pfv7jCIym^Rm&iQ&)Op7*tJx3}fq)=1vIMQ?2`h`CMo?svBE zlRiezbMmxyZ=P}We|c#5^q{|U->I-GGRquWTabTez1;rp*f&WL^5Xp6Q`(fvtB$#^KkFK6Vl%~ZsjFDm5Z^&L8vkzpbwd9Bn)agZj}8f($*g+fC~mvdeZl&Uakk^X7T$l#Yl+^$iw*%0iE&HU=tha%>Jz^Zo4k zq`7$A-P{WgGt~MP`#+SHT#)otUSm;vxTj9^iLB+bcEyW)+8Z>qIZgq-L7BGyXfGX z_t#DJXO*UyCIz`wFLX4yTzyG#-R;F)e-vlBX^D8e{>SX=H`#r0|dg=VFW6wM%Uw>C< zk`cF}GDna-TVqz~3c<5hhaQS8bo-L+Qm^8_>im?thWUx*U$x`p`~PH=98CMN+W%yz zwN1s5tGh)y7rDNnKED{xh+{ z;=$|r_1<>hpDta$?W{=s+RjC5=j+_`tEt(aHS53aBAML0{TbE&?wx=3^tICZgU2_{ zeHFo-(K`Py`$yTFTD!_u{fpGkF5Y5Q$(?b%$f95>-|ouGF}ua)-?#c|{735jadX4$ ze5Y*v#bsRW1+jCO_a6$M5Z@g=-}G~XG28UNxBu?nRmAF0-*m9x=h+#x|C6hK&+o0_ zkhlJEiQ%8L!eO>u5eqB=+6AgCHlCE%m)zlCaF?U)aKZ#ZtyPgmmQ!qYT3U delta 1757 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 diff --git a/launcher/resources/multimc/32x32/centralmods.png b/launcher/resources/multimc/32x32/centralmods.png index cd2b8208ec31bb3f4824f819eb0dfe47a7585b2c..7225ba08c564754d9bd1556700107a70276c74a8 100644 GIT binary patch delta 1460 zcmX>uaFlz3ay@I0r;B4q#jUrKnYTRg+wWSg8tU1<_TTMoxo{MHJYg<|Mkqq(uq&Mxc~e2v+McmU3&HV)@5BV?p#$m@9T~G`z`FRxbE!# z&(SsiuOv(SA6WzA4SKKteA|Dbd`gh2f8~t&Db}qXt?Env&R_I-P4<%DRg)fThkjUc zXpx$hbGjrhevW^pY2&tEwa=Y{)9TdfkWp7nc*$JTj* zuguwgA&vwyIxMd;2Drcd~42%k*YVTG;V-`vVr9 z$j?k-WpSw+Kg~TORNM2Ow{b?=QZdI+km>_Zx$LF-_XboUz{AzW$@C z6#pSD7g3iOHt!(A5MI*`W*4Ev|8J{y?MG51 z$Xoh|5~M<^Mj0 zEqM4_TrtbwisGaHL6g{8ww<cqeCvSkrDrlTSa23!)D8F1X~F zI`i(Xx0^vJ_W8-`b+6yNdew9K>Z<6qS6}pPh;p(p?T~i7&RqJyr0ESyDC2srRcuBc zPyJd76jzj#-cFCb_VY_^y?Kdc`213r;|Evs-uSY@^ml&lje{E=@2IK!_DZ~ZuZ_U1 z2@S%_l|(0;;++|DmT`uXwcv2*oy zym@jLrc1Y1{QCakcgn--eY!F>&%3tTir-LpXKHX?x}cL;ccxrr<>|!N^;NIdEH(c= zWxmbkX~jQ2OP}0VGFjZLh<)bY<9l~b|MN)q_37ss^?9*dSuSh$uW3p!DpvdON6RPd bAOAAfA|>hR*IqF&Ffe$!`njxgN@xNASTFQM literal 2119 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 delta 2471 zcmX@gzd?9{ayK;HUHMdIkmt&H|6f zVg?4@>mbbNq%pe!Bv@A9m<}=;jO*Kf&6&%*eU|He_3rAu~Cn z=TJ{ziK4*V!y9|A@|qpLwQl>{x36no?)_eQ&hlTO_jSFuI-GVV^`BRMn)Ceo?|=LD zzpsBk=QGE18Tq4MH@7doe{%Yr{c@EHf9&S}JokqNgG`OXii&EZjD&u5rd?OZ3C z|L1%4&j)H2L^#heEImFif7`ZocYi(G9N$qVt$1W=&CB{!);FSw!HcVxOxj(dQL}w| zR!r&JZM$RtPh^&=s1s}YeA@M4lTz6y9^2dHF6Xwb`SvVl>7vH@Pox4}PzHQbP+`INgfW&i| zYf^IzU1qI&xK;kmlPkX?oxCpGotO~&{`PE^*;#+-6*od*_kn!uQeBIQCB1{(IKDc{>h2T*J81(N#c;NsDWt z24DLI#@3CWMU3BHy0WqN;=XW;`X>yHK1zoQTPBE3o)n_Baw*^2NHK=&w|jfFZ)rUZ zObkeD=~LLNqIIoddd5M^1CdP|x1WryxA98+qjU1u)s{U5&+q@yY+l|Uu;rc(Hw0F* zvIyPyVGj$_uiy6+{@%0aFwI|NrZw@>^5VOukKQK#-y?iue~Gxp`+w`+=?YHh@qKc_ zhu65?&gg*8v)D&!z8*iGs#cjk4_a!Kd^IGh0c*#E7Edb zU*&ij>f=7aip#2t$5qg(CqVF+*X2Lo-kfep_LQ1s^>R&KT5+hb#f&q&#)ebX=32TN zTDvJen&@%umQSS$>k@HRg{5mW?l*2uHLz>4;o#i-_URHP5%;3^#W~NEX74V$7;*nt zNnyt%`-2azR5H{n?V8ngjLj-6_I$y!TE2NUE}_98#)Y1Lx(xy{`Lew%(hILWnsd;S z``SYTi`N!XJ_a*9Hf8^I7HQ&nemw5DRj{X1$elFr%uP#89{=2YMg7{v-G8-Z`ed#g zF1@$-z+~@jicXYKO~Z{GW8aobwX zy`!u8HIMSm;2yDGH}?IkbFuifb^X5;#fK*`%$X1o9a*No{Q%pZD7nPbU$;-zUV8Ez zPx9Kin|0svUz~8m!8wUJ`j&ju2R&Se_ff@w%k9tXXfT!?efd@({A-llZ&d_vefMI-CgMi=RACQ`O0;Z&Rw&n=9-GH z-<8}c6w^*@?h_H0qelw7v?W!N?I@8`~PHyKU- z=_nPf{g`i?9+yMMg*^+(4*qS>44k_{HGbBN;;PWUzBy4_s~tc5R4`k6>ul&(^Rs8` z&rerdvChl0Wk;kQj}FTXFU}eIhrAz8h+m==bk-+RDw#(+d)Ldz-yB|5I;EN~FK+%O z7?rh))5l?d6^=8d(~Scx{XI;zWtvN;ZYy4=q>{}0bb*J!k1L^T6VtB?ztCpc zf28I3+F1X9_^o2XEI%AMlg}@iw@5J{rD~Syv1>oE}m4JBYgb1u>wP{s8g$rfRLuCljf2Tj+GOG zE-tclJKiqfrysE0Fzw`<=g(L~h5d}J40CFP|9mZCP-Ni{b@Oa>ShR#`>4YHV(2g+K zbd6#`Rpt7rlXTb*p8Mgts5kaZ zUgraybCz?AIi5%KJ`K~ZczmYtTKwJ4X-$jfKdxrC+sDG{FKbJO57TJZ|(%OLrg$6_|#`6r{)!>GGvsL6jq8)l8R13=9m02G}ETIjMTd`MC=E1^VfE`MIgO$zaX;0kT_P PgW6D@u6{1-oD!M<6RK|P diff --git a/launcher/resources/multimc/32x32/copy.png b/launcher/resources/multimc/32x32/copy.png index c137b0f11ecef71ac7906d3724eb8301a36adcbf..ce662604ea6d575331cd77d6be0de5e15f11b74f 100644 GIT binary patch delta 754 zcmey#)yXzNxt{5Qr;B4q1>=!vzFy3ZA}yyuQfY zWVw)PHY?||wY_9;!sLYuo^Mt7v1Iw|>GM{uzprgv=zIBrz4GIumgQ^@=6L^!{gCqh zICI?$29f)D+b7os9{70vv)7!fQJ*Ki59 zXb=#r_h1e2`70paxBWmnSN#h6MGOwhE7si6y7R9}y`_ywWqZR!F2N&T_gOT2xhY`o z=rdoVfou7$dmJ~Dw=lHb=H+mX`I|Un!pG>3-wsE=pT;qTVTDIlyk?b!jKyLd?{j}- z_S*R8H`dI^QQ^8?+Iu#wd65Rk0h#Z~;Zt6G|GmLUd%~M6uE2t=QHeWalJ>^c3$sN}Xw@Uy0G`pIm8?SJYo*5n^r;`zDZ*c<0E2Ftn38xG3Mk>RQ4 zf0KUV^hw4@KZDvUre8_fESX z`zz0pZLmpk%l9JbaHcQczO|_zopr0F1j^hyVZp literal 1401 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 RGcYhPc)I$ztaD0e0szs6LOB2c diff --git a/launcher/resources/multimc/32x32/help.png b/launcher/resources/multimc/32x32/help.png index b38542784dbdff26ad5abf9f568255cf5873c966..6e4cdbff6162783ec1a32e06e081aa2752c3daad 100644 GIT binary patch delta 2149 zcmZ1=`cYtlay^HIr;B4q1>@Cl)`Hg_Lbb{#6`~7s+Us5zKQ=T50Z|!aF&X2-M#jd* z`4X}PImb034UEm_S*C{WpSJzQu2-S`ANST>zU#;Fe2#;wiFAPD!gE#&l9G~?LN!D# zO`fb;TzT`F6tA_0Sae=~{wceP3t#Si-}k+ep~k7Bzn!mMM%6)SnGut#PGf%U>y{%g zr^i}4X@6xt+wexYFj>0u=%*=#zU-MBwi%yaQNBL)MftMJhmEhtem^`(=Yb%{g#{;O zHm$ky=i2stPyc_Lu{1Yr&EH+?YVNQ8q};rF_pjeNhflrWGk##`H{*HXvn?~iqsya@ zUOgJNvBa}*SJ|Aqv-U~W?^yXQfXV8JO_FtZ!`FM?|DD?P;gR;d%e!+w2rp*;ZmYS! zv^r?>rUFU9BM!IISKPF#S!I{hp!n=|!qTY;xo_s(JmvK8{n3}d?l&4wpCbKT-yvMo zo88IqS@^zB&wY>2t$Qln_C4?aopsCYGab%Uig;YgR6H z%~<#~@p0|D;(BlS;!nEzZ}0AUENngRUr$Z_gfk8WIcGW^OjmLe5D-|T^F~9drNK~- zHOyAFBqhJ*@@!Tz@21B_<>d~t5M-OheBok(7F znODC>ce*vC__$jwJnZ$#L&`<#ag3ERqk!frKhuoG)k4g>%lFxun|zUaa8^wzvE>Pq z#WM-@`pdh|RvrJQE_YM@^w){g&L5sO<%r?j1eN@x>UyrlmcbLG3z*wlyLxA*z1oq! zvNPy%^AmRV#-cTiELCOi&+|?3mVfl^km*&ecRgGjEGB`ric1PN)PMPK+IaSMDZdLV zU(`=^ep>4+7WaRNW6u*I1u4d*GP~SZsy-}Y);qVSRP=a#Ot8c4?*}X=`enN8J@5a0 z!n@qtd~5aB?&G-n{2bGCQ^A`>2XD-n>B&1o|HbW%xf~}=R-86FAsNi~!m809@VaRw>o)I& z+CipiTFs3L(@q{qitUtTI1|8N{qxCWPR9xT%Y!(lPwq`!{A{Ks`;HRVUdgHJPd;Z+ zkE>W9zP{=Y!?kETycErz0o;c_TBO0@jF7p{-0khR(Nx-=+A!}euhkY?Ui1!q2xyi!HwGQVn_QV3f^uic?pq z?R35N=Y`8NG#dE%_}Jt!u4eCMv~U(EZ4|ByJ0fDb+xgr?-=jy~d{;_7R&Zu3>zuOB zT&r~BC%LQ+&kpOFXx+>%w_I;+(z$QWj6Q#!U2b^kowxaBkFeY>1y5Ohhr65`@_rXx zIdt*N3^unapPuzw3NFT`YWhUUuC>#0VNPN?lXvkzeQ|o@BJp>OJ9qfL6TLO{D^u|s z#@REQW}FHXZV8$o6;?UzdQet{#oJ|}mXlh)mQC?V?etJ?Qdnqsr&k6n z_G;o26Z6;@wCYYkd~71aJ7sr{o8qsQhoyX#ez4%q7pFrSN=+g>&dz7b1EOPRKI|(q zXHaF3E_AxQvbtXUy100j+RGc9t~%9@WqVb4SD5hl-?-JQzdwn6-;Ymki$t?IR`Uv) zEwq}=))=kBay9Acq^zqEOP<4P*2=C^cz$vJ zjfG-fSHBrVZYew(!CEdR_36|XzpJyF)+ro)>cf=&OfLW1x848a=B=O0;bZnbp20!3 zdW*-3$r~?qsxSHdi??0KljG`DrI2m5Z8J@!Kc~7+^iFCy;?=TFaq^YKDcm`~cD-Jw z<1b$KX4ms`j1RtRI~-kdS7mm3J@55*e+A0t!M_@AT(%W}UrR!vE&hG9Rbg6JNhJoROvwFj;Z& zn)A!kC!Mf*L zPUUU2ySC!mx{_Z^*L3sxekmV$1_lNOPgg&ebxsLQ0IInj7ytkO literal 2720 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 A1^@s6 diff --git a/launcher/resources/multimc/32x32/instance-settings.png b/launcher/resources/multimc/32x32/instance-settings.png index a9c0817c931c2251632083698b571da359b12fd4..3447c5543a4a07b6d2be1d30129dfc8465e04f9d 100644 GIT binary patch delta 2419 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 diff --git a/launcher/resources/multimc/32x32/instances/brick_legacy.png b/launcher/resources/multimc/32x32/instances/brick_legacy.png index c324fda06304c72b6ca19d95bbfc610b60d22a4b..cd4bbc42521890bbc57efa936ea33874842d0f47 100644 GIT binary patch delta 217 zcmca2^pbIcL_G^L0|P^2NcwRG1_tQ>pAgrLNxrkgoV)YVk7WcdYOC!Ju&;47E4DXW zIi=U&>i1*@28K>g7srqa#?*dBP8I_m=JbVPS&3pp0%&o#(CE5g+?2LO1_lOCS3j3^P6^X_+~x z3MG{VsS2qTnQ06R6}Q%gXBT}o10r9@W&wcVQJTCt^DfRfjNhMjXLau?{ z47(X5um1bFd-eVg%0_XK;)}%Jo7RP`32;(=^>uQk>8*3G|6HtVeZIV|bgx2*;k!L@ z&bJ;5|GN9Q*|`1W`M+B4%tg#E)D<#Rp0P<=U9No5fA#$vyehe-dyW*Co8||fmb37^ znVxytd9%9o`B(Q6nHPn~x)}y0mpt~`qx+y#ZH{30;ikei=3CPu&+2W~b#$0_$GUv& zd&VlRPnj#PzldKu{Xy`pzkh_h_b0a;yDfffFaJNDkGVNjjKrBiFfV|&B}5!4e3gooxQJBZ1$Eb3%8!T zTXwyc-?r@K%cR`Rzn=bJ%}(3wHhHC?Ud)<>;jIMb59yV1wsqRsc#pwo&pd^dCD$~2zR%d#dgo5nWH0Vl+`pPwjO(0sO+2&N@X3Re zgAorr9-5lWnkAEDVwk(EAZq=M>oTh+DqTCisdvjrZ!t z)H_!x$hccxEb}*CuouUrq!3J%yLFT`oK{=uRvW*lj~j8ko=Y>BgETz~t_={w2|K}GXx!!BJ~ z_iGk!Zil5txw~0do6w)?UviBkk9>R^-S@<@ur6& z#h8i={O;!64BGwZJipqZQ*|LmRdZ9)#V5br7L#QdbBZgi`FA+ei8sNV^IM+sZPOKx zeD~y~Y;mhq^)&ZiM^rzouxm5Wje4SJy4NwSLjwq{`0lt>&w251Sb}$5oonW=Pj5Fn%TEctA;a zW%L2NyZNneBNK0*c((J={Wblf(=vMx``y@gqeHf=`?RP|NlL)ptD*b!#b0Y1om}|Z za&M1ra{ZnSf&ClA%KgmO+b^H$-+dzM;F9y754!E$EI(V!(yFZH%t5h~%7ypUU-H&6 zt!n&Xt&l$L>qZ5^^_!MV`nTuUr8tfg$E!V8d&k~$i2b+1`{@4|;rZ8#O~t=dpZ$3` z=x5b_&9GYSoAO#=dnfCZxxYS`F!6rHhtJNn5#?XQVxwb@@4Ix%k3pwEK4if@?e+Gt z`By(5`n|mMca-~mrd9q7;uXjL1#Z~&{1Ns#H1N3&vzzq&3pV>&Tikmqm|RX@3eQHKgnG3fpACq%)E#r(nl`Oo_4Ns zzQrl8NlrC>Hfa}FJLPxk?f!FY=Zg*V)7^S~s^(dE>4;cIyh{i(3VEdYXvU(fDeuqk zT2pZE(VDQVHKqRl4h6(TM?SMU>!`A^L$yOdVR4(0)&_y)p~^>HW_=Tu`^R`(f0DOa zxMYtE_X?-hCqEAUe^9+uxtNyON1zUZeKfx9iOs zX8K=xovT~M(z3m=`}H=p_l(o69sW<&lboc?n(>R9^}*kseVXhpd5!l>w{O2@=O^F5 zQ#y4QBOhPmM5WaA)qAXO+`PR%J?igYhL)b9b&Dc2ZZj}2uqAoByD#35PJhHup_s

    C7OzMc;^v?3Rgx{81@0Kl3{rYt-$HRT+3G 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 literal 62973 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 !opc4I>J_Po1Q?&s!Ms^8LbX0=QLC9KpStBCyd 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 diff --git a/launcher/resources/backgrounds/rory-flat-bday.png b/launcher/resources/backgrounds/rory-flat-bday.png index 8a6e366db60e8fb958fc970b4d72b48921e28d76..700192256ad4523d30c76b1dfca67f05c83af3d2 100644 GIT binary patch literal 49757 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