From 010e07eb4552d805ad3dc08347531d9bad6b3c24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 13 Mar 2016 19:45:34 +0100 Subject: [PATCH] NOISSUE clean up forge installer --- logic/CMakeLists.txt | 1 - logic/minecraft/MinecraftProfile.cpp | 2 +- logic/minecraft/NullProfileStrategy.h | 32 --- logic/minecraft/forge/ForgeInstaller.cpp | 243 +++++++++--------- logic/minecraft/forge/ForgeInstaller.h | 4 +- .../minecraft/onesix/OneSixVersionFormat.cpp | 18 -- logic/minecraft/onesix/OneSixVersionFormat.h | 3 - 7 files changed, 131 insertions(+), 172 deletions(-) delete mode 100644 logic/minecraft/NullProfileStrategy.h 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 #include "minecraft/VersionFilterData.h" +#include "minecraft/MinecraftVersion.h" #include "Env.h" #include "Exception.h" #include @@ -44,7 +45,7 @@ ForgeInstaller::ForgeInstaller() : BaseInstaller() void ForgeInstaller::prepare(const QString &filename, const QString &universalUrl) { - std::shared_ptr 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 blacklist{"authlib", "realms"}; - // - QList 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()) + return false; + } + + // A blacklist + QSet blacklist{"authlib", "realms"}; + QList xzlist{"org.scala-lang", "com.typesafe"}; + + // get the minecraft version from the instance + VersionFilePtr minecraft; + auto minecraftPatch = to->getMinecraftProfile()->versionPatch("net.minecraft"); + if(minecraftPatch) + { + minecraft = std::dynamic_pointer_cast(minecraftPatch); + if(!minecraft) { - QString libName = lib->artifactId(); - QString rawName = lib->rawName(); - - // ignore lwjgl libraries. - if (g_VersionFilterData.lwjglWhitelist.contains(lib->artifactPrefix())) - continue; - // ignore other blacklisted (realms, authlib) - if (blacklist.contains(libName)) - continue; - - // 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) + auto mcWrap = std::dynamic_pointer_cast(minecraftPatch); + if(mcWrap) { - 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); - } + minecraft = mcWrap->getVersionFile(); } - else - { - if (libName.contains("minecraftforge")) - { - lib->setAbsoluteUrl(m_universal_url); - } - } - - // WARNING: This could actually break. - // mark bad libraries based on the xzlist above - for (auto entry : xzlist) - { - qDebug() << "Testing " << rawName << " : " << entry; - if (rawName.startsWith(entry)) - { - lib->setHint("forge-pack-xz"); - break; - } - } - - 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 (tolib->artifactId() != libName) - continue; - if (OneSixVersionFormat::libraryToJson(tolib.get()) == libObj) - { - equals = true; - } - break; - } - if (equals) - { - continue; - } - */ - libraries.append(libObj); - } - obj.insert("libraries", libraries); - obj.insert("mainClass", m_forge_json->getMainClass()); - QString args = m_forge_json->getMinecraftArguments(); - QStringList tweakers; - { - QRegularExpression expression("--tweakClass ([a-zA-Z0-9\\.]*)"); - QRegularExpressionMatch match = expression.match(args); - while (match.hasMatch()) - { - tweakers.append(match.captured(1)); - args.remove(match.capturedStart(), match.capturedLength()); - match = expression.match(args); - } - } - // FIXME: use upstream Minecraft version files instead, not the processed profile! - if (!args.isEmpty() /* && args != to->getMinecraftProfile()->getVanillaMinecraftArguments() */) - { - obj.insert("minecraftArguments", args); - } - if (!tweakers.isEmpty()) - { - obj.insert("+tweakers", QJsonArray::fromStringList(tweakers)); } } - obj.insert("name", QString("Forge")); - obj.insert("fileId", id()); - obj.insert("version", m_forgeVersionString); - obj.insert("mcVersion", to->intendedVersionId()); + // for each library in the version we are adding (except for the blacklisted) + QMutableListIterator iter(m_forge_json->libraries); + while (iter.hasNext()) + { + auto library = iter.next(); + QString libName = library->artifactId(); + QString libVersion = library->version(); + QString rawName = library->rawName(); - QFile file(filename(to->instanceRoot())); + // 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) + { + if(library->artifactPrefix() == lib->artifactPrefix() && library->version() == lib->version()) + { + found = true; + break; + } + } + if (found) + continue; + } + + // if this is the actual forge lib, set an absolute url for the download + if (m_forge_version->type == ForgeVersion::Gradle) + { + if (libName == "forge") + { + library->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)); + library->setRawName(spec); + } + } + else + { + if (libName.contains("minecraftforge")) + { + library->setAbsoluteUrl(m_universal_url); + } + } + + // mark bad libraries based on the xzlist above + for (auto entry : xzlist) + { + qDebug() << "Testing " << rawName << " : " << entry; + if (rawName.startsWith(entry)) + { + library->setHint("forge-pack-xz"); + break; + } + } + } + QString &args = m_forge_json->minecraftArguments; + QStringList tweakers; + { + QRegularExpression expression("--tweakClass ([a-zA-Z0-9\\.]*)"); + QRegularExpressionMatch match = expression.match(args); + while (match.hasMatch()) + { + 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(); + } + + 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; + + 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 m_forge_json; + std::shared_ptr m_forge_json; // the actual forge version std::shared_ptr 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 #include #include "minecraft/ParseUtils.h" #include @@ -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 OneSixVersionFormat::profileFromSingleJson(const QJsonObject &obj) -{ - std::shared_ptr 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 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);