aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/logic/minecraft/ComponentUpdateTask.cpp9
-rw-r--r--api/logic/minecraft/Mod.cpp55
-rw-r--r--api/logic/minecraft/Mod.h1
-rw-r--r--application/pages/instance/VersionPage.cpp35
-rw-r--r--application/pages/instance/VersionPage.h1
-rw-r--r--application/pages/instance/VersionPage.ui13
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 &current, 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/>