summaryrefslogtreecommitdiffstats
path: root/logic/OneSixVersionBuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'logic/OneSixVersionBuilder.cpp')
-rw-r--r--logic/OneSixVersionBuilder.cpp210
1 files changed, 90 insertions, 120 deletions
diff --git a/logic/OneSixVersionBuilder.cpp b/logic/OneSixVersionBuilder.cpp
index a4bac80a..f6917697 100644
--- a/logic/OneSixVersionBuilder.cpp
+++ b/logic/OneSixVersionBuilder.cpp
@@ -32,7 +32,7 @@
#include "modutils.h"
#include "logger/QsLog.h"
-#define CURRENT_MINIMUM_LAUNCHER_VERSION 13
+#define CURRENT_MINIMUM_LAUNCHER_VERSION 14
struct VersionFile
{
@@ -201,7 +201,7 @@ struct VersionFile
return out;
}
static VersionFile fromJson(const QJsonDocument &doc, const QString &filename,
- const bool requireOrder, bool &isError)
+ const bool requireOrder, bool &isError, const OneSixVersionBuilder::ParseFlags flags = OneSixVersionBuilder::NoFlags)
{
VersionFile out;
isError = true;
@@ -260,7 +260,10 @@ struct VersionFile
}
};
- readString("id", out.id);
+ if (!(flags & OneSixVersionBuilder::IsFTBPackJson))
+ {
+ readString("id", out.id);
+ }
readString("mainClass", out.mainClass);
readString("processArguments", out.processArguments);
readString("minecraftArguments", out.overwriteMinecraftArguments);
@@ -352,7 +355,7 @@ struct VersionFile
if (root.contains("libraries"))
{
- out.shouldOverwriteLibs = true;
+ out.shouldOverwriteLibs = !(flags & OneSixVersionBuilder::IsFTBPackJson);
QJsonValue librariesVal = root.value("libraries");
if (!librariesVal.isArray())
{
@@ -376,7 +379,16 @@ struct VersionFile
QLOG_ERROR() << "Error while reading a library entry in" << filename;
return out;
}
- out.overwriteLibs.append(lib);
+ if (flags & OneSixVersionBuilder::IsFTBPackJson)
+ {
+ lib.hint = "local";
+ lib.insertType = Library::Prepend;
+ out.addLibs.prepend(lib);
+ }
+ else
+ {
+ out.overwriteLibs.append(lib);
+ }
}
}
if (root.contains("+libraries"))
@@ -795,13 +807,13 @@ OneSixVersionBuilder::OneSixVersionBuilder()
}
bool OneSixVersionBuilder::build(OneSixVersion *version, OneSixInstance *instance,
- QWidget *widgetParent, const bool onlyVanilla)
+ QWidget *widgetParent, const bool onlyVanilla, const QStringList &external)
{
OneSixVersionBuilder builder;
builder.m_version = version;
builder.m_instance = instance;
builder.m_widgetParent = widgetParent;
- return builder.build(onlyVanilla);
+ return builder.build(onlyVanilla, external);
}
bool OneSixVersionBuilder::read(OneSixVersion *version, const QJsonObject &obj)
@@ -813,14 +825,34 @@ bool OneSixVersionBuilder::read(OneSixVersion *version, const QJsonObject &obj)
return builder.read(obj);
}
-bool OneSixVersionBuilder::build(const bool onlyVanilla)
+bool OneSixVersionBuilder::build(const bool onlyVanilla, const QStringList &external)
{
m_version->clear();
QDir root(m_instance->instanceRoot());
QDir patches(root.absoluteFilePath("patches/"));
- if (QFile::exists(root.absoluteFilePath("custom.json")))
+ // if we do external files, do just those.
+ if(!external.isEmpty()) for (auto fileName : external)
+ {
+ QLOG_INFO() << "Reading" << fileName;
+ VersionFile file;
+ ParseFlags flags = fileName.endsWith("pack.json") ? IsFTBPackJson : NoFlags;
+ if (!read(QFileInfo(fileName), false, &file, flags))
+ {
+ return false;
+ }
+ file.name = QFileInfo(fileName).fileName();
+ file.fileId = "org.multimc.external." + file.name;
+ file.version = QString();
+ file.mcVersion = QString();
+ bool isError = false;
+ auto errorcode = file.applyTo(m_version);
+ if(errorcode != VersionFile::NoApplyError)
+ return false;
+ }
+ // else, if there's custom json, we just do that.
+ else if (QFile::exists(root.absoluteFilePath("custom.json")))
{
QLOG_INFO() << "Reading custom.json";
VersionFile file;
@@ -832,142 +864,79 @@ bool OneSixVersionBuilder::build(const bool onlyVanilla)
file.filename = "custom.json";
file.fileId = "org.multimc.custom.json";
file.version = QString();
- VersionFile::ApplyError error = file.applyTo(m_version);
- if (error == VersionFile::OtherError)
+ auto errorcode = file.applyTo(m_version);
+ if(errorcode != VersionFile::NoApplyError)
+ return false;
+ // QObject::tr("The version descriptors of this instance are not compatible with the current version of MultiMC"));
+ // QObject::tr("Error while applying %1. Please check MultiMC-0.log for more info.")
+ }
+ // version.json -> patches/*.json -> user.json
+ else do
+ {
+ // version.json
+ QLOG_INFO() << "Reading version.json";
+ VersionFile file;
+ if (!read(QFileInfo(root.absoluteFilePath("version.json")), false, &file))
{
- QMessageBox::critical(
- m_widgetParent, QObject::tr("Error"),
- QObject::tr(
- "Error while applying %1. Please check MultiMC-0.log for more info.")
- .arg(root.absoluteFilePath("custom.json")));
return false;
}
- else if (error == VersionFile::LauncherVersionError)
+ file.name = "version.json";
+ file.fileId = "org.multimc.version.json";
+ file.version = m_instance->intendedVersionId();
+ file.mcVersion = m_instance->intendedVersionId();
+ auto error = file.applyTo(m_version);
+ if (error != VersionFile::NoApplyError)
{
QMessageBox::critical(
m_widgetParent, QObject::tr("Error"),
- QObject::tr("The version descriptors of this instance are not compatible with the current version of MultiMC"));
+ QObject::tr(
+ "Error while applying %1. Please check MultiMC-0.log for more info.")
+ .arg(root.absoluteFilePath("version.json")));
return false;
}
- }
- else
- {
- // version.json -> patches/*.json -> user.json
- // version.json
+ if (onlyVanilla)
+ break;
+
+ // patches/
+ // load all, put into map for ordering, apply in the right order
+ QMap<QString, int> overrideOrder = readOverrideOrders(m_instance);
+
+ QMap<int, QPair<QString, VersionFile>> files;
+ for (auto info : patches.entryInfoList(QStringList() << "*.json", QDir::Files))
{
- QLOG_INFO() << "Reading version.json";
+ QLOG_INFO() << "Reading" << info.fileName();
VersionFile file;
- if (!read(QFileInfo(root.absoluteFilePath("version.json")), false, &file))
+ if (!read(info, true, &file))
{
return false;
}
- file.name = "version.json";
- file.fileId = "org.multimc.version.json";
- file.version = m_instance->intendedVersionId();
- file.mcVersion = m_instance->intendedVersionId();
- VersionFile::ApplyError error = file.applyTo(m_version);
- if (error == VersionFile::OtherError)
+ if (overrideOrder.contains(file.fileId))
{
- QMessageBox::critical(
- m_widgetParent, QObject::tr("Error"),
- QObject::tr(
- "Error while applying %1. Please check MultiMC-0.log for more info.")
- .arg(root.absoluteFilePath("version.json")));
- return false;
+ file.order = overrideOrder.value(file.fileId);
}
- else if (error == VersionFile::LauncherVersionError)
+ if (files.contains(file.order))
{
- QMessageBox::critical(
- m_widgetParent, QObject::tr("Error"),
- QObject::tr("The version descriptors of this instance are not compatible with the current version of MultiMC"));
+ QLOG_ERROR() << file.fileId << "has the same order as" << files[file.order].second.fileId;
return false;
}
+ files.insert(file.order, qMakePair(info.fileName(), file));
}
-
- if (!onlyVanilla)
+ for (auto order : files.keys())
{
-
- // patches/
+ QLOG_DEBUG() << "Applying file with order" << order;
+ auto filePair = files[order];
+ auto error = filePair.second.applyTo(m_version);
+ if (error != VersionFile::NoApplyError)
{
- // load all, put into map for ordering, apply in the right order
- QMap<QString, int> overrideOrder = readOverrideOrders(m_instance);
-
- QMap<int, QPair<QString, VersionFile>> files;
- for (auto info : patches.entryInfoList(QStringList() << "*.json", QDir::Files))
- {
- QLOG_INFO() << "Reading" << info.fileName();
- VersionFile file;
- if (!read(info, true, &file))
- {
- return false;
- }
- if (overrideOrder.contains(file.fileId))
- {
- file.order = overrideOrder.value(file.fileId);
- }
- if (files.contains(file.order))
- {
- QLOG_ERROR() << file.fileId << "has the same order as"
- << files[file.order].second.fileId;
- return false;
- }
- files.insert(file.order, qMakePair(info.fileName(), file));
- }
- for (auto order : files.keys())
- {
- QLOG_DEBUG() << "Applying file with order" << order;
- auto filePair = files[order];
- VersionFile::ApplyError error = filePair.second.applyTo(m_version);
- if (error == VersionFile::OtherError)
- {
- QMessageBox::critical(
+ QMessageBox::critical(
m_widgetParent, QObject::tr("Error"),
QObject::tr("Error while applying %1. Please check MultiMC-0.log "
"for more info.").arg(filePair.first));
- return false;
- }
- else if (error == VersionFile::LauncherVersionError)
- {
- QMessageBox::critical(
- m_widgetParent, QObject::tr("Error"),
- QObject::tr("The version descriptors of this instance are not compatible with the current version of MultiMC"));
- return false;
- }
- }
- }
-
-#if 0
- // user.json
- {
- if (QFile::exists(root.absoluteFilePath("user.json")))
- {
- QLOG_INFO() << "Reading user.json";
- VersionFile file;
- if (!read(QFileInfo(root.absoluteFilePath("user.json")), false, &file))
- {
- return false;
- }
- file.name = "user.json";
- file.fileId = "org.multimc.user.json";
- file.version = QString();
- file.mcVersion = QString();
- bool isError = false;
- file.applyTo(m_version, isError);
- if (isError)
- {
- QMessageBox::critical(
- m_widgetParent, QObject::tr("Error"),
- QObject::tr(
- "Error while applying %1. Please check MultiMC-0.log for more info.")
- .arg(root.absoluteFilePath("user.json")));
- return false;
- }
- }
+ return false;
}
-#endif
}
- }
+ } while(0);
// some final touches
{
@@ -1032,7 +1001,7 @@ bool OneSixVersionBuilder::read(const QJsonObject &obj)
}
bool OneSixVersionBuilder::read(const QFileInfo &fileInfo, const bool requireOrder,
- VersionFile *out)
+ VersionFile *out, const ParseFlags flags)
{
QFile file(fileInfo.absoluteFilePath());
if (!file.open(QFile::ReadOnly))
@@ -1053,7 +1022,7 @@ bool OneSixVersionBuilder::read(const QFileInfo &fileInfo, const bool requireOrd
return false;
}
bool isError = false;
- *out = VersionFile::fromJson(doc, file.fileName(), requireOrder, isError);
+ *out = VersionFile::fromJson(doc, file.fileName(), requireOrder, isError, flags);
if (isError)
{
QMessageBox::critical(
@@ -1125,3 +1094,4 @@ bool OneSixVersionBuilder::writeOverrideOrders(const QMap<QString, int> &order,
orderFile.write(QJsonDocument(obj).toJson(QJsonDocument::Indented));
return true;
}
+