From b80c787b6059ec10594e8d00a9687902ff707a09 Mon Sep 17 00:00:00 2001 From: Glavo Date: Sun, 21 Aug 2022 19:00:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E9=9D=9E=20x86=20=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E5=BC=80=E7=AE=B1=E5=8D=B3=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E6=94=AF=E6=8C=81=20(#1610)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Replace native libraries on non-x86 platforms * Add support for Linux ARM * Relax the constraint 'JavaVersionConstraint.VANILLA_X86' * Fix several hints * Add OpenGL software renderer option * Add support for OpenGL software renderer on windows * Add __GLX_VENDOR_LIBRARY_NAME on Linux * Catch GLFW error 65543 * Allow users to disable auto completion of native libraries * fix NPE when violated mandatory constraint * Add support for Minecraft 1.13 * Add support for Minecraft 1.6~1.12 * Add base support for linux-loongarch64 * Improve warnings on Loongson platform * Add linux launcher script * fix typo * Add support for loongarch64 (old world) --- HMCL/build.gradle.kts | 1 + .../java/org/jackhuang/hmcl/Launcher.java | 6 + .../main/java/org/jackhuang/hmcl/Main.java | 8 +- .../hmcl/game/HMCLGameRepository.java | 1 + .../jackhuang/hmcl/game/LauncherHelper.java | 132 ++- .../jackhuang/hmcl/setting/GlobalConfig.java | 1 + .../hmcl/setting/VersionSetting.java | 36 + .../hmcl/ui/versions/VersionSettingsPage.java | 17 +- .../hmcl/upgrade/ExecutableHeaderHelper.java | 4 +- .../jackhuang/hmcl/util/NativePatcher.java | 114 ++ HMCL/src/main/resources/assets/HMCLauncher.sh | 183 +++ .../resources/assets/lang/I18N.properties | 19 +- .../resources/assets/lang/I18N_ja.properties | 1 - .../resources/assets/lang/I18N_ru.properties | 1 - .../resources/assets/lang/I18N_zh.properties | 15 +- .../assets/lang/I18N_zh_CN.properties | 15 +- HMCL/src/main/resources/assets/natives.json | 1018 +++++++++++++++++ .../download/BMCLAPIDownloadProvider.java | 3 +- .../hmcl/game/CrashReportAnalyzer.java | 2 +- .../hmcl/game/JavaVersionConstraint.java | 9 +- .../jackhuang/hmcl/game/LaunchOptions.java | 14 + .../hmcl/launch/DefaultLauncher.java | 5 + .../org/jackhuang/hmcl/launch/ExitWaiter.java | 46 +- .../hmcl/util/platform/Architecture.java | 8 +- .../hmcl/util/platform/Platform.java | 15 + 25 files changed, 1570 insertions(+), 104 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java create mode 100644 HMCL/src/main/resources/assets/HMCLauncher.sh create mode 100644 HMCL/src/main/resources/assets/natives.json diff --git a/HMCL/build.gradle.kts b/HMCL/build.gradle.kts index ccf916908..87d851c6c 100644 --- a/HMCL/build.gradle.kts +++ b/HMCL/build.gradle.kts @@ -266,6 +266,7 @@ val makeExecutables = tasks.create("makeExecutables") { doLast { createExecutable("exe", "src/main/resources/assets/HMCLauncher.exe") + createExecutable("sh", "src/main/resources/assets/HMCLauncher.sh") } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index 25c3d6ac0..51bf5bd1f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -69,6 +69,12 @@ public final class Launcher extends Application { Main.showWarningAndContinue(i18n("fatal.illegal_char")); } + if (!Architecture.CURRENT_ARCH.isX86() + && !(OperatingSystem.CURRENT_OS == OperatingSystem.OSX && Architecture.CURRENT_ARCH == Architecture.ARM64) + && ConfigHolder.globalConfig().getAgreementVersion() < 1) { + Main.showWarningAndContinue(i18n("fatal.unsupported_platform")); + } + // runLater to ensure ConfigHolder.init() finished initialization Platform.runLater(() -> { // When launcher visibility is set to "hide and reopen" without Platform.implicitExit = false, diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java index f619b7e78..96004e7dd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java @@ -19,6 +19,7 @@ package org.jackhuang.hmcl; import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.SelfDependencyPatcher; +import org.jackhuang.hmcl.util.platform.Architecture; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; @@ -97,7 +98,12 @@ public final class Main { showErrorAndExit(i18n("fatal.javafx.missing")); } catch (SelfDependencyPatcher.IncompatibleVersionException e) { LOG.log(Level.SEVERE, "unable to patch JVM", e); - showErrorAndExit(i18n("fatal.javafx.incompatible")); + if (Architecture.CURRENT_ARCH == Architecture.MIPS64EL + || Architecture.CURRENT_ARCH == Architecture.LOONGARCH64 + || Architecture.CURRENT_ARCH == Architecture.LOONGARCH64_OW) + showErrorAndExit(i18n("fatal.javafx.incompatible.loongson")); + else + showErrorAndExit(i18n("fatal.javafx.incompatible")); } catch (CancellationException e) { LOG.log(Level.SEVERE, "User cancels downloading JavaFX", e); System.exit(0); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index 27dbc0187..5981fda5a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -355,6 +355,7 @@ public class HMCLGameRepository extends DefaultGameRepository { .setNativesDirType(vs.getNativesDirType()) .setNativesDir(vs.getNativesDir()) .setProcessPriority(vs.getProcessPriority()) + .setUseSoftwareRenderer(vs.isUseSoftwareRenderer()) .setUseNativeGLFW(vs.isUseNativeGLFW()) .setUseNativeOpenAL(vs.isUseNativeOpenAL()) .setDaemon(!makeLaunchScript && vs.getLauncherVisibility().isDaemon()) 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 5394eec04..684a38f81 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -26,18 +26,13 @@ import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorDownloadException; import org.jackhuang.hmcl.download.DefaultDependencyManager; import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.MaintainTask; -import org.jackhuang.hmcl.download.game.GameAssetIndexDownloadTask; -import org.jackhuang.hmcl.download.game.GameVerificationFixTask; -import org.jackhuang.hmcl.download.game.LibraryDownloadException; +import org.jackhuang.hmcl.download.game.*; import org.jackhuang.hmcl.download.java.JavaRepository; import org.jackhuang.hmcl.launch.*; import org.jackhuang.hmcl.mod.ModpackCompletionException; import org.jackhuang.hmcl.mod.ModpackConfiguration; import org.jackhuang.hmcl.mod.ModpackProvider; -import org.jackhuang.hmcl.setting.DownloadProviders; -import org.jackhuang.hmcl.setting.LauncherVisibility; -import org.jackhuang.hmcl.setting.Profile; -import org.jackhuang.hmcl.setting.VersionSetting; +import org.jackhuang.hmcl.setting.*; import org.jackhuang.hmcl.task.*; import org.jackhuang.hmcl.ui.*; import org.jackhuang.hmcl.ui.construct.*; @@ -121,24 +116,24 @@ public final class LauncherHelper { private void launch0() { HMCLGameRepository repository = profile.getRepository(); DefaultDependencyManager dependencyManager = profile.getDependency(); - Version version = MaintainTask.maintain(repository, repository.getResolvedVersion(selectedVersion)); - Optional gameVersion = repository.getGameVersion(version); + AtomicReference version = new AtomicReference<>(MaintainTask.maintain(repository, repository.getResolvedVersion(selectedVersion))); + Optional gameVersion = repository.getGameVersion(version.get()); boolean integrityCheck = repository.unmarkVersionLaunchedAbnormally(selectedVersion); CountDownLatch launchingLatch = new CountDownLatch(1); List javaAgents = new ArrayList<>(0); AtomicReference javaVersionRef = new AtomicReference<>(); - getLog4jPatch(version).ifPresent(javaAgents::add); + getLog4jPatch(version.get()).ifPresent(javaAgents::add); - TaskExecutor executor = checkGameState(profile, setting, version) + TaskExecutor executor = checkGameState(profile, setting, version.get()) .thenComposeAsync(javaVersion -> { javaVersionRef.set(Objects.requireNonNull(javaVersion)); + version.set(NativePatcher.patchNative(version.get(), gameVersion.orElse(null), javaVersion, setting)); if (setting.isNotCheckGame()) return null; - return Task.allOf( - dependencyManager.checkGameCompletionAsync(version, integrityCheck), + dependencyManager.checkGameCompletionAsync(version.get(), integrityCheck), Task.composeAsync(() -> { try { ModpackConfiguration configuration = ModpackHelper.readModpackConfiguration(repository.getModpackConfiguration(selectedVersion)); @@ -148,11 +143,33 @@ public final class LauncherHelper { } catch (IOException e) { return null; } + }), + Task.composeAsync(() -> { + if (setting.isUseSoftwareRenderer() && OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { + Library lib = NativePatcher.getSoftwareRendererLoader(javaVersion); + if (lib == null) + return null; + File file = dependencyManager.getGameRepository().getLibraryFile(version.get(), lib); + if (file.getAbsolutePath().indexOf('=') >= 0) { + LOG.warning("Invalid character '=' in the libraries directory path, unable to attach software renderer loader"); + return null; + } + + if (GameLibrariesTask.shouldDownloadLibrary(repository, version.get(), lib, integrityCheck)) { + return new LibraryDownloadTask(dependencyManager, file, lib) + .thenRunAsync(() -> javaAgents.add(file.getAbsolutePath())); + } else { + javaAgents.add(file.getAbsolutePath()); + return null; + } + } else { + return null; + } }) ); }).withStage("launch.state.dependencies") .thenComposeAsync(() -> { - return gameVersion.map(s -> new GameVerificationFixTask(dependencyManager, s, version)).orElse(null); + return gameVersion.map(s -> new GameVerificationFixTask(dependencyManager, s, version.get())).orElse(null); }) .thenComposeAsync(Task.supplyAsync(() -> { try { @@ -169,12 +186,12 @@ public final class LauncherHelper { LaunchOptions launchOptions = repository.getLaunchOptions(selectedVersion, javaVersionRef.get(), profile.getGameDir(), javaAgents, scriptFile != null); return new HMCLGameLauncher( repository, - version, + version.get(), authInfo, launchOptions, launcherVisibility == LauncherVisibility.CLOSE ? null // Unnecessary to start listening to game process output when close launcher immediately after game launched. - : new HMCLProcessListener(repository, version, authInfo, launchOptions, launchingLatch, gameVersion.isPresent()) + : new HMCLProcessListener(repository, version.get(), authInfo, launchOptions, launchingLatch, gameVersion.isPresent()) ); }).thenComposeAsync(launcher -> { // launcher is prev task's result if (scriptFile == null) { @@ -330,30 +347,32 @@ public final class LauncherHelper { Runnable continueAction = () -> future.complete(JavaVersion.fromCurrentEnvironment()); if (setting.isJavaAutoSelected()) { - JavaVersionConstraint.VersionRanges range = JavaVersionConstraint.findSuitableJavaVersionRange(gameVersion, version); - GameJavaVersion targetJavaVersion; + GameJavaVersion targetJavaVersion = null; - if (range.getMandatory().contains(VersionNumber.asVersion("17.0.1"))) { - targetJavaVersion = GameJavaVersion.JAVA_17; - } else if (range.getMandatory().contains(VersionNumber.asVersion("16.0.1"))) { - targetJavaVersion = GameJavaVersion.JAVA_16; - } else { - String java8Version; - - if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { - java8Version = "1.8.0_51"; - } else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { - java8Version = "1.8.0_202"; - } else if (OperatingSystem.CURRENT_OS == OperatingSystem.OSX) { - java8Version = "1.8.0_74"; + if (org.jackhuang.hmcl.util.platform.Platform.isCompatibleWithX86Java()) { + JavaVersionConstraint.VersionRanges range = JavaVersionConstraint.findSuitableJavaVersionRange(gameVersion, version); + if (range.getMandatory().contains(VersionNumber.asVersion("17.0.1"))) { + targetJavaVersion = GameJavaVersion.JAVA_17; + } else if (range.getMandatory().contains(VersionNumber.asVersion("16.0.1"))) { + targetJavaVersion = GameJavaVersion.JAVA_16; } else { - java8Version = null; - } + String java8Version; - if (java8Version != null && range.getMandatory().contains(VersionNumber.asVersion(java8Version))) - targetJavaVersion = GameJavaVersion.JAVA_8; - else - targetJavaVersion = null; + if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { + java8Version = "1.8.0_51"; + } else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { + java8Version = "1.8.0_202"; + } else if (OperatingSystem.CURRENT_OS == OperatingSystem.OSX) { + java8Version = "1.8.0_74"; + } else { + java8Version = null; + } + + if (java8Version != null && range.getMandatory().contains(VersionNumber.asVersion(java8Version))) + targetJavaVersion = GameJavaVersion.JAVA_8; + else + targetJavaVersion = null; + } } if (targetJavaVersion != null) { @@ -363,7 +382,9 @@ public final class LauncherHelper { }) .exceptionally(throwable -> { LOG.log(Level.WARNING, "Failed to download java", throwable); - Controllers.dialog(i18n("launch.failed.no_accepted_java"), i18n("message.warning"), MessageType.WARNING, continueAction); + Controllers.confirm(i18n("launch.failed.no_accepted_java"), i18n("message.warning"), MessageType.WARNING, continueAction, () -> { + future.completeExceptionally(new CancellationException("No accepted java")); + }); return null; }); } @@ -432,40 +453,25 @@ public final class LauncherHelper { Controllers.confirm(i18n("launch.advice.require_newer_java_version", gameVersion.toString(), 16), i18n("message.warning"), () -> { FXUtils.openLink(OPENJDK_DOWNLOAD_LINK); }, breakAction); - return null; + return Task.fromCompletableFuture(future); case VANILLA_JAVA_17: Controllers.confirm(i18n("launch.advice.require_newer_java_version", gameVersion.toString(), 17), i18n("message.warning"), () -> { FXUtils.openLink(OPENJDK_DOWNLOAD_LINK); }, breakAction); - return null; + return Task.fromCompletableFuture(future); case VANILLA_JAVA_8: Controllers.dialog(i18n("launch.advice.java8_1_13"), i18n("message.error"), MessageType.ERROR, breakAction); - return null; + return Task.fromCompletableFuture(future); case VANILLA_LINUX_JAVA_8: if (setting.getNativesDirType() == NativesDirectoryType.VERSION_FOLDER) { Controllers.dialog(i18n("launch.advice.vanilla_linux_java_8"), i18n("message.error"), MessageType.ERROR, breakAction); - return null; - } else { - break; - } - case VANILLA_X86: - if (setting.getNativesDirType() == NativesDirectoryType.VERSION_FOLDER) { - if (Architecture.SYSTEM_ARCH == Architecture.ARM64) { - if (OperatingSystem.CURRENT_OS == OperatingSystem.OSX - // Windows on ARM introduced translation support for x86-64 after 10.0.21277. - || (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS && OperatingSystem.SYSTEM_BUILD_NUMBER >= 21277)) { - Controllers.dialog(i18n("launch.advice.vanilla_x86.translation"), i18n("message.error"), MessageType.ERROR, breakAction); - return null; - } - } - Controllers.dialog(i18n("launch.advice.vanilla_x86"), i18n("message.error"), MessageType.ERROR, breakAction); - return null; + return Task.fromCompletableFuture(future); } else { break; } case LAUNCH_WRAPPER: Controllers.dialog(i18n("launch.advice.java9") + "\n" + i18n("launch.advice.uncorrected"), i18n("message.error"), MessageType.ERROR, breakAction); - return null; + return Task.fromCompletableFuture(future); } } } @@ -490,7 +496,7 @@ public final class LauncherHelper { switch (violatedSuggestedConstraint) { case MODDED_JAVA_7: Controllers.dialog(i18n("launch.advice.java.modded_java_7"), i18n("message.warning"), MessageType.WARNING, continueAction); - return null; + break; case MODDED_JAVA_8: Controllers.dialog(i18n("launch.advice.newer_java"), i18n("message.warning"), MessageType.WARNING, continueAction); break; @@ -503,6 +509,14 @@ public final class LauncherHelper { case MODLAUNCHER_8: Controllers.dialog(i18n("launch.advice.modlauncher8"), i18n("message.warning"), MessageType.WARNING, continueAction); break; + case VANILLA_X86: + if (setting.getNativesDirType() == NativesDirectoryType.VERSION_FOLDER + && org.jackhuang.hmcl.util.platform.Platform.isCompatibleWithX86Java()) { + Controllers.dialog(i18n("launch.advice.vanilla_x86.translation"), i18n("message.warning"), MessageType.WARNING, continueAction); + } else { + continueAction.run(); + } + break; } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java index 23beaad00..f08214bb7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java @@ -153,6 +153,7 @@ public class GlobalConfig implements Cloneable, Observable { private static final Set knownFields = new HashSet<>(Arrays.asList( "agreementVersion", "multiplayerToken", + "multiplayerRelay", "multiplayerAgreementVersion" )); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java index f8c69bd24..c5224c7ea 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java @@ -392,6 +392,20 @@ public final class VersionSetting implements Cloneable { notCheckGameProperty.set(notCheckGame); } + private final BooleanProperty notPatchNativesProperty = new SimpleBooleanProperty(this, "notPatchNatives", false); + + public BooleanProperty notPatchNativesProperty() { + return notPatchNativesProperty; + } + + public boolean isNotPatchNatives() { + return notPatchNativesProperty.get(); + } + + public void setNotPatchNatives(boolean notPatchNatives) { + notPatchNativesProperty.set(notPatchNatives); + } + private final BooleanProperty showLogsProperty = new SimpleBooleanProperty(this, "showLogs", false); public BooleanProperty showLogsProperty() { @@ -540,6 +554,20 @@ public final class VersionSetting implements Cloneable { processPriorityProperty.set(processPriority); } + private final BooleanProperty useSoftwareRenderer = new SimpleBooleanProperty(this, "softwareRenderer", false); + + public boolean isUseSoftwareRenderer() { + return useSoftwareRenderer.get(); + } + + public BooleanProperty useSoftwareRendererProperty() { + return useSoftwareRenderer; + } + + public void setUseSoftwareRenderer(boolean useSoftwareRenderer) { + this.useSoftwareRenderer.set(useSoftwareRenderer); + } + private final BooleanProperty useNativeGLFW = new SimpleBooleanProperty(this, "nativeGLFW", false); public boolean isUseNativeGLFW() { @@ -670,6 +698,7 @@ public final class VersionSetting implements Cloneable { noJVMArgsProperty.addListener(listener); notCheckGameProperty.addListener(listener); notCheckJVMProperty.addListener(listener); + notPatchNativesProperty.addListener(listener); showLogsProperty.addListener(listener); serverIpProperty.addListener(listener); fullscreenProperty.addListener(listener); @@ -678,6 +707,7 @@ public final class VersionSetting implements Cloneable { gameDirTypeProperty.addListener(listener); gameDirProperty.addListener(listener); processPriorityProperty.addListener(listener); + useSoftwareRenderer.addListener(listener); useNativeGLFW.addListener(listener); useNativeOpenAL.addListener(listener); launcherVisibilityProperty.addListener(listener); @@ -706,6 +736,7 @@ public final class VersionSetting implements Cloneable { versionSetting.setNoJVMArgs(isNoJVMArgs()); versionSetting.setNotCheckGame(isNotCheckGame()); versionSetting.setNotCheckJVM(isNotCheckJVM()); + versionSetting.setNotPatchNatives(isNotPatchNatives()); versionSetting.setShowLogs(isShowLogs()); versionSetting.setServerIp(getServerIp()); versionSetting.setFullscreen(isFullscreen()); @@ -714,6 +745,7 @@ public final class VersionSetting implements Cloneable { versionSetting.setGameDirType(getGameDirType()); versionSetting.setGameDir(getGameDir()); versionSetting.setProcessPriority(getProcessPriority()); + versionSetting.setUseSoftwareRenderer(isUseSoftwareRenderer()); versionSetting.setUseNativeGLFW(isUseNativeGLFW()); versionSetting.setUseNativeOpenAL(isUseNativeOpenAL()); versionSetting.setLauncherVisibility(getLauncherVisibility()); @@ -747,10 +779,12 @@ public final class VersionSetting implements Cloneable { obj.addProperty("noJVMArgs", src.isNoJVMArgs()); obj.addProperty("notCheckGame", src.isNotCheckGame()); obj.addProperty("notCheckJVM", src.isNotCheckJVM()); + obj.addProperty("notPatchNatives", src.isNotPatchNatives()); obj.addProperty("showLogs", src.isShowLogs()); obj.addProperty("gameDir", src.getGameDir()); obj.addProperty("launcherVisibility", src.getLauncherVisibility().ordinal()); obj.addProperty("processPriority", src.getProcessPriority().ordinal()); + obj.addProperty("useSoftwareRenderer", src.isUseSoftwareRenderer()); obj.addProperty("useNativeGLFW", src.isUseNativeGLFW()); obj.addProperty("useNativeOpenAL", src.isUseNativeOpenAL()); obj.addProperty("gameDirType", src.getGameDirType().ordinal()); @@ -793,9 +827,11 @@ public final class VersionSetting implements Cloneable { vs.setNoJVMArgs(Optional.ofNullable(obj.get("noJVMArgs")).map(JsonElement::getAsBoolean).orElse(false)); vs.setNotCheckGame(Optional.ofNullable(obj.get("notCheckGame")).map(JsonElement::getAsBoolean).orElse(false)); vs.setNotCheckJVM(Optional.ofNullable(obj.get("notCheckJVM")).map(JsonElement::getAsBoolean).orElse(false)); + vs.setNotPatchNatives(Optional.ofNullable(obj.get("notPatchNatives")).map(JsonElement::getAsBoolean).orElse(false)); vs.setShowLogs(Optional.ofNullable(obj.get("showLogs")).map(JsonElement::getAsBoolean).orElse(false)); vs.setLauncherVisibility(LauncherVisibility.values()[Optional.ofNullable(obj.get("launcherVisibility")).map(JsonElement::getAsInt).orElse(LauncherVisibility.HIDE.ordinal())]); vs.setProcessPriority(ProcessPriority.values()[Optional.ofNullable(obj.get("processPriority")).map(JsonElement::getAsInt).orElse(ProcessPriority.NORMAL.ordinal())]); + vs.setUseSoftwareRenderer(Optional.ofNullable(obj.get("useSoftwareRenderer")).map(JsonElement::getAsBoolean).orElse(false)); vs.setUseNativeGLFW(Optional.ofNullable(obj.get("useNativeGLFW")).map(JsonElement::getAsBoolean).orElse(false)); vs.setUseNativeOpenAL(Optional.ofNullable(obj.get("useNativeOpenAL")).map(JsonElement::getAsBoolean).orElse(false)); vs.setGameDirType(GameDirectoryType.values()[Optional.ofNullable(obj.get("gameDirType")).map(JsonElement::getAsInt).orElse(GameDirectoryType.ROOT_FOLDER.ordinal())]); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java index a1348ffd3..e662c1264 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java @@ -90,6 +90,8 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag private final OptionToggleButton noJVMArgsPane; private final OptionToggleButton noGameCheckPane; private final OptionToggleButton noJVMCheckPane; + private final OptionToggleButton noNativesPatchPane; + private final OptionToggleButton useSoftwareRenderer; private final OptionToggleButton useNativeGLFWPane; private final OptionToggleButton useNativeOpenALPane; private final ComponentSublist javaSublist; @@ -512,13 +514,22 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag noJVMCheckPane = new OptionToggleButton(); noJVMCheckPane.setTitle(i18n("settings.advanced.dont_check_jvm_validity")); + noNativesPatchPane = new OptionToggleButton(); + noNativesPatchPane.setTitle(i18n("settings.advanced.dont_patch_natives")); + + useSoftwareRenderer = new OptionToggleButton(); + useSoftwareRenderer.setTitle(i18n("settings.advanced.use_software_renderer")); + useNativeGLFWPane = new OptionToggleButton(); useNativeGLFWPane.setTitle(i18n("settings.advanced.use_native_glfw")); useNativeOpenALPane = new OptionToggleButton(); useNativeOpenALPane.setTitle(i18n("settings.advanced.use_native_openal")); - workaroundPane.getContent().setAll(nativesDirSublist, noJVMArgsPane, noGameCheckPane, noJVMCheckPane, useNativeGLFWPane, useNativeOpenALPane); + workaroundPane.getContent().setAll( + nativesDirSublist, + noJVMArgsPane, noGameCheckPane, noJVMCheckPane, noNativesPatchPane, + useSoftwareRenderer, useNativeGLFWPane, useNativeOpenALPane); } rootPane.getChildren().addAll(componentList, @@ -635,7 +646,9 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag noGameCheckPane.selectedProperty().unbindBidirectional(lastVersionSetting.notCheckGameProperty()); noJVMCheckPane.selectedProperty().unbindBidirectional(lastVersionSetting.notCheckJVMProperty()); noJVMArgsPane.selectedProperty().unbindBidirectional(lastVersionSetting.noJVMArgsProperty()); + noNativesPatchPane.selectedProperty().unbindBidirectional(lastVersionSetting.notPatchNativesProperty()); showLogsPane.selectedProperty().unbindBidirectional(lastVersionSetting.showLogsProperty()); + useSoftwareRenderer.selectedProperty().unbindBidirectional(lastVersionSetting.useSoftwareRendererProperty()); useNativeGLFWPane.selectedProperty().unbindBidirectional(lastVersionSetting.useNativeGLFWProperty()); useNativeOpenALPane.selectedProperty().unbindBidirectional(lastVersionSetting.useNativeOpenALProperty()); FXUtils.unbindEnum(cboLauncherVisibility); @@ -674,7 +687,9 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag noGameCheckPane.selectedProperty().bindBidirectional(versionSetting.notCheckGameProperty()); noJVMCheckPane.selectedProperty().bindBidirectional(versionSetting.notCheckJVMProperty()); noJVMArgsPane.selectedProperty().bindBidirectional(versionSetting.noJVMArgsProperty()); + noNativesPatchPane.selectedProperty().bindBidirectional(versionSetting.notPatchNativesProperty()); showLogsPane.selectedProperty().bindBidirectional(versionSetting.showLogsProperty()); + useSoftwareRenderer.selectedProperty().bindBidirectional(versionSetting.useSoftwareRendererProperty()); useNativeGLFWPane.selectedProperty().bindBidirectional(versionSetting.useNativeGLFWProperty()); useNativeOpenALPane.selectedProperty().bindBidirectional(versionSetting.useNativeOpenALProperty()); FXUtils.bindEnum(cboLauncherVisibility, versionSetting.launcherVisibilityProperty()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/ExecutableHeaderHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/ExecutableHeaderHelper.java index 924d99860..66a0f0eed 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/ExecutableHeaderHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/ExecutableHeaderHelper.java @@ -43,7 +43,9 @@ final class ExecutableHeaderHelper { private ExecutableHeaderHelper() {} private static Map suffix2header = mapOf( - pair("exe", "assets/HMCLauncher.exe")); + pair("exe", "assets/HMCLauncher.exe"), + pair("sh", "assets/HMCLauncher.sh") + ); private static Optional getSuffix(Path file) { String filename = file.getFileName().toString(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java new file mode 100644 index 000000000..d8f518b86 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java @@ -0,0 +1,114 @@ +package org.jackhuang.hmcl.util; + +import com.google.gson.reflect.TypeToken; +import org.jackhuang.hmcl.game.Library; +import org.jackhuang.hmcl.game.NativesDirectoryType; +import org.jackhuang.hmcl.game.Version; +import org.jackhuang.hmcl.setting.VersionSetting; +import org.jackhuang.hmcl.util.gson.JsonUtils; +import org.jackhuang.hmcl.util.platform.Architecture; +import org.jackhuang.hmcl.util.platform.JavaVersion; +import org.jackhuang.hmcl.util.platform.OperatingSystem; +import org.jackhuang.hmcl.util.versioning.VersionNumber; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.*; +import java.util.logging.Level; + +import static org.jackhuang.hmcl.util.Logging.LOG; + +public final class NativePatcher { + private NativePatcher() { + } + + private static final Library NONEXISTENT_LIBRARY = new Library(null); + + public static Version patchNative(Version version, String gameVersion, JavaVersion javaVersion, VersionSetting settings) { + if (settings.isNotPatchNatives()) + return version; + + if (settings.getNativesDirType() == NativesDirectoryType.CUSTOM) { + if (gameVersion != null && VersionNumber.VERSION_COMPARATOR.compare(gameVersion, "1.19") < 0) + return version; + + ArrayList newLibraries = new ArrayList<>(); + for (Library library : version.getLibraries()) { + if (!library.appliesToCurrentEnvironment()) + continue; + + if (library.getClassifier() == null + || !library.getArtifactId().startsWith("lwjgl") + || !library.getClassifier().startsWith("natives")) { + newLibraries.add(library); + } + } + return version.setLibraries(newLibraries); + } + + if (javaVersion.getArchitecture().isX86()) + return version; + + if (javaVersion.getPlatform().getOperatingSystem() == OperatingSystem.OSX + && javaVersion.getArchitecture() == Architecture.ARM64 + && gameVersion != null + && VersionNumber.VERSION_COMPARATOR.compare(gameVersion, "1.19") >= 0) + return version; + + Map replacements = Hole.nativeReplacement.get(javaVersion.getPlatform().toString()); + if (replacements == null) { + LOG.warning("No alternative native library provided for platform " + javaVersion.getPlatform()); + return version; + } + + ArrayList newLibraries = new ArrayList<>(); + for (Library library : version.getLibraries()) { + if (!library.appliesToCurrentEnvironment()) + continue; + + if (library.isNative()) { + Library replacement = replacements.getOrDefault(library.getName() + ":natives", NONEXISTENT_LIBRARY); + if (replacement == NONEXISTENT_LIBRARY) { + if (!(settings.isUseNativeGLFW() && library.getArtifactId().contains("glfw")) + && !(settings.isUseNativeOpenAL() && library.getArtifactId().contains("openal"))) { + LOG.warning("No alternative native library " + library.getName() + " provided for platform " + javaVersion.getPlatform()); + return version; + } + newLibraries.add(library); + } else if (replacement != null) { + newLibraries.add(replacement); + } + } else { + Library replacement = replacements.getOrDefault(library.getName(), NONEXISTENT_LIBRARY); + if (replacement == NONEXISTENT_LIBRARY) { + newLibraries.add(library); + } else if (replacement != null) { + newLibraries.add(replacement); + } + } + } + + return version.setLibraries(newLibraries); + } + + public static Library getSoftwareRendererLoader(JavaVersion javaVersion) { + Map map = Hole.nativeReplacement.get(javaVersion.getPlatform().toString()); + return map != null ? map.get("software-renderer-loader") : null; + } + + private static final class Hole { + static Map> nativeReplacement; + + static { + //noinspection ConstantConditions + try (Reader reader = new InputStreamReader(NativePatcher.class.getResourceAsStream("/assets/natives.json"))) { + nativeReplacement = JsonUtils.GSON.fromJson(reader, new TypeToken>>() { + }.getType()); + } catch (IOException e) { + nativeReplacement = Collections.emptyMap(); + LOG.log(Level.WARNING, "Failed to load native library list", e); + } + } + } +} diff --git a/HMCL/src/main/resources/assets/HMCLauncher.sh b/HMCL/src/main/resources/assets/HMCLauncher.sh new file mode 100644 index 000000000..b7e42d7c6 --- /dev/null +++ b/HMCL/src/main/resources/assets/HMCLauncher.sh @@ -0,0 +1,183 @@ +#!/usr/bin/env bash + +set -e + +# Switch message language +if [ -z "${LANG##zh_*}" ]; then + _HMCL_USE_CHINESE=true +else + _HMCL_USE_CHINESE=false +fi + +# _HMCL_OS +case "$OSTYPE" in + linux*) + _HMCL_OS="linux";; + darwin*) + _HMCL_OS="osx";; + msys*|cygwin*) + _HMCL_OS="windows";; + *) + _HMCL_OS="unknown";; +esac + +# Normalize _HMCL_ARCH +case "$(uname -m)" in + x86_64|x86-64|amd64|em64t|x64) + _HMCL_ARCH="x86_64";; + x86_32|x86-32|x86|ia32|i386|i486|i586|i686|i86pc|x32) + _HMCL_ARCH="x86";; + arm64|aarch64|armv8*|armv9*) + _HMCL_ARCH="arm64";; + arm|arm32|aarch32|armv7*) + _HMCL_ARCH="arm32";; + loongarch64) + _HMCL_ARCH="loongarch64";; + *) + _HMCL_ARCH="unknown";; +esac + +# Self path +_HMCL_PATH="${BASH_SOURCE[0]}" +_HMCL_DIR=$(dirname "$_HMCL_PATH") + +if [ "$_HMCL_OS" == "windows" ]; then + _HMCL_JAVA_EXE_NAME="java.exe" +else + _HMCL_JAVA_EXE_NAME="java" +fi + +# _HMCL_VM_OPTIONS +if [ -n "${HMCL_JAVA_OPTS+x}" ]; then + _HMCL_VM_OPTIONS=${HMCL_JAVA_OPTS} +else + _HMCL_VM_OPTIONS="-XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=15" +fi + +# First, find Java in HMCL_JAVA_HOME +if [ -n "${HMCL_JAVA_HOME+x}" ]; then + if [ -x "$HMCL_JAVA_HOME/bin/$_HMCL_JAVA_EXE_NAME" ]; then + "$HMCL_JAVA_HOME/bin/$_HMCL_JAVA_EXE_NAME" $_HMCL_VM_OPTIONS -jar "$_HMCL_PATH" + exit 0 + else + if [ "$_HMCL_USE_CHINESE" == true ]; then + echo "环境变量 HMCL_JAVA_HOME 的值无效,请设置为合法的 Java 路径。" 1>&2 + else + echo "The value of the environment variable HMCL_JAVA_HOME is invalid, please set it to a valid Java path." 1>&2 + fi + exit 1 + fi +fi + +# Find Java in HMCL_DIR +case "$_HMCL_ARCH" in + x86_64) + if [ -x "$_HMCL_DIR/jre-x64/bin/$_HMCL_JAVA_EXE_NAME" ]; then + "$_HMCL_DIR/jre-x64/bin/$_HMCL_JAVA_EXE_NAME" $_HMCL_VM_OPTIONS -jar "$_HMCL_PATH" + exit 0 + fi + if [ -x "$_HMCL_DIR/jre-x86/bin/$_HMCL_JAVA_EXE_NAME" ]; then + "$_HMCL_DIR/jre-x86/bin/$_HMCL_JAVA_EXE_NAME" $_HMCL_VM_OPTIONS -jar "$_HMCL_PATH" + exit 0 + fi + ;; + x86) + if [ -x "$_HMCL_DIR/jre-x86/bin/$_HMCL_JAVA_EXE_NAME" ]; then + "$_HMCL_DIR/jre-x86/bin/$_HMCL_JAVA_EXE_NAME" $_HMCL_VM_OPTIONS -jar "$_HMCL_PATH" + exit 0 + fi + ;; + arm64) + if [ -x "$_HMCL_DIR/jre-arm64/bin/$_HMCL_JAVA_EXE_NAME" ]; then + "$_HMCL_DIR/jre-arm64/bin/$_HMCL_JAVA_EXE_NAME" $_HMCL_VM_OPTIONS -jar "$_HMCL_PATH" + exit 0 + fi + ;; + arm32) + if [ -x "$_HMCL_DIR/jre-arm32/bin/$_HMCL_JAVA_EXE_NAME" ]; then + "$_HMCL_DIR/jre-arm32/bin/$_HMCL_JAVA_EXE_NAME" $_HMCL_VM_OPTIONS -jar "$_HMCL_PATH" + exit 0 + fi + ;; + loongarch64) + if [ -x "$_HMCL_DIR/jre-loongarch64/bin/$_HMCL_JAVA_EXE_NAME" ]; then + "$_HMCL_DIR/jre-loongarch64/bin/$_HMCL_JAVA_EXE_NAME" $_HMCL_VM_OPTIONS -jar "$_HMCL_PATH" + exit 0 + fi + ;; +esac + +# Find Java in JAVA_HOME +if [ -f "$JAVA_HOME/bin/$_HMCL_JAVA_EXE_NAME" ]; then + "$JAVA_HOME/bin/$_HMCL_JAVA_EXE_NAME" $_HMCL_VM_OPTIONS -jar "$_HMCL_PATH" + exit 0 +fi + +# Find Java in PATH +if [ -x "$(command -v $_HMCL_JAVA_EXE_NAME)" ]; then + $_HMCL_JAVA_EXE_NAME $_HMCL_VM_OPTIONS -jar "$_HMCL_PATH" + exit 0 +fi + +# Java not found + +if [[ "$_HMCL_OS" == "unknown" || "$_HMCL_ARCH" == "unknown" ]]; then + if [ "$_HMCL_USE_CHINESE" == true ]; then + echo "运行 HMCL 需要 Java 运行时环境,请安装 Java 并设置环境变量后重试。" 1>&2 + else + echo "The Java runtime environment is required to run HMCL. " 1>&2 + echo "Please install Java and set the environment variables and try again." 1>&2 + fi + exit 1 +fi + +if [[ "$_HMCL_ARCH" == "loongarch64" ]]; then + if [ "$_HMCL_USE_CHINESE" == true ]; then + echo "运行 HMCL 需要 Java 运行时环境,请安装龙芯 JDK8 (http://www.loongnix.cn/zh/api/java/downloads-jdk8/index.html) 并设置环境变量后重试。" 1>&2 + else + echo "The Java runtime environment is required to run HMCL." 1>&2 + echo "Please install Loongson JDK8 (http://www.loongnix.cn/zh/api/java/downloads-jdk8/index.html) and set the environment variables, then try again." 1>&2 + fi + exit 1 +fi + + +case "$_HMCL_OS" in + linux) + _HMCL_DOWNLOAD_PAGE_OS="&os=Linux";; + osx) + _HMCL_DOWNLOAD_PAGE_OS="&os=macOS";; + windows) + _HMCL_DOWNLOAD_PAGE_OS="&os=Windows";; + *) + echo "Unknown os: $_HMCL_OS" 1>&2 + exit 1 + ;; +esac + +case "$_HMCL_ARCH" in + arm64) + _HMCL_DOWNLOAD_PAGE_ARCH="&bitness=64-bit&architecture=ARM";; + arm32) + _HMCL_DOWNLOAD_PAGE_ARCH="&bitness=32-bit&architecture=ARM";; + x86_64) + _HMCL_DOWNLOAD_PAGE_ARCH="&bitness=64-bit&architecture=x86";; + x86) + _HMCL_DOWNLOAD_PAGE_ARCH="&bitness=32-bit&architecture=x86";; + *) + echo "Unknown architecture: $_HMCL_ARCH" 1>&2 + exit 1 + ;; +esac + +_HMCL_DOWNLOAD_PAGE="https://bell-sw.com/pages/downloads/?version=java-17-lts$_HMCL_DOWNLOAD_PAGE_OS$_HMCL_DOWNLOAD_PAGE_ARCH&package=jdk-full" + +if [ "$_HMCL_USE_CHINESE" == true ]; then + echo "运行 HMCL 需要 Java 运行时环境,请安装 Java 并设置环境变量后重试。" 1>&2 + echo "$_HMCL_DOWNLOAD_PAGE" 1>&2 +else + echo "The Java runtime environment is required to run HMCL. " 1>&2 + echo "Please install Java and set the environment variables and try again." 1>&2 + echo "$_HMCL_DOWNLOAD_PAGE" 1>&2 +fi +exit 1 \ No newline at end of file diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index cbd7cb8a0..1877844d1 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -337,6 +337,8 @@ extension.sh=Bash Shell Script fatal.javafx.incompatible=Missing JavaFX environment.\n\ HMCL cannot automatically install JavaFX under Java versions below 11.\n\ Please try to switch to Java versions like Oracle Java 8 which has JavaFX built-in, or update to version 11 or higher. +fatal.javafx.incompatible.loongson=Missing JavaFX environment.\n\ + Please try to switch to Loongson JDK 8 (http://www.loongnix.cn/zh/api/java/downloads-jdk8/index.html) to start HMCL. fatal.javafx.missing=Missing JavaFX environment.\n\ If you are using Java 11 or higher, please downgrade it to Oracle JRE 8 (java.com), or install BellSoft Liberica Full JRE (bell-sw.com/pages/downloads/?package\=jre-full).\n\ Or, if you are using OpenJDK distributions, please make sure it has OpenJFX included. @@ -354,7 +356,11 @@ You can update manually by downloading a newer version of the launcher from %s.\ If the problem persists, please consider reporting this to us. fatal.samba=If you launched HMCL from a Samba network drive, some features might not be working. Please try updating your Java version or copy and run the launcher in a local folder. fatal.illegal_char=Your user path contains an illegal character '\=', so some features might not function properly.\n\ -For example, you will not be able to use authlib-injector or change the skin of your offline account. Besides, this may cause security issues during multiplayer. +For example, you will not be able to use authlib-injector or change the skin of your offline account. Besides, this may cause security issues during multiplayer. +fatal.unsupported_platform=Minecraft is not yet fully supported for your platform, so you may experience missing functionality, \nor even be unable to launch the game.\n\ + \n\ + If you can't start Minecraft 1.17 and above, you can try turning on the "Use OpenGL software renderer" option\n\ + in instance settings to use CPU rendering for better compatibility. feedback=Feedback feedback.add=Add a Feedback @@ -445,6 +451,8 @@ If your computer has a discrete graphics card, you need to check whether the gam \n\ If you are using your integrated graphics card, please notice that Minecraft 1.16.5 or older requires Java 1.8.0_51 or older for Intel(R) Core(TM) 3000 processor series or earlier.\n\ \n\ +Turning on the "Use OpenGL software renderer" option in the instance settings can also solve this problem, but when this option is turned on, the frame rate will be significantly reduced in the case of insufficient CPU performance. So it is only recommended to turn it on for debugging purposes or in case of emergency.\n\ +\n\ You can go to this website (in Chinese) for more information. game.crash.reason.illegal_access_error=The game crashed because of some mod(s).\n\ \n\ @@ -625,10 +633,7 @@ launch.advice.too_large_memory_for_32bit=You have allocated a memory size larger launch.advice.vanilla_linux_java_8=Minecraft 1.12.2 or below only supports Java 8 for the Linux x86-64 platform, because later versions cannot load 32-bit native libraries like liblwjgl.so\n\ \n\ Please download it from java.com, or install OpenJDK 8. -launch.advice.vanilla_x86=Minecraft currently does not provide official support for architectures other than x86 or x86-64.\n\ -You can try to download the native library of your platform and specify its path, then try again. -launch.advice.vanilla_x86.translation=Minecraft does not currently provide official support for architectures other than x86 and x86-64.\n\ -Please install Java for x86-64 to play Minecraft via the Rosetta translation environment, or download your corresponding native libraries and specify its path. +launch.advice.vanilla_x86.translation=Minecraft is not yet fully supported for your platform, so you may experience missing functionality, or even be unable to launch the game.\nYou can play through the Rosetta translation environment for a full gaming experience.\nDo you still want to continue? launch.failed=Unable to launch launch.failed.cannot_create_jvm=We are unable to create a Java virtual machine. It may be due to an issue with the provided launch arguments, you can try to fix it by removing all arguments you added under instance settings. launch.failed.creating_process=We are unable to create a new process, please check your Java path. @@ -642,7 +647,7 @@ launch.failed.execution_policy.hint=The current execution policy prevents the ex \n\ Click on 'OK' to allow the current user to execute PowerShell scripts, or click on 'Cancel' to keep it as it is. launch.failed.exited_abnormally=Game crashed. Please refer to the crash log for more details. -launch.failed.no_accepted_java=Unable to find a compatible Java version. If you do believe you've downloaded a compatible one, you can set it manually in settings. +launch.failed.no_accepted_java=Unable to find a compatible Java version, do you want to start the game with the default Java?\nClick on 'Yes' to start the game with the default Java.\nOr, you can go to the instance settings to select one yourself. launch.state.dependencies=Resolving dependencies launch.state.done=Completing launch launch.state.java=Checking Java version @@ -1026,6 +1031,7 @@ settings.advanced.custom_commands.hint=The following environment variables are p - $INST_FABRIC\: set if Fabric installed settings.advanced.dont_check_game_completeness=Do not check game integrity settings.advanced.dont_check_jvm_validity=Do not check JVM compatibility +settings.advanced.dont_patch_natives=Do not attempt to automatically replace native libraries settings.advanced.game_dir.default=Default (.minecraft/) settings.advanced.game_dir.independent=Isolated (.minecraft/versions//, except for assets and libraries) settings.advanced.java_permanent_generation_space=PermGen Space @@ -1064,6 +1070,7 @@ settings.advanced.server_ip=Server Address settings.advanced.server_ip.prompt=Join automatically after launching the game. settings.advanced.use_native_glfw=[Linux Only] Use system GLFW settings.advanced.use_native_openal=[Linux Only] Use system OpenAL +settings.advanced.use_software_renderer=Use OpenGL software renderer (better compatibility, but less performance) settings.advanced.workaround=Workarounds settings.advanced.workaround.warning=Workaround options are intended only for expert users. Tweaking with these options may crash the game. Unless you know what you are doing, please do not modify these options. settings.advanced.wrapper_launcher=Wrapper Command diff --git a/HMCL/src/main/resources/assets/lang/I18N_ja.properties b/HMCL/src/main/resources/assets/lang/I18N_ja.properties index cb4ece011..16b319c33 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ja.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ja.properties @@ -472,7 +472,6 @@ launch.advice.not_enough_space=割り当てたメモリが多すぎます。物 launch.advice.require_newer_java_version=Minecraft %1$s にはJava %2$s 以降が必要です。今すぐダウンロードしますか? launch.advice.too_large_memory_for_32bit=32ビットJavaランタイム環境が原因で、割り当てたメモリが多すぎるため、ゲームがクラッシュする可能性があります。 32ビットシステムの最大メモリ容量は1024MBです。打ち上げを続けましょうか。 launch.advice.vanilla_linux_java_8=Linux x86-64の場合、Minecraft1.12.2以下はJava8でのみ実行できます。\nJava9以降のバージョンでは、liblwjgl.soなどの32ビットネイティブライブラリをロードできません。 -launch.advice.vanilla_x86=Minecraftは現在、x86およびx86-64以外のアーキテクチャの公式サポートを提供していません。\nプラットフォームの対応するネイティブライブラリをダウンロードして、その配置パスを指定してみてください。 launch.advice.vanilla_x86.translation=Minecraftは現在、x86およびx86-64以外のアーキテクチャの公式サポートを提供していません。\nJava for x86-64を使用して、トランスレータを介してminecraftを実行するか、プラットフォームの対応するネイティブライブラリをダウンロードして指定してくださいその配置パス。 launch.failed=起動できません launch.failed.cannot_create_jvm=Java仮想マシンを作成できませんでした。 Java引数は問題を引き起こす可能性があります。 JVM引数なしで再起動してください。 diff --git a/HMCL/src/main/resources/assets/lang/I18N_ru.properties b/HMCL/src/main/resources/assets/lang/I18N_ru.properties index 7d0d03f0b..5ab03f3dc 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ru.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ru.properties @@ -476,7 +476,6 @@ launch.advice.require_newer_java_version=Minecraft %1$s требует Java %2$s launch.advice.too_large_memory_for_32bit=Вы выделили слишком много памяти, из-за 32-разрядной Java Runtime Environment ваша игра может рухнуть. Максимальный объем памяти для 32-разрядных систем составляет 1024 МБ. Продолжить запуск? launch.advice.vanilla_linux_java_8=На Linux x86-64, Minecraft 1.12.2 и ниже может работать только на Java 8.\nВерсии Java 9 и выше не могут загружать 32-битные нативные библиотеки, такие как liblwjgl.so. launch.advice.modlauncher8=Используемая вами версия Forge несовместима с текущей версией Java. Попробуйте обновить Forge или начните с Java 8u312/11.0.13/17.0.1 или более ранней версии. Продолжить запуск? -launch.advice.vanilla_x86=В настоящее время Minecraft не обеспечивает официальную поддержку архитектур, отличных от x86 и x86-64.\nВы можете попробовать скачать соответствующую нативную библиотеку платформы и указать её путь размещения. launch.advice.vanilla_x86.translation=В настоящее время Minecraft не обеспечивает официальную поддержку архитектур, отличных от x86 и x86-64.\nПожалуйста, используйте Java для x86-64 для запуска minecraft через переводчик, или загрузите соответствующую нативную библиотеку платформы и укажите её путь размещения. launch.failed=Невозможно запустить launch.failed.cannot_create_jvm=Не удалось создать виртуальную машину Java. Аргументы Java могут вызвать проблемы. Перезапустите без аргументов JVM. diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index f4956a739..2ea15b75f 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -319,6 +319,7 @@ extension.ps1=PowerShell 指令碼 extension.sh=Bash 指令碼 fatal.javafx.incompatible=缺少 JavaFX 運行環境。\nHMCL 無法在低於 Java 11 且缺少 JavaFX 的 Java 環境上自行補全 JavaFX 運行環境。\n請更換如 Oracle Java 8 等包含 JavaFX 的 Java 運行環境,或者更新到 Java 11 或更高版本。 +fatal.javafx.incompatible.loongson=缺少 JavaFX 運行環境。\n請使龍芯 JDK 8 (http://www.loongnix.cn/zh/api/java/downloads-jdk8/index.html) 啟動 HMCL。 fatal.javafx.missing=找不到 JavaFX。\n如果您使用的是 Java 11 或更高版本,請降級到 Oracle JRE 8,或者安裝 BellSoft Liberica Full JRE。\n如果您使用的是其他 OpenJDK 构建,請確保其包含 OpenJFX。 fatal.missing_dst_root_ca_x3=目前的 Java 平台缺少 DST Root CA X3 憑證。\n您依然可以使用 Hello Minecraft! Launcher,但會無法連線到部分網站 (如使用 Lets Encrypt 憑證的站台),這可能會使 Hello Minecraft! Launcher 無法正常運作。\n請將您的 Java 升級到 8u101 以上來解決此問題。 fatal.config_loading_failure=Hello Minecraft! Launcher 無法載入設定檔案。\n請確保 Hello Minecraft! Launcher 對 "%s" 目錄及該目錄下的檔案擁有讀寫權限。 @@ -326,6 +327,7 @@ fatal.migration_requires_manual_reboot=Hello Minecraft! Launcher 即將升級完 fatal.apply_update_failure=我們很抱歉 Hello Minecraft! Launcher 無法自動完成升級程式,因為出現了一些問題。\n但你依然可以從 %s 處手動下載 Hello Minecraft! Launcher 來完成升級。\n請考慮向我們回報該問題。 fatal.samba=如果您正在通過 Samba 共亯的資料夾中運行 HMCL,HMCL 可能無法正常工作,請嘗試更新您的 Java 或在本地資料夾內運行 HMCL。 fatal.illegal_char=您的用戶資料夾路徑中存在非法字元‘=’。HMCL 能够運行,但一些功能無法正常使用。 \n您將無法使用外置登入帳戶以及離線登入更換皮膚功能,並且在進行多人遊戲時可能存在更大的安全隱患。 +fatal.unsupported_platform=Minecraft 尚未你您的平臺提供完善支持,所以可能影響遊戲體驗或無法啟動遊戲。\n若無法啟動 Minecraft 1.17 及以上版本,可以嘗試在版本設定中打開“使用 OpenGL 軟渲染器”選項,\n使用 CPU 渲染以獲得更好的相容性。 feedback=回饋 feedback.add=新增回饋 @@ -379,10 +381,10 @@ game.crash.reason.fabric_warnings=Fabric 提供了一些警告訊息:\n%1$s game.crash.reason.file_already_exists=當前遊戲因為文件 %1$s 已經存在,無法繼續運行。\n如果你認為這個文件可以刪除,你可以在備份這個文件後嘗試刪除它,並重新啟動遊戲。 game.crash.reason.file_changed=當前遊戲因為檔案校驗失敗,無法繼續運行。\n如果你手動修改了 Minecraft.jar 檔案,你需要回退修改,或者重新下載遊戲。 game.crash.reason.gl_operation_failure=當前遊戲因為你使用的某些 Mod、光影包、材質包,無法繼續運行。\n請先嘗試禁用你所使用的Mod/光影包/材質包再試。 -game.crash.reason.graphics_driver=當前遊戲因為你的顯示卡驅動存在問題崩潰了。\n\ - 請嘗試升級你的顯示卡驅動到最新版本後再嘗試啟動遊戲。\n\ +game.crash.reason.graphics_driver=當前遊戲因為你的顯示卡驅動存在問題崩潰了,請嘗試升級你的顯示卡驅動到最新版本後再嘗試啟動遊戲。\n\ 如果你的電腦存在獨立顯示卡,你需要檢查遊戲是否使用集成/核芯顯示卡啟動。如果是,請嘗試使用獨立顯示卡啟動 HMCL 與遊戲。如果仍有問題,你可能需要考慮換一個新顯示卡或新電腦。\n\ - 如果你確實需要使用核芯顯示卡,請檢查你的電腦的 CPU 是否是 Intel(R) Core(TM) 3000 系列或更舊的處理器,如果是,對於 Minecraft 1.16.5 及更舊版本,請你將遊戲所使用的 Java 版本降級至 1.8.0_51 及以下版本,否則你必須更換獨立顯示卡或新電腦。\n\ + 如果你確實需要使用核芯顯示卡,請檢查你的電腦的 CPU 是否是 Intel(R) Core(TM) 3000 系列或更舊的處理器,如果是,對於 Minecraft 1.16.5 及更舊版本,請你將遊戲所使用的 Java 版本降級至 1.8.0_51 及以下版本,否則你需要更換獨立顯示卡或新電腦。\n\ + 在版本設定中打開“使用 OpenGL 軟渲染器”選項也可以解决此問題,但打開此選項後在 CPU 效能不足的情况下幀數會顯著降低,僅推薦以調試為目的或應急時開啟。\n\ 詳情請點擊 此處 查看 game.crash.reason.illegal_access_error=當前遊戲因為某些 Mod 的問題,無法繼續運行。\n如果你認識:%1$s,你可以更新或刪除對應 Mod 再試。 game.crash.reason.jdk_9=當前遊戲因為 Java 版本過高,無法繼續運行。\n你需要下載安裝 Java 8,並在遊戲設置中將 Java 設置為 1.8 的版本。 @@ -482,8 +484,7 @@ launch.advice.not_enough_space=您設定的記憶體大小過大,由於超過 launch.advice.require_newer_java_version=Minecraft %1$s 僅能運行在 Java %2$s 或更高版本上,但 HMCL 未能找到該 Java 版本,你可以點擊“是” ,HMCL 會自動下載他,是否下載? launch.advice.too_large_memory_for_32bit=您設定的記憶體大小過大,由於可能超過了 32 位元 Java 的記憶體分配限制,所以可能無法啟動遊戲,請將記憶體調至低於 1024MB 的值。是否繼續啟動? launch.advice.vanilla_linux_java_8=對於 Linux x86-64 平台,Minecraft 1.12.2 及以下版本僅支援 Java 8。\nJava 9+ 版本會無法載入 32 位的 liblwjgl.so。 -launch.advice.vanilla_x86=Minecraft 官方尚未提供對非 x86-64 平臺的支援。\n您可以嘗試下載您所用平臺對應的本機庫,在遊戲設定的調試選項中指定其路徑後再嘗試運行。 -launch.advice.vanilla_x86.translation=你的電腦中沒有安裝 X64 架構的 Java 虛擬機(JDK),你可以在 這裡 下載 X64 架構的 Java 虛擬機。\nMinecraft 尚未提供對 ARM 平台的支持,不能在您目前使用的 ARM64 架構 JDK 上運行。因此 HMCL 會借助 Rosetta 2 轉譯執行 X64 架構的 JDK 來啟動 Minecraft。 +launch.advice.vanilla_x86.translation=Minecraft 尚未為您的平臺提供完善支持,所以可能影響遊戲體驗或無法啟動遊戲。\n你可以在 這裡 下載 X86-64 架構的 Java 以獲得更完整的體驗。\n是否繼續啟動? launch.failed=啟動失敗 launch.failed.cannot_create_jvm=偵測到無法建立 Java 虛擬機,可能是 Java 參數有問題。可以在設定中開啟無參數模式啟動。 launch.failed.creating_process=啟動失敗,在建立新處理程式時發生錯誤。可能是 Java 路徑錯誤。 @@ -495,7 +496,7 @@ launch.failed.execution_policy=設定執行策略 launch.failed.execution_policy.failed_to_set=設定執行策略失敗 launch.failed.execution_policy.hint=當前執行策略封锁您執行 PowerShell 腳本。\n點擊“確定”允許當前用戶執行本地 PowerShell 腳本,或點擊“取消”保持現狀。 launch.failed.exited_abnormally=遊戲非正常退出,請查看記錄檔案,或聯絡他人尋求幫助。 -launch.failed.no_accepted_java=找不到適合當前遊戲使用的 Java。如果您認為實際存在合適的 Java,您可以在遊戲設置中手動設置 Java。 +launch.failed.no_accepted_java=找不到適合當前遊戲使用的 Java,是否使用默認 Java 啟動遊戲?點擊“是”使用默認 Java 繼續啟動遊戲,\n或者請到遊戲設定中選擇一個合適的Java虛擬機器版本。 launch.state.dependencies=處理遊戲相依元件 launch.state.done=啟動完成 launch.state.java=檢測 Java 版本 @@ -863,6 +864,7 @@ settings.advanced.custom_commands.hint=自訂命令被調用時將包含如下 \ - $INST_FABRIC: 若安裝了 Fabric,將會存在本環境變數 settings.advanced.dont_check_game_completeness=不檢查遊戲完整性 settings.advanced.dont_check_jvm_validity=不檢查 JVM 與遊戲的相容性 +settings.advanced.dont_patch_natives=不嘗試自動替換本機庫 settings.advanced.game_dir.default=預設(.minecraft/) settings.advanced.game_dir.independent=各版本獨立(.minecraft/versions/<版本名>/,除 assets、libraries) settings.advanced.java_permanent_generation_space=記憶體永久儲存區域 @@ -899,6 +901,7 @@ settings.advanced.server_ip=伺服器位址 settings.advanced.server_ip.prompt=預設,啟動遊戲後直接進入對應伺服器 settings.advanced.use_native_glfw=[Linux] 使用系統 GLFW settings.advanced.use_native_openal=[Linux] 使用系統 OpenAL +settings.advanced.use_software_renderer=使用 OpenGL 軟渲染器(相容性更好,但效能較差) settings.advanced.workaround=除錯選項 settings.advanced.workaround.warning=除錯選項僅提供給專業玩家使用。修改除錯選項可能會導致遊戲無法啟動。除非你知道你在做什麼,否則請你不要修改這些選項。 settings.advanced.wrapper_launcher=前置指令 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 60dc61a79..fed06773e 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -319,6 +319,7 @@ extension.ps1=PowerShell 脚本 extension.sh=Bash 脚本 fatal.javafx.incompatible=缺少 JavaFX 运行环境。\nHMCL 无法在低于 Java 11 且缺少 JavaFX 的 Java 环境上自行补全 JavaFX 运行环境。\n请更换如 Oracle Java 8 等包含 JavaFX 的 Java 运行环境,或者更新到 Java 11 或更高版本。 +fatal.javafx.incompatible.loongson=缺少 JavaFX 运行环境。\n请使用龙芯 JDK 8 (http://www.loongnix.cn/zh/api/java/downloads-jdk8/index.html) 启动 HMCL。 fatal.javafx.missing=缺少 JavaFX 运行环境。\n如果您使用的是 Java 11 或更高版本,请降级到 Oracle JRE 8(java.com),或者安装 BellSoft Liberica Full JRE(bell-sw.com/pages/downloads/?package=jre-full)。\n如果您使用的是其他 OpenJDK 构建,请确保其包含 OpenJFX! fatal.missing_dst_root_ca_x3=当前 Java 平台缺少 DST Root CA X3 证书。\n您依然可以使用 Hello Minecraft! Launcher,但将无法连接到部分站点(如使用 Lets Encrypt 证书的站点),这可能会使 HMCL 无法正常工作。\n请将您的 Java 升级到 8u101 以上以解决此问题。 fatal.config_loading_failure=Hello Minecraft! Launcher 无法加载配置文件\n请确保 Hello Minecraft! Launcher 对 "%s" 目录及该目录下的文件拥有读写权限! @@ -326,6 +327,7 @@ fatal.migration_requires_manual_reboot=Hello Minecraft! Launcher 即将完成升 fatal.apply_update_failure=我们很抱歉 Hello Minecraft! Launcher 无法自动完成升级,因为出现了一些问题……\n但你依可以从 %s 处手动下载 Hello Minecraft! Launcher 来完成升级\n请考虑向我们反馈该问题! fatal.samba=如果您正在通过 Samba 共享的文件夹中运行 HMCL,HMCL 可能无法正常工作,请尝试更新您的 Java 或在本地文件夹内运行 HMCL。 fatal.illegal_char=您的用户文件夹路径中存在非法字符‘=’。HMCL 能够运行,但可能某些功能无法正常使用!\n你将无法使用外置登录账户以及离线登录更换皮肤功能,并且在进行多人游戏时可能存在更大的安全隐患! +fatal.unsupported_platform=Minecraft 尚未为您的平台提供完善支持,所以可能影响游戏体验或无法启动游戏。\n若无法启动 Minecraft 1.17 及以上版本,可以尝试在版本设置中打开“使用 OpenGL 软渲染器”选项,\n使用 CPU 渲染以获得更好的兼容性。 feedback=反馈 feedback.add=新增反馈 @@ -379,10 +381,10 @@ game.crash.reason.fabric_warnings=Fabric 提供了一些警告信息:\n%1$s game.crash.reason.file_already_exists=当前游戏因为文件 %1$s 已经存在,无法继续运行。\n如果你认为这个文件可以删除,你可以在备份这个文件后尝试删除它,并重新启动游戏。 game.crash.reason.file_changed=当前游戏因为文件校验失败,无法继续运行。\n如果你手动修改了 Minecraft.jar 文件,你需要回退修改,或者重新下载游戏。 game.crash.reason.gl_operation_failure=当前游戏因为你使用的某些 Mod、光影包、材质包,无法继续运行。\n请先尝试禁用你所使用的Mod/光影包/材质包再试。 -game.crash.reason.graphics_driver=当前游戏因为你的显卡驱动存在问题崩溃了。\n\ - 请尝试升级你的显卡驱动到最新版本后再尝试启动游戏。\n\ +game.crash.reason.graphics_driver=当前游戏因为你的显卡驱动存在问题崩溃了,请尝试升级你的显卡驱动到最新版本后再尝试启动游戏。\n\ 如果你的电脑存在独立显卡,你需要检查游戏是否使用集成/核芯显卡启动。如果是,请尝试使用独立显卡启动 HMCL 与游戏。如果仍有问题,你可能需要考虑换一个新显卡或新电脑……\n\ - 如果你确实需要使用核芯显卡,请检查你的电脑的 CPU 是否是 Intel(R) Core(TM) 3000 系列或更旧的处理器,如果是,对于 Minecraft 1.16.5 及更旧版本,请你将游戏所使用的 Java 版本降级至 1.8.0_51 及以下版本 Java 1.8.0 历史版本 ,否则你必须更换独立显卡或新电脑。\n\ + 如果你确实需要使用核芯显卡,请检查你的电脑的 CPU 是否是 Intel(R) Core(TM) 3000 系列或更旧的处理器,如果是,对于 Minecraft 1.16.5 及更旧版本,请你将游戏所使用的 Java 版本降级至 1.8.0_51 及以下版本 Java 1.8.0 历史版本 ,否则你需要更换独立显卡或新电脑。\n\ + 在版本设置中打开“使用 OpenGL 软渲染器”选项也可以解决此问题,但打开此选项后在 CPU 性能不足的情况下帧数会显著降低,仅推荐以调试为目的或应急时开启。\n\ 详情请点击 此处 查看 game.crash.reason.illegal_access_error=当前游戏因为某些 Mod 的问题,无法继续运行。\n如果你认识:%1$s,你可以更新或删除对应 Mod 再试…… game.crash.reason.jdk_9=当前游戏因为 Java 版本过高,无法继续运行。\n你需要下载安装 Java 8,并在游戏设置中将 Java 设置为 1.8 的版本。 @@ -482,8 +484,7 @@ launch.advice.not_enough_space=您设置的内存大小过大,由于超过了 launch.advice.require_newer_java_version=Minecraft %1$s 仅能运行在 Java %2$s 或更高版本上,但 HMCL 未能找到该 Java 版本,你可以点击“是”,HMCL会自动下载他,是否下载? launch.advice.too_large_memory_for_32bit=您设置的内存大小过大,由于可能超过了 32 位 Java 的内存分配限制,所以可能无法启动游戏,请将内存调至 1024MB 或更小。是否继续启动? launch.advice.vanilla_linux_java_8=对于 Linux x86-64 平台,Minecraft 1.12.2 及以下版本仅支持 Java 8。\n请到 java.com 或其他途径下载 Java8!\n(可将 Java 路径选择至“自动选择合适的 Java”,启动时会自动下载该 Java)\nJava 9+ 版本会无法加载 32 位的 liblwjgl.so -launch.advice.vanilla_x86=Minecraft 官方尚未提供对非 x86-64 平台的支持。\n您可以尝试下载您所用平台对应的本机库,在游戏设置的调试选项中指定其路径后再尝试运行。 -launch.advice.vanilla_x86.translation=你的电脑中没有安装 X64 架构的 Java 虚拟机(JDK),你可以在 这里 下载 X64 架构的 Java 虚拟机。\nMinecraft 尚未提供对 ARM 平台的支持,不能在您目前使用的 ARM64 架构 JDK 上运行。因此 HMCL 会借助 Rosetta 2 转译执行 X64 架构的 JDK 来启动 Minecraft。 +launch.advice.vanilla_x86.translation=Minecraft 尚未为您的平台提供完善支持,所以可能影响游戏体验或无法启动游戏。\n你可以在 这里 下载 X86-64 架构的 Java 以获得更完整的体验。\n是否继续启动? launch.failed=启动失败 launch.failed.cannot_create_jvm=截获到无法创建 Java 虚拟机,可能是 Java 参数有问题,可以在设置中开启无参数模式启动。 launch.failed.creating_process=启动失败,在创建新进程时发生错误,可能是 Java 路径错误…… @@ -495,7 +496,7 @@ launch.failed.execution_policy=设置执行策略 launch.failed.execution_policy.failed_to_set=设置执行策略失败 launch.failed.execution_policy.hint=当前执行策略阻止您执行 PowerShell 脚本。\n点击“确定”允许当前用户执行本地 PowerShell 脚本,或点击“取消”保持现状。 launch.failed.exited_abnormally=游戏非正常退出,请查看日志文件,或联系他人寻求帮助。 -launch.failed.no_accepted_java=找不到适合当前游戏使用的 Java。如果您认为实际存在合适的 Java,您可以在游戏设置中手动设置 Java。 +launch.failed.no_accepted_java=找不到适合当前游戏使用的 Java,是否使用默认 Java 启动游戏?点击“是”使用默认 Java 继续启动游戏,\n或者请到游戏设置中选择一个合适的 Java 虚拟机版本。 launch.state.dependencies=处理游戏依赖 launch.state.done=启动完成 launch.state.java=检测 Java 版本 @@ -863,6 +864,7 @@ settings.advanced.custom_commands.hint=自定义命令被调用时将包含如 \ - $INST_FABRIC: 若安装了 Fabric,将会存在本环境变量 settings.advanced.dont_check_game_completeness=不检查游戏完整性 settings.advanced.dont_check_jvm_validity=不检查 JVM 与游戏的兼容性 +settings.advanced.dont_patch_natives=不尝试自动替换本地库 settings.advanced.game_dir.default=默认(.minecraft/) settings.advanced.game_dir.independent=各版本独立(存放在 .minecraft/versions/<版本名>/,除 assets、libraries 外) settings.advanced.java_permanent_generation_space=内存永久保存区域 @@ -899,6 +901,7 @@ settings.advanced.server_ip=服务器地址 settings.advanced.server_ip.prompt=默认,启动游戏后可以直接进入对应服务器 settings.advanced.use_native_glfw=[Linux] 使用系统 GLFW settings.advanced.use_native_openal=[Linux] 使用系统 OpenAL +settings.advanced.use_software_renderer=使用 OpenGL 软渲染器(兼容性更好,但性能较差) settings.advanced.workaround=调试选项 settings.advanced.workaround.warning=调试选项仅提供给专业玩家使用。调试选项可能会导致游戏无法启动。除非你知道你在做什么,否则请你不要修改这些选项! settings.advanced.wrapper_launcher=包装命令 diff --git a/HMCL/src/main/resources/assets/natives.json b/HMCL/src/main/resources/assets/natives.json new file mode 100644 index 000000000..a4a9016e3 --- /dev/null +++ b/HMCL/src/main/resources/assets/natives.json @@ -0,0 +1,1018 @@ +{ + "linux-arm64": { + "org.lwjgl:lwjgl:3.1.6": { + "name": "org.lwjgl:lwjgl:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3.jar", + "sha1": "17a59ba0fe8d474ec9dbe0d5db40d2cfe59c4c08", + "size": 552997 + } + } + }, + "org.lwjgl:lwjgl:3.1.6:natives": { + "name": "org.lwjgl:lwjgl:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3-natives-linux-arm64.jar", + "sha1": "368463bfc8ba25fa68a89a16ee535f0a229e86bc", + "size": 51148 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.1.6": { + "name": "org.lwjgl:lwjgl-jemalloc:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3.jar", + "sha1": "b6fd0932171ba3f2eaa4547beddca3a3e645342d", + "size": 34130 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3-natives-linux-arm64.jar", + "sha1": "bbc0a4672f5589e868ce3883da5a0c0b86e5b6ee", + "size": 148807 + } + } + }, + "org.lwjgl:lwjgl-openal:3.1.6": { + "name": "org.lwjgl:lwjgl-openal:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3.jar", + "sha1": "106742e805803ab9eab8e343f0fb31a3d263903c", + "size": 79432 + } + } + }, + "org.lwjgl:lwjgl-openal:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-openal:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3-natives-linux-arm64.jar", + "sha1": "bc72c90b6feaa303ca838b138e1b9f679a66139c", + "size": 554810 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.1.6": { + "name": "org.lwjgl:lwjgl-opengl:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3.jar", + "sha1": "bdd534a323d0c8f54969b95e424b6ac8984f7d6e", + "size": 936589 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3-natives-linux-arm64.jar", + "sha1": "aceb5d9ca264beed6d41c87e001632491dae165f", + "size": 58109 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.1.6": { + "name": "org.lwjgl:lwjgl-glfw:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3.jar", + "sha1": "5e520d5c290c8b012545a8d34fa5db5ab051ea53", + "size": 107999 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3-natives-linux-arm64.jar", + "sha1": "05149002edd12c9a7f62fb053d0ca8ea05a45f83", + "size": 141559 + } + } + }, + "org.lwjgl:lwjgl-stb:3.1.6": { + "name": "org.lwjgl:lwjgl-stb:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3.jar", + "sha1": "40eccaa4fa86fc815f2e17946a392fb5fdcc286a", + "size": 104049 + } + } + }, + "org.lwjgl:lwjgl-stb:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-stb:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3-natives-linux-arm64.jar", + "sha1": "ed533966d44fa24df4ab92c34e18b18e2b1afb7f", + "size": 181213 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.1.6": { + "name": "org.lwjgl:lwjgl-tinyfd:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3.jar", + "sha1": "d5edf89c7b6ca1ea20865a6ba0a09bfc5efb29c1", + "size": 6392 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3-natives-linux-arm64.jar", + "sha1": "bfc7be38fdc64f502b667fe2177db2ca8fd628cd", + "size": 34992 + } + } + }, + "org.lwjgl:lwjgl:3.2.2": { + "name": "org.lwjgl:lwjgl:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3.jar", + "sha1": "17a59ba0fe8d474ec9dbe0d5db40d2cfe59c4c08", + "size": 552997 + } + } + }, + "org.lwjgl:lwjgl:3.2.2:natives": { + "name": "org.lwjgl:lwjgl:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3-natives-linux-arm64.jar", + "sha1": "368463bfc8ba25fa68a89a16ee535f0a229e86bc", + "size": 51148 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.2": { + "name": "org.lwjgl:lwjgl-jemalloc:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3.jar", + "sha1": "b6fd0932171ba3f2eaa4547beddca3a3e645342d", + "size": 34130 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3-natives-linux-arm64.jar", + "sha1": "bbc0a4672f5589e868ce3883da5a0c0b86e5b6ee", + "size": 148807 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.2": { + "name": "org.lwjgl:lwjgl-openal:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3.jar", + "sha1": "106742e805803ab9eab8e343f0fb31a3d263903c", + "size": 79432 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-openal:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3-natives-linux-arm64.jar", + "sha1": "bc72c90b6feaa303ca838b138e1b9f679a66139c", + "size": 554810 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.2": { + "name": "org.lwjgl:lwjgl-opengl:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3.jar", + "sha1": "bdd534a323d0c8f54969b95e424b6ac8984f7d6e", + "size": 936589 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3-natives-linux-arm64.jar", + "sha1": "aceb5d9ca264beed6d41c87e001632491dae165f", + "size": 58109 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.2": { + "name": "org.lwjgl:lwjgl-glfw:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3.jar", + "sha1": "5e520d5c290c8b012545a8d34fa5db5ab051ea53", + "size": 107999 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3-natives-linux-arm64.jar", + "sha1": "05149002edd12c9a7f62fb053d0ca8ea05a45f83", + "size": 141559 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.2": { + "name": "org.lwjgl:lwjgl-stb:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3.jar", + "sha1": "40eccaa4fa86fc815f2e17946a392fb5fdcc286a", + "size": 104049 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-stb:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3-natives-linux-arm64.jar", + "sha1": "ed533966d44fa24df4ab92c34e18b18e2b1afb7f", + "size": 181213 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.2": { + "name": "org.lwjgl:lwjgl-tinyfd:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3.jar", + "sha1": "d5edf89c7b6ca1ea20865a6ba0a09bfc5efb29c1", + "size": 6392 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.2.3:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3-natives-linux-arm64.jar", + "sha1": "bfc7be38fdc64f502b667fe2177db2ca8fd628cd", + "size": 34992 + } + } + }, + "org.lwjgl:lwjgl:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl:3.3.1:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-linux-arm64.jar", + "sha1": "b597401014acb7196c76d97e15a6288f54f1f692", + "size": 86308 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-linux-arm64.jar", + "sha1": "c6606e57db075ad218a2e78d2416c159a53b6a0c", + "size": 157996 + } + } + }, + "org.lwjgl:lwjgl-openal:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-linux-arm64.jar", + "sha1": "cf4e303257e82981b8b2e31bba3d7f8f7b8f42b2", + "size": 470743 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-linux-arm64.jar", + "sha1": "1c528fb258a6e63e8fceb4482d8db0f3af10a634", + "size": 57908 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-linux-arm64.jar", + "sha1": "513eb39b866d0fe131a18d5c517087805433b029", + "size": 112350 + } + } + }, + "org.lwjgl:lwjgl-stb:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-linux-arm64.jar", + "sha1": "8e8348a1813aad7f30aaf75ea197151ebb7beba9", + "size": 205491 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-linux-arm64.jar", + "sha1": "964f628b7a82fd909def086c0dd9a4b84bb259ae", + "size": 42654 + } + } + }, + "org.lwjgl.lwjgl:lwjgl-platform:2.9.0:natives": { + "name": "org.glavo.hmcl:lwjgl2-natives:2.9.3", + "downloads": { + "classifiers": { + "linux-arm64": { + "path": "org/glavo/hmcl/lwjgl2-natives/2.9.3/lwjgl2-natives-2.9.3-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl2-natives/2.9.3-linux-arm64/lwjgl2-natives-2.9.3-linux-arm64.jar", + "sha1": "c47df34b6a0414b2d9972f602d0c85191129d69c", + "size": 7346768 + } + } + }, + "extract": { + "exclude": [ + "META-INF/" + ] + }, + "natives": { + "linux": "linux-arm64" + } + }, + "org.lwjgl.lwjgl:lwjgl-platform:2.9.1:natives": { + "name": "org.glavo.hmcl:lwjgl2-natives:2.9.3", + "downloads": { + "classifiers": { + "linux-arm64": { + "path": "org/glavo/hmcl/lwjgl2-natives/2.9.3/lwjgl2-natives-2.9.3-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl2-natives/2.9.3-linux-arm64/lwjgl2-natives-2.9.3-linux-arm64.jar", + "sha1": "c47df34b6a0414b2d9972f602d0c85191129d69c", + "size": 7346768 + } + } + }, + "extract": { + "exclude": [ + "META-INF/" + ] + }, + "natives": { + "linux": "linux-arm64" + } + }, + "org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209:natives": { + "name": "org.glavo.hmcl:lwjgl2-natives:2.9.3", + "downloads": { + "classifiers": { + "linux-arm64": { + "path": "org/glavo/hmcl/lwjgl2-natives/2.9.3/lwjgl2-natives-2.9.3-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl2-natives/2.9.3-linux-arm64/lwjgl2-natives-2.9.3-linux-arm64.jar", + "sha1": "c47df34b6a0414b2d9972f602d0c85191129d69c", + "size": 7346768 + } + } + }, + "extract": { + "exclude": [ + "META-INF/" + ] + }, + "natives": { + "linux": "linux-arm64" + } + }, + "net.java.jinput:jinput-platform:2.0.5:natives": null, + "com.mojang:text2speech:1.10.3:natives": null, + "com.mojang:text2speech:1.11.3:natives": null, + "com.mojang:text2speech:1.12.4:natives": null, + "com.mojang:text2speech:1.13.9:natives-linux": null + }, + "linux-arm32": { + "org.lwjgl:lwjgl:3.1.6": { + "name": "org.lwjgl:lwjgl:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3.jar", + "sha1": "17a59ba0fe8d474ec9dbe0d5db40d2cfe59c4c08", + "size": 552997 + } + } + }, + "org.lwjgl:lwjgl:3.1.6:natives": { + "name": "org.lwjgl:lwjgl:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3-natives-linux-arm32.jar", + "sha1": "3180d363040744dfe0c6a0dd5d018cedae476e9a", + "size": 53035 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.1.6": { + "name": "org.lwjgl:lwjgl-jemalloc:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3.jar", + "sha1": "b6fd0932171ba3f2eaa4547beddca3a3e645342d", + "size": 34130 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3-natives-linux-arm32.jar", + "sha1": "d7e5cecbf045b7b7863343273ffea94e0e2f6994", + "size": 137847 + } + } + }, + "org.lwjgl:lwjgl-openal:3.1.6": { + "name": "org.lwjgl:lwjgl-openal:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3.jar", + "sha1": "106742e805803ab9eab8e343f0fb31a3d263903c", + "size": 79432 + } + } + }, + "org.lwjgl:lwjgl-openal:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-openal:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3-natives-linux-arm32.jar", + "sha1": "5c30ef08c829252e542f9fbc04772d51013326c5", + "size": 552314 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.1.6": { + "name": "org.lwjgl:lwjgl-opengl:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3.jar", + "sha1": "bdd534a323d0c8f54969b95e424b6ac8984f7d6e", + "size": 936589 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3-natives-linux-arm32.jar", + "sha1": "4925362a5f2412cb6467e6d6c6de26b9e1ccfc71", + "size": 58594 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.1.6": { + "name": "org.lwjgl:lwjgl-glfw:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3.jar", + "sha1": "5e520d5c290c8b012545a8d34fa5db5ab051ea53", + "size": 107999 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3-natives-linux-arm32.jar", + "sha1": "aab1a5a1e21eca87f4acd5ba055f6bfd5d90951c", + "size": 138698 + } + } + }, + "org.lwjgl:lwjgl-stb:3.1.6": { + "name": "org.lwjgl:lwjgl-stb:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3.jar", + "sha1": "40eccaa4fa86fc815f2e17946a392fb5fdcc286a", + "size": 104049 + } + } + }, + "org.lwjgl:lwjgl-stb:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-stb:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3-natives-linux-arm32.jar", + "sha1": "f28dc1e73025cf699a2cdd4f6db7964ed357ce50", + "size": 146890 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.1.6": { + "name": "org.lwjgl:lwjgl-tinyfd:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3.jar", + "sha1": "d5edf89c7b6ca1ea20865a6ba0a09bfc5efb29c1", + "size": 6392 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3-natives-linux-arm32.jar", + "sha1": "b3ad16cb0e4c1307bf3d1ecb29559e18a4f8633c", + "size": 38752 + } + } + }, + "org.lwjgl:lwjgl:3.2.2": { + "name": "org.lwjgl:lwjgl:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3.jar", + "sha1": "17a59ba0fe8d474ec9dbe0d5db40d2cfe59c4c08", + "size": 552997 + } + } + }, + "org.lwjgl:lwjgl:3.2.2:natives": { + "name": "org.lwjgl:lwjgl:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3-natives-linux-arm32.jar", + "sha1": "3180d363040744dfe0c6a0dd5d018cedae476e9a", + "size": 53035 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.2": { + "name": "org.lwjgl:lwjgl-jemalloc:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3.jar", + "sha1": "b6fd0932171ba3f2eaa4547beddca3a3e645342d", + "size": 34130 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3-natives-linux-arm32.jar", + "sha1": "d7e5cecbf045b7b7863343273ffea94e0e2f6994", + "size": 137847 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.2": { + "name": "org.lwjgl:lwjgl-openal:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3.jar", + "sha1": "106742e805803ab9eab8e343f0fb31a3d263903c", + "size": 79432 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-openal:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3-natives-linux-arm32.jar", + "sha1": "5c30ef08c829252e542f9fbc04772d51013326c5", + "size": 552314 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.2": { + "name": "org.lwjgl:lwjgl-opengl:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3.jar", + "sha1": "bdd534a323d0c8f54969b95e424b6ac8984f7d6e", + "size": 936589 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3-natives-linux-arm32.jar", + "sha1": "4925362a5f2412cb6467e6d6c6de26b9e1ccfc71", + "size": 58594 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.2": { + "name": "org.lwjgl:lwjgl-glfw:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3.jar", + "sha1": "5e520d5c290c8b012545a8d34fa5db5ab051ea53", + "size": 107999 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3-natives-linux-arm32.jar", + "sha1": "aab1a5a1e21eca87f4acd5ba055f6bfd5d90951c", + "size": 138698 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.2": { + "name": "org.lwjgl:lwjgl-stb:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3.jar", + "sha1": "40eccaa4fa86fc815f2e17946a392fb5fdcc286a", + "size": 104049 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-stb:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3-natives-linux-arm32.jar", + "sha1": "f28dc1e73025cf699a2cdd4f6db7964ed357ce50", + "size": 146890 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.2": { + "name": "org.lwjgl:lwjgl-tinyfd:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3.jar", + "sha1": "d5edf89c7b6ca1ea20865a6ba0a09bfc5efb29c1", + "size": 6392 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3-natives-linux-arm32.jar", + "sha1": "b3ad16cb0e4c1307bf3d1ecb29559e18a4f8633c", + "size": 38752 + } + } + }, + "org.lwjgl:lwjgl:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-linux-arm32.jar", + "sha1": "41a3c1dd15d6b964eb8196dde69720a3e3e5e969", + "size": 82374 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-linux-arm32.jar", + "sha1": "a96a6d6cb3876d7813fcee53c3c24f246aeba3b3", + "size": 136157 + } + } + }, + "org.lwjgl:lwjgl-openal:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-linux-arm32.jar", + "sha1": "ffbe35d7fa5ec9b7eca136a7c71f24d4025a510b", + "size": 400129 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-linux-arm32.jar", + "sha1": "e3550fa91097fd56e361b4370fa822220fef3595", + "size": 58474 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-linux-arm32.jar", + "sha1": "816d935933f2dd743074c4e717cc25b55720f294", + "size": 104027 + } + } + }, + "org.lwjgl:lwjgl-stb:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-linux-arm32.jar", + "sha1": "b08226bab162c06ae69337d8a1b0ee0a3fdf0b90", + "size": 153889 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-linux-arm32.jar", + "sha1": "d53d331e859217a61298fcbcf8d79137f3df345c", + "size": 48061 + } + } + }, + "com.mojang:text2speech:1.10.3:natives": null, + "com.mojang:text2speech:1.11.3:natives": null, + "com.mojang:text2speech:1.12.4:natives": null, + "com.mojang:text2speech:1.13.9:natives-linux": null + }, + "linux-loongarch64_ow": { + "org.lwjgl.lwjgl:lwjgl-platform:2.9.0:natives": { + "name": "org.glavo.hmcl:lwjgl2-natives:2.9.3-rc1", + "downloads": { + "classifiers": { + "linux-loongarch64": { + "path": "org/glavo/hmcl/lwjgl2-natives/2.9.3-rc1/lwjgl2-natives-2.9.3-rc1-linux-loongarch64.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl2-natives/2.9.3-rc1-linux-loongarch64/lwjgl2-natives-2.9.3-rc1-linux-loongarch64.jar", + "sha1": "135e7e557431be70fa590eb6feffebb078d34728", + "size": 594335 + } + } + }, + "extract": { + "exclude": [ + "META-INF/" + ] + }, + "natives": { + "linux": "linux-loongarch64" + } + }, + "org.lwjgl.lwjgl:lwjgl-platform:2.9.1:natives": { + "name": "org.glavo.hmcl:lwjgl2-natives:2.9.3-rc1", + "downloads": { + "classifiers": { + "linux-loongarch64": { + "path": "org/glavo/hmcl/lwjgl2-natives/2.9.3-rc1/lwjgl2-natives-2.9.3-rc1-linux-loongarch64.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl2-natives/2.9.3-rc1-linux-loongarch64/lwjgl2-natives-2.9.3-rc1-linux-loongarch64.jar", + "sha1": "135e7e557431be70fa590eb6feffebb078d34728", + "size": 594335 + } + } + }, + "extract": { + "exclude": [ + "META-INF/" + ] + }, + "natives": { + "linux": "linux-loongarch64" + } + }, + "org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209:natives": { + "name": "org.glavo.hmcl:lwjgl2-natives:2.9.3-rc1", + "downloads": { + "classifiers": { + "linux-loongarch64": { + "path": "org/glavo/hmcl/lwjgl2-natives/2.9.3-rc1/lwjgl2-natives-2.9.3-rc1-linux-loongarch64.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl2-natives/2.9.3-rc1-linux-loongarch64/lwjgl2-natives-2.9.3-rc1-linux-loongarch64.jar", + "sha1": "135e7e557431be70fa590eb6feffebb078d34728", + "size": 594335 + } + } + }, + "extract": { + "exclude": [ + "META-INF/" + ] + }, + "natives": { + "linux": "linux-loongarch64" + } + }, + "org.lwjgl:lwjgl:3.3.1:natives-linux": null, + "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux": null, + "org.lwjgl:lwjgl-openal:3.3.1:natives-linux": null, + "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux": null, + "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux": null, + "org.lwjgl:lwjgl-stb:3.3.1:natives-linux": null, + "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux": null, + "net.java.jinput:jinput-platform:2.0.5:natives": null, + "com.mojang:text2speech:1.10.3:natives": null, + "com.mojang:text2speech:1.11.3:natives": null, + "com.mojang:text2speech:1.12.4:natives": null, + "com.mojang:text2speech:1.13.9:natives-linux": null + }, + "windows-x86_64": { + "software-renderer-loader": { + "name": "org.glavo:llvmpipe-loader:1.0", + "downloads": { + "artifact": { + "path": "org/glavo/llvmpipe-loader/1.0/llvmpipe-loader-1.0.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/llvmpipe-loader/1.0/llvmpipe-loader-1.0.jar", + "sha1": "ff255415e5c4b2a18970da0a8e552b557ca013ae", + "size": 12964773 + } + } + } + }, + "windows-arm64": { + "org.lwjgl:lwjgl:3.3.1:natives-windows": { + "name": "org.lwjgl:lwjgl:3.3.1:natives-windows-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-windows-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-windows-arm64.jar", + "sha1": "0f46cadcf95675908fd3a550d63d9d709cb68998", + "size": 130064 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-windows": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-windows-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-windows-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-windows-arm64.jar", + "sha1": "cae85c4edb219c88b6a0c26a87955ad98dc9519d", + "size": 114250 + } + } + }, + "org.lwjgl:lwjgl-openal:3.3.1:natives-windows": { + "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-windows-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-windows-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-windows-arm64.jar", + "sha1": "40d65f1a7368a2aa47336f9cb69f5a190cf9975a", + "size": 505234 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.3.1:natives-windows": { + "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-windows-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-windows-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-windows-arm64.jar", + "sha1": "527d78f1e9056aff3ed02ce93019c73c5e8f1721", + "size": 82445 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.3.1:natives-windows": { + "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-windows-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-windows-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-windows-arm64.jar", + "sha1": "beda65ee503443e60aa196d58ed31f8d001dc22a", + "size": 123808 + } + } + }, + "org.lwjgl:lwjgl-stb:3.3.1:natives-windows": { + "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-windows-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-windows-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-windows-arm64.jar", + "sha1": "fde63cdd2605c00636721a6c8b961e41d1f6b247", + "size": 216848 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-windows": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-windows-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-windows-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-windows-arm64.jar", + "sha1": "83a5e780df610829ff3a737822b4f931cffecd91", + "size": 109139 + } + } + }, + "com.mojang:text2speech:1.13.9:natives-windows": null + } +} \ No newline at end of file diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java index 3b2294216..1f5eb5368 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java @@ -106,7 +106,8 @@ public class BMCLAPIDownloadProvider implements DownloadProvider { .replace("http://dl.liteloader.com/versions", apiRoot + "/maven") .replace("https://meta.fabricmc.net", apiRoot + "/fabric-meta") .replace("https://maven.fabricmc.net", apiRoot + "/maven") - .replace("https://authlib-injector.yushi.moe", apiRoot + "/mirrors/authlib-injector"); + .replace("https://authlib-injector.yushi.moe", apiRoot + "/mirrors/authlib-injector") + .replace("https://repo1.maven.org/maven2", "https://maven.aliyun.com/repository/central"); } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/CrashReportAnalyzer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/CrashReportAnalyzer.java index 1dfa34663..dbaaa5490 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/CrashReportAnalyzer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/CrashReportAnalyzer.java @@ -44,7 +44,7 @@ public final class CrashReportAnalyzer { // Maybe software rendering? Suggest user for using a graphics card. OPENGL_NOT_SUPPORTED(Pattern.compile("The driver does not appear to support OpenGL")), - GRAPHICS_DRIVER(Pattern.compile("(Pixel format not accelerated|Couldn't set pixel format|net\\.minecraftforge\\.fml.client\\.SplashProgress|org\\.lwjgl\\.LWJGLException|EXCEPTION_ACCESS_VIOLATION(.|\\n|\\r)+# C {2}\\[(ig|atio|nvoglv))")), + GRAPHICS_DRIVER(Pattern.compile("(Pixel format not accelerated|GLX: Failed to create context: GLXBadFBConfig|Couldn't set pixel format|net\\.minecraftforge\\.fml.client\\.SplashProgress|org\\.lwjgl\\.LWJGLException|EXCEPTION_ACCESS_VIOLATION(.|\\n|\\r)+# C {2}\\[(ig|atio|nvoglv))")), // Out of memory OUT_OF_MEMORY(Pattern.compile("(java\\.lang\\.OutOfMemoryError|The system is out of physical RAM or swap space)")), // Memory exceeded diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java index 3b2287e6d..45066dc17 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java @@ -116,7 +116,7 @@ public enum JavaVersionConstraint { } }, // Minecraft currently does not provide official support for architectures other than x86 and x86-64. - VANILLA_X86(JavaVersionConstraint.RULE_MANDATORY, versionRange(JavaVersionConstraint.MIN, JavaVersionConstraint.MAX), versionRange(JavaVersionConstraint.MIN, JavaVersionConstraint.MAX)) { + VANILLA_X86(JavaVersionConstraint.RULE_SUGGESTED, versionRange(JavaVersionConstraint.MIN, JavaVersionConstraint.MAX), versionRange(JavaVersionConstraint.MIN, JavaVersionConstraint.MAX)) { @Override protected boolean appliesToVersionImpl(VersionNumber gameVersionNumber, @Nullable Version version, @Nullable JavaVersion javaVersion) { @@ -237,12 +237,15 @@ public enum JavaVersionConstraint { public static JavaVersion findSuitableJavaVersion(VersionNumber gameVersion, Version version) throws InterruptedException { VersionRanges range = findSuitableJavaVersionRange(gameVersion, version); + boolean skipCheckArchitecture = Architecture.CURRENT_ARCH.isX86() + || (OperatingSystem.CURRENT_OS == OperatingSystem.OSX && gameVersion.compareTo(VersionNumber.asVersion("1.19")) >= 0) + || OperatingSystem.CURRENT_OS == OperatingSystem.LINUX; + JavaVersion mandatory = null; JavaVersion suggested = null; for (JavaVersion javaVersion : JavaVersion.getJavas()) { // select the latest x86 java that this version accepts. - if (!javaVersion.getArchitecture().isX86() - && (OperatingSystem.CURRENT_OS != OperatingSystem.OSX || gameVersion.compareTo(VersionNumber.asVersion("1.19")) < 0)) + if (!skipCheckArchitecture && !javaVersion.getArchitecture().isX86()) continue; VersionNumber javaVersionNumber = javaVersion.getVersionNumber(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java index b1faa9ff9..6c0e12055 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java @@ -58,6 +58,7 @@ public class LaunchOptions implements Serializable { private NativesDirectoryType nativesDirType; private String nativesDir; private ProcessPriority processPriority = ProcessPriority.NORMAL; + private boolean useSoftwareRenderer; private boolean useNativeGLFW; private boolean useNativeOpenAL; private boolean daemon; @@ -242,6 +243,10 @@ public class LaunchOptions implements Serializable { return processPriority; } + public boolean isUseSoftwareRenderer() { + return useSoftwareRenderer; + } + public boolean isUseNativeGLFW() { return useNativeGLFW; } @@ -421,6 +426,10 @@ public class LaunchOptions implements Serializable { return options.nativesDir; } + public boolean isUseSoftwareRenderer() { + return options.useSoftwareRenderer; + } + public boolean isUseNativeGLFW() { return options.useNativeGLFW; } @@ -561,6 +570,11 @@ public class LaunchOptions implements Serializable { return this; } + public Builder setUseSoftwareRenderer(boolean useSoftwareRenderer) { + options.useSoftwareRenderer = useSoftwareRenderer; + return this; + } + public Builder setUseNativeGLFW(boolean useNativeGLFW) { options.useNativeGLFW = useNativeGLFW; return this; 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 47c1e92bc..cb2b8db7a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -481,6 +481,11 @@ public class DefaultLauncher extends Launcher { env.put("INST_MC_DIR", repository.getRunDirectory(version.getId()).getAbsolutePath()); env.put("INST_JAVA", options.getJava().getBinary().toString()); + if (options.isUseSoftwareRenderer() && OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { + env.put("LIBGL_ALWAYS_SOFTWARE", "1"); + env.put("__GLX_VENDOR_LIBRARY_NAME", "mesa"); + } + LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version); if (analyzer.has(LibraryAnalyzer.LibraryType.FORGE)) { env.put("INST_FORGE", "1"); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/ExitWaiter.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/ExitWaiter.java index 50ae9d0d1..086b70812 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/ExitWaiter.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/ExitWaiter.java @@ -26,9 +26,7 @@ import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.platform.ManagedProcess; import java.util.Collection; -import java.util.List; import java.util.function.BiConsumer; -import java.util.stream.Collectors; /** * @@ -60,21 +58,37 @@ final class ExitWaiter implements Runnable { for (Thread thread : joins) thread.join(); - List errorLines = process.getLines().stream() - .filter(Log4jLevel::guessLogLineError).collect(Collectors.toList()); - ProcessListener.ExitType exitType; + ProcessListener.ExitType exitType = null; + for (String line : process.getLines()) { + Log4jLevel level = Log4jLevel.guessLevel(line); + if (Log4jLevel.isError(level)) { + // LaunchWrapper will catch the exception logged and will exit normally. + if (exitCode != 0 && StringUtils.containsOne(line, + "Could not create the Java Virtual Machine.", + "Error occurred during initialization of VM", + "A fatal exception has occurred. Program will exit.")) { + EventBus.EVENT_BUS.fireEvent(new JVMLaunchFailedEvent(this, process)); + exitType = ProcessListener.ExitType.JVM_ERROR; + break; + } - // LaunchWrapper will catch the exception logged and will exit normally. - if (exitCode != 0 && StringUtils.containsOne(errorLines, - "Could not create the Java Virtual Machine.", - "Error occurred during initialization of VM", - "A fatal exception has occurred. Program will exit.")) { - EventBus.EVENT_BUS.fireEvent(new JVMLaunchFailedEvent(this, process)); - exitType = ProcessListener.ExitType.JVM_ERROR; - } else if (exitCode != 0 || StringUtils.containsOne(errorLines, "Unable to launch")) { - EventBus.EVENT_BUS.fireEvent(new ProcessExitedAbnormallyEvent(this, process)); - exitType = ProcessListener.ExitType.APPLICATION_ERROR; - } else + if (exitCode != 0 || StringUtils.containsOne(line, "Unable to launch")) { + EventBus.EVENT_BUS.fireEvent(new ProcessExitedAbnormallyEvent(this, process)); + exitType = ProcessListener.ExitType.APPLICATION_ERROR; + break; + } + } + + if (level == Log4jLevel.WARN) { + if (StringUtils.containsOne(line, "Failed to create window")) { + EventBus.EVENT_BUS.fireEvent(new ProcessExitedAbnormallyEvent(this, process)); + exitType = ProcessListener.ExitType.APPLICATION_ERROR; + break; + } + } + } + + if (exitType == null) exitType = ProcessListener.ExitType.NORMAL; EventBus.EVENT_BUS.fireEvent(new ProcessStoppedEvent(this, process)); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java index 6845349b1..fae3ee77f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java @@ -17,6 +17,8 @@ */ package org.jackhuang.hmcl.util.platform; +import org.jackhuang.hmcl.util.versioning.VersionNumber; + import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Locale; @@ -46,6 +48,7 @@ public enum Architecture { S390X(BIT_64, "S390x"), RISCV(BIT_64, "RISC-V"), LOONGARCH32(BIT_32, "LoongArch32"), + LOONGARCH64_OW(BIT_64, "LoongArch64 (old world)"), LOONGARCH64(BIT_64, "LoongArch64"), UNKNOWN(Bits.UNKNOWN, "Unknown"); @@ -172,8 +175,11 @@ public enum Architecture { return S390X; case "loongarch32": return LOONGARCH32; - case "loongarch64": + case "loongarch64": { + if (VersionNumber.VERSION_COMPARATOR.compare(System.getProperty("os.version"), "5.19") < 0) + return LOONGARCH64_OW; return LOONGARCH64; + } default: if (value.startsWith("armv7")) { return ARM32; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Platform.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Platform.java index 3fc8b872d..027aacdd8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Platform.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Platform.java @@ -14,6 +14,21 @@ public final class Platform { public static final Platform CURRENT_PLATFORM = Platform.getPlatform(OperatingSystem.CURRENT_OS, Architecture.CURRENT_ARCH); public static final Platform SYSTEM_PLATFORM = Platform.getPlatform(OperatingSystem.CURRENT_OS, Architecture.SYSTEM_ARCH); + public static boolean isCompatibleWithX86Java() { + if (Architecture.CURRENT_ARCH.isX86()) + return true; + + // Rosetta 2 is available for Mac computers with Apple silicon + if (CURRENT_PLATFORM == OSX_ARM64) + return true; + + // Windows on ARM introduced translation support for x86-64 after 10.0.21277. + if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS && OperatingSystem.SYSTEM_BUILD_NUMBER >= 21277) + return true; + + return false; + } + private final OperatingSystem os; private final Architecture arch;