aboutsummaryrefslogtreecommitdiff
path: root/logic
diff options
context:
space:
mode:
Diffstat (limited to 'logic')
-rw-r--r--logic/BaseInstance.cpp13
-rw-r--r--logic/BaseInstance.h7
-rw-r--r--logic/BaseVersion.h9
-rw-r--r--logic/JavaChecker.cpp13
-rw-r--r--logic/LegacyFTBInstance.cpp5
-rw-r--r--logic/LegacyFTBInstance.h1
-rw-r--r--logic/LegacyInstance.cpp57
-rw-r--r--logic/MinecraftProcess.cpp256
-rw-r--r--logic/MinecraftProcess.h32
-rw-r--r--logic/NagUtils.cpp18
-rw-r--r--logic/OneSixFTBInstance.cpp5
-rw-r--r--logic/OneSixFTBInstance.h2
-rw-r--r--logic/OneSixInstance.cpp121
-rw-r--r--logic/OneSixLibrary.cpp87
-rw-r--r--logic/OneSixLibrary.h3
-rw-r--r--logic/OneSixUpdate.cpp151
-rw-r--r--logic/OneSixUpdate.h8
-rw-r--r--logic/SkinUtils.h2
-rw-r--r--logic/auth/MojangAccount.cpp6
-rw-r--r--logic/icons/IconList.cpp17
-rw-r--r--logic/icons/IconList.h1
-rw-r--r--logic/lists/ForgeVersionList.cpp12
-rw-r--r--logic/lists/ForgeVersionList.h21
-rw-r--r--logic/lists/InstanceList.cpp73
-rw-r--r--logic/net/CacheDownload.cpp125
-rw-r--r--logic/net/CacheDownload.h15
-rw-r--r--logic/net/URLConstants.h2
-rw-r--r--logic/status/StatusChecker.cpp137
-rw-r--r--logic/status/StatusChecker.h57
-rw-r--r--logic/updater/NotificationChecker.cpp2
-rw-r--r--logic/updater/UpdateChecker.cpp1
-rw-r--r--logic/updater/UpdateChecker.h2
32 files changed, 868 insertions, 393 deletions
diff --git a/logic/BaseInstance.cpp b/logic/BaseInstance.cpp
index ac66a8d5..222004a3 100644
--- a/logic/BaseInstance.cpp
+++ b/logic/BaseInstance.cpp
@@ -26,6 +26,7 @@
#include "overridesetting.h"
#include "pathutils.h"
+#include <cmdutils.h>
#include "lists/MinecraftVersionList.h"
#include "logic/icons/IconList.h"
@@ -81,6 +82,7 @@ BaseInstance::BaseInstance(BaseInstancePrivate *d_in, const QString &rootDir,
settings().registerSetting("OverrideConsole", false);
settings().registerOverride(globalSettings->getSetting("ShowConsole"));
settings().registerOverride(globalSettings->getSetting("AutoCloseConsole"));
+ settings().registerOverride(globalSettings->getSetting("LogPrePostOutput"));
}
void BaseInstance::iconUpdated(QString key)
@@ -248,8 +250,19 @@ void BaseInstance::setName(QString val)
d->m_settings->set("name", val);
emit propertiesChanged(this);
}
+
QString BaseInstance::name() const
{
I_D(BaseInstance);
return d->m_settings->get("name").toString();
}
+
+QString BaseInstance::windowTitle() const
+{
+ return "MultiMC: " + name();
+}
+
+QStringList BaseInstance::extraArguments() const
+{
+ return Util::Commandline::splitArgs(settings().get("JvmArgs").toString());
+}
diff --git a/logic/BaseInstance.h b/logic/BaseInstance.h
index 01d6dc7d..a861e9b2 100644
--- a/logic/BaseInstance.h
+++ b/logic/BaseInstance.h
@@ -57,7 +57,7 @@ public:
/// The instance's ID. The ID SHALL be determined by MMC internally. The ID IS guaranteed to
/// be unique.
- QString id() const;
+ virtual QString id() const;
/// get the type of this instance
QString instanceType() const;
@@ -71,6 +71,9 @@ public:
QString name() const;
void setName(QString val);
+ /// Value used for instance window titles
+ QString windowTitle() const;
+
QString iconKey() const;
void setIconKey(QString val);
@@ -81,6 +84,8 @@ public:
void setGroupInitial(QString val);
void setGroupPost(QString val);
+ QStringList extraArguments() const;
+
virtual QString intendedVersionId() const = 0;
virtual bool setIntendedVersionId(QString version) = 0;
diff --git a/logic/BaseVersion.h b/logic/BaseVersion.h
index 1864c94c..43f5942a 100644
--- a/logic/BaseVersion.h
+++ b/logic/BaseVersion.h
@@ -39,6 +39,15 @@ struct BaseVersion
* the kind of version this is (Stable, Beta, Snapshot, whatever)
*/
virtual QString typeString() const = 0;
+
+ virtual bool operator<(BaseVersion &a)
+ {
+ return name() < a.name();
+ };
+ virtual bool operator>(BaseVersion &a)
+ {
+ return name() > a.name();
+ };
};
typedef std::shared_ptr<BaseVersion> BaseVersionPtr;
diff --git a/logic/JavaChecker.cpp b/logic/JavaChecker.cpp
index 6ee7b4cf..b87ee3d5 100644
--- a/logic/JavaChecker.cpp
+++ b/logic/JavaChecker.cpp
@@ -20,6 +20,9 @@ void JavaChecker::performCheck()
process->setArguments(args);
process->setProgram(path);
process->setProcessChannelMode(QProcess::SeparateChannels);
+ QLOG_DEBUG() << "Running java checker!";
+ QLOG_DEBUG() << "Java: " + path;
+ QLOG_DEBUG() << "Args: {" + args.join("|") + "}";
connect(process.get(), SIGNAL(finished(int, QProcess::ExitStatus)), this,
SLOT(finished(int, QProcess::ExitStatus)));
@@ -42,15 +45,19 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status)
result.path = path;
result.id = id;
}
+ QLOG_DEBUG() << "Java checker finished with status " << status << " exit code " << exitcode;
if (status == QProcess::CrashExit || exitcode == 1)
{
+ QLOG_DEBUG() << "Java checker failed!";
emit checkFinished(result);
return;
}
bool success = true;
QString p_stdout = _process->readAllStandardOutput();
+ QLOG_DEBUG() << p_stdout;
+
QMap<QString, QString> results;
QStringList lines = p_stdout.split("\n", QString::SkipEmptyParts);
for(QString line : lines)
@@ -70,6 +77,7 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status)
if(!results.contains("os.arch") || !results.contains("java.version") || !success)
{
+ QLOG_DEBUG() << "Java checker failed - couldn't extract required information.";
emit checkFinished(result);
return;
}
@@ -84,7 +92,7 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status)
result.mojangPlatform = is_64 ? "64" : "32";
result.realPlatform = os_arch;
result.javaVersion = java_version;
-
+ QLOG_DEBUG() << "Java checker succeeded.";
emit checkFinished(result);
}
@@ -93,7 +101,7 @@ void JavaChecker::error(QProcess::ProcessError err)
if(err == QProcess::FailedToStart)
{
killTimer.stop();
-
+ QLOG_DEBUG() << "Java checker has failed to start.";
JavaCheckResult result;
{
result.path = path;
@@ -110,6 +118,7 @@ void JavaChecker::timeout()
// NO MERCY. NO ABUSE.
if(process)
{
+ QLOG_DEBUG() << "Java checker has been killed by timeout.";
process->kill();
}
}
diff --git a/logic/LegacyFTBInstance.cpp b/logic/LegacyFTBInstance.cpp
index 84d5a900..6c6bd10b 100644
--- a/logic/LegacyFTBInstance.cpp
+++ b/logic/LegacyFTBInstance.cpp
@@ -14,3 +14,8 @@ bool LegacyFTBInstance::menuActionEnabled(QString action_name) const
{
return false;
}
+
+QString LegacyFTBInstance::id() const
+{
+ return "FTB/" + BaseInstance::id();
+}
diff --git a/logic/LegacyFTBInstance.h b/logic/LegacyFTBInstance.h
index 2ae72797..70f60535 100644
--- a/logic/LegacyFTBInstance.h
+++ b/logic/LegacyFTBInstance.h
@@ -10,4 +10,5 @@ public:
QObject *parent = 0);
virtual QString getStatusbarDescription();
virtual bool menuActionEnabled(QString action_name) const;
+ virtual QString id() const;
};
diff --git a/logic/LegacyInstance.cpp b/logic/LegacyInstance.cpp
index 5ab19fc9..2828bcbf 100644
--- a/logic/LegacyInstance.cpp
+++ b/logic/LegacyInstance.cpp
@@ -47,7 +47,7 @@ std::shared_ptr<Task> LegacyInstance::doUpdate(bool only_prepare)
// make sure the jar mods list is initialized by asking for it.
auto list = jarModList();
// create an update task
- return std::shared_ptr<Task> (new LegacyUpdate(this, only_prepare , this));
+ return std::shared_ptr<Task>(new LegacyUpdate(this, only_prepare, this));
}
MinecraftProcess *LegacyInstance::prepareForLaunch(MojangAccountPtr account)
@@ -58,58 +58,27 @@ MinecraftProcess *LegacyInstance::prepareForLaunch(MojangAccountPtr account)
auto pixmap = icon.pixmap(128, 128);
pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG");
- // extract the legacy launcher
- QString launcherJar = PathCombine(MMC->bin(), "jars", "MultiMCLauncher.jar");
-
- // set the process arguments
+ // create the launch script
+ QString launchScript;
{
- QStringList args;
-
// window size
- QString windowSize;
+ QString windowParams;
if (settings().get("LaunchMaximized").toBool())
- windowSize = "max";
+ windowParams = "max";
else
- windowSize = QString("%1x%2").arg(settings().get("MinecraftWinWidth").toInt()).arg(
+ windowParams = QString("%1x%2").arg(settings().get("MinecraftWinWidth").toInt()).arg(
settings().get("MinecraftWinHeight").toInt());
- // window title
- QString windowTitle;
- windowTitle.append("MultiMC: ").append(name());
-
- // Java arguments
- args.append(Util::Commandline::splitArgs(settings().get("JvmArgs").toString()));
-
-#ifdef OSX
- // OSX dock icon and name
- args << "-Xdock:icon=icon.png";
- args << QString("-Xdock:name=\"%1\"").arg(windowTitle);
-#endif
-
QString lwjgl = QDir(MMC->settings()->get("LWJGLDir").toString() + "/" + lwjglVersion())
.absolutePath();
-
- // launcher arguments
- args << QString("-Xms%1m").arg(settings().get("MinMemAlloc").toInt());
- args << QString("-Xmx%1m").arg(settings().get("MaxMemAlloc").toInt());
- args << QString("-XX:PermSize=%1m").arg(settings().get("PermGen").toInt());
-/**
-* HACK: Stupid hack for Intel drivers.
-* See: https://mojang.atlassian.net/browse/MCL-767
-*/
-#ifdef Q_OS_WIN32
- args << QString("-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_"
- "minecraft.exe.heapdump");
-#endif
-
- args << "-jar" << launcherJar;
- args << account->currentProfile()->name;
- args << account->sessionId();
- args << windowTitle;
- args << windowSize;
- args << lwjgl;
- proc->setArguments(args);
+ launchScript += "userName " + account->currentProfile()->name + "\n";
+ launchScript += "sessionId " + account->sessionId() + "\n";
+ launchScript += "windowTitle " + windowTitle() + "\n";
+ launchScript += "windowParams " + windowParams + "\n";
+ launchScript += "lwjgl " + lwjgl + "\n";
+ launchScript += "launch legacy\n";
}
+ proc->setLaunchScript(launchScript);
// set the process work path
proc->setWorkdir(minecraftRoot());
diff --git a/logic/MinecraftProcess.cpp b/logic/MinecraftProcess.cpp
index 209929b7..84610021 100644
--- a/logic/MinecraftProcess.cpp
+++ b/logic/MinecraftProcess.cpp
@@ -14,14 +14,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#include "MultiMC.h"
#include "MinecraftProcess.h"
#include <QDataStream>
#include <QFile>
#include <QDir>
-//#include <QImage>
#include <QProcessEnvironment>
+#include <QRegularExpression>
#include "BaseInstance.h"
@@ -42,6 +43,7 @@ MinecraftProcess::MinecraftProcess(BaseInstance *inst) : m_instance(inst)
#ifdef LINUX
// Strip IBus
+ // IBus is a Linux IME framework. For some reason, it breaks MC?
if (env.value("XMODIFIERS").contains(IBUS))
env.insert("XMODIFIERS", env.value("XMODIFIERS").replace(IBUS, ""));
#endif
@@ -57,11 +59,15 @@ MinecraftProcess::MinecraftProcess(BaseInstance *inst) : m_instance(inst)
// std channels
connect(this, SIGNAL(readyReadStandardError()), SLOT(on_stdErr()));
connect(this, SIGNAL(readyReadStandardOutput()), SLOT(on_stdOut()));
-}
-void MinecraftProcess::setArguments(QStringList args)
-{
- m_args = args;
+ // Log prepost launch command output (can be disabled.)
+ if (m_instance->settings().get("LogPrePostOutput").toBool())
+ {
+ connect(&m_prepostlaunchprocess, &QProcess::readyReadStandardError,
+ this, &MinecraftProcess::on_prepost_stdErr);
+ connect(&m_prepostlaunchprocess, &QProcess::readyReadStandardOutput,
+ this, &MinecraftProcess::on_prepost_stdOut);
+ }
}
void MinecraftProcess::setWorkdir(QString path)
@@ -90,47 +96,145 @@ QString MinecraftProcess::censorPrivateInfo(QString in)
in.replace(profileId, "<PROFILE ID>");
in.replace(profileName, "<PROFILE NAME>");
}
+
+ auto i = m_account->user().properties.begin();
+ while (i != m_account->user().properties.end())
+ {
+ in.replace(i.value(), "<" + i.key().toUpper() + ">");
+ ++i;
+ }
+
return in;
}
// console window
+MessageLevel::Enum MinecraftProcess::guessLevel(const QString &line, MessageLevel::Enum level)
+{
+ if (line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") ||
+ line.contains("[FINER]") || line.contains("[FINEST]"))
+ level = MessageLevel::Message;
+ if (line.contains("[SEVERE]") || line.contains("[STDERR]"))
+ level = MessageLevel::Error;
+ if (line.contains("[WARNING]"))
+ level = MessageLevel::Warning;
+ if (line.contains("Exception in thread") || line.contains(" at "))
+ level = MessageLevel::Fatal;
+ if (line.contains("[DEBUG]"))
+ level = MessageLevel::Debug;
+ return level;
+}
+
+MessageLevel::Enum MinecraftProcess::getLevel(const QString &levelName)
+{
+ if (levelName == "MultiMC")
+ return MessageLevel::MultiMC;
+ else if (levelName == "Debug")
+ return MessageLevel::Debug;
+ else if (levelName == "Info")
+ return MessageLevel::Info;
+ else if (levelName == "Message")
+ return MessageLevel::Message;
+ else if (levelName == "Warning")
+ return MessageLevel::Warning;
+ else if (levelName == "Error")
+ return MessageLevel::Error;
+ else if (levelName == "Fatal")
+ return MessageLevel::Fatal;
+ // Skip PrePost, it's not exposed to !![]!
+ else
+ return MessageLevel::Message;
+}
+
+void MinecraftProcess::logOutput(const QStringList &lines,
+ MessageLevel::Enum defaultLevel,
+ bool guessLevel, bool censor)
+{
+ for (int i = 0; i < lines.size(); ++i)
+ logOutput(lines[i], defaultLevel, guessLevel, censor);
+}
+
+void MinecraftProcess::logOutput(QString line,
+ MessageLevel::Enum defaultLevel,
+ bool guessLevel, bool censor)
+{
+ MessageLevel::Enum level = defaultLevel;
+
+ // Level prefix
+ int endmark = line.indexOf("]!");
+ if (line.startsWith("!![") && endmark != -1)
+ {
+ level = getLevel(line.left(endmark).mid(3));
+ line = line.mid(endmark + 2);
+ }
+ // Guess level
+ else if (guessLevel)
+ level = this->guessLevel(line, defaultLevel);
+
+ if (censor)
+ line = censorPrivateInfo(line);
+
+ emit log(line, level);
+}
+
void MinecraftProcess::on_stdErr()
{
QByteArray data = readAllStandardError();
QString str = m_err_leftover + QString::fromLocal8Bit(data);
- m_err_leftover.clear();
+
QStringList lines = str.split("\n");
- bool complete = str.endsWith("\n");
+ m_err_leftover = lines.takeLast();
- for (int i = 0; i < lines.size() - 1; i++)
- {
- QString &line = lines[i];
- emit log(censorPrivateInfo(line), getLevel(line, MessageLevel::Error));
- }
- if (!complete)
- m_err_leftover = lines.last();
+ logOutput(lines, MessageLevel::Error);
}
void MinecraftProcess::on_stdOut()
{
QByteArray data = readAllStandardOutput();
QString str = m_out_leftover + QString::fromLocal8Bit(data);
- m_out_leftover.clear();
+
QStringList lines = str.split("\n");
- bool complete = str.endsWith("\n");
+ m_out_leftover = lines.takeLast();
- for (int i = 0; i < lines.size() - 1; i++)
- {
- QString &line = lines[i];
- emit log(censorPrivateInfo(line), getLevel(line, MessageLevel::Message));
- }
- if (!complete)
- m_out_leftover = lines.last();
+ logOutput(lines);
+}
+
+void MinecraftProcess::on_prepost_stdErr()
+{
+ QByteArray data = m_prepostlaunchprocess.readAllStandardError();
+ QString str = m_err_leftover + QString::fromLocal8Bit(data);
+
+ QStringList lines = str.split("\n");
+ m_err_leftover = lines.takeLast();
+
+ logOutput(lines, MessageLevel::PrePost, false, false);
+}
+
+void MinecraftProcess::on_prepost_stdOut()
+{
+ QByteArray data = m_prepostlaunchprocess.readAllStandardOutput();
+ QString str = m_out_leftover + QString::fromLocal8Bit(data);
+
+ QStringList lines = str.split("\n");
+ m_out_leftover = lines.takeLast();
+
+ logOutput(lines, MessageLevel::PrePost, false, false);
}
// exit handler
void MinecraftProcess::finish(int code, ExitStatus status)
{
+ // Flush console window
+ if (!m_err_leftover.isEmpty())
+ {
+ logOutput(m_err_leftover, MessageLevel::Error);
+ m_err_leftover.clear();
+ }
+ if (!m_out_leftover.isEmpty())
+ {
+ logOutput(m_out_leftover);
+ m_out_leftover.clear();
+ }
+
if (!killed)
{
if (status == NormalExit)
@@ -153,15 +257,32 @@ void MinecraftProcess::finish(int code, ExitStatus status)
m_prepostlaunchprocess.processEnvironment().insert("INST_EXITCODE", QString(code));
// run post-exit
- if (!m_instance->settings().get("PostExitCommand").toString().isEmpty())
+ QString postlaunch_cmd = m_instance->settings().get("PostExitCommand").toString();
+ if (!postlaunch_cmd.isEmpty())
{
- m_prepostlaunchprocess.start(m_instance->settings().get("PostExitCommand").toString());
+ emit log(tr("Running Post-Launch command: %1").arg(postlaunch_cmd));
+ m_prepostlaunchprocess.start(postlaunch_cmd);
m_prepostlaunchprocess.waitForFinished();
+ // Flush console window
+ if (!m_err_leftover.isEmpty())
+ {
+ logOutput(m_err_leftover, MessageLevel::PrePost);
+ m_err_leftover.clear();
+ }
+ if (!m_out_leftover.isEmpty())
+ {
+ logOutput(m_out_leftover, MessageLevel::PrePost);
+ m_out_leftover.clear();
+ }
if (m_prepostlaunchprocess.exitStatus() != NormalExit)
{
+ emit log(tr("Post-Launch command failed with code %1.\n\n").arg(m_prepostlaunchprocess.exitCode()),
+ MessageLevel::Error);
emit postlaunch_failed(m_instance, m_prepostlaunchprocess.exitCode(),
m_prepostlaunchprocess.exitStatus());
}
+ else
+ emit log(tr("Post-Launch command ran successfully.\n\n"));
}
m_instance->cleanupAfterRun();
emit ended(m_instance, code, status);
@@ -175,27 +296,78 @@ void MinecraftProcess::killMinecraft()
void MinecraftProcess::launch()
{
- if (!m_instance->settings().get("PreLaunchCommand").toString().isEmpty())
+ emit log("MultiMC version: " + MMC->version().toString() + "\n\n");
+ emit log("Minecraft folder is:\n" + workingDirectory() + "\n\n");
+
+ QString prelaunch_cmd = m_instance->settings().get("PreLaunchCommand").toString();
+ if (!prelaunch_cmd.isEmpty())
{
- m_prepostlaunchprocess.start(m_instance->settings().get("PreLaunchCommand").toString());
+ // Launch
+ emit log(tr("Running Pre-Launch command: %1").arg(prelaunch_cmd));
+ m_prepostlaunchprocess.start(prelaunch_cmd);
+ // Wait
m_prepostlaunchprocess.waitForFinished();
+ // Flush console window
+ if (!m_err_leftover.isEmpty())
+ {
+ logOutput(m_err_leftover, MessageLevel::PrePost);
+ m_err_leftover.clear();
+ }
+ if (!m_out_leftover.isEmpty())
+ {
+ logOutput(m_out_leftover, MessageLevel::PrePost);
+ m_out_leftover.clear();
+ }
+ // Process return values
if (m_prepostlaunchprocess.exitStatus() != NormalExit)
{
+ emit log(tr("Pre-Launch command failed with code %1.\n\n").arg(m_prepostlaunchprocess.exitCode()),
+ MessageLevel::Fatal);
m_instance->cleanupAfterRun();
emit prelaunch_failed(m_instance, m_prepostlaunchprocess.exitCode(),
m_prepostlaunchprocess.exitStatus());
return;
}
+ else
+ emit log(tr("Pre-Launch command ran successfully.\n\n"));
}
m_instance->setLastLaunch();
+ auto &settings = m_instance->settings();
+
+ //////////// java arguments ////////////
+ QStringList args;
+ {
+ // custom args go first. we want to override them if we have our own here.
+ args.append(m_instance->extraArguments());
+
+ // OSX dock icon and name
+ #ifdef OSX
+ args << "-Xdock:icon=icon.png";
+ args << QString("-Xdock:name=\"%1\"").arg(m_instance->windowTitle());
+ #endif
+
+ // HACK: Stupid hack for Intel drivers. See: https://mojang.atlassian.net/browse/MCL-767
+ #ifdef Q_OS_WIN32
+ args << QString("-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_"
+ "minecraft.exe.heapdump");
+ #endif
+
+ args << QString("-Xms%1m").arg(settings.get("MinMemAlloc").toInt());
+ args << QString("-Xmx%1m").arg(settings.get("MaxMemAlloc").toInt());
+ args << QString("-XX:PermSize=%1m").arg(settings.get("PermGen").toInt());
+ if(!m_nativeFolder.isEmpty())
+ args << QString("-Djava.library.path=%1").arg(m_nativeFolder);
+ args << "-jar" << PathCombine(MMC->bin(), "jars", "NewLaunch.jar");
+ }
- emit log(QString("Minecraft folder is: '%1'").arg(workingDirectory()));
QString JavaPath = m_instance->settings().get("JavaPath").toString();
- emit log(QString("Java path: '%1'").arg(JavaPath));
- QString allArgs = m_args.join("' '");
- emit log(QString("Arguments: '%1'").arg(censorPrivateInfo(allArgs)));
- start(JavaPath, m_args);
+ emit log("Java path is:\n" + JavaPath + "\n\n");
+ QString allArgs = args.join(", ");
+ emit log("Java Arguments:\n[" + censorPrivateInfo(allArgs) + "]\n\n");
+
+ // instantiate the launcher part
+ start(JavaPath, args);
if (!waitForStarted())
{
//: Error message displayed if instace can't start
@@ -204,21 +376,7 @@ void MinecraftProcess::launch()
emit launch_failed(m_instance);
return;
}
-}
-
-MessageLevel::Enum MinecraftProcess::getLevel(const QString &line, MessageLevel::Enum level)
-{
-
- if (line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") ||
- line.contains("[FINER]") || line.contains("[FINEST]"))
- level = MessageLevel::Message;
- if (line.contains("[SEVERE]") || line.contains("[STDERR]"))
- level = MessageLevel::Error;
- if (line.contains("[WARNING]"))
- level = MessageLevel::Warning;
- if (line.contains("Exception in thread") || line.contains(" at "))
- level = MessageLevel::Fatal;
- if (line.contains("[DEBUG]"))
- level = MessageLevel::Debug;
- return level;
+ // send the launch script to the launcher part
+ QByteArray bytes = launchScript.toUtf8();
+ writeData(bytes.constData(), bytes.length());
}
diff --git a/logic/MinecraftProcess.h b/logic/MinecraftProcess.h
index bd0151cc..70e5df52 100644
--- a/logic/MinecraftProcess.h
+++ b/logic/MinecraftProcess.h
@@ -18,7 +18,7 @@
#pragma once
#include <QProcess>
-
+#include <QString>
#include "BaseInstance.h"
/**
@@ -31,11 +31,12 @@ enum Enum
{
MultiMC, /**< MultiMC Messages */
Debug, /**< Debug Messages */
- Info, /**< Info Messages */
+ Info, /**< Info Messages */
Message, /**< Standard Messages */
Warning, /**< Warnings */
Error, /**< Errors */
- Fatal /**< Fatal Errors */
+ Fatal, /**< Fatal Errors */
+ PrePost, /**< Pre/Post Launch command output */
};
}
@@ -65,7 +66,15 @@ public:
void setWorkdir(QString path);
- void setArguments(QStringList args);
+ void setLaunchScript(QString script)
+ {
+ launchScript = script;
+ }
+
+ void setNativeFolder(QString natives)
+ {
+ m_nativeFolder = natives;
+ }
void killMinecraft();
@@ -104,21 +113,30 @@ signals:
protected:
BaseInstance *m_instance = nullptr;
- QStringList m_args;
QString m_err_leftover;
QString m_out_leftover;
QProcess m_prepostlaunchprocess;
bool killed = false;
MojangAccountPtr m_account;
+ QString launchScript;
+ QString m_nativeFolder;
protected
slots:
void finish(int, QProcess::ExitStatus status);
void on_stdErr();
void on_stdOut();
+ void on_prepost_stdOut();
+ void on_prepost_stdErr();
+ void logOutput(const QStringList &lines,
+ MessageLevel::Enum defaultLevel = MessageLevel::Message,
+ bool guessLevel = true, bool censor = true);
+ void logOutput(QString line,
+ MessageLevel::Enum defaultLevel = MessageLevel::Message,
+ bool guessLevel = true, bool censor = true);
private:
QString censorPrivateInfo(QString in);
- MessageLevel::Enum getLevel(const QString &message, MessageLevel::Enum defaultLevel);
-
+ MessageLevel::Enum guessLevel(const QString &message, MessageLevel::Enum defaultLevel);
+ MessageLevel::Enum getLevel(const QString &levelName);
};
diff --git a/logic/NagUtils.cpp b/logic/NagUtils.cpp
index 6f81b3c7..c963a98a 100644
--- a/logic/NagUtils.cpp
+++ b/logic/NagUtils.cpp
@@ -23,15 +23,15 @@ void checkJVMArgs(QString jvmargs, QWidget *parent)
if (jvmargs.contains("-XX:PermSize=") || jvmargs.contains(QRegExp("-Xm[sx]")))
{
CustomMessageBox::selectable(
- parent, parent->tr("JVM arguments warning"),
- parent->tr("You tried to manually set a JVM memory option (using "
- " \"-XX:PermSize\", \"-Xmx\" or \"-Xms\") - there"
- " are dedicated boxes for these in the settings (Java"
- " tab, in the Memory group at the top).\n"
- "Your manual settings will be overridden by the"
- " dedicated options.\n"
- "This message will be displayed until you remove them"
- " from the JVM arguments."),
+ parent, QObject::tr("JVM arguments warning"),
+ QObject::tr("You tried to manually set a JVM memory option (using "
+ " \"-XX:PermSize\", \"-Xmx\" or \"-Xms\") - there"
+ " are dedicated boxes for these in the settings (Java"
+ " tab, in the Memory group at the top).\n"
+ "Your manual settings will be overridden by the"
+ " dedicated options.\n"
+ "This message will be displayed until you remove them"
+ " from the JVM arguments."),
QMessageBox::Warning)->exec();
}
}
diff --git a/logic/OneSixFTBInstance.cpp b/logic/OneSixFTBInstance.cpp
index 4bb5cf42..e50a5b53 100644
--- a/logic/OneSixFTBInstance.cpp
+++ b/logic/OneSixFTBInstance.cpp
@@ -92,6 +92,11 @@ OneSixFTBInstance::OneSixFTBInstance(const QString &rootDir, SettingsObject *set
}
}
+QString OneSixFTBInstance::id() const
+{
+ return "FTB/" + BaseInstance::id();
+}
+
QString OneSixFTBInstance::getStatusbarDescription()
{
return "OneSix FTB: " + intendedVersionId();
diff --git a/logic/OneSixFTBInstance.h b/logic/OneSixFTBInstance.h
index 7600090c..dc028819 100644
--- a/logic/OneSixFTBInstance.h
+++ b/logic/OneSixFTBInstance.h
@@ -15,6 +15,8 @@ public:
virtual std::shared_ptr<Task> doUpdate(bool only_prepare) override;
+ virtual QString id() const;
+
private:
std::shared_ptr<OneSixLibrary> m_forge;
};
diff --git a/logic/OneSixInstance.cpp b/logic/OneSixInstance.cpp
index 2392c683..3cfc1c76 100644
--- a/logic/OneSixInstance.cpp
+++ b/logic/OneSixInstance.cpp
@@ -13,12 +13,14 @@
* limitations under the License.
*/
+#include "MultiMC.h"
#include "OneSixInstance.h"
#include "OneSixInstance_p.h"
#include "OneSixUpdate.h"
#include "MinecraftProcess.h"
#include "OneSixVersion.h"
#include "JavaChecker.h"
+#include "logic/icons/IconList.h"
#include <setting.h>
#include <pathutils.h>
@@ -27,6 +29,7 @@
#include "gui/dialogs/OneSixModEditDialog.h"
#include "logger/QsLog.h"
#include "logic/assets/AssetsUtils.h"
+#include <QIcon>
OneSixInstance::OneSixInstance(const QString &rootDir, SettingsObject *setting