summaryrefslogtreecommitdiffstats
path: root/logic/minecraft/MinecraftProcess.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'logic/minecraft/MinecraftProcess.cpp')
-rw-r--r--logic/minecraft/MinecraftProcess.cpp70
1 files changed, 63 insertions, 7 deletions
diff --git a/logic/minecraft/MinecraftProcess.cpp b/logic/minecraft/MinecraftProcess.cpp
index 9d18ad90..10d30b73 100644
--- a/logic/minecraft/MinecraftProcess.cpp
+++ b/logic/minecraft/MinecraftProcess.cpp
@@ -16,6 +16,8 @@
*/
#include "minecraft/MinecraftProcess.h"
#include "BaseInstance.h"
+#include <java/JavaChecker.h>
+#include <MMCStrings.h>
#include <QDataStream>
#include <QFile>
@@ -141,11 +143,18 @@ QStringList MinecraftProcess::javaArguments() const
args << QString("-Xms%1m").arg(m_instance->settings().get("MinMemAlloc").toInt());
args << QString("-Xmx%1m").arg(m_instance->settings().get("MaxMemAlloc").toInt());
- auto permgen = m_instance->settings().get("PermGen").toInt();
- if (permgen != 64)
+
+ // No PermGen in newer java.
+ auto javaVersion = m_instance->settings().get("JavaVersion");
+ if(Strings::naturalCompare(javaVersion.toString(), "1.8.0", Qt::CaseInsensitive) < 0)
{
- args << QString("-XX:PermSize=%1m").arg(permgen);
+ auto permgen = m_instance->settings().get("PermGen").toInt();
+ if (permgen != 64)
+ {
+ args << QString("-XX:PermSize=%1m").arg(permgen);
+ }
}
+
args << "-Duser.language=en";
if (!m_nativeFolder.isEmpty())
args << QString("-Djava.library.path=%1").arg(m_nativeFolder);
@@ -167,12 +176,8 @@ void MinecraftProcess::arm()
m_instance->setLastLaunch();
- QStringList args = javaArguments();
-
QString JavaPath = m_instance->settings().get("JavaPath").toString();
emit log("Java path is:\n" + JavaPath + "\n\n");
- QString allArgs = args.join(", ");
- emit log("Java Arguments:\n[" + censorPrivateInfo(allArgs) + "]\n\n");
auto realJavaPath = QStandardPaths::findExecutable(JavaPath);
if (realJavaPath.isEmpty())
@@ -182,6 +187,57 @@ void MinecraftProcess::arm()
MessageLevel::Warning);
}
+ // check java version here.
+ {
+ QFileInfo javaInfo(realJavaPath);
+ qlonglong javaUnixTime = javaInfo.lastModified().toMSecsSinceEpoch();
+ auto storedUnixTime = m_instance->settings().get("JavaTimestamp").toLongLong();
+ // if they are not the same, check!
+ if(javaUnixTime != storedUnixTime)
+ {
+ QEventLoop ev;
+ auto checker = std::make_shared<JavaChecker>();
+ bool successful = false;
+ QString errorLog;
+ QString version;
+ emit log(tr("Checking Java version..."), MessageLevel::MultiMC);
+ connect(checker.get(), &JavaChecker::checkFinished,
+ [&](JavaCheckResult result)
+ {
+ successful = result.valid;
+ errorLog = result.stderr;
+ version = result.javaVersion;
+ ev.exit();
+ });
+ checker->m_path = realJavaPath;
+ checker->performCheck();
+ ev.exec();
+ if(!successful)
+ {
+ // Error message displayed if java can't start
+ emit log(tr("Could not start java:"), MessageLevel::Error);
+ auto lines = errorLog.split('\n');
+ for(auto line: lines)
+ {
+ emit log(line, MessageLevel::Error);
+ }
+ emit log("\nCheck your MultiMC Java settings.", MessageLevel::MultiMC);
+ m_instance->cleanupAfterRun();
+ emit launch_failed(m_instance);
+ // not running, failed
+ m_instance->setRunning(false);
+ return;
+ }
+ emit log(tr("Java version is %1!\n").arg(version), MessageLevel::MultiMC);
+ m_instance->settings().set("JavaVersion", version);
+ m_instance->settings().set("JavaTimestamp", javaUnixTime);
+ }
+ }
+
+ QStringList args = javaArguments();
+ QString allArgs = args.join(", ");
+ emit log("Java Arguments:\n[" + censorPrivateInfo(allArgs) + "]\n\n");
+
// instantiate the launcher part
start(JavaPath, args);
if (!waitForStarted())