aboutsummaryrefslogtreecommitdiff
path: root/launcher/minecraft
diff options
context:
space:
mode:
Diffstat (limited to 'launcher/minecraft')
-rw-r--r--launcher/minecraft/Agent.h36
-rw-r--r--launcher/minecraft/ComponentUpdateTask.cpp2
-rw-r--r--launcher/minecraft/LaunchProfile.cpp33
-rw-r--r--launcher/minecraft/LaunchProfile.h14
-rw-r--r--launcher/minecraft/MinecraftInstance.cpp15
-rw-r--r--launcher/minecraft/OneSixVersionFormat.cpp24
-rw-r--r--launcher/minecraft/PackProfile.cpp17
-rw-r--r--launcher/minecraft/PackProfile.h3
-rw-r--r--launcher/minecraft/VersionFile.cpp5
-rw-r--r--launcher/minecraft/VersionFile.h7
-rw-r--r--launcher/minecraft/auth/steps/XboxAuthorizationStep.cpp2
-rw-r--r--launcher/minecraft/mod/LocalModParseTask.cpp2
-rw-r--r--launcher/minecraft/update/LibrariesTask.cpp4
13 files changed, 161 insertions, 3 deletions
diff --git a/launcher/minecraft/Agent.h b/launcher/minecraft/Agent.h
new file mode 100644
index 00000000..01109daf
--- /dev/null
+++ b/launcher/minecraft/Agent.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <QString>
+
+#include "Library.h"
+
+class Agent;
+
+typedef std::shared_ptr<Agent> AgentPtr;
+
+class Agent {
+public:
+ Agent(LibraryPtr library, QString &argument)
+ {
+ m_library = library;
+ m_argument = argument;
+ }
+
+public: /* methods */
+
+ LibraryPtr library() {
+ return m_library;
+ }
+ QString argument() {
+ return m_argument;
+ }
+
+protected: /* data */
+
+ /// The library pointing to the jar this Java agent is contained within
+ LibraryPtr m_library;
+
+ /// The argument to the Java agent, passed after an = if present
+ QString m_argument;
+
+};
diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp
index 8bc05a1b..ff7ed0af 100644
--- a/launcher/minecraft/ComponentUpdateTask.cpp
+++ b/launcher/minecraft/ComponentUpdateTask.cpp
@@ -591,7 +591,7 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly)
{
component->m_version = "3.1.2";
}
- else if (add.uid == "net.fabricmc.intermediary")
+ else if (add.uid == "net.fabricmc.intermediary" || add.uid == "org.quiltmc.hashed")
{
auto minecraft = std::find_if(components.begin(), components.end(), [](ComponentPtr & cmp){
return cmp->getID() == "net.minecraft";
diff --git a/launcher/minecraft/LaunchProfile.cpp b/launcher/minecraft/LaunchProfile.cpp
index cd77aa4a..39a342ca 100644
--- a/launcher/minecraft/LaunchProfile.cpp
+++ b/launcher/minecraft/LaunchProfile.cpp
@@ -42,11 +42,13 @@ void LaunchProfile::clear()
m_minecraftVersionType.clear();
m_minecraftAssets.reset();
m_minecraftArguments.clear();
+ m_addnJvmArguments.clear();
m_tweakers.clear();
m_mainClass.clear();
m_appletClass.clear();
m_libraries.clear();
m_mavenFiles.clear();
+ m_agents.clear();
m_traits.clear();
m_jarMods.clear();
m_mainJar.reset();
@@ -80,6 +82,11 @@ void LaunchProfile::applyMinecraftArguments(const QString& minecraftArguments)
applyString(minecraftArguments, this->m_minecraftArguments);
}
+void LaunchProfile::applyAddnJvmArguments(const QStringList& addnJvmArguments)
+{
+ this->m_addnJvmArguments.append(addnJvmArguments);
+}
+
void LaunchProfile::applyMinecraftVersionType(const QString& type)
{
applyString(type, this->m_minecraftVersionType);
@@ -214,6 +221,22 @@ void LaunchProfile::applyMavenFile(LibraryPtr mavenFile)
m_mavenFiles.append(Library::limitedCopy(mavenFile));
}
+void LaunchProfile::applyAgent(AgentPtr agent)
+{
+ auto lib = agent->library();
+ if(!lib->isActive())
+ {
+ return;
+ }
+
+ if(lib->isNative())
+ {
+ return;
+ }
+
+ m_agents.append(agent);
+}
+
const LibraryPtr LaunchProfile::getMainJar() const
{
return m_mainJar;
@@ -295,6 +318,11 @@ QString LaunchProfile::getMinecraftArguments() const
return m_minecraftArguments;
}
+const QStringList & LaunchProfile::getAddnJvmArguments() const
+{
+ return m_addnJvmArguments;
+}
+
const QList<LibraryPtr> & LaunchProfile::getJarMods() const
{
return m_jarMods;
@@ -315,6 +343,11 @@ const QList<LibraryPtr> & LaunchProfile::getMavenFiles() const
return m_mavenFiles;
}
+const QList<AgentPtr> & LaunchProfile::getAgents() const
+{
+ return m_agents;
+}
+
const QList<int> & LaunchProfile::getCompatibleJavaMajors() const
{
return m_compatibleJavaMajors;
diff --git a/launcher/minecraft/LaunchProfile.h b/launcher/minecraft/LaunchProfile.h
index 366ed805..b55cf661 100644
--- a/launcher/minecraft/LaunchProfile.h
+++ b/launcher/minecraft/LaunchProfile.h
@@ -36,6 +36,7 @@
#pragma once
#include <QString>
#include "Library.h"
+#include "Agent.h"
#include <ProblemProvider.h>
class LaunchProfile: public ProblemProvider
@@ -48,6 +49,7 @@ public: /* application of profile variables from patches */
void applyMainClass(const QString& mainClass);
void applyAppletClass(const QString& appletClass);
void applyMinecraftArguments(const QString& minecraftArguments);
+ void applyAddnJvmArguments(const QStringList& minecraftArguments);
void applyMinecraftVersionType(const QString& type);
void applyMinecraftAssets(MojangAssetIndexInfo::Ptr assets);
void applyTraits(const QSet<QString> &traits);
@@ -56,6 +58,7 @@ public: /* application of profile variables from patches */
void applyMods(const QList<LibraryPtr> &jarMods);
void applyLibrary(LibraryPtr library);
void applyMavenFile(LibraryPtr library);
+ void applyAgent(AgentPtr agent);
void applyCompatibleJavaMajors(QList<int>& javaMajor);
void applyMainJar(LibraryPtr jar);
void applyProblemSeverity(ProblemSeverity severity);
@@ -69,12 +72,14 @@ public: /* getters for profile variables */
QString getMinecraftVersionType() const;
MojangAssetIndexInfo::Ptr getMinecraftAssets() const;
QString getMinecraftArguments() const;
+ const QStringList & getAddnJvmArguments() const;
const QSet<QString> & getTraits() const;
const QStringList & getTweakers() const;
const QList<LibraryPtr> & getJarMods() const;
const QList<LibraryPtr> & getLibraries() const;
const QList<LibraryPtr> & getNativeLibraries() const;
const QList<LibraryPtr> & getMavenFiles() const;
+ const QList<AgentPtr> & getAgents() const;
const QList<int> & getCompatibleJavaMajors() const;
const LibraryPtr getMainJar() const;
void getLibraryFiles(
@@ -106,6 +111,12 @@ private:
*/
QString m_minecraftArguments;
+ /**
+ * Additional arguments to pass to the JVM in addition to those the user has configured,
+ * memory settings, etc.
+ */
+ QStringList m_addnJvmArguments;
+
/// A list of all tweaker classes
QStringList m_tweakers;
@@ -121,6 +132,9 @@ private:
/// the list of maven files to be placed in the libraries folder, but not acted upon
QList<LibraryPtr> m_mavenFiles;
+ /// the list of java agents to add to JVM arguments
+ QList<AgentPtr> m_agents;
+
/// the main jar
LibraryPtr m_mainJar;
diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp
index fd933df7..503b34d9 100644
--- a/launcher/minecraft/MinecraftInstance.cpp
+++ b/launcher/minecraft/MinecraftInstance.cpp
@@ -213,8 +213,12 @@ QString MinecraftInstance::binRoot() const
QString MinecraftInstance::getNativePath() const
{
+#ifdef Q_OS_FREEBSD
+ QDir natives_dir("/usr/local/lib/lwjgl/");
+#else
QDir natives_dir(FS::PathCombine(instanceRoot(), "natives/"));
return natives_dir.absolutePath();
+#endif
}
QString MinecraftInstance::getLocalLibraryPath() const
@@ -330,6 +334,17 @@ QStringList MinecraftInstance::extraArguments() const
list.append({"-Dfml.ignoreInvalidMinecraftCertificates=true",
"-Dfml.ignorePatchDiscrepancies=true"});
}
+ auto addn = m_components->getProfile()->getAddnJvmArguments();
+ if (!addn.isEmpty()) {
+ list.append(addn);
+ }
+ auto agents = m_components->getProfile()->getAgents();
+ for (auto agent : agents)
+ {
+ QStringList jar, temp1, temp2, temp3;
+ agent->library()->getApplicableFiles(currentSystem, jar, temp1, temp2, temp3, getLocalLibraryPath());
+ list.append("-javaagent:"+jar[0]+(agent->argument().isEmpty() ? "" : "="+agent->argument()));
+ }
return list;
}
diff --git a/launcher/minecraft/OneSixVersionFormat.cpp b/launcher/minecraft/OneSixVersionFormat.cpp
index 0329d70e..879f18c1 100644
--- a/launcher/minecraft/OneSixVersionFormat.cpp
+++ b/launcher/minecraft/OneSixVersionFormat.cpp
@@ -1,5 +1,6 @@
#include "OneSixVersionFormat.h"
#include <Json.h>
+#include "minecraft/Agent.h"
#include "minecraft/ParseUtils.h"
#include <minecraft/MojangVersionFormat.h>
@@ -108,6 +109,14 @@ VersionFilePtr OneSixVersionFormat::versionFileFromJson(const QJsonDocument &doc
}
}
+ if (root.contains("+jvmArgs"))
+ {
+ for (auto arg : requireArray(root.value("+jvmArgs")))
+ {
+ out->addnJvmArguments.append(requireString(arg));
+ }
+ }
+
if (root.contains("jarMods"))
{
@@ -176,6 +185,21 @@ VersionFilePtr OneSixVersionFormat::versionFileFromJson(const QJsonDocument &doc
readLibs("mavenFiles", out->mavenFiles);
}
+ if(root.contains("+agents")) {
+ for (auto agentVal : requireArray(root.value("+agents")))
+ {
+ QJsonObject agentObj = requireObject(agentVal);
+ auto lib = libraryFromJson(*out, agentObj, filename);
+ QString arg = "";
+ if (agentObj.contains("argument"))
+ {
+ readString(agentObj, "argument", arg);
+ }
+ AgentPtr agent(new Agent(lib, arg));
+ out->agents.append(agent);
+ }
+ }
+
// if we have mainJar, just use it
if(root.contains("mainJar"))
{
diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp
index d516e555..d53f41e1 100644
--- a/launcher/minecraft/PackProfile.cpp
+++ b/launcher/minecraft/PackProfile.cpp
@@ -970,3 +970,20 @@ void PackProfile::disableInteraction(bool disable)
}
}
}
+
+ModAPI::ModLoaderType PackProfile::getModLoader()
+{
+ if (!getComponentVersion("net.minecraftforge").isEmpty())
+ {
+ return ModAPI::Forge;
+ }
+ else if (!getComponentVersion("net.fabricmc.fabric-loader").isEmpty())
+ {
+ return ModAPI::Fabric;
+ }
+ else if (!getComponentVersion("org.quiltmc.quilt-loader").isEmpty())
+ {
+ return ModAPI::Quilt;
+ }
+ return ModAPI::Unspecified;
+}
diff --git a/launcher/minecraft/PackProfile.h b/launcher/minecraft/PackProfile.h
index 989d1c6a..ab4cd5c8 100644
--- a/launcher/minecraft/PackProfile.h
+++ b/launcher/minecraft/PackProfile.h
@@ -28,6 +28,7 @@
#include "BaseVersion.h"
#include "MojangDownloadInfo.h"
#include "net/Mode.h"
+#include "modplatform/ModAPI.h"
class MinecraftInstance;
struct PackProfileData;
@@ -117,6 +118,8 @@ public:
// todo(merged): is this the best approach
void appendComponent(ComponentPtr component);
+ ModAPI::ModLoaderType getModLoader();
+
private:
void scheduleSave();
bool saveIsScheduled() const;
diff --git a/launcher/minecraft/VersionFile.cpp b/launcher/minecraft/VersionFile.cpp
index 94fb6db7..9db30ba2 100644
--- a/launcher/minecraft/VersionFile.cpp
+++ b/launcher/minecraft/VersionFile.cpp
@@ -67,6 +67,7 @@ void VersionFile::applyTo(LaunchProfile *profile)
profile->applyMainClass(mainClass);
profile->applyAppletClass(appletClass);
profile->applyMinecraftArguments(minecraftArguments);
+ profile->applyAddnJvmArguments(addnJvmArguments);
profile->applyTweakers(addTweakers);
profile->applyJarMods(jarMods);
profile->applyMods(mods);
@@ -81,6 +82,10 @@ void VersionFile::applyTo(LaunchProfile *profile)
{
profile->applyMavenFile(mavenFile);
}
+ for (auto agent : agents)
+ {
+ profile->applyAgent(agent);
+ }
profile->applyProblemSeverity(getProblemSeverity());
}
diff --git a/launcher/minecraft/VersionFile.h b/launcher/minecraft/VersionFile.h
index a7a19c4e..d4b29719 100644
--- a/launcher/minecraft/VersionFile.h
+++ b/launcher/minecraft/VersionFile.h
@@ -45,6 +45,7 @@
#include "minecraft/Rule.h"
#include "ProblemProvider.h"
#include "Library.h"
+#include "Agent.h"
#include <meta/JsonFormat.h>
class PackProfile;
@@ -92,6 +93,9 @@ public: /* data */
/// Mojang: Minecraft launch arguments (may contain placeholders for variable substitution)
QString minecraftArguments;
+ /// PolyMC: Additional JVM launch arguments
+ QStringList addnJvmArguments;
+
/// Mojang: list of compatible java majors
QList<int> compatibleJavaMajors;
@@ -116,6 +120,9 @@ public: /* data */
/// PolyMC: list of maven files to put in the libraries folder, but not in classpath
QList<LibraryPtr> mavenFiles;
+ /// PolyMC: list of agents to add to JVM arguments
+ QList<AgentPtr> agents;
+
/// The main jar (Minecraft version library, normally)
LibraryPtr mainJar;
diff --git a/launcher/minecraft/auth/steps/XboxAuthorizationStep.cpp b/launcher/minecraft/auth/steps/XboxAuthorizationStep.cpp
index 07eeb7dc..589768e3 100644
--- a/launcher/minecraft/auth/steps/XboxAuthorizationStep.cpp
+++ b/launcher/minecraft/auth/steps/XboxAuthorizationStep.cpp
@@ -65,7 +65,7 @@ void XboxAuthorizationStep::onRequestDone(
if(!processSTSError(error, data, headers)) {
emit finished(
AccountTaskState::STATE_FAILED_SOFT,
- tr("Failed to get authorization for %1 services. Error %1.").arg(m_authorizationKind, error)
+ tr("Failed to get authorization for %1 services. Error %2.").arg(m_authorizationKind, error)
);
}
return;
diff --git a/launcher/minecraft/mod/LocalModParseTask.cpp b/launcher/minecraft/mod/LocalModParseTask.cpp
index 757a2187..f01da8ae 100644
--- a/launcher/minecraft/mod/LocalModParseTask.cpp
+++ b/launcher/minecraft/mod/LocalModParseTask.cpp
@@ -391,7 +391,7 @@ void LocalModParseTask::processAsZip()
zip.close();
return;
}
- else if (zip.setCurrentFile("fabric.mod.json"))
+ else if (zip.setCurrentFile("fabric.mod.json")) // TODO: Support quilt.mod.json
{
if (!file.open(QIODevice::ReadOnly))
{
diff --git a/launcher/minecraft/update/LibrariesTask.cpp b/launcher/minecraft/update/LibrariesTask.cpp
index 667dd5d9..26679110 100644
--- a/launcher/minecraft/update/LibrariesTask.cpp
+++ b/launcher/minecraft/update/LibrariesTask.cpp
@@ -48,6 +48,10 @@ void LibrariesTask::executeTask()
libArtifactPool.append(profile->getLibraries());
libArtifactPool.append(profile->getNativeLibraries());
libArtifactPool.append(profile->getMavenFiles());
+ for (auto agent : profile->getAgents())
+ {
+ libArtifactPool.append(agent->library());
+ }
libArtifactPool.append(profile->getMainJar());
processArtifactPool(libArtifactPool, failedLocalLibraries, inst->getLocalLibraryPath());