fix: check for Quilt as Fabric-compatible loader
This commit is contained in:
		| @@ -241,6 +241,7 @@ void InstanceImportTask::processFlame() | |||||||
|  |  | ||||||
|     QString forgeVersion; |     QString forgeVersion; | ||||||
|     QString fabricVersion; |     QString fabricVersion; | ||||||
|  |     // TODO: is Quilt relevant here? | ||||||
|     for(auto &loader: pack.minecraft.modLoaders) |     for(auto &loader: pack.minecraft.modLoaders) | ||||||
|     { |     { | ||||||
|         auto id = loader.id; |         auto id = loader.id; | ||||||
|   | |||||||
| @@ -970,3 +970,20 @@ void PackProfile::disableInteraction(bool disable) | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | ModAPI::ModLoaderType PackProfile::getModLoader() | ||||||
|  | { | ||||||
|  |     if (!getComponentVersion("net.minecraftforge").isEmpty()) | ||||||
|  |     { | ||||||
|  |         return ModAPI::Forge; | ||||||
|  |     } | ||||||
|  |     else if (!getComponentVersion("net.fabricmc.fabric-loader").isEmpty()) | ||||||
|  |     { | ||||||
|  |         return ModAPI::Fabric; | ||||||
|  |     } | ||||||
|  |     else if (!getComponentVersion("org.quiltmc.quilt-loader").isEmpty()) | ||||||
|  |     { | ||||||
|  |         return ModAPI::Quilt; | ||||||
|  |     } | ||||||
|  |     return ModAPI::Any; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ | |||||||
| #include "BaseVersion.h" | #include "BaseVersion.h" | ||||||
| #include "MojangDownloadInfo.h" | #include "MojangDownloadInfo.h" | ||||||
| #include "net/Mode.h" | #include "net/Mode.h" | ||||||
|  | #include "modplatform/ModAPI.h" | ||||||
|  |  | ||||||
| class MinecraftInstance; | class MinecraftInstance; | ||||||
| struct PackProfileData; | struct PackProfileData; | ||||||
| @@ -117,6 +118,8 @@ public: | |||||||
|     // todo(merged): is this the best approach |     // todo(merged): is this the best approach | ||||||
|     void appendComponent(ComponentPtr component); |     void appendComponent(ComponentPtr component); | ||||||
|  |  | ||||||
|  |     ModAPI::ModLoaderType getModLoader(); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     void scheduleSave(); |     void scheduleSave(); | ||||||
|     bool saveIsScheduled() const; |     bool saveIsScheduled() const; | ||||||
|   | |||||||
| @@ -391,7 +391,7 @@ void LocalModParseTask::processAsZip() | |||||||
|         zip.close(); |         zip.close(); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     else if (zip.setCurrentFile("fabric.mod.json")) |     else if (zip.setCurrentFile("fabric.mod.json"))  // TODO: Support quilt.mod.json | ||||||
|     { |     { | ||||||
|         if (!file.open(QIODevice::ReadOnly)) |         if (!file.open(QIODevice::ReadOnly)) | ||||||
|         { |         { | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ class ModAPI { | |||||||
|     virtual ~ModAPI() = default; |     virtual ~ModAPI() = default; | ||||||
|  |  | ||||||
|     // https://docs.curseforge.com/?http#tocS_ModLoaderType |     // https://docs.curseforge.com/?http#tocS_ModLoaderType | ||||||
|     enum ModLoaderType { Any = 0, Forge = 1, Cauldron = 2, LiteLoader = 3, Fabric = 4 }; |     enum ModLoaderType { Any = 0, Forge = 1, Cauldron = 2, LiteLoader = 3, Fabric = 4, Quilt = 5 }; | ||||||
|  |  | ||||||
|     struct SearchArgs { |     struct SearchArgs { | ||||||
|         int offset; |         int offset; | ||||||
|   | |||||||
| @@ -69,6 +69,7 @@ void FlameMod::loadIndexedPackVersions(ModPlatform::IndexedPack& pack, | |||||||
|         for (auto m : modules) { |         for (auto m : modules) { | ||||||
|             auto fname = Json::requireString(m.toObject(), "foldername"); |             auto fname = Json::requireString(m.toObject(), "foldername"); | ||||||
|             // FIXME: This does not work properly when a mod supports more than one mod loader, since |             // FIXME: This does not work properly when a mod supports more than one mod loader, since | ||||||
|  |             // FIXME: This also doesn't deal with Quilt mods at the moment | ||||||
|             // they bundle the meta files for all of them in the same arquive, even when that version |             // they bundle the meta files for all of them in the same arquive, even when that version | ||||||
|             // doesn't support the given mod loader. |             // doesn't support the given mod loader. | ||||||
|             if (hasFabric) { |             if (hasFabric) { | ||||||
|   | |||||||
| @@ -55,11 +55,13 @@ class ModrinthAPI : public NetworkModAPI { | |||||||
|     { |     { | ||||||
|         switch (modLoader) { |         switch (modLoader) { | ||||||
|             case Any: |             case Any: | ||||||
|                 return "fabric, forge"; |                 return "fabric, forge, quilt"; | ||||||
|             case Forge: |             case Forge: | ||||||
|                 return "forge"; |                 return "forge"; | ||||||
|             case Fabric: |             case Fabric: | ||||||
|                 return "fabric"; |                 return "fabric"; | ||||||
|  |             case Quilt: | ||||||
|  |                 return "quilt"; | ||||||
|             default: |             default: | ||||||
|                 return ""; |                 return ""; | ||||||
|         } |         } | ||||||
| @@ -67,7 +69,7 @@ class ModrinthAPI : public NetworkModAPI { | |||||||
|  |  | ||||||
|     inline auto validateModLoader(ModLoaderType modLoader) const -> bool |     inline auto validateModLoader(ModLoaderType modLoader) const -> bool | ||||||
|     { |     { | ||||||
|         return modLoader == Any || modLoader == Forge || modLoader == Fabric; |         return modLoader == Any || modLoader == Forge || modLoader == Fabric || modLoader == Quilt; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -56,6 +56,8 @@ | |||||||
| #include "minecraft/VersionFilterData.h" | #include "minecraft/VersionFilterData.h" | ||||||
| #include "minecraft/PackProfile.h" | #include "minecraft/PackProfile.h" | ||||||
|  |  | ||||||
|  | #include "modplatform/ModAPI.h" | ||||||
|  |  | ||||||
| #include "Version.h" | #include "Version.h" | ||||||
| #include "ui/dialogs/ProgressDialog.h" | #include "ui/dialogs/ProgressDialog.h" | ||||||
| #include "tasks/SequentialTask.h" | #include "tasks/SequentialTask.h" | ||||||
| @@ -388,9 +390,9 @@ void ModFolderPage::on_actionInstall_mods_triggered() | |||||||
|     if(m_inst->typeName() != "Minecraft"){ |     if(m_inst->typeName() != "Minecraft"){ | ||||||
|         return; //this is a null instance or a legacy instance |         return; //this is a null instance or a legacy instance | ||||||
|     } |     } | ||||||
|     bool hasFabric = !((MinecraftInstance *)m_inst)->getPackProfile()->getComponentVersion("net.fabricmc.fabric-loader").isEmpty(); |     QStringList modLoaders = {"net.minecraftforge", "net.fabricmc.fabric-loader", "org.quiltmc.quilt-loader"}; | ||||||
|     bool hasForge = !((MinecraftInstance *)m_inst)->getPackProfile()->getComponentVersion("net.minecraftforge").isEmpty(); |     auto profile = ((MinecraftInstance *)m_inst)->getPackProfile(); | ||||||
|     if (!hasFabric && !hasForge) { |     if (profile->getModLoader() == ModAPI::Any) { | ||||||
|         QMessageBox::critical(this,tr("Error"),tr("Please install a mod loader first!")); |         QMessageBox::critical(this,tr("Error"),tr("Please install a mod loader first!")); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -61,14 +61,18 @@ auto ListModel::data(const QModelIndex& index, int role) const -> QVariant | |||||||
|  |  | ||||||
| void ListModel::requestModVersions(ModPlatform::IndexedPack const& current) | void ListModel::requestModVersions(ModPlatform::IndexedPack const& current) | ||||||
| { | { | ||||||
|  |     auto profile = (dynamic_cast<MinecraftInstance*>((dynamic_cast<ModPage*>(parent()))->m_instance))->getPackProfile(); | ||||||
|  |  | ||||||
|     m_parent->apiProvider()->getVersions(this, |     m_parent->apiProvider()->getVersions(this, | ||||||
|             { current.addonId.toString(), getMineVersions(), hasFabric() ? ModAPI::ModLoaderType::Fabric : ModAPI::ModLoaderType::Forge }); |             { current.addonId.toString(), getMineVersions(), profile->getModLoader() }); | ||||||
| } | } | ||||||
|  |  | ||||||
| void ListModel::performPaginatedSearch() | void ListModel::performPaginatedSearch() | ||||||
| { | { | ||||||
|  |     auto profile = (dynamic_cast<MinecraftInstance*>((dynamic_cast<ModPage*>(parent()))->m_instance))->getPackProfile(); | ||||||
|  |  | ||||||
|     m_parent->apiProvider()->searchMods(this, |     m_parent->apiProvider()->searchMods(this, | ||||||
|             { nextSearchOffset, currentSearchTerm, getSorts()[currentSort], hasFabric() ? ModAPI::Fabric : ModAPI::Forge, getMineVersions().at(0) }); |             { nextSearchOffset, currentSearchTerm, getSorts()[currentSort], profile->getModLoader(), getMineVersions().at(0) }); | ||||||
| } | } | ||||||
|  |  | ||||||
| void ListModel::searchWithTerm(const QString& term, const int sort) | void ListModel::searchWithTerm(const QString& term, const int sort) | ||||||
| @@ -218,13 +222,6 @@ void ListModel::versionRequestSucceeded(QJsonDocument doc, QString addonId) | |||||||
| }  // namespace ModPlatform | }  // namespace ModPlatform | ||||||
|  |  | ||||||
| /******** Helpers ********/ | /******** Helpers ********/ | ||||||
| auto ModPlatform::ListModel::hasFabric() const -> bool |  | ||||||
| { |  | ||||||
|     return !(dynamic_cast<MinecraftInstance*>((dynamic_cast<ModPage*>(parent()))->m_instance)) |  | ||||||
|                 ->getPackProfile() |  | ||||||
|                 ->getComponentVersion("net.fabricmc.fabric-loader") |  | ||||||
|                 .isEmpty(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| auto ModPlatform::ListModel::getMineVersions() const -> QList<QString> | auto ModPlatform::ListModel::getMineVersions() const -> QList<QString> | ||||||
| { | { | ||||||
|   | |||||||
| @@ -62,7 +62,6 @@ class ListModel : public QAbstractListModel { | |||||||
|  |  | ||||||
|     void requestLogo(QString file, QString url); |     void requestLogo(QString file, QString url); | ||||||
|  |  | ||||||
|     inline auto hasFabric() const -> bool; |  | ||||||
|     inline auto getMineVersions() const -> QList<QString>; |     inline auto getMineVersions() const -> QList<QString>; | ||||||
|  |  | ||||||
|    protected: |    protected: | ||||||
|   | |||||||
| @@ -136,7 +136,21 @@ void ModPage::updateModVersions() | |||||||
|     auto packProfile = (dynamic_cast<MinecraftInstance*>(m_instance))->getPackProfile(); |     auto packProfile = (dynamic_cast<MinecraftInstance*>(m_instance))->getPackProfile(); | ||||||
|  |  | ||||||
|     QString mcVersion = packProfile->getComponentVersion("net.minecraft"); |     QString mcVersion = packProfile->getComponentVersion("net.minecraft"); | ||||||
|     QString loaderString = (packProfile->getComponentVersion("net.minecraftforge").isEmpty()) ? "fabric" : "forge"; |  | ||||||
|  |     QString loaderString; | ||||||
|  |     switch (packProfile->getModLoader()) { | ||||||
|  |         case ModAPI::Forge: | ||||||
|  |             loaderString = "forge"; | ||||||
|  |             break; | ||||||
|  |         case ModAPI::Fabric: | ||||||
|  |             loaderString = "fabric"; | ||||||
|  |             break; | ||||||
|  |         case ModAPI::Quilt: | ||||||
|  |             loaderString = "quilt"; | ||||||
|  |             break; | ||||||
|  |         default: | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     for (int i = 0; i < current.versions.size(); i++) { |     for (int i = 0; i < current.versions.size(); i++) { | ||||||
|         auto version = current.versions[i]; |         auto version = current.versions[i]; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sefa Eyeoglu
					Sefa Eyeoglu