diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index e7e27ab98..33504b62f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -191,10 +191,12 @@ public final class LauncherHelper { private static void checkGameState(Profile profile, VersionSetting setting, Version version, Runnable onAccept) throws InterruptedException { boolean flag = false; + // Without onAccept called, the launching operation will be terminated. + VersionNumber gameVersion = VersionNumber.asVersion(GameVersion.minecraftVersion(profile.getRepository().getVersionJar(version)).orElse("Unknown")); JavaVersion java = setting.getJavaVersion(); if (java == null) { - Controllers.dialog(Launcher.i18n("launch.wrong_javadir"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); + Controllers.dialog(Launcher.i18n("launch.wrong_javadir"), Launcher.i18n("message.error"), MessageBox.WARNING_MESSAGE, onAccept); setting.setJava(null); setting.setDefaultJavaPath(null); java = JavaVersion.fromCurrentEnvironment(); @@ -202,10 +204,19 @@ public final class LauncherHelper { } if (!flag && java.getParsedVersion() < JavaVersion.JAVA_8) { - Controllers.dialog(Launcher.i18n("launch.advice.newer_java"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); + if (gameVersion.compareTo(VersionNumber.asVersion("1.13")) >= 0) { + // Minecraft 1.13 and later versions only support Java 8 or later. + // Terminate launching operation. + Controllers.dialog(Launcher.i18n("launch.advice.java8_1_13"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, null); + } else { + // Most mods require Java 8 or later version. + Controllers.dialog(Launcher.i18n("launch.advice.newer_java"), Launcher.i18n("message.error"), MessageBox.WARNING_MESSAGE, onAccept); + } flag = true; } + // LaunchWrapper will crash because of assuming the system class loader is an instance of URLClassLoader. + // cpw has claimed that he will make MinecraftForge of 1.13 and later versions able to run on Java 9. if (!flag && java.getParsedVersion() >= JavaVersion.JAVA_9 && gameVersion.compareTo(VersionNumber.asVersion("1.12.5")) < 0 && version.getMainClass().contains("launchwrapper")) { Controllers.dialog(Launcher.i18n("launch.advice.java9"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, null); flag = true; @@ -218,6 +229,8 @@ public final class LauncherHelper { } if (!flag && java.getPlatform() == org.jackhuang.hmcl.util.Platform.BIT_32 && setting.getMaxMemory() > 1.5 * 1024) { + // 1.5 * 1024 is an inaccurate number. + // Actual memory limit depends on operating system and memory. Controllers.dialog(Launcher.i18n("launch.advice.too_large_memory_for_32bit"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); flag = true; } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index f854e86f7..ae9d4098d 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -125,7 +125,8 @@ lang=English lang.default=Belong to OS language. launch.advice.different_platform=Your OS is 64-Bit but your Java is 32-Bit. The 64-Bit Java is recommended. -launch.advice.java9=You cannot launch Minecraft until game version is higher than 1.13 with Java 9 or newer Java version. +launch.advice.java8_1_13=Minecraft 1.13 and later versions can only run on Java 8 or later. +launch.advice.java9=You cannot launch Minecraft until game version is higher than 1.13 with Java 9 or later Java versions. launch.advice.newer_java=Java 8 is suggested, which can make game run more fluently. And many mods and Minecraft 1.12 and newer versions requires Java 8. launch.advice.not_enough_space=You have allocated too much memory, because the physical memory size is %dMB, your game probably crash. The launcher will try to launch it. launch.advice.too_large_memory_for_32bit=You have allocated too much memory, because of your 32-Bit Java Runtime Environment, your game probably crash. The maximum memory is 1024MB. The launcher will try to launch it. diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index a617af497..bb41a354e 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -125,7 +125,8 @@ lang=简体中文 lang.default=跟随系统语言 launch.advice.different_platform=您的系统是 64 位的但是 Java 是 32 位的,推荐您安装 64 位 Java。 -launch.advice.java9=不高于 1.13 的 Minecraft 不支持 Java 9 或更高版本,请使用 Java 8。 +launch.advice.java8_1_13=Minecraft 1.13 只支持 Java 8 或更高版本,请使用 Java 8 或最新版本。 +launch.advice.java9=不高于 1.13 的安装了 Mod 的 Minecraft 不支持 Java 9 或更高版本,请使用 Java 8。 launch.advice.newer_java=检测到您未使用 Java 8 及更新版本,Java 8 能使游戏更流畅而且 Minecraft 1.12 及更新版本和很多 Mod 强制需要需要 Java 8。 launch.advice.not_enough_space=您设置的内存大小过大,由于超过了系统内存大小 %dMB,所以可能影响游戏体验或无法启动游戏,启动器仍会尝试启动。 launch.advice.too_large_memory_for_32bit=您设置的内存大小过大,由于可能超过了 32 位 Java 的内存分配限制,所以可能无法启动游戏,请将内存调至 1024MB 或更小,启动器仍会尝试启动。 diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index ae58142fc..ab30c00ef 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -84,6 +84,7 @@ public class DefaultLauncher extends Launcher { if (OperatingSystem.CURRENT_OS != OperatingSystem.WINDOWS) res.add("-Duser.home=" + options.getGameDir().getParent()); + // Force using G1GC with its settings if (options.getJava().getParsedVersion() >= JavaVersion.JAVA_7) { res.add("-XX:+UnlockExperimentalVMOptions"); res.add("-XX:+UseG1GC"); @@ -103,6 +104,12 @@ public class DefaultLauncher extends Launcher { res.add("-XX:-OmitStackTraceInFastThrow"); res.add("-Xmn128m"); + // As 32-bit JVM allocate 320KB for stack by default rather than 64-bit version allocating 1MB, + // causing Minecraft 1.13 crashed accounting for java.lang.StackOverflowError. + if (options.getJava().getPlatform() == Platform.BIT_32) { + res.add("-Xss1M"); + } + if (options.getMaxMemory() != null && options.getMaxMemory() > 0) res.add("-Xmx" + options.getMaxMemory() + "m");