Skip to content

Commit 69d97a5

Browse files
Glavohuanghongxun
authored andcommitted
Add JavaVersionConstraint rules
1 parent e7dc23a commit 69d97a5

5 files changed

Lines changed: 77 additions & 1 deletion

File tree

HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,9 +493,15 @@ private static Task<JavaVersion> checkGameState(Profile profile, VersionSetting
493493
case MODDED_JAVA_8:
494494
Controllers.dialog(i18n("launch.advice.newer_java"), i18n("message.warning"), MessageType.WARNING, continueAction);
495495
break;
496+
case MODDED_JAVA_16:
497+
Controllers.dialog(i18n("launch.advice.forge37_0_60"), i18n("message.warning"), MessageType.WARNING, continueAction);
498+
break;
496499
case VANILLA_JAVA_8_51:
497500
Controllers.dialog(i18n("launch.advice.java8_51_1_13"), i18n("message.warning"), MessageType.WARNING, continueAction);
498501
break;
502+
case MODLAUNCHER_8:
503+
Controllers.dialog(i18n("launch.advice.modlauncher8"), i18n("message.warning"), MessageType.WARNING, continueAction);
504+
break;
499505
}
500506
}
501507

HMCL/src/main/resources/assets/lang/I18N.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ launch.advice.uncorrected=If you are sure that the game can be started normally,
459459
launch.advice.different_platform=Your OS is 64-Bit but your Java is 32-Bit. The 64-Bit Java is recommended.
460460
launch.advice.forge2760_liteloader=Forge 2760 and higher are not compatible with LiteLoader, please consider upgrading Forge to 2773 or later. Shall we continue launching?
461461
launch.advice.forge28_2_2_optifine=Forge 28.2.2 and later versions are not compatible with OptiFine. Please consider downgrading Forge to 28.2.1 or earlier versions. Shall we continue launching?
462+
launch.advice.forge37_0_60=Forge versions earlier than 37.0.60 are not compatible with Java 17. Please update forge or start the game with Java 16. Shall we continue launching?
462463
launch.advice.java8_1_13=Minecraft 1.13 and later can only run on Java 8 or later.
463464
launch.advice.java8_51_1_13=Minecraft 1.13 may crash on Java 8 earlier than 1.8.0_51. Please install the latest version of Java 8.
464465
launch.advice.java9=You cannot launch Minecraft 1.12 or earlier with Java 9 or later versions of Java.
@@ -467,6 +468,7 @@ launch.advice.not_enough_space=You have allocated too much memory, because the p
467468
launch.advice.require_newer_java_version=Minecraft %1$s requires Java %2$s or later, are you willing to download one now?
468469
launch.advice.too_large_memory_for_32bit=You have allocated too much memory, because of your 32-Bit Java Runtime Environment, your game may crash. The maximum memory capacity for 32 bit systems is is 1024MB. Shall we continue launching?
469470
launch.advice.vanilla_linux_java_8=For Linux x86-64, Minecraft 1.12.2 and below can only run on Java 8.\nJava 9 and above versions cannot load 32-bit native libraries like liblwjgl.so.
471+
launch.advice.modlauncher8=The Forge version you are using is not compatible with the current Java version. Please try updating Forge, or start with Java 8u312/11.0.13/17.0.1 or earlier. Shall we continue launching?
470472
launch.advice.vanilla_x86=Minecraft currently does not provide official support for architectures other than x86 and x86-64.\nYou can try to download the corresponding native library of the platform and specify its placement path.
471473
launch.advice.vanilla_x86.translation=Minecraft currently does not provide official support for architectures other than x86 and x86-64.\nPlease use Java for x86-64 to run minecraft through translator, or download the corresponding native library of the platform and specify its placement path.
472474
launch.failed=Unable to launch

HMCL/src/main/resources/assets/lang/I18N_zh.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,9 +459,11 @@ launch.advice.uncorrected=如果您確實希望使用您自訂的 Java 虛擬機
459459
launch.advice.different_platform=您的系統為 64 位元,但是 Java 是 32 位元,建議您安裝 64 位 Java。
460460
launch.advice.forge2760_liteloader=Forge 2760 與 LiteLoader 不相容。請刪除 LiteLoader 或者變更 Forge 至 2773 或更新的版本。是否繼續啟動?
461461
launch.advice.forge28_2_2_optifine=Forge 28.2.2 或更高版本與 OptiFine 不相容。請變更 Forge 至 28.2.1 或更低版本。是否繼續啟動?
462+
launch.advice.forge37_0_60=Forge 低於 37.0.60 的版本不相容 Java 17。請更新 Forge 到 37.0.60 或更高版本,或者使用 Java 16 啟動遊戲。是否繼續啟動?
462463
launch.advice.java8_1_13=Minecraft 1.13 只支援 Java 8 或更高版本,請使用 Java 8 或最新版本。
463464
launch.advice.java8_51_1_13=低於 1.8.0_51 的 Java 版本可能會導致 Minecraft 1.13 崩潰。建議您到 https://java.com 安裝最新版的 Java 8。
464465
launch.advice.java9=低於 (包含) 1.13 的有安裝 Mod 的 Minecraft 版本不支援 Java 9 或更高版本,請使用 Java 8。
466+
launch.advice.modlauncher8=您所使用的 Forge 版本與當前使用的 Java 不相容。請嘗試更新 Forge,或使用 Java 8u312/11.0.13/17.0.1 及更早版本啟動。是否繼續啟動?
465467
launch.advice.newer_java=偵測到您未使用 Java 8 及更新版本,Java 8 能使遊戲更順暢而且 Minecraft 1.12 及更新版本和很多 Mod 強制需要 Java 8 版本。
466468
launch.advice.not_enough_space=您設定的記憶體大小過大,由於超過了系統記憶體大小 %dMB,所以可能影響遊戲體驗或無法啟動遊戲。是否繼續啟動?
467469
launch.advice.require_newer_java_version=Minecraft %1$s 僅能運行在 Java %2$s 或更高版本上,是否下載?

HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,9 +459,11 @@ launch.advice.uncorrected=如果您确实希望使用您自定义的 Java 虚拟
459459
launch.advice.different_platform=您的系统是 64 位,但是 Java 是 32 位的,建议您安装 64 位 Java。
460460
launch.advice.forge2760_liteloader=Forge 2760 与 LiteLoader 不兼容。请删除 LiteLoader 或者更换 Forge 至 2773 或更新的版本。是否继续启动?
461461
launch.advice.forge28_2_2_optifine=Forge 28.2.2 或更高版本与 OptiFine 不兼容。请更换 Forge 至 28.2.1 或更低版本。是否继续启动?
462+
launch.advice.forge37_0_60=Forge 低于 37.0.60 的版本不兼容 Java 17。请更新 Forge 到 37.0.60 或更高版本,或者使用 Java 16 启动游戏。是否继续启动?
462463
launch.advice.java8_1_13=Minecraft 1.13 及以上版本只能运行在 Java 8 或更高版本上,请使用 Java 8 或最新版本。
463464
launch.advice.java8_51_1_13=低于 1.8.0_51 的 Java 版本可能会导致 Minecraft 1.13 崩溃。建议您到 https://java.com 安装 Java 8。
464465
launch.advice.java9=低于 1.13 的有安装 Mod 的 Minecraft 版本不支持 Java 9 或更高版本,请使用 Java 8。
466+
launch.advice.modlauncher8=您所使用的 Forge 版本与当前使用的 Java 不兼容。请尝试更新 Forge,或使用 Java 8u312/11.0.13/17.0.1 及更早版本启动。是否继续启动?
465467
launch.advice.newer_java=检测到您未使用 Java 8 及更新版本,Java 8 能使游戏更流畅,而且 Minecraft 1.12 及更新版本和很多 Mod 强制需要 Java 8。
466468
launch.advice.not_enough_space=您设置的内存大小过大,由于超过了系统内存大小 %dMB,所以可能影响游戏体验或无法启动游戏。是否继续启动?
467469
launch.advice.require_newer_java_version=Minecraft %1$s 仅能运行在 Java %2$s 或更高版本上,是否下载?

HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,20 @@ public enum JavaVersionConstraint {
3636
// Minecraft>=1.17 requires Java 16
3737
VANILLA_JAVA_16(JavaVersionConstraint.RULE_MANDATORY, versionRange("1.17", JavaVersionConstraint.MAX), versionRange("16", JavaVersionConstraint.MAX)),
3838
VANILLA_JAVA_17(JavaVersionConstraint.RULE_MANDATORY, versionRange("1.18", JavaVersionConstraint.MAX), versionRange("17", JavaVersionConstraint.MAX)),
39+
// Minecraft<=1.17.1+Forge[37.0.0,37.0.60) not compatible with Java 17
40+
MODDED_JAVA_16(JavaVersionConstraint.RULE_SUGGESTED, versionIs("1.17.1"), versionRange("16", "16.999")) {
41+
@Override
42+
protected boolean appliesToVersionImpl(VersionNumber gameVersionNumber, @Nullable Version version,
43+
@Nullable JavaVersion javaVersion) {
44+
if (version == null) return false;
45+
VersionNumber forgePatchVersion = LibraryAnalyzer.analyze(version)
46+
.getVersion(LibraryAnalyzer.LibraryType.FORGE)
47+
.map(LibraryAnalyzer.LibraryType.FORGE::patchVersion)
48+
.map(VersionNumber::asVersion)
49+
.orElse(null);
50+
return forgePatchVersion != null && forgePatchVersion.compareTo(VersionNumber.asVersion("37.0.60")) < 0;
51+
}
52+
},
3953
// Minecraft>=1.13 requires Java 8
4054
VANILLA_JAVA_8(JavaVersionConstraint.RULE_MANDATORY, versionRange("1.13", JavaVersionConstraint.MAX), versionRange("1.8", JavaVersionConstraint.MAX)),
4155
// Minecraft>=1.7.10+Forge accepts Java 8
@@ -113,7 +127,53 @@ protected boolean appliesToVersionImpl(VersionNumber gameVersionNumber, @Nullabl
113127
public boolean checkJava(VersionNumber gameVersionNumber, Version version, JavaVersion javaVersion) {
114128
return javaVersion.getArchitecture().isX86();
115129
}
116-
};
130+
},
131+
// Minecraft 1.16+Forge with crash because JDK-8273826
132+
MODLAUNCHER_8(JavaVersionConstraint.RULE_SUGGESTED, versionRange("1.16.3", "1.17.1"), versionRange(JavaVersionConstraint.MIN, JavaVersionConstraint.MAX)) {
133+
@Override
134+
protected boolean appliesToVersionImpl(VersionNumber gameVersionNumber, @Nullable Version version,
135+
@Nullable JavaVersion javaVersion) {
136+
if (version == null || javaVersion == null) return false;
137+
VersionNumber forgePatchVersion = LibraryAnalyzer.analyze(version)
138+
.getVersion(LibraryAnalyzer.LibraryType.FORGE)
139+
.map(LibraryAnalyzer.LibraryType.FORGE::patchVersion)
140+
.map(VersionNumber::asVersion)
141+
.orElse(null);
142+
if (forgePatchVersion == null) {
143+
return false;
144+
}
145+
switch (gameVersionNumber.toString()) {
146+
case "1.16.3":
147+
return forgePatchVersion.compareTo(VersionNumber.asVersion("34.1.27")) >= 0;
148+
case "1.16.4":
149+
return true;
150+
case "1.16.5":
151+
return forgePatchVersion.compareTo(VersionNumber.asVersion("36.2.23")) <= 0;
152+
case "1.17.1":
153+
return versionRange("37.0.60", "37.0.75").contains(forgePatchVersion);
154+
default:
155+
return false;
156+
}
157+
}
158+
159+
@Override
160+
public boolean checkJava(VersionNumber gameVersionNumber, Version version, JavaVersion javaVersion) {
161+
int parsedJavaVersion = javaVersion.getParsedVersion();
162+
if (parsedJavaVersion > 17) {
163+
return false;
164+
} else if (parsedJavaVersion == 8) {
165+
return javaVersion.getVersionNumber().compareTo(VersionNumber.asVersion("1.8.0_321")) < 0;
166+
} else if (parsedJavaVersion == 11) {
167+
return javaVersion.getVersionNumber().compareTo(VersionNumber.asVersion("11.0.14")) < 0;
168+
} else if (parsedJavaVersion == 15) {
169+
return javaVersion.getVersionNumber().compareTo(VersionNumber.asVersion("15.0.6")) < 0;
170+
} else if (parsedJavaVersion == 17) {
171+
return javaVersion.getVersionNumber().compareTo(VersionNumber.asVersion("17.0.2")) < 0;
172+
} else {
173+
return true;
174+
}
175+
}
176+
};;
117177

118178
private final int type;
119179
private final Range<VersionNumber> gameVersionRange;
@@ -227,6 +287,10 @@ private static Range<VersionNumber> versionRange(String fromInclusive, String to
227287
return Range.between(VersionNumber.asVersion(fromInclusive), VersionNumber.asVersion(toExclusive));
228288
}
229289

290+
static Range<VersionNumber> versionIs(String version) {
291+
return Range.is(VersionNumber.asVersion(version));
292+
}
293+
230294
public static class VersionRanges {
231295
private final Range<VersionNumber> mandatory;
232296
private final Range<VersionNumber> suggested;

0 commit comments

Comments
 (0)