diff options
-rw-r--r-- | api/logic/minecraft/ComponentUpdateTask.cpp | 9 | ||||
-rw-r--r-- | api/logic/minecraft/Mod.cpp | 55 | ||||
-rw-r--r-- | api/logic/minecraft/Mod.h | 1 | ||||
-rw-r--r-- | application/pages/instance/VersionPage.cpp | 35 | ||||
-rw-r--r-- | application/pages/instance/VersionPage.h | 1 | ||||
-rw-r--r-- | application/pages/instance/VersionPage.ui | 13 |
6 files changed, 113 insertions, 1 deletions
diff --git a/api/logic/minecraft/ComponentUpdateTask.cpp b/api/logic/minecraft/ComponentUpdateTask.cpp index 37cc488d..15003160 100644 --- a/api/logic/minecraft/ComponentUpdateTask.cpp +++ b/api/logic/minecraft/ComponentUpdateTask.cpp @@ -586,6 +586,15 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) { component->m_version = "3.1.2"; } + else if (add.uid == "net.fabricmc.intermediary") + { + auto minecraft = std::find_if(components.begin(), components.end(), [](ComponentPtr & cmp){ + return cmp->getID() == "net.minecraft"; + }); + if(minecraft != components.end()) { + component->m_version = (*minecraft)->getVersion(); + } + } } // HACK HACK HACK HACK FIXME: this is a placeholder for deciding what version to use. For now, it is hardcoded. // ############################################################################################################ diff --git a/api/logic/minecraft/Mod.cpp b/api/logic/minecraft/Mod.cpp index 069a27a4..6217c9d2 100644 --- a/api/logic/minecraft/Mod.cpp +++ b/api/logic/minecraft/Mod.cpp @@ -96,6 +96,19 @@ void Mod::repath(const QFileInfo &file) zip.close(); return; } + else if (zip.setCurrentFile("fabric.mod.json")) + { + if (!file.open(QIODevice::ReadOnly)) + { + zip.close(); + return; + } + + ReadFabricModInfo(file.readAll()); + file.close(); + zip.close(); + return; + } else if (zip.setCurrentFile("forgeversion.properties")) { if (!file.open(QIODevice::ReadOnly)) @@ -224,6 +237,48 @@ void Mod::ReadMCModInfo(QByteArray contents) } } +// https://fabricmc.net/wiki/documentation:fabric_mod_json +void Mod::ReadFabricModInfo(QByteArray contents) +{ + QJsonParseError jsonError; + QJsonDocument jsonDoc = QJsonDocument::fromJson(contents, &jsonError); + auto object = jsonDoc.object(); + auto schemaVersion = object.contains("schemaVersion") ? object.value("schemaVersion").toInt(0) : 0; + + m_mod_id = object.value("id").toString(); + m_version = object.value("version").toString(); + + m_name = object.contains("name") ? object.value("name").toString() : m_mod_id; + m_description = object.value("description").toString(); + + if (schemaVersion >= 1) + { + QJsonArray authors = object.value("authors").toArray(); + m_authors = ""; + + for (int i = 0; i < authors.size(); i++) + { + QString author_name = authors.at(i).isObject() + ? authors.at(i).toObject().value("name").toString() + : authors.at(i).toString(); + + if (i > 0) + m_authors += ", " + author_name; + else { + m_authors += author_name; + } + } + + if (object.contains("contact")) + { + QJsonObject contact = object.value("contact").toObject(); + + if (contact.contains("homepage")) + m_homeurl = contact.value("homepage").toString(); + } + } +} + void Mod::ReadForgeInfo(QByteArray contents) { // Read the data diff --git a/api/logic/minecraft/Mod.h b/api/logic/minecraft/Mod.h index 6c329363..63bf5ab4 100644 --- a/api/logic/minecraft/Mod.h +++ b/api/logic/minecraft/Mod.h @@ -113,6 +113,7 @@ public: private: void ReadMCModInfo(QByteArray contents); + void ReadFabricModInfo(QByteArray contents); void ReadForgeInfo(QByteArray contents); void ReadLiteModInfo(QByteArray contents); diff --git a/application/pages/instance/VersionPage.cpp b/application/pages/instance/VersionPage.cpp index cbe4a31c..fc1755e4 100644 --- a/application/pages/instance/VersionPage.cpp +++ b/application/pages/instance/VersionPage.cpp @@ -180,6 +180,7 @@ void VersionPage::packageCurrent(const QModelIndex ¤t, const QModelIndex & void VersionPage::updateVersionControls() { + ui->fabricBtn->setEnabled(true); ui->forgeBtn->setEnabled(true); ui->liteloaderBtn->setEnabled(true); updateButtons(); @@ -187,6 +188,7 @@ void VersionPage::updateVersionControls() void VersionPage::disableVersionControls() { + ui->fabricBtn->setEnabled(false); ui->forgeBtn->setEnabled(false); ui->liteloaderBtn->setEnabled(false); ui->reloadBtn->setEnabled(false); @@ -316,6 +318,12 @@ void VersionPage::on_changeVersionBtn_clicked() return; } VersionSelectDialog vselect(list.get(), tr("Change %1 version").arg(name), this); + if (uid == "net.fabricmc.intermediary") + { + vselect.setEmptyString(tr("No Fabric Loader versions are currently available.")); + vselect.setEmptyErrorString(tr("Couldn't load or download the Fabric Loader version lists!")); + vselect.setExactFilter(BaseVersionList::ParentVersionRole, m_profile->getComponentVersion("net.minecraft")); + } auto currentVersion = patch->getVersion(); if(!currentVersion.isEmpty()) { @@ -389,6 +397,33 @@ void VersionPage::on_forgeBtn_clicked() } } +void VersionPage::on_fabricBtn_clicked() +{ + auto vlist = ENV.metadataIndex()->get("net.fabricmc.fabric-loader"); + if(!vlist) + { + return; + } + VersionSelectDialog vselect(vlist.get(), tr("Select Fabric Loader version"), this); + vselect.setEmptyString(tr("No Fabric Loader versions are currently available.")); + vselect.setEmptyErrorString(tr("Couldn't load or download the Fabric Loader version lists!")); + + auto currentVersion = m_profile->getComponentVersion("net.fabricmc.fabric-loader"); + if(!currentVersion.isEmpty()) + { + vselect.setCurrentVersion(currentVersion); + } + + if (vselect.exec() && vselect.selectedVersion()) + { + auto vsn = vselect.selectedVersion(); + m_profile->setComponentVersion("net.fabricmc.fabric-loader", vsn->descriptor()); + m_profile->resolve(Net::Mode::Online); + preselect(m_profile->rowCount(QModelIndex())-1); + m_container->refreshContainer(); + } +} + void VersionPage::on_addEmptyBtn_clicked() { NewComponentDialog compdialog(QString(), QString(), this); diff --git a/application/pages/instance/VersionPage.h b/application/pages/instance/VersionPage.h index 5432e009..4957c9ea 100644 --- a/application/pages/instance/VersionPage.h +++ b/application/pages/instance/VersionPage.h @@ -49,6 +49,7 @@ public: virtual bool shouldDisplay() const override; private slots: + void on_fabricBtn_clicked(); void on_forgeBtn_clicked(); void on_addEmptyBtn_clicked(); void on_liteloaderBtn_clicked(); diff --git a/application/pages/instance/VersionPage.ui b/application/pages/instance/VersionPage.ui index cfb13f94..2d4b0ec8 100644 --- a/application/pages/instance/VersionPage.ui +++ b/application/pages/instance/VersionPage.ui @@ -171,6 +171,16 @@ </widget> </item> <item> + <widget class="QPushButton" name="fabricBtn"> + <property name="toolTip"> + <string>Install the Fabric Loader package.</string> + </property> + <property name="text"> + <string>Install Fabric</string> + </property> + </widget> + </item> + <item> <widget class="QPushButton" name="liteloaderBtn"> <property name="toolTip"> <string>Install the LiteLoader package.</string> @@ -298,6 +308,7 @@ </customwidget> </customwidgets> <tabstops> + <tabstop>tabWidget</tabstop> <tabstop>packageView</tabstop> <tabstop>changeVersionBtn</tabstop> <tabstop>moveUpBtn</tabstop> @@ -307,6 +318,7 @@ <tabstop>editBtn</tabstop> <tabstop>revertBtn</tabstop> <tabstop>forgeBtn</tabstop> + <tabstop>fabricBtn</tabstop> <tabstop>liteloaderBtn</tabstop> <tabstop>modBtn</tabstop> <tabstop>jarmodBtn</tabstop> @@ -314,7 +326,6 @@ <tabstop>addEmptyBtn</tabstop> <tabstop>reloadBtn</tabstop> <tabstop>downloadBtn</tabstop> - <tabstop>tabWidget</tabstop> </tabstops> <resources/> <connections/> |