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 45c2401f4..0c31afbbe 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -227,29 +227,50 @@ public final class LauncherHelper { flag = true; } - if (!flag && java.getParsedVersion() < JavaVersion.JAVA_8) { - 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(i18n("launch.advice.java8_1_13"), i18n("message.error"), MessageBox.ERROR_MESSAGE, null); + // Game later than 1.7.2 accepts Java 8. + if (!flag && java.getParsedVersion() < JavaVersion.JAVA_8 && gameVersion.compareTo(VersionNumber.asVersion("1.7.2")) > 0) { + Optional java8 = JavaVersion.getJREs().stream() + .filter(javaVersion -> javaVersion.getParsedVersion() >= JavaVersion.JAVA_8) + .max(Comparator.comparing(JavaVersion::getVersionNumber)); + if (java8.isPresent()) { + setting.setJavaVersion(java8.get()); } else { - // Most mods require Java 8 or later version. - Controllers.dialog(i18n("launch.advice.newer_java"), i18n("message.warning"), MessageBox.WARNING_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(i18n("launch.advice.java8_1_13"), i18n("message.error"), MessageBox.ERROR_MESSAGE, null); + } else { + // Most mods require Java 8 or later version. + Controllers.dialog(i18n("launch.advice.newer_java"), i18n("message.warning"), MessageBox.WARNING_MESSAGE, onAccept); + } + flag = true; } - 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")) { + if (!flag && java.getParsedVersion() >= JavaVersion.JAVA_9 && gameVersion.compareTo(VersionNumber.asVersion("1.13")) < 0 && version.getMainClass().contains("launchwrapper")) { Optional java8 = JavaVersion.getJREs().stream().filter(javaVersion -> javaVersion.getParsedVersion() == JavaVersion.JAVA_8).findAny(); if (java8.isPresent()) { setting.setJavaVersion(java8.get()); - Controllers.dialog(i18n("launch.advice.java9"), i18n("message.warning"), MessageBox.WARNING_MESSAGE, onAccept); } else { Controllers.dialog(i18n("launch.advice.java9"), i18n("message.error"), MessageBox.ERROR_MESSAGE, null); + flag = true; + } + } + + // Minecraft 1.13 may crash when generating world on Java 8 earlier than 1.8.0_51 + VersionNumber JAVA_8 = VersionNumber.asVersion("1.8.0.51"); + if (!flag && gameVersion.compareTo(VersionNumber.asVersion("1.13")) >= 0 && java.getParsedVersion() == JavaVersion.JAVA_8 && java.getVersionNumber().compareTo(JAVA_8) < 0) { + Optional java8 = JavaVersion.getJREs().stream() + .filter(javaVersion -> javaVersion.getVersionNumber().compareTo(JAVA_8) >= 0) + .max(Comparator.comparing(JavaVersion::getVersionNumber)); + if (java8.isPresent()) { + setting.setJavaVersion(java8.get()); + } else { + Controllers.dialog(i18n("launch.advice.java8_51_1_13"), i18n("message.warning"), MessageBox.WARNING_MESSAGE, onAccept); + flag = true; } - flag = true; } if (!flag && java.getPlatform() == org.jackhuang.hmcl.util.Platform.BIT_32 && @@ -257,6 +278,7 @@ public final class LauncherHelper { Controllers.dialog(i18n("launch.advice.different_platform"), i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); flag = true; } + if (!flag && java.getPlatform() == org.jackhuang.hmcl.util.Platform.BIT_32 && setting.getMaxMemory() > 1.5 * 1024) { // 1.5 * 1024 is an inaccurate number. @@ -264,6 +286,7 @@ public final class LauncherHelper { Controllers.dialog(i18n("launch.advice.too_large_memory_for_32bit"), i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); flag = true; } + if (!flag && OperatingSystem.TOTAL_MEMORY > 0 && OperatingSystem.TOTAL_MEMORY < setting.getMaxMemory()) { Controllers.dialog(i18n("launch.advice.not_enough_space", OperatingSystem.TOTAL_MEMORY), 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 eec2ddaa5..38ff16864 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -135,6 +135,7 @@ lang.default=Use system language launch.advice.different_platform=Your OS is 64-Bit but your Java is 32-Bit. The 64-Bit Java is recommended. launch.advice.java8_1_13=Minecraft 1.13 and later versions can only run on Java 8 or later. +launch.advice.java8_51_1_13=Minecraft 1.13 may crash on Java 8 earlier than 1.8.0_51. You are supposed to install the latest version of Java 8. 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. diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 350a4b8da..7799ca307 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -135,6 +135,7 @@ lang.default=跟隨系統語言 launch.advice.different_platform=您的系統是 64 位的但是 Java 是 32 位的,推薦您安裝 64 位 Java。 launch.advice.java8_1_13=Minecraft 1.13 只支持 Java 8 或更高版本,請使用 Java 8 或最新版本。 +launch.advice.java8_51_1_13=舊於 1.8.0_51 的 Java 可能會導致 Minecraft 1.13 崩潰。建議您到 https://java.com 安裝最新版的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,所以可能影響遊戲體驗或無法啓動遊戲,啓動器仍會嘗試啓動。 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 b48e641b9..d5c097fa1 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -135,6 +135,7 @@ lang.default=跟随系统语言 launch.advice.different_platform=您的系统是 64 位的但是 Java 是 32 位的,推荐您安装 64 位 Java。 launch.advice.java8_1_13=Minecraft 1.13 只支持 Java 8 或更高版本,请使用 Java 8 或最新版本。 +launch.advice.java8_51_1_13=旧于 1.8.0_51 的 Java 可能会导致 Minecraft 1.13 崩溃。建议您到 https://java.com 安装最新版的 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,所以可能影响游戏体验或无法启动游戏,启动器仍会尝试启动。 diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java index 10069c8e8..7a04e1fd6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java @@ -63,6 +63,10 @@ public final class JavaVersion { return platform; } + public VersionNumber getVersionNumber() { + return VersionNumber.asVersion(longVersion.replace('_', '.')); + } + /** * The major version of Java installation. *