fix: check for Quilt as Fabric-compatible loader
This commit is contained in:
		@@ -241,6 +241,7 @@ void InstanceImportTask::processFlame()
 | 
			
		||||
 | 
			
		||||
    QString forgeVersion;
 | 
			
		||||
    QString fabricVersion;
 | 
			
		||||
    // TODO: is Quilt relevant here?
 | 
			
		||||
    for(auto &loader: pack.minecraft.modLoaders)
 | 
			
		||||
    {
 | 
			
		||||
        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 "MojangDownloadInfo.h"
 | 
			
		||||
#include "net/Mode.h"
 | 
			
		||||
#include "modplatform/ModAPI.h"
 | 
			
		||||
 | 
			
		||||
class MinecraftInstance;
 | 
			
		||||
struct PackProfileData;
 | 
			
		||||
@@ -117,6 +118,8 @@ public:
 | 
			
		||||
    // todo(merged): is this the best approach
 | 
			
		||||
    void appendComponent(ComponentPtr component);
 | 
			
		||||
 | 
			
		||||
    ModAPI::ModLoaderType getModLoader();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    void scheduleSave();
 | 
			
		||||
    bool saveIsScheduled() const;
 | 
			
		||||
 
 | 
			
		||||
@@ -391,7 +391,7 @@ void LocalModParseTask::processAsZip()
 | 
			
		||||
        zip.close();
 | 
			
		||||
        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))
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ class ModAPI {
 | 
			
		||||
    virtual ~ModAPI() = default;
 | 
			
		||||
 | 
			
		||||
    // 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 {
 | 
			
		||||
        int offset;
 | 
			
		||||
 
 | 
			
		||||
@@ -69,6 +69,7 @@ void FlameMod::loadIndexedPackVersions(ModPlatform::IndexedPack& pack,
 | 
			
		||||
        for (auto m : modules) {
 | 
			
		||||
            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 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
 | 
			
		||||
            // doesn't support the given mod loader.
 | 
			
		||||
            if (hasFabric) {
 | 
			
		||||
 
 | 
			
		||||
@@ -55,11 +55,13 @@ class ModrinthAPI : public NetworkModAPI {
 | 
			
		||||
    {
 | 
			
		||||
        switch (modLoader) {
 | 
			
		||||
            case Any:
 | 
			
		||||
                return "fabric, forge";
 | 
			
		||||
                return "fabric, forge, quilt";
 | 
			
		||||
            case Forge:
 | 
			
		||||
                return "forge";
 | 
			
		||||
            case Fabric:
 | 
			
		||||
                return "fabric";
 | 
			
		||||
            case Quilt:
 | 
			
		||||
                return "quilt";
 | 
			
		||||
            default:
 | 
			
		||||
                return "";
 | 
			
		||||
        }
 | 
			
		||||
@@ -67,7 +69,7 @@ class ModrinthAPI : public NetworkModAPI {
 | 
			
		||||
 | 
			
		||||
    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/PackProfile.h"
 | 
			
		||||
 | 
			
		||||
#include "modplatform/ModAPI.h"
 | 
			
		||||
 | 
			
		||||
#include "Version.h"
 | 
			
		||||
#include "ui/dialogs/ProgressDialog.h"
 | 
			
		||||
#include "tasks/SequentialTask.h"
 | 
			
		||||
@@ -388,9 +390,9 @@ void ModFolderPage::on_actionInstall_mods_triggered()
 | 
			
		||||
    if(m_inst->typeName() != "Minecraft"){
 | 
			
		||||
        return; //this is a null instance or a legacy instance
 | 
			
		||||
    }
 | 
			
		||||
    bool hasFabric = !((MinecraftInstance *)m_inst)->getPackProfile()->getComponentVersion("net.fabricmc.fabric-loader").isEmpty();
 | 
			
		||||
    bool hasForge = !((MinecraftInstance *)m_inst)->getPackProfile()->getComponentVersion("net.minecraftforge").isEmpty();
 | 
			
		||||
    if (!hasFabric && !hasForge) {
 | 
			
		||||
    QStringList modLoaders = {"net.minecraftforge", "net.fabricmc.fabric-loader", "org.quiltmc.quilt-loader"};
 | 
			
		||||
    auto profile = ((MinecraftInstance *)m_inst)->getPackProfile();
 | 
			
		||||
    if (profile->getModLoader() == ModAPI::Any) {
 | 
			
		||||
        QMessageBox::critical(this,tr("Error"),tr("Please install a mod loader first!"));
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -61,14 +61,18 @@ auto ListModel::data(const QModelIndex& index, int role) const -> QVariant
 | 
			
		||||
 | 
			
		||||
void ListModel::requestModVersions(ModPlatform::IndexedPack const& current)
 | 
			
		||||
{
 | 
			
		||||
    auto profile = (dynamic_cast<MinecraftInstance*>((dynamic_cast<ModPage*>(parent()))->m_instance))->getPackProfile();
 | 
			
		||||
 | 
			
		||||
    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()
 | 
			
		||||
{
 | 
			
		||||
    auto profile = (dynamic_cast<MinecraftInstance*>((dynamic_cast<ModPage*>(parent()))->m_instance))->getPackProfile();
 | 
			
		||||
 | 
			
		||||
    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)
 | 
			
		||||
@@ -218,13 +222,6 @@ void ListModel::versionRequestSucceeded(QJsonDocument doc, QString addonId)
 | 
			
		||||
}  // namespace ModPlatform
 | 
			
		||||
 | 
			
		||||
/******** 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>
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,6 @@ class ListModel : public QAbstractListModel {
 | 
			
		||||
 | 
			
		||||
    void requestLogo(QString file, QString url);
 | 
			
		||||
 | 
			
		||||
    inline auto hasFabric() const -> bool;
 | 
			
		||||
    inline auto getMineVersions() const -> QList<QString>;
 | 
			
		||||
 | 
			
		||||
   protected:
 | 
			
		||||
 
 | 
			
		||||
@@ -136,7 +136,21 @@ void ModPage::updateModVersions()
 | 
			
		||||
    auto packProfile = (dynamic_cast<MinecraftInstance*>(m_instance))->getPackProfile();
 | 
			
		||||
 | 
			
		||||
    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++) {
 | 
			
		||||
        auto version = current.versions[i];
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user