summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Dalheimer <jan@dalheimer.de>2014-02-21 18:01:06 +0100
committerJan Dalheimer <jan@dalheimer.de>2014-02-21 18:01:06 +0100
commitf54705e1c5311e023b2e1ebd5d4db226a7c7149e (patch)
tree83f7daccc58bb2bdeb89815f8a962356f35d5b79
parent43881b9cdba95259395c8bf633b670c8a6fead9a (diff)
downloadMultiMC-f54705e1c5311e023b2e1ebd5d4db226a7c7149e.tar
MultiMC-f54705e1c5311e023b2e1ebd5d4db226a7c7149e.tar.gz
MultiMC-f54705e1c5311e023b2e1ebd5d4db226a7c7149e.tar.lz
MultiMC-f54705e1c5311e023b2e1ebd5d4db226a7c7149e.tar.xz
MultiMC-f54705e1c5311e023b2e1ebd5d4db226a7c7149e.zip
Don't assume forge for FTB instances. Fix FTB related stuff.
-rw-r--r--logic/BaseInstance.h2
-rw-r--r--logic/InstanceFactory.cpp3
-rw-r--r--logic/OneSixFTBInstance.cpp34
-rw-r--r--logic/OneSixFTBInstance.h8
-rw-r--r--logic/OneSixInstance.cpp14
-rw-r--r--logic/OneSixInstance.h3
-rw-r--r--logic/OneSixVersion.cpp5
-rw-r--r--logic/OneSixVersion.h2
-rw-r--r--logic/OneSixVersionBuilder.cpp253
-rw-r--r--logic/OneSixVersionBuilder.h16
-rw-r--r--logic/lists/InstanceList.cpp2
11 files changed, 204 insertions, 138 deletions
diff --git a/logic/BaseInstance.h b/logic/BaseInstance.h
index cd49f99b..d4007a41 100644
--- a/logic/BaseInstance.h
+++ b/logic/BaseInstance.h
@@ -51,6 +51,8 @@ public:
/// virtual destructor to make sure the destruction is COMPLETE
virtual ~BaseInstance() {};
+ virtual void init() {}
+
/// nuke thoroughly - deletes the instance contents, notifies the list/model which is
/// responsible of cleaning up the husk
void nuke();
diff --git a/logic/InstanceFactory.cpp b/logic/InstanceFactory.cpp
index 807bccd0..2c89bf43 100644
--- a/logic/InstanceFactory.cpp
+++ b/logic/InstanceFactory.cpp
@@ -75,6 +75,7 @@ InstanceFactory::InstLoadError InstanceFactory::loadInstance(BaseInstance *&inst
{
return InstanceFactory::UnknownLoadError;
}
+ inst->init();
return NoLoadError;
}
@@ -156,6 +157,8 @@ InstanceFactory::InstCreateError InstanceFactory::createInstance(BaseInstance *&
return InstanceFactory::NoSuchVersion;
}
+ inst->init();
+
// FIXME: really, how do you even know?
return InstanceFactory::NoCreateError;
}
diff --git a/logic/OneSixFTBInstance.cpp b/logic/OneSixFTBInstance.cpp
index 8f745f93..4bd30b1d 100644
--- a/logic/OneSixFTBInstance.cpp
+++ b/logic/OneSixFTBInstance.cpp
@@ -5,6 +5,7 @@
#include "tasks/SequentialTask.h"
#include "ForgeInstaller.h"
#include "lists/ForgeVersionList.h"
+#include "OneSixInstance_p.h"
#include "MultiMC.h"
class OneSixFTBInstanceForge : public Task
@@ -80,14 +81,11 @@ private:
OneSixFTBInstance::OneSixFTBInstance(const QString &rootDir, SettingsObject *settings, QObject *parent) :
OneSixInstance(rootDir, settings, parent)
{
- QFile f(QDir(minecraftRoot()).absoluteFilePath("pack.json"));
- if (f.open(QFile::ReadOnly))
- {
- QString data = QString::fromUtf8(f.readAll());
- QRegularExpressionMatch match = QRegularExpression("net.minecraftforge:minecraftforge:[\\.\\d]*").match(data);
- m_forge.reset(new OneSixLibrary(match.captured()));
- m_forge->finalize();
- }
+}
+
+void OneSixFTBInstance::init()
+{
+ reloadVersion();
}
QString OneSixFTBInstance::id() const
@@ -104,6 +102,13 @@ QDir OneSixFTBInstance::versionsPath() const
return QDir(MMC->settings()->get("FTBRoot").toString() + "/versions");
}
+QStringList OneSixFTBInstance::externalPatches() const
+{
+ I_D(OneSixInstance);
+ return QStringList() << versionsPath().absoluteFilePath(intendedVersionId() + "/" + intendedVersionId() + ".json")
+ << minecraftRoot() + "/pack.json";
+}
+
QString OneSixFTBInstance::getStatusbarDescription()
{
return "OneSix FTB: " + intendedVersionId();
@@ -115,18 +120,7 @@ bool OneSixFTBInstance::menuActionEnabled(QString action_name) const
std::shared_ptr<Task> OneSixFTBInstance::doUpdate()
{
- std::shared_ptr<SequentialTask> task;
- task.reset(new SequentialTask(this));
- if (!MMC->forgelist()->isLoaded())
- {
- task->addTask(std::shared_ptr<Task>(MMC->forgelist()->getLoadTask()));
- }
- task->addTask(OneSixInstance::doUpdate());
- task->addTask(std::shared_ptr<Task>(new OneSixFTBInstanceForge(m_forge->version(), this, this)));
- //FIXME: yes. this may appear dumb. but the previous step can change the list, so we do it all again.
- //TODO: Add a graph task. Construct graphs of tasks so we may capture the logic properly.
- task->addTask(OneSixInstance::doUpdate());
- return task;
+ return OneSixInstance::doUpdate();
}
#include "OneSixFTBInstance.moc"
diff --git a/logic/OneSixFTBInstance.h b/logic/OneSixFTBInstance.h
index d3ceb190..bcf3df8f 100644
--- a/logic/OneSixFTBInstance.h
+++ b/logic/OneSixFTBInstance.h
@@ -10,6 +10,9 @@ class OneSixFTBInstance : public OneSixInstance
public:
explicit OneSixFTBInstance(const QString &rootDir, SettingsObject *settings,
QObject *parent = 0);
+
+ void init() override;
+
virtual QString getStatusbarDescription();
virtual bool menuActionEnabled(QString action_name) const;
@@ -17,8 +20,9 @@ public:
virtual QString id() const;
- virtual QDir librariesPath() const override;
- virtual QDir versionsPath() const override;
+ QDir librariesPath() const override;
+ QDir versionsPath() const override;
+ QStringList externalPatches() const override;
private:
std::shared_ptr<OneSixLibrary> m_forge;
diff --git a/logic/OneSixInstance.cpp b/logic/OneSixInstance.cpp
index 8b4de641..f7e56591 100644
--- a/logic/OneSixInstance.cpp
+++ b/logic/OneSixInstance.cpp
@@ -36,6 +36,10 @@ OneSixInstance::OneSixInstance(const QString &rootDir, SettingsObject *settings,
d->m_settings->registerSetting("ShouldUpdate", false);
d->version.reset(new OneSixVersion(this, this));
d->vanillaVersion.reset(new OneSixVersion(this, this));
+}
+
+void OneSixInstance::init()
+{
if (QDir(instanceRoot()).exists("version.json"))
{
reloadVersion();
@@ -316,11 +320,12 @@ bool OneSixInstance::reloadVersion(QWidget *widgetParent)
{
I_D(OneSixInstance);
- bool ret = d->version->reload(widgetParent);
+ bool ret = d->version->reload(widgetParent, false, externalPatches());
if (ret)
{
- ret = d->vanillaVersion->reload(widgetParent, true);
+ ret = d->vanillaVersion->reload(widgetParent, true, externalPatches());
}
+
emit versionReloaded();
return ret;
}
@@ -381,6 +386,11 @@ QDir OneSixInstance::versionsPath() const
return QDir::current().absoluteFilePath("versions");
}
+QStringList OneSixInstance::externalPatches() const
+{
+ return QStringList();
+}
+
QString OneSixInstance::loaderModsDir() const
{
return PathCombine(minecraftRoot(), "mods");
diff --git a/logic/OneSixInstance.h b/logic/OneSixInstance.h
index 4ea5fce1..96526693 100644
--- a/logic/OneSixInstance.h
+++ b/logic/OneSixInstance.h
@@ -27,6 +27,8 @@ public:
explicit OneSixInstance(const QString &rootDir, SettingsObject *settings,
QObject *parent = 0);
+ virtual void init() override;
+
////// Mod Lists //////
std::shared_ptr<ModList> loaderModList();
std::shared_ptr<ModList> resourcePackList();
@@ -70,6 +72,7 @@ public:
virtual QDir librariesPath() const;
virtual QDir versionsPath() const;
+ virtual QStringList externalPatches() const;
signals:
void versionReloaded();
diff --git a/logic/OneSixVersion.cpp b/logic/OneSixVersion.cpp
index fb32f3a8..ed8d5fa5 100644
--- a/logic/OneSixVersion.cpp
+++ b/logic/OneSixVersion.cpp
@@ -26,10 +26,10 @@ OneSixVersion::OneSixVersion(OneSixInstance *instance, QObject *parent)
clear();
}
-bool OneSixVersion::reload(QWidget *widgetParent, const bool onlyVanilla)
+bool OneSixVersion::reload(QWidget *widgetParent, const bool onlyVanilla, const QStringList &external)
{
beginResetModel();
- bool ret = OneSixVersionBuilder::build(this, m_instance, widgetParent, onlyVanilla);
+ bool ret = OneSixVersionBuilder::build(this, m_instance, widgetParent, onlyVanilla, external);
endResetModel();
return ret;
}
@@ -104,6 +104,7 @@ QList<std::shared_ptr<OneSixLibrary> > OneSixVersion::getActiveNormalLibs()
QList<std::shared_ptr<OneSixLibrary> > output;
for (auto lib : libraries)
{
+ qDebug() << "Checking" << lib->rawName() << lib->isActive() << !lib->isNative();
if (lib->isActive() && !lib->isNative())
{
output.append(lib);
diff --git a/logic/OneSixVersion.h b/logic/OneSixVersion.h
index ba7695d5..fee47fa3 100644
--- a/logic/OneSixVersion.h
+++ b/logic/OneSixVersion.h
@@ -37,7 +37,7 @@ public:
virtual int columnCount(const QModelIndex &parent) const;
virtual Qt::ItemFlags flags(const QModelIndex &index) const;
- bool reload(QWidget *widgetParent, const bool onlyVanilla = false);
+ bool reload(QWidget *widgetParent, const bool onlyVanilla = false, const QStringList &external = QStringList());
void clear();
void dump() const;
diff --git a/logic/OneSixVersionBuilder.cpp b/logic/OneSixVersionBuilder.cpp
index bbd33ddc..f1d0477e 100644
--- a/logic/OneSixVersionBuilder.cpp
+++ b/logic/OneSixVersionBuilder.cpp
@@ -192,7 +192,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;
@@ -251,7 +251,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);
@@ -343,7 +346,7 @@ struct VersionFile
if (root.contains("libraries"))
{
- out.shouldOverwriteLibs = true;
+ out.shouldOverwriteLibs = !(flags & OneSixVersionBuilder::IsFTBPackJson);
QJsonValue librariesVal = root.value("libraries");
if (!librariesVal.isArray())
{
@@ -367,7 +370,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"))
@@ -775,13 +787,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)
@@ -793,140 +805,171 @@ 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")))
- {
- QLOG_INFO() << "Reading custom.json";
- VersionFile file;
- if (!read(QFileInfo(root.absoluteFilePath("custom.json")), false, &file))
- {
- return false;
- }
- file.name = "custom.json";
- file.filename = "custom.json";
- file.fileId = "org.multimc.custom.json";
- file.version = 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("custom.json")));
- return false;
- }
- }
- else
+ if (external.isEmpty())
{
- // version.json -> patches/*.json -> user.json
-
- // version.json
+ if (QFile::exists(root.absoluteFilePath("custom.json")))
{
- QLOG_INFO() << "Reading version.json";
+ QLOG_INFO() << "Reading custom.json";
VersionFile file;
- if (!read(QFileInfo(root.absoluteFilePath("version.json")), false, &file))
+ if (!read(QFileInfo(root.absoluteFilePath("custom.json")), false, &file))
{
return false;
}
- file.name = "version.json";
- file.fileId = "org.multimc.version.json";
- file.version = m_instance->intendedVersionId();
- file.mcVersion = m_instance->intendedVersionId();
+ file.name = "custom.json";
+ file.filename = "custom.json";
+ file.fileId = "org.multimc.custom.json";
+ file.version = 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("version.json")));
+ 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;
}
}
-
- if (!onlyVanilla)
+ else
{
+ // version.json -> patches/*.json -> user.json
- // patches/
+ // version.json
{
- // 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";
+ VersionFile file;
+ if (!read(QFileInfo(root.absoluteFilePath("version.json")), false, &file))
{
- 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));
+ return false;
}
- for (auto order : files.keys())
+ file.name = "version.json";
+ file.fileId = "org.multimc.version.json";
+ file.version = m_instance->intendedVersionId();
+ file.mcVersion = m_instance->intendedVersionId();
+ bool isError = false;
+ file.applyTo(m_version, isError);
+ if (isError)
{
- QLOG_DEBUG() << "Applying file with order" << order;
- auto filePair = files[order];
- bool isError = false;
- filePair.second.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(filePair.first));
- return false;
- }
+ 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;
}
}
-#if 0
- // user.json
+ if (!onlyVanilla)
{
- if (QFile::exists(root.absoluteFilePath("user.json")))
+
+ // patches/
{
- QLOG_INFO() << "Reading user.json";
- VersionFile file;
- if (!read(QFileInfo(root.absoluteFilePath("user.json")), false, &file))
+ // 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))
{
- return false;
+ 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));
}
- 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)
+ for (auto order : files.keys())
{
- 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;
+ QLOG_DEBUG() << "Applying file with order" << order;
+ auto filePair = files[order];
+ bool isError = false;
+ filePair.second.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(filePair.first));
+ 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;
+ }
}
}
- }
#endif
+ }
+ }
+ }
+ else
+ {
+ 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;
+ 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(fileName));
+ return false;
+ }
}
}
@@ -986,7 +1029,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))
@@ -1007,7 +1050,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(
diff --git a/logic/OneSixVersionBuilder.h b/logic/OneSixVersionBuilder.h
index ab0966df..8cf6f32f 100644
--- a/logic/OneSixVersionBuilder.h
+++ b/logic/OneSixVersionBuilder.h
@@ -29,19 +29,27 @@ class OneSixVersionBuilder
{
OneSixVersionBuilder();
public:
- static bool build(OneSixVersion *version, OneSixInstance *instance, QWidget *widgetParent, const bool onlyVanilla);
+ static bool build(OneSixVersion *version, OneSixInstance *instance, QWidget *widgetParent, const bool onlyVanilla, const QStringList &external);
static bool read(OneSixVersion *version, const QJsonObject &obj);
static QMap<QString, int> readOverrideOrders(OneSixInstance *instance);
static bool writeOverrideOrders(const QMap<QString, int> &order, OneSixInstance *instance);
+ enum ParseFlag
+ {
+ NoFlags = 0x0,
+ IsFTBPackJson = 0x1
+ };
+ Q_DECLARE_FLAGS(ParseFlags, ParseFlag)
+
private:
OneSixVersion *m_version;
OneSixInstance *m_instance;
QWidget *m_widgetParent;
- bool build(const bool onlyVanilla);
+ bool build(const bool onlyVanilla, const QStringList &external);
bool read(const QJsonObject &obj);
- bool read(const QFileInfo &fileInfo, const bool requireOrder, VersionFile *out);
-
+ bool read(const QFileInfo &fileInfo, const bool requireOrder, VersionFile *out, const ParseFlags flags = NoFlags);
};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(OneSixVersionBuilder::ParseFlags)
diff --git a/logic/lists/InstanceList.cpp b/logic/lists/InstanceList.cpp
index cd59e6d6..9a61e2dd 100644
--- a/logic/lists/InstanceList.cpp
+++ b/logic/lists/InstanceList.cpp
@@ -336,8 +336,6 @@ QList<FTBRecord> InstanceList::discoverFTBInstances()
if (!test.exists())
continue;
record.name = attrs.value("name").toString();
- if(record.name.contains("voxel", Qt::CaseInsensitive))
- continue;
record.logo = attrs.value("logo").toString();
record.mcVersion = attrs.value("mcVersion").toString();
record.description = attrs.value("description").toString();