summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2016-03-13 19:45:34 +0100
committerPetr Mrázek <peterix@gmail.com>2016-03-26 17:05:27 +0100
commit010e07eb4552d805ad3dc08347531d9bad6b3c24 (patch)
tree7e45475b6c4c269ff748f625d926f5345bec559d
parent576d808d7197b4b7ef798891dfd138e2e8aae54f (diff)
downloadMultiMC-010e07eb4552d805ad3dc08347531d9bad6b3c24.tar
MultiMC-010e07eb4552d805ad3dc08347531d9bad6b3c24.tar.gz
MultiMC-010e07eb4552d805ad3dc08347531d9bad6b3c24.tar.lz
MultiMC-010e07eb4552d805ad3dc08347531d9bad6b3c24.tar.xz
MultiMC-010e07eb4552d805ad3dc08347531d9bad6b3c24.zip
NOISSUE clean up forge installer
-rw-r--r--logic/CMakeLists.txt1
-rw-r--r--logic/minecraft/MinecraftProfile.cpp2
-rw-r--r--logic/minecraft/NullProfileStrategy.h32
-rw-r--r--logic/minecraft/forge/ForgeInstaller.cpp203
-rw-r--r--logic/minecraft/forge/ForgeInstaller.h4
-rw-r--r--logic/minecraft/onesix/OneSixVersionFormat.cpp18
-rw-r--r--logic/minecraft/onesix/OneSixVersionFormat.h3
7 files changed, 111 insertions, 152 deletions
diff --git a/logic/CMakeLists.txt b/logic/CMakeLists.txt
index b8c36794..62a4e738 100644
--- a/logic/CMakeLists.txt
+++ b/logic/CMakeLists.txt
@@ -185,7 +185,6 @@ set(LOGIC_SOURCES
minecraft/MinecraftVersion.h
minecraft/MinecraftVersionList.cpp
minecraft/MinecraftVersionList.h
- minecraft/NullProfileStrategy.h
minecraft/Rule.cpp
minecraft/Rule.h
minecraft/OpSys.cpp
diff --git a/logic/minecraft/MinecraftProfile.cpp b/logic/minecraft/MinecraftProfile.cpp
index 1429e7b2..80021672 100644
--- a/logic/minecraft/MinecraftProfile.cpp
+++ b/logic/minecraft/MinecraftProfile.cpp
@@ -22,7 +22,7 @@
#include "minecraft/MinecraftProfile.h"
#include "ProfileUtils.h"
-#include "NullProfileStrategy.h"
+#include "ProfileStrategy.h"
#include "Exception.h"
MinecraftProfile::MinecraftProfile(ProfileStrategy *strategy)
diff --git a/logic/minecraft/NullProfileStrategy.h b/logic/minecraft/NullProfileStrategy.h
deleted file mode 100644
index 44a46060..00000000
--- a/logic/minecraft/NullProfileStrategy.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#pragma once
-
-#include "ProfileStrategy.h"
-
-class NullProfileStrategy: public ProfileStrategy
-{
- virtual bool installJarMods(QStringList filepaths)
- {
- return false;
- }
- virtual void load() {};
- virtual bool removePatch(ProfilePatchPtr jarMod)
- {
- return false;
- }
- virtual bool customizePatch(ProfilePatchPtr patch)
- {
- return false;
- }
- virtual bool revertPatch(ProfilePatchPtr patch)
- {
- return false;
- }
- virtual bool resetOrder()
- {
- return false;
- }
- virtual bool saveOrder(ProfileUtils::PatchOrder order)
- {
- return false;
- }
-};
diff --git a/logic/minecraft/forge/ForgeInstaller.cpp b/logic/minecraft/forge/ForgeInstaller.cpp
index c42a8e18..9ed040de 100644
--- a/logic/minecraft/forge/ForgeInstaller.cpp
+++ b/logic/minecraft/forge/ForgeInstaller.cpp
@@ -23,6 +23,7 @@
#include "minecraft/onesix/OneSixInstance.h"
#include <minecraft/onesix/OneSixVersionFormat.h>
#include "minecraft/VersionFilterData.h"
+#include "minecraft/MinecraftVersion.h"
#include "Env.h"
#include "Exception.h"
#include <FileSystem.h>
@@ -44,7 +45,7 @@ ForgeInstaller::ForgeInstaller() : BaseInstaller()
void ForgeInstaller::prepare(const QString &filename, const QString &universalUrl)
{
- std::shared_ptr<MinecraftProfile> newVersion;
+ VersionFilePtr newVersion;
m_universal_url = universalUrl;
QuaZip zip(filename);
@@ -75,11 +76,13 @@ void ForgeInstaller::prepare(const QString &filename, const QString &universalUr
if (!installVal.isObject() || !versionInfoVal.isObject())
return;
- // read the forge version info
+ try
{
- newVersion = OneSixVersionFormat::profileFromSingleJson(versionInfoVal.toObject());
- if (!newVersion)
- return;
+ newVersion = OneSixVersionFormat::versionFileFromJson(QJsonDocument(versionInfoVal.toObject()), QString(), false);
+ }
+ catch(Exception &err)
+ {
+ return;
}
QJsonObject installObj = installVal.toObject();
@@ -119,7 +122,6 @@ void ForgeInstaller::prepare(const QString &filename, const QString &universalUr
file.close();
m_forge_json = newVersion;
- //m_forge_json->id = installObj.value("minecraft").toString();
}
bool ForgeInstaller::add(OneSixInstance *to)
@@ -129,130 +131,141 @@ bool ForgeInstaller::add(OneSixInstance *to)
return false;
}
- QJsonObject obj;
- obj.insert("order", 5);
-
if (!m_forge_json)
- return false;
{
- QJsonArray libraries;
- // A blacklist
- QSet<QString> blacklist{"authlib", "realms"};
- //
- QList<QString> xzlist{"org.scala-lang", "com.typesafe"};
- // for each library in the version we are adding (except for the blacklisted)
- for (auto lib : m_forge_json->getLibraries())
- {
- QString libName = lib->artifactId();
- QString rawName = lib->rawName();
+ return false;
+ }
- // ignore lwjgl libraries.
- if (g_VersionFilterData.lwjglWhitelist.contains(lib->artifactPrefix()))
- continue;
- // ignore other blacklisted (realms, authlib)
- if (blacklist.contains(libName))
- continue;
+ // A blacklist
+ QSet<QString> blacklist{"authlib", "realms"};
+ QList<QString> xzlist{"org.scala-lang", "com.typesafe"};
- // WARNING: This could actually break.
- // if this is the actual forge lib, set an absolute url for the download
- if (m_forge_version->type == ForgeVersion::Gradle)
- {
- if (libName == "forge")
- {
- lib->setClassifier("universal");
- }
- else if (libName == "minecraftforge")
- {
- QString forgeCoord("net.minecraftforge:forge:%1:universal");
- // using insane form of the MC version...
- QString longVersion =
- m_forge_version->mcver + "-" + m_forge_version->jobbuildver;
- GradleSpecifier spec(forgeCoord.arg(longVersion));
- lib->setRawName(spec);
- }
- }
- else
+ // get the minecraft version from the instance
+ VersionFilePtr minecraft;
+ auto minecraftPatch = to->getMinecraftProfile()->versionPatch("net.minecraft");
+ if(minecraftPatch)
+ {
+ minecraft = std::dynamic_pointer_cast<VersionFile>(minecraftPatch);
+ if(!minecraft)
+ {
+ auto mcWrap = std::dynamic_pointer_cast<MinecraftVersion>(minecraftPatch);
+ if(mcWrap)
{
- if (libName.contains("minecraftforge"))
- {
- lib->setAbsoluteUrl(m_universal_url);
- }
+ minecraft = mcWrap->getVersionFile();
}
+ }
+ }
- // WARNING: This could actually break.
- // mark bad libraries based on the xzlist above
- for (auto entry : xzlist)
+ // for each library in the version we are adding (except for the blacklisted)
+ QMutableListIterator<LibraryPtr> iter(m_forge_json->libraries);
+ while (iter.hasNext())
+ {
+ auto library = iter.next();
+ QString libName = library->artifactId();
+ QString libVersion = library->version();
+ QString rawName = library->rawName();
+
+ // ignore lwjgl libraries.
+ if (g_VersionFilterData.lwjglWhitelist.contains(library->artifactPrefix()))
+ {
+ iter.remove();
+ continue;
+ }
+ // ignore other blacklisted (realms, authlib)
+ if (blacklist.contains(libName))
+ {
+ iter.remove();
+ continue;
+ }
+ // if minecraft version was found, ignore everything that is already in the minecraft version
+ if(minecraft)
+ {
+ bool found = false;
+ for (auto & lib: minecraft->libraries)
{
- qDebug() << "Testing " << rawName << " : " << entry;
- if (rawName.startsWith(entry))
+ if(library->artifactPrefix() == lib->artifactPrefix() && library->version() == lib->version())
{
- lib->setHint("forge-pack-xz");
+ found = true;
break;
}
}
+ if (found)
+ continue;
+ }
- QJsonObject libObj = OneSixVersionFormat::libraryToJson(lib.get());
-
- // FIXME: use upstream Minecraft version files instead, not the processed profile!
- /*
- bool equals = false;
- // find an entry that matches this one
- for (auto tolib : to->getMinecraftProfile()->getVanillaLibraries())
+ // if this is the actual forge lib, set an absolute url for the download
+ if (m_forge_version->type == ForgeVersion::Gradle)
+ {
+ if (libName == "forge")
{
- if (tolib->artifactId() != libName)
- continue;
- if (OneSixVersionFormat::libraryToJson(tolib.get()) == libObj)
- {
- equals = true;
- }
- break;
+ library->setClassifier("universal");
}
- if (equals)
+ else if (libName == "minecraftforge")
{
- continue;
+ QString forgeCoord("net.minecraftforge:forge:%1:universal");
+ // using insane form of the MC version...
+ QString longVersion = m_forge_version->mcver + "-" + m_forge_version->jobbuildver;
+ GradleSpecifier spec(forgeCoord.arg(longVersion));
+ library->setRawName(spec);
}
- */
- libraries.append(libObj);
}
- obj.insert("libraries", libraries);
- obj.insert("mainClass", m_forge_json->getMainClass());
- QString args = m_forge_json->getMinecraftArguments();
- QStringList tweakers;
+ else
{
- QRegularExpression expression("--tweakClass ([a-zA-Z0-9\\.]*)");
- QRegularExpressionMatch match = expression.match(args);
- while (match.hasMatch())
+ if (libName.contains("minecraftforge"))
{
- tweakers.append(match.captured(1));
- args.remove(match.capturedStart(), match.capturedLength());
- match = expression.match(args);
+ library->setAbsoluteUrl(m_universal_url);
}
}
- // FIXME: use upstream Minecraft version files instead, not the processed profile!
- if (!args.isEmpty() /* && args != to->getMinecraftProfile()->getVanillaMinecraftArguments() */)
+
+ // mark bad libraries based on the xzlist above
+ for (auto entry : xzlist)
{
- obj.insert("minecraftArguments", args);
+ qDebug() << "Testing " << rawName << " : " << entry;
+ if (rawName.startsWith(entry))
+ {
+ library->setHint("forge-pack-xz");
+ break;
+ }
}
- if (!tweakers.isEmpty())
+ }
+ QString &args = m_forge_json->minecraftArguments;
+ QStringList tweakers;
+ {
+ QRegularExpression expression("--tweakClass ([a-zA-Z0-9\\.]*)");
+ QRegularExpressionMatch match = expression.match(args);
+ while (match.hasMatch())
{
- obj.insert("+tweakers", QJsonArray::fromStringList(tweakers));
+ tweakers.append(match.captured(1));
+ args.remove(match.capturedStart(), match.capturedLength());
+ match = expression.match(args);
}
+ if(tweakers.size())
+ {
+ args.operator=(args.trimmed());
+ m_forge_json->addTweakers = tweakers;
+ }
+ }
+ if(minecraft && args == minecraft->minecraftArguments)
+ {
+ args.clear();
}
- obj.insert("name", QString("Forge"));
- obj.insert("fileId", id());
- obj.insert("version", m_forgeVersionString);
- obj.insert("mcVersion", to->intendedVersionId());
+ m_forge_json->name = "Forge";
+ m_forge_json->fileId = id();
+ m_forge_json->version = m_forgeVersionString;
+ m_forge_json->mcVersion = to->intendedVersionId();
+ m_forge_json->id.clear();
+ m_forge_json->order = 5;
- QFile file(filename(to->instanceRoot()));
+ QSaveFile file(filename(to->instanceRoot()));
if (!file.open(QFile::WriteOnly))
{
qCritical() << "Error opening" << file.fileName()
<< "for reading:" << file.errorString();
return false;
}
- file.write(QJsonDocument(obj).toJson());
- file.close();
+ file.write(OneSixVersionFormat::profilePatchToJson(m_forge_json, true).toJson());
+ file.commit();
return true;
}
diff --git a/logic/minecraft/forge/ForgeInstaller.h b/logic/minecraft/forge/ForgeInstaller.h
index 0de762b6..499a6fb3 100644
--- a/logic/minecraft/forge/ForgeInstaller.h
+++ b/logic/minecraft/forge/ForgeInstaller.h
@@ -22,7 +22,7 @@
#include "multimc_logic_export.h"
-class MinecraftProfile;
+class VersionFile;
class ForgeInstallTask;
struct ForgeVersion;
@@ -42,7 +42,7 @@ protected:
private:
// the parsed version json, read from the installer
- std::shared_ptr<MinecraftProfile> m_forge_json;
+ std::shared_ptr<VersionFile> m_forge_json;
// the actual forge version
std::shared_ptr<ForgeVersion> m_forge_version;
QString internalPath;
diff --git a/logic/minecraft/onesix/OneSixVersionFormat.cpp b/logic/minecraft/onesix/OneSixVersionFormat.cpp
index d9aff535..e262cecd 100644
--- a/logic/minecraft/onesix/OneSixVersionFormat.cpp
+++ b/logic/minecraft/onesix/OneSixVersionFormat.cpp
@@ -1,5 +1,4 @@
#include "OneSixVersionFormat.h"
-#include <minecraft/NullProfileStrategy.h>
#include <Json.h>
#include "minecraft/ParseUtils.h"
#include <minecraft/MinecraftVersion.h>
@@ -283,23 +282,6 @@ QJsonDocument OneSixVersionFormat::profilePatchToJson(const ProfilePatchPtr &pat
throw VersionIncomplete(QObject::tr("Unhandled object type while processing %1").arg(patch->getName()));
}
-std::shared_ptr<MinecraftProfile> OneSixVersionFormat::profileFromSingleJson(const QJsonObject &obj)
-{
- std::shared_ptr<MinecraftProfile> version(new MinecraftProfile(new NullProfileStrategy()));
- try
- {
- version->clear();
- auto file = versionFileFromJson(QJsonDocument(obj), QString(), false);
- file->applyTo(version.get());
- version->appendPatch(file);
- }
- catch(Exception &err)
- {
- return nullptr;
- }
- return version;
-}
-
JarmodPtr OneSixVersionFormat::jarModFromJson(const QJsonObject &libObj, const QString &filename, const QString &originalName)
{
JarmodPtr out(new Jarmod());
diff --git a/logic/minecraft/onesix/OneSixVersionFormat.h b/logic/minecraft/onesix/OneSixVersionFormat.h
index 45a961e4..3011688c 100644
--- a/logic/minecraft/onesix/OneSixVersionFormat.h
+++ b/logic/minecraft/onesix/OneSixVersionFormat.h
@@ -8,9 +8,6 @@
class OneSixVersionFormat
{
public:
- // whole profiles from single file
- static std::shared_ptr<MinecraftProfile> profileFromSingleJson(const QJsonObject &obj);
-
// version files / profile patches
static VersionFilePtr versionFileFromJson(const QJsonDocument &doc, const QString &filename, const bool requireOrder);
static QJsonDocument profilePatchToJson(const ProfilePatchPtr &patch, bool saveOrder);