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 189313ca9..015edc008 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -374,7 +374,7 @@ public class HMCLGameRepository extends DefaultGameRepository { vs.setUsesGlobal(true); } - public LaunchOptions getLaunchOptions(String version, JavaRuntime javaVersion, File gameDir, List javaAgents, boolean makeLaunchScript) { + public LaunchOptions getLaunchOptions(String version, JavaRuntime javaVersion, File gameDir, List javaAgents, List javaArguments, boolean makeLaunchScript) { VersionSetting vs = getVersionSetting(version); LaunchOptions.Builder builder = new LaunchOptions.Builder() @@ -417,7 +417,8 @@ public class HMCLGameRepository extends DefaultGameRepository { .setUseNativeGLFW(vs.isUseNativeGLFW()) .setUseNativeOpenAL(vs.isUseNativeOpenAL()) .setDaemon(!makeLaunchScript && vs.getLauncherVisibility().isDaemon()) - .setJavaAgents(javaAgents); + .setJavaAgents(javaAgents) + .setJavaArguments(javaArguments); if (config().hasProxy()) { builder.setProxy(ProxyManager.getProxy()); if (config().hasProxyAuth()) { 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 e837fa1e2..cb6b62bd2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -131,13 +131,14 @@ public final class LauncherHelper { boolean integrityCheck = repository.unmarkVersionLaunchedAbnormally(selectedVersion); CountDownLatch launchingLatch = new CountDownLatch(1); List javaAgents = new ArrayList<>(0); + List javaArguments = new ArrayList<>(0); AtomicReference javaVersionRef = new AtomicReference<>(); TaskExecutor executor = checkGameState(profile, setting, version.get()) .thenComposeAsync(java -> { javaVersionRef.set(Objects.requireNonNull(java)); - version.set(NativePatcher.patchNative(version.get(), gameVersion.orElse(null), java, setting)); + version.set(NativePatcher.patchNative(repository, version.get(), gameVersion.orElse(null), java, setting, javaArguments)); if (setting.isNotCheckGame()) return null; return Task.allOf( @@ -155,7 +156,7 @@ public final class LauncherHelper { Task.composeAsync(() -> { Renderer renderer = setting.getRenderer(); if (renderer != Renderer.DEFAULT && OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { - Library lib = NativePatcher.getMesaLoader(java, renderer); + Library lib = NativePatcher.getMesaLoader(java); if (lib == null) return null; File file = dependencyManager.getGameRepository().getLibraryFile(version.get(), lib); @@ -182,7 +183,8 @@ public final class LauncherHelper { .thenComposeAsync(() -> gameVersion.map(s -> new GameVerificationFixTask(dependencyManager, s, version.get())).orElse(null)) .thenComposeAsync(() -> logIn(account).withStage("launch.state.logging_in")) .thenComposeAsync(authInfo -> Task.supplyAsync(() -> { - LaunchOptions launchOptions = repository.getLaunchOptions(selectedVersion, javaVersionRef.get(), profile.getGameDir(), javaAgents, scriptFile != null); + LaunchOptions launchOptions = repository.getLaunchOptions( + selectedVersion, javaVersionRef.get(), profile.getGameDir(), javaAgents, javaArguments, scriptFile != null); LOG.info("Here's the structure of game mod directory:\n" + FileUtils.printFileStructure(repository.getModManager(selectedVersion).getModsDirectory(), 10)); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java index 814064728..211b7e274 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java @@ -18,6 +18,8 @@ package org.jackhuang.hmcl.util; import org.jackhuang.hmcl.game.*; +import org.jackhuang.hmcl.mod.LocalModFile; +import org.jackhuang.hmcl.mod.ModManager; import org.jackhuang.hmcl.setting.VersionSetting; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.platform.Architecture; @@ -60,7 +62,11 @@ public final class NativePatcher { }); } - public static Version patchNative(Version version, String gameVersion, JavaRuntime javaVersion, VersionSetting settings) { + public static Version patchNative(DefaultGameRepository repository, + Version version, String gameVersion, + JavaRuntime javaVersion, + VersionSetting settings, + List javaArguments) { if (settings.getNativesDirType() == NativesDirectoryType.CUSTOM) { if (gameVersion != null && GameVersionNumber.compare(gameVersion, "1.19") < 0) return version; @@ -124,6 +130,7 @@ public final class NativePatcher { return version; } + boolean lwjglVersionChanged = false; ArrayList newLibraries = new ArrayList<>(); for (Library library : version.getLibraries()) { if (!library.appliesToCurrentEnvironment()) @@ -145,14 +152,33 @@ public final class NativePatcher { } else if (replacement != null) { LOG.info("Replace " + library.getName() + " with " + replacement.getName()); newLibraries.add(replacement); + + if ("org.lwjgl:lwjgl".equals(library.getName()) && !Objects.equals(library.getVersion(), replacement.getVersion())) { + lwjglVersionChanged = true; + } } } } + if (lwjglVersionChanged) { + ModManager modManager = repository.getModManager(version.getId()); + try { + for (LocalModFile mod : modManager.getMods()) { + if ("sodium".equals(mod.getId())) { + // https://github.com/CaffeineMC/sodium/issues/2561 + javaArguments.add("-Dsodium.checks.issue2561=false"); + break; + } + } + } catch (Throwable e) { + LOG.warning("Failed to get mods", e); + } + } + return version.setLibraries(newLibraries); } - public static Library getMesaLoader(JavaRuntime javaVersion, Renderer renderer) { + public static Library getMesaLoader(JavaRuntime javaVersion) { return getNatives(javaVersion.getPlatform()).get("mesa-loader"); } } 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 1f4c13043..188347f40 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -50,6 +50,8 @@ import static org.jackhuang.hmcl.util.Pair.pair; */ public class DefaultLauncher extends Launcher { + private final LibraryAnalyzer analyzer; + public DefaultLauncher(GameRepository repository, Version version, AuthInfo authInfo, LaunchOptions options) { this(repository, version, authInfo, options, null); } @@ -60,6 +62,8 @@ public class DefaultLauncher extends Launcher { public DefaultLauncher(GameRepository repository, Version version, AuthInfo authInfo, LaunchOptions options, ProcessListener listener, boolean daemon) { super(repository, version, authInfo, options, listener, daemon); + + this.analyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null)); } private Command generateCommandLine(File nativeFolder) throws IOException { @@ -496,7 +500,7 @@ public class DefaultLauncher extends Launcher { break; case ZINK: env.put("MESA_LOADER_DRIVER_OVERRIDE", "zink"); - /** + /* * The amdgpu DDX is missing support for modifiers, causing Zink to fail. * Disable DRI3 to workaround this issue. * @@ -508,7 +512,6 @@ public class DefaultLauncher extends Launcher { } } - LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null)); if (analyzer.has(LibraryAnalyzer.LibraryType.FORGE)) { env.put("INST_FORGE", "1"); }