aboutsummaryrefslogtreecommitdiff
path: root/api
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@users.noreply.github.com>2021-05-15 00:33:53 +0200
committerGitHub <noreply@github.com>2021-05-15 00:33:53 +0200
commit2f1e8e82a3a2fb16e3970ee6a17f290ef7fe84ab (patch)
tree6c989e3202e42b0f44ccd42539b198b7cdfe59a5 /api
parent3d11f9a7e97301483c50621db9a8b9b7b04d790f (diff)
parentdf7873eb9a44c70710d86ccdf9975597e941351e (diff)
downloadPrismLauncher-2f1e8e82a3a2fb16e3970ee6a17f290ef7fe84ab.tar.gz
PrismLauncher-2f1e8e82a3a2fb16e3970ee6a17f290ef7fe84ab.tar.bz2
PrismLauncher-2f1e8e82a3a2fb16e3970ee6a17f290ef7fe84ab.zip
Merge pull request #3729 from jamierocks/atl-loader-targets
Various ATLauncher improvements and bug fixes
Diffstat (limited to 'api')
-rw-r--r--api/logic/modplatform/atlauncher/ATLPackInstallTask.cpp60
-rw-r--r--api/logic/modplatform/atlauncher/ATLPackInstallTask.h18
-rw-r--r--api/logic/modplatform/atlauncher/ATLPackManifest.cpp33
-rw-r--r--api/logic/modplatform/atlauncher/ATLPackManifest.h1
4 files changed, 87 insertions, 25 deletions
diff --git a/api/logic/modplatform/atlauncher/ATLPackInstallTask.cpp b/api/logic/modplatform/atlauncher/ATLPackInstallTask.cpp
index 12ceaccd..89c4dfd3 100644
--- a/api/logic/modplatform/atlauncher/ATLPackInstallTask.cpp
+++ b/api/logic/modplatform/atlauncher/ATLPackInstallTask.cpp
@@ -18,8 +18,9 @@
namespace ATLauncher {
-PackInstallTask::PackInstallTask(QString pack, QString version)
+PackInstallTask::PackInstallTask(UserInteractionSupport *support, QString pack, QString version)
{
+ m_support = support;
m_pack = pack;
m_version_name = version;
}
@@ -154,23 +155,56 @@ QString PackInstallTask::getVersionForLoader(QString uid)
auto vlist = ENV.metadataIndex()->get(uid);
if(!vlist)
{
- emitFailed(tr("Failed to get local metadata index for ") + uid);
+ emitFailed(tr("Failed to get local metadata index for %1").arg(uid));
return Q_NULLPTR;
}
- // todo: filter by Minecraft version
-
- if(m_version.loader.recommended) {
- return vlist.get()->getRecommended().get()->descriptor();
+ if(!vlist->isLoaded()) {
+ vlist->load(Net::Mode::Online);
}
- else if(m_version.loader.latest) {
- return vlist.get()->at(0)->descriptor();
+
+ if(m_version.loader.recommended || m_version.loader.latest) {
+ for (int i = 0; i < vlist->versions().size(); i++) {
+ auto version = vlist->versions().at(i);
+ auto reqs = version->requires();
+
+ // filter by minecraft version, if the loader depends on a certain version.
+ // not all mod loaders depend on a given Minecraft version, so we won't do this
+ // filtering for those loaders.
+ if (m_version.loader.type != "fabric") {
+ auto iter = std::find_if(reqs.begin(), reqs.end(), [](const Meta::Require &req) {
+ return req.uid == "net.minecraft";
+ });
+ if (iter == reqs.end()) continue;
+ if (iter->equalsVersion != m_version.minecraft) continue;
+ }
+
+ if (m_version.loader.recommended) {
+ // first recommended build we find, we use.
+ if (!version->isRecommended()) continue;
+ }
+
+ return version->descriptor();
+ }
+
+ emitFailed(tr("Failed to find version for %1 loader").arg(m_version.loader.type));
+ return Q_NULLPTR;
}
else if(m_version.loader.choose) {
- // todo: implement
+ // Fabric Loader doesn't depend on a given Minecraft version.
+ if (m_version.loader.type == "fabric") {
+ return m_support->chooseVersion(vlist, Q_NULLPTR);
+ }
+
+ return m_support->chooseVersion(vlist, m_version.minecraft);
}
}
+ if (m_version.loader.version == Q_NULLPTR || m_version.loader.version.isEmpty()) {
+ emitFailed(tr("No loader version set for modpack!"));
+ return Q_NULLPTR;
+ }
+
return m_version.loader.version;
}
@@ -428,6 +462,9 @@ void PackInstallTask::downloadMods()
jarmods.clear();
jobPtr.reset(new NetJob(tr("Mod download")));
for(const auto& mod : m_version.mods) {
+ // skip non-client mods
+ if (!mod.client) continue;
+
// skip optional mods for now
if(mod.optional) continue;
@@ -451,7 +488,6 @@ void PackInstallTask::downloadMods()
auto cacheName = fileName.completeBaseName() + "-" + mod.md5 + "." + fileName.suffix();
if (mod.type == ModType::Extract || mod.type == ModType::TexturePackExtract || mod.type == ModType::ResourcePackExtract) {
-
auto entry = ENV.metacache()->resolveEntry("ATLauncherPacks", cacheName);
entry->setStale(true);
modsToExtract.insert(entry->getFullPath(), mod);
@@ -522,7 +558,7 @@ void PackInstallTask::onModsDownloaded() {
qDebug() << "PackInstallTask::onModsDownloaded: " << QThread::currentThreadId();
jobPtr.reset();
- if(modsToExtract.size() || modsToDecomp.size() || modsToCopy.size()) {
+ if(!modsToExtract.empty() || !modsToDecomp.empty() || !modsToCopy.empty()) {
m_modExtractFuture = QtConcurrent::run(QThreadPool::globalInstance(), this, &PackInstallTask::extractMods, modsToExtract, modsToDecomp, modsToCopy);
connect(&m_modExtractFutureWatcher, &QFutureWatcher<QStringList>::finished, this, &PackInstallTask::onModsExtracted);
connect(&m_modExtractFutureWatcher, &QFutureWatcher<QStringList>::canceled, this, [&]()
@@ -629,6 +665,7 @@ void PackInstallTask::install()
// Use a component to add libraries BEFORE Minecraft
if(!createLibrariesComponent(instance.instanceRoot(), components)) {
+ emitFailed(tr("Failed to create libraries component"));
return;
}
@@ -666,6 +703,7 @@ void PackInstallTask::install()
// Use a component to fill in the rest of the data
// todo: use more detection
if(!createPackComponent(instance.instanceRoot(), components)) {
+ emitFailed(tr("Failed to create pack component"));
return;
}
diff --git a/api/logic/modplatform/atlauncher/ATLPackInstallTask.h b/api/logic/modplatform/atlauncher/ATLPackInstallTask.h
index 78544bab..3647e471 100644
--- a/api/logic/modplatform/atlauncher/ATLPackInstallTask.h
+++ b/api/logic/modplatform/atlauncher/ATLPackInstallTask.h
@@ -15,12 +15,23 @@
namespace ATLauncher {
+class MULTIMC_LOGIC_EXPORT UserInteractionSupport {
+
+public:
+ /**
+ * Requests a user interaction to select a component version from a given version list
+ * and constrained to a given Minecraft version.
+ */
+ virtual QString chooseVersion(Meta::VersionListPtr vlist, QString minecraftVersion) = 0;
+
+};
+
class MULTIMC_LOGIC_EXPORT PackInstallTask : public InstanceTask
{
Q_OBJECT
public:
- explicit PackInstallTask(QString pack, QString version);
+ explicit PackInstallTask(UserInteractionSupport *support, QString pack, QString version);
virtual ~PackInstallTask(){}
bool abort() override;
@@ -54,6 +65,8 @@ private:
void install();
private:
+ UserInteractionSupport *m_support;
+
NetJobPtr jobPtr;
QByteArray response;
@@ -76,9 +89,6 @@ private:
QFuture<bool> m_modExtractFuture;
QFutureWatcher<bool> m_modExtractFutureWatcher;
- QFuture<bool> m_decompFuture;
- QFutureWatcher<bool> m_decompFutureWatcher;
-
};
}
diff --git a/api/logic/modplatform/atlauncher/ATLPackManifest.cpp b/api/logic/modplatform/atlauncher/ATLPackManifest.cpp
index 84389330..57cc52b6 100644
--- a/api/logic/modplatform/atlauncher/ATLPackManifest.cpp
+++ b/api/logic/modplatform/atlauncher/ATLPackManifest.cpp
@@ -81,12 +81,21 @@ static ATLauncher::ModType parseModType(QString rawType) {
static void loadVersionLoader(ATLauncher::VersionLoader & p, QJsonObject & obj) {
p.type = Json::requireString(obj, "type");
- p.latest = Json::ensureBoolean(obj, QString("latest"), false);
p.choose = Json::ensureBoolean(obj, QString("choose"), false);
- p.recommended = Json::ensureBoolean(obj, QString("recommended"), false);
auto metadata = Json::requireObject(obj, "metadata");
- p.version = Json::requireString(metadata, "version");
+ p.latest = Json::ensureBoolean(metadata, QString("latest"), false);
+ p.recommended = Json::ensureBoolean(metadata, QString("recommended"), false);
+
+ // Minecraft Forge
+ if (p.type == "forge") {
+ p.version = Json::ensureString(metadata, "version", "");
+ }
+
+ // Fabric Loader
+ if (p.type == "fabric") {
+ p.version = Json::ensureString(metadata, "loader", "");
+ }
}
static void loadVersionLibrary(ATLauncher::VersionLibrary & p, QJsonObject & obj) {
@@ -135,6 +144,7 @@ static void loadVersionMod(ATLauncher::VersionMod & p, QJsonObject & obj) {
}
p.optional = Json::ensureBoolean(obj, QString("optional"), false);
+ p.client = Json::ensureBoolean(obj, QString("client"), false);
}
void ATLauncher::loadVersion(PackVersion & v, QJsonObject & obj)
@@ -169,12 +179,15 @@ void ATLauncher::loadVersion(PackVersion & v, QJsonObject & obj)
}
}
- auto mods = Json::requireArray(obj, "mods");
- for (const auto modRaw : mods)
- {
- auto modObj = Json::requireObject(modRaw);
- ATLauncher::VersionMod mod;
- loadVersionMod(mod, modObj);
- v.mods.append(mod);
+
+ if(obj.contains("mods")) {
+ auto mods = Json::requireArray(obj, "mods");
+ for (const auto modRaw : mods)
+ {
+ auto modObj = Json::requireObject(modRaw);
+ ATLauncher::VersionMod mod;
+ loadVersionMod(mod, modObj);
+ v.mods.append(mod);
+ }
}
}
diff --git a/api/logic/modplatform/atlauncher/ATLPackManifest.h b/api/logic/modplatform/atlauncher/ATLPackManifest.h
index 1adf889b..937106a5 100644
--- a/api/logic/modplatform/atlauncher/ATLPackManifest.h
+++ b/api/logic/modplatform/atlauncher/ATLPackManifest.h
@@ -87,6 +87,7 @@ struct VersionMod
QString decompFile;
bool optional;
+ bool client;
};
struct PackVersion