From be53eb66f8a63730f4def5640db6205678b4e9d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 13 Apr 2017 09:28:25 +0200 Subject: NOISSUE implement mainJar support in OneSix format This allows customizing the main jar like any other library. --- api/logic/minecraft/MinecraftProfile.cpp | 45 +++++++++++++-------- api/logic/minecraft/MinecraftProfile.h | 9 ++++- api/logic/minecraft/VersionFile.cpp | 1 + api/logic/minecraft/VersionFile.h | 11 ++++-- api/logic/minecraft/onesix/OneSixInstance.cpp | 46 ++++------------------ api/logic/minecraft/onesix/OneSixInstance.h | 3 -- api/logic/minecraft/onesix/OneSixVersionFormat.cpp | 26 ++++++++++++ .../minecraft/onesix/update/LibrariesTask.cpp | 34 ++++++++-------- 8 files changed, 94 insertions(+), 81 deletions(-) (limited to 'api/logic') diff --git a/api/logic/minecraft/MinecraftProfile.cpp b/api/logic/minecraft/MinecraftProfile.cpp index c04669c1..efe4651b 100644 --- a/api/logic/minecraft/MinecraftProfile.cpp +++ b/api/logic/minecraft/MinecraftProfile.cpp @@ -517,6 +517,19 @@ void MinecraftProfile::applyLibrary(LibraryPtr library) } } +const LibraryPtr MinecraftProfile::getMainJar() const +{ + return m_mainJar; +} + +void MinecraftProfile::applyMainJar(LibraryPtr jar) +{ + if(jar) + { + m_mainJar = jar; + } +} + void MinecraftProfile::applyProblemSeverity(ProblemSeverity severity) { if (m_problemSeverity < severity) @@ -595,7 +608,7 @@ const QList & MinecraftProfile::getNativeLibraries() const return m_nativeLibraries; } -void MinecraftProfile::getLibraryFiles(const QString& architecture, QStringList& jars, QStringList& nativeJars, const QString& overridePath) const +void MinecraftProfile::getLibraryFiles(const QString& architecture, QStringList& jars, QStringList& nativeJars, const QString& overridePath, const QString& tempPath) const { QStringList native32, native64; jars.clear(); @@ -604,6 +617,20 @@ void MinecraftProfile::getLibraryFiles(const QString& architecture, QStringList& { lib->getApplicableFiles(currentSystem, jars, nativeJars, native32, native64, overridePath); } + // NOTE: order is important here, add main jar last to the lists + if(m_mainJar) + { + // FIXME: HACK!! jar modding is weird and unsystematic! + if(m_jarMods.size()) + { + QDir tempDir(tempPath); + jars.append(tempDir.absoluteFilePath("minecraft.jar")); + } + else + { + m_mainJar->getApplicableFiles(currentSystem, jars, nativeJars, native32, native64, overridePath); + } + } for (auto lib : getNativeLibraries()) { lib->getApplicableFiles(currentSystem, jars, nativeJars, native32, native64, overridePath); @@ -618,22 +645,6 @@ void MinecraftProfile::getLibraryFiles(const QString& architecture, QStringList& } } - -QString MinecraftProfile::getMainJarUrl() const -{ - auto iter = mojangDownloads.find("client"); - if(iter != mojangDownloads.end()) - { - // current - return iter.value()->url; - } - else - { - // legacy fallback - return URLConstants::getLegacyJarUrl(getMinecraftVersion()); - } -} - void MinecraftProfile::installJarMods(QStringList selectedFiles) { m_strategy->installJarMods(selectedFiles); diff --git a/api/logic/minecraft/MinecraftProfile.h b/api/logic/minecraft/MinecraftProfile.h index 5b1ea539..93a02197 100644 --- a/api/logic/minecraft/MinecraftProfile.h +++ b/api/logic/minecraft/MinecraftProfile.h @@ -101,6 +101,7 @@ public: /* application of profile variables from patches */ void applyTweakers(const QStringList &tweakers); void applyJarMods(const QList &jarMods); void applyLibrary(LibraryPtr library); + void applyMainJar(LibraryPtr jar); void applyProblemSeverity(ProblemSeverity severity); void applyMojangDownload(const QString & key, MojangDownloadInfo::Ptr download); @@ -116,8 +117,9 @@ public: /* getters for profile variables */ const QList & getJarMods() const; const QList & getLibraries() const; const QList & getNativeLibraries() const; - void getLibraryFiles(const QString & architecture, QStringList & jars, QStringList & nativeJars, const QString & overridePath) const; - QString getMainJarUrl() const; + const LibraryPtr getMainJar() const; + void getLibraryFiles(const QString & architecture, QStringList & jars, QStringList & nativeJars, const QString & overridePath, + const QString & tempPath) const; bool hasTrait(const QString & trait) const; ProblemSeverity getProblemSeverity() const; @@ -170,6 +172,9 @@ private: /* data */ /// the list of libraries QList m_libraries; + /// the main jar + LibraryPtr m_mainJar; + /// the list of libraries QList m_nativeLibraries; diff --git a/api/logic/minecraft/VersionFile.cpp b/api/logic/minecraft/VersionFile.cpp index b261ff2a..3e1461ed 100644 --- a/api/logic/minecraft/VersionFile.cpp +++ b/api/logic/minecraft/VersionFile.cpp @@ -30,6 +30,7 @@ void VersionFile::applyTo(MinecraftProfile *profile) profile->applyMinecraftAssets(mojangAssetIndex); } + profile->applyMainJar(mainJar); profile->applyMainClass(mainClass); profile->applyAppletClass(appletClass); profile->applyMinecraftArguments(minecraftArguments); diff --git a/api/logic/minecraft/VersionFile.h b/api/logic/minecraft/VersionFile.h index 312d0a3b..830e2ca0 100644 --- a/api/logic/minecraft/VersionFile.h +++ b/api/logic/minecraft/VersionFile.h @@ -41,10 +41,10 @@ public: /* data */ /// MultiMC: version of this package QString version; - /// MultiMC: dependency on a Minecraft version + /// MultiMC: DEPRECATED dependency on a Minecraft version QString dependsOnMinecraftVersion; - /// Mojang: used to version the Mojang version format + /// Mojang: DEPRECATED used to version the Mojang version format int minimumLauncherVersion = -1; /// Mojang: DEPRECATED version of Minecraft this is @@ -65,7 +65,7 @@ public: /* data */ /// Mojang: the time this version was actually released by Mojang QDateTime releaseTime; - /// Mojang: the time this version was last updated by Mojang + /// Mojang: DEPRECATED the time this version was last updated by Mojang QDateTime updateTime; /// Mojang: DEPRECATED asset group to be used with Minecraft @@ -77,6 +77,9 @@ public: /* data */ /// Mojang: list of libraries to add to the version QList libraries; + // The main jar (Minecraft version library, normally) + LibraryPtr mainJar; + /// MultiMC: list of attached traits of this version file - used to enable features QSet traits; @@ -84,7 +87,7 @@ public: /* data */ QList jarMods; public: - // Mojang: list of 'downloads' - client jar, server jar, windows server exe, maybe more. + // Mojang: DEPRECATED list of 'downloads' - client jar, server jar, windows server exe, maybe more. QMap > mojangDownloads; // Mojang: extended asset index download information diff --git a/api/logic/minecraft/onesix/OneSixInstance.cpp b/api/logic/minecraft/onesix/OneSixInstance.cpp index fd54f544..0061be08 100644 --- a/api/logic/minecraft/onesix/OneSixInstance.cpp +++ b/api/logic/minecraft/onesix/OneSixInstance.cpp @@ -159,20 +159,6 @@ QString OneSixInstance::getLocalLibraryPath() const return libraries_dir.absolutePath(); } -QString OneSixInstance::mainJarPath() const -{ - auto jarMods = getJarMods(); - if (!jarMods.isEmpty()) - { - return QDir(binRoot()).absoluteFilePath("minecraft.jar"); - } - else - { - QString relpath = m_profile->getMinecraftVersion() + "/" + m_profile->getMinecraftVersion() + ".jar"; - return versionsPath().absoluteFilePath(relpath); - } -} - QString OneSixInstance::createLaunchScript(AuthSessionPtr session) { QString launchScript; @@ -221,12 +207,11 @@ QString OneSixInstance::createLaunchScript(AuthSessionPtr session) { QStringList jars, nativeJars; auto javaArchitecture = settings()->get("JavaArchitecture").toString(); - m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath()); + m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot()); for(auto file: jars) { launchScript += "cp " + file + "\n"; } - launchScript += "cp " + mainJarPath() + "\n"; for(auto file: nativeJars) { launchScript += "ext " + file + "\n"; @@ -265,7 +250,7 @@ QStringList OneSixInstance::verboseDescription(AuthSessionPtr session) out << "Libraries:"; QStringList jars, nativeJars; auto javaArchitecture = settings()->get("JavaArchitecture").toString(); - m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath()); + m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot()); auto printLibFile = [&](const QString & path) { QFileInfo info(path); @@ -282,7 +267,6 @@ QStringList OneSixInstance::verboseDescription(AuthSessionPtr session) { printLibFile(file); } - printLibFile(mainJarPath()); out << ""; out << "Native libraries:"; for(auto file: nativeJars) @@ -390,18 +374,6 @@ std::shared_ptr OneSixInstance::createJarModdingTask() auto profile = m_inst->getMinecraftProfile(); // nuke obsolete stripped jar(s) if needed QString version_id = profile->getMinecraftVersion(); - QString strippedPath = version_id + "/" + version_id + "-stripped.jar"; - QFile strippedJar(strippedPath); - if(strippedJar.exists()) - { - strippedJar.remove(); - } - auto tempJarPath = QDir(m_inst->instanceRoot()).absoluteFilePath("temp.jar"); - QFile tempJar(tempJarPath); - if(tempJar.exists()) - { - tempJar.remove(); - } if(!FS::ensureFolderPathExists(m_inst->binRoot())) { emitFailed(tr("Couldn't create the bin folder for Minecraft.jar")); @@ -421,11 +393,10 @@ std::shared_ptr OneSixInstance::createJarModdingTask() auto jarMods = m_inst->getJarMods(); if(jarMods.size()) { - auto sourceJarPath = m_inst->versionsPath().absoluteFilePath(version_id + "/" + version_id + ".jar"); - QString localPath = version_id + "/" + version_id + ".jar"; - auto metacache = ENV.metacache(); - auto entry = metacache->resolveEntry("versions", localPath); - QString fullJarPath = entry->getFullPath(); + auto mainJar = profile->getMainJar(); + QStringList jars, temp1, temp2, temp3, temp4; + mainJar->getApplicableFiles(currentSystem, jars, temp1, temp2, temp3, m_inst->getLocalLibraryPath()); + auto sourceJarPath = jars[0]; if(!MMCZip::createModdedJar(sourceJarPath, finalJarPath, jarMods)) { emitFailed(tr("Failed to create the custom Minecraft jar file.")); @@ -699,8 +670,7 @@ QStringList OneSixInstance::getClassPath() const { QStringList jars, nativeJars; auto javaArchitecture = settings()->get("JavaArchitecture").toString(); - m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath()); - jars.append(mainJarPath()); + m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot()); return jars; } @@ -713,6 +683,6 @@ QStringList OneSixInstance::getNativeJars() const { QStringList jars, nativeJars; auto javaArchitecture = settings()->get("JavaArchitecture").toString(); - m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath()); + m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot()); return nativeJars; } diff --git a/api/logic/minecraft/onesix/OneSixInstance.h b/api/logic/minecraft/onesix/OneSixInstance.h index ec8c2597..bf12160e 100644 --- a/api/logic/minecraft/onesix/OneSixInstance.h +++ b/api/logic/minecraft/onesix/OneSixInstance.h @@ -115,9 +115,6 @@ protected: signals: void versionReloaded(); -private: - QString mainJarPath() const; - protected: std::shared_ptr m_profile; mutable std::shared_ptr m_loader_mod_list; diff --git a/api/logic/minecraft/onesix/OneSixVersionFormat.cpp b/api/logic/minecraft/onesix/OneSixVersionFormat.cpp index 266bd4bd..1da375ad 100644 --- a/api/logic/minecraft/onesix/OneSixVersionFormat.cpp +++ b/api/logic/minecraft/onesix/OneSixVersionFormat.cpp @@ -142,6 +142,32 @@ VersionFilePtr OneSixVersionFormat::versionFileFromJson(const QJsonDocument &doc readLibs("+libraries"); } + // if we have mainJar, just use it + if(root.contains("mainJar")) + { + QJsonObject libObj = requireObject(root, "mainJar"); + out->mainJar = libraryFromJson(libObj, filename); + } + // else reconstruct it from downloads and id ... if that's available + else if(!out->minecraftVersion.isEmpty()) + { + auto lib = std::make_shared(); + lib->setRawName(GradleSpecifier(QString("com.mojang:minecraft:%1:client").arg(out->minecraftVersion))); + // we have a reliable client download, use it. + if(out->mojangDownloads.contains("client")) + { + auto LibDLInfo = std::make_shared(); + LibDLInfo->artifact = out->mojangDownloads["client"]; + lib->setMojangDownloadInfo(LibDLInfo); + } + // we got nothing... guess based on ancient hardcoded Mojang behaviour + // FIXME: this will eventually break... + else + { + lib->setAbsoluteUrl(URLConstants::getLegacyJarUrl(out->minecraftVersion)); + } + } + /* removed features that shouldn't be used */ if (root.contains("tweakers")) { diff --git a/api/logic/minecraft/onesix/update/LibrariesTask.cpp b/api/logic/minecraft/onesix/update/LibrariesTask.cpp index 3e6bb12a..1b7e71d3 100644 --- a/api/logic/minecraft/onesix/update/LibrariesTask.cpp +++ b/api/logic/minecraft/onesix/update/LibrariesTask.cpp @@ -21,36 +21,36 @@ void LibrariesTask::executeTask() // Build a list of URLs that will need to be downloaded. std::shared_ptr profile = inst->getMinecraftProfile(); - // minecraft.jar for this version - { - QString version_id = profile->getMinecraftVersion(); - QString localPath = version_id + "/" + version_id + ".jar"; - QString urlstr = profile->getMainJarUrl(); - - auto job = new NetJob(tr("Libraries for instance %1").arg(inst->name())); - auto metacache = ENV.metacache(); - auto entry = metacache->resolveEntry("versions", localPath); - job->addNetAction(Net::Download::makeCached(QUrl(urlstr), entry)); - downloadJob.reset(job); - } + auto job = new NetJob(tr("Libraries for instance %1").arg(inst->name())); + downloadJob.reset(job); auto metacache = ENV.metacache(); QList brokenLocalLibs; QStringList failedFiles; + auto createJob = [&](const LibraryPtr & lib) + { + if(!lib) + { + emitFailed(tr("Null jar is specified in the metadata, aborting.")); + return; + } + auto dls = lib->getDownloads(currentSystem, metacache.get(), failedFiles, inst->getLocalLibraryPath()); + for(auto dl : dls) + { + downloadJob->addNetAction(dl); + } + }; auto createJobs = [&](const QList & libs) { for (auto lib : libs) { - auto dls = lib->getDownloads(currentSystem, metacache.get(), failedFiles, inst->getLocalLibraryPath()); - for(auto dl : dls) - { - downloadJob->addNetAction(dl); - } + createJob(lib); } }; createJobs(profile->getLibraries()); createJobs(profile->getNativeLibraries()); + createJob(profile->getMainJar()); // FIXME: this is never filled!!!! if (!brokenLocalLibs.empty()) -- cgit v1.2.3