diff --git a/launcher/minecraft/mod/LocalModParseTask.cpp b/launcher/minecraft/mod/LocalModParseTask.cpp index 8ac5885f..eb101b1c 100644 --- a/launcher/minecraft/mod/LocalModParseTask.cpp +++ b/launcher/minecraft/mod/LocalModParseTask.cpp @@ -262,6 +262,51 @@ std::shared_ptr ReadFabricModInfo(QByteArray contents) return details; } +// https://github.com/QuiltMC/rfcs/blob/master/specification/0002-quilt.mod.json.md +std::shared_ptr ReadQuiltModInfo(QByteArray contents) +{ + QJsonParseError jsonError; + QJsonDocument jsonDoc = QJsonDocument::fromJson(contents, &jsonError); + auto object = jsonDoc.object(); + + std::shared_ptr details = std::make_shared(); + + if (object.contains("schema_version") && object.value("schema_version").toInt() == 1) + { + QJsonObject loader = object.value("quilt_loader").toObject(); + details->mod_id = loader.value("id").toString(); + details->version = loader.value("version").toString(); + + if (loader.contains("metadata")) + { + QJsonObject metadata = loader.value("metadata").toObject(); + details->name = metadata.contains("name") ? metadata.value("name").toString() : details->mod_id; + + if (metadata.contains("description")) + { + details->description = metadata.value("description").toString(); + } + + if (metadata.contains("contributors")) + { + // NOTE: This lists every contributor, not just "authors" + details->authors = metadata.value("contributors").toObject().keys(); + } + + if (object.contains("contact")) + { + QJsonObject contact = object.value("contact").toObject(); + + if (contact.contains("homepage")) + { + details->homeurl = contact.value("homepage").toString(); + } + } + } + } + return details; +} + std::shared_ptr ReadForgeInfo(QByteArray contents) { std::shared_ptr details = std::make_shared(); @@ -404,6 +449,20 @@ void LocalModParseTask::processAsZip() zip.close(); return; } + else if (zip.setCurrentFile("quilt.mod.json")) + { + if (!file.open(QIODevice::ReadOnly)) + { + zip.close(); + return; + } + + m_result->details = ReadQuiltModInfo(file.readAll()); + file.close(); + zip.close(); + return; + + } else if (zip.setCurrentFile("forgeversion.properties")) { if (!file.open(QIODevice::ReadOnly))