summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2017-04-13 09:28:25 +0200
committerPetr Mrázek <peterix@gmail.com>2017-04-13 09:28:25 +0200
commitbe53eb66f8a63730f4def5640db6205678b4e9d8 (patch)
treebd5bdef96985312b6687b40f8835336bb3f56bb3
parentdb7357d008ae1f4ac0599b7e410ab666dbea5805 (diff)
downloadMultiMC-be53eb66f8a63730f4def5640db6205678b4e9d8.tar
MultiMC-be53eb66f8a63730f4def5640db6205678b4e9d8.tar.gz
MultiMC-be53eb66f8a63730f4def5640db6205678b4e9d8.tar.lz
MultiMC-be53eb66f8a63730f4def5640db6205678b4e9d8.tar.xz
MultiMC-be53eb66f8a63730f4def5640db6205678b4e9d8.zip
NOISSUE implement mainJar support in OneSix format
This allows customizing the main jar like any other library.
-rw-r--r--api/logic/minecraft/MinecraftProfile.cpp45
-rw-r--r--api/logic/minecraft/MinecraftProfile.h9
-rw-r--r--api/logic/minecraft/VersionFile.cpp1
-rw-r--r--api/logic/minecraft/VersionFile.h11
-rw-r--r--api/logic/minecraft/onesix/OneSixInstance.cpp46
-rw-r--r--api/logic/minecraft/onesix/OneSixInstance.h3
-rw-r--r--api/logic/minecraft/onesix/OneSixVersionFormat.cpp26
-rw-r--r--api/logic/minecraft/onesix/update/LibrariesTask.cpp34
8 files changed, 94 insertions, 81 deletions
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<LibraryPtr> & 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<JarmodPtr> &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<JarmodPtr> & getJarMods() const;
const QList<LibraryPtr> & getLibraries() const;
const QList<LibraryPtr> & 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<LibraryPtr> m_libraries;
+ /// the main jar
+ LibraryPtr m_mainJar;
+
/// the list of libraries
QList<LibraryPtr> 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<LibraryPtr> libraries;
+ // The main jar (Minecraft version library, normally)
+ LibraryPtr mainJar;
+
/// MultiMC: list of attached traits of this version file - used to enable features
QSet<QString> traits;
@@ -84,7 +87,7 @@ public: /* data */
QList<JarmodPtr> 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 <QString, std::shared_ptr<MojangDownloadInfo>> 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<Task> 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<Task> 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<MinecraftProfile> m_profile;
mutable std::shared_ptr<ModList> 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<Library>();
+ 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<MojangLibraryDownloadInfo>();
+ 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<MinecraftProfile> 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<LibraryPtr> 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<LibraryPtr> & 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())