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 abc972cc372..4cd6210378d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -35,23 +35,12 @@ import org.jackhuang.hmcl.modpack.Modpack; import org.jackhuang.hmcl.modpack.ModpackConfiguration; import org.jackhuang.hmcl.modpack.ModpackProvider; -import org.jackhuang.hmcl.setting.LauncherSettings; -import org.jackhuang.hmcl.setting.SettingsManager; -import org.jackhuang.hmcl.setting.DefaultIsolationType; -import org.jackhuang.hmcl.setting.DownloadProviders; -import org.jackhuang.hmcl.setting.GameSettings; -import org.jackhuang.hmcl.setting.GameWindowType; -import org.jackhuang.hmcl.setting.LegacyGameSettingsMigrator; -import org.jackhuang.hmcl.setting.GameDirectory; -import org.jackhuang.hmcl.setting.ProxyType; -import org.jackhuang.hmcl.setting.SettingFileUtils; -import org.jackhuang.hmcl.setting.GameSettingsPresetID; -import org.jackhuang.hmcl.setting.GameInstanceIconType; +import org.jackhuang.hmcl.setting.*; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.util.FileSaver; import org.jackhuang.hmcl.util.Lang; -import org.jackhuang.hmcl.util.gson.JsonSchema; import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.gson.JsonSchema; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.platform.Bits; @@ -794,6 +783,7 @@ public LaunchOptions.Builder getLaunchOptions(GameInstanceID instanceId, JavaRun .setDisableAutoGameOptions(vs.getInheritable(GameSettings::disableAutoGameOptionsProperty)) .setUseNativeGLFW(vs.getInheritable(GameSettings::useNativeGLFWProperty)) .setUseNativeOpenAL(vs.getInheritable(GameSettings::useNativeOpenALProperty)) + .setUseNativeSDL(vs.getInheritable(GameSettings::useNativeSDLProperty)) .setUseHighPerformanceGPU(vs.getInheritable(GameSettings::highPerformanceProperty)) .setDaemon(!makeLaunchScript && vs.getInheritable(GameSettings::launcherVisibilityProperty).isDaemon()) .setJavaAgents(javaAgents) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GameSettings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GameSettings.java index dcee269f706..8372cb06fd9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GameSettings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GameSettings.java @@ -836,6 +836,18 @@ public InheritableProperty useNativeOpenALProperty() { return useNativeOpenAL; } + /// Property name for using native SDL. + public static final String PROPERTY_USE_NATIVE_SDL = "useNativeSDL"; + + /// If `true`, HMCL will use native SDL. + @SerializedName(PROPERTY_USE_NATIVE_SDL) + private final InheritableProperty useNativeSDL = newInheritableProperty(PROPERTY_USE_NATIVE_SDL, false); + + /// Returns the native SDL property. + public InheritableProperty useNativeSDLProperty() { + return useNativeSDL; + } + private static Renderer selectRenderer(GraphicsAPI api, @Nullable Renderer renderer) { if (renderer instanceof Renderer.Driver driver && driver.api() != api) { return Renderer.DEFAULT; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/GameSettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/GameSettingsPage.java index 1fc2429b04d..38cb6105972 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/GameSettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/GameSettingsPage.java @@ -835,10 +835,23 @@ public GameSettingsPage(Class settingType) { useNativeGLFWPane.setTitle(i18n("settings.advanced.use_native_glfw")); useNativeGLFWPane.setSubtitle(i18n("settings.advanced.linux_freebsd_only")); + var useNativeSDLPane = createIndependentBooleanButton(GameSettings::useNativeSDLProperty); + nativeLibrarySettings.getContent().add(useNativeSDLPane); + useNativeSDLPane.setTitle(i18n("settings.advanced.use_native_sdl")); + useNativeSDLPane.setSubtitle(i18n("settings.advanced.linux_freebsd_only")); + var useNativeOpenALPane = createIndependentBooleanButton(GameSettings::useNativeOpenALProperty); nativeLibrarySettings.getContent().add(useNativeOpenALPane); useNativeOpenALPane.setTitle(i18n("settings.advanced.use_native_openal")); useNativeOpenALPane.setSubtitle(i18n("settings.advanced.linux_freebsd_only")); + + this.currentGameVersionNumber.addListener((o, oldValue, newValue) -> { + boolean isUsingSDL = isPresetSetting || newValue.compareTo("26.3-snapshot-4") >= 0; + useNativeGLFWPane.setVisible(!isUsingSDL); + useNativeGLFWPane.setManaged(!isUsingSDL); + useNativeSDLPane.setManaged(isUsingSDL); + useNativeSDLPane.setVisible(isUsingSDL); + }); } } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index ca60b1b0a01..8c3e90055a3 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1538,6 +1538,7 @@ settings.advanced.server_ip.prompt=Automatically join after launching the game settings.advanced.unsupported_system_options=Settings not applicable to the current system settings.advanced.use_native_glfw=Use System GLFW settings.advanced.use_native_openal=Use System OpenAL +settings.advanced.use_native_sdl=Use System SDL settings.advanced.linux_freebsd_only=Linux/FreeBSD Only settings.advanced.windows_only=Windows Only settings.advanced.workaround=Workaround diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 5eeafafcb3b..ce25022f7d6 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1341,6 +1341,7 @@ settings.advanced.server_ip.prompt=預設,啟動遊戲後直接進入對應伺 settings.advanced.unsupported_system_options=不適用於目前系統的選項 settings.advanced.use_native_glfw=使用系統 GLFW settings.advanced.use_native_openal=使用系統 OpenAL +settings.advanced.use_native_sdl=使用系統 SDL settings.advanced.linux_freebsd_only=僅限 Linux/FreeBSD settings.advanced.windows_only=僅限 Windows settings.advanced.workaround=除錯選項 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 6fe08134e54..1c1fff75191 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1341,6 +1341,7 @@ settings.advanced.server_ip.prompt=默认,启动游戏后可以直接进入对 settings.advanced.unsupported_system_options=不适用于当前系统的选项 settings.advanced.use_native_glfw=使用系统 GLFW settings.advanced.use_native_openal=使用系统 OpenAL +settings.advanced.use_native_sdl=使用系统 SDL settings.advanced.linux_freebsd_only=仅 Linux/FreeBSD settings.advanced.windows_only=仅 Windows settings.advanced.workaround=调试选项 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 cb1ea514e89..67e27c67a58 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java @@ -61,6 +61,7 @@ public class LaunchOptions implements Serializable { private Renderer renderer = Renderer.DEFAULT; private boolean useNativeGLFW; private boolean useNativeOpenAL; + private boolean useNativeSDL; private boolean useHighPerformanceGPU; private boolean enableDebugLogOutput; private boolean allowAutoAgent; @@ -264,6 +265,10 @@ public boolean isUseNativeOpenAL() { return useNativeOpenAL; } + public boolean isUseNativeSDL() { + return useNativeSDL; + } + public boolean isUseHighPerformanceGPU() { return useHighPerformanceGPU; } @@ -481,6 +486,11 @@ public Builder setUseNativeOpenAL(boolean useNativeOpenAL) { return this; } + public Builder setUseNativeSDL(boolean useNativeSDL) { + options.useNativeSDL = useNativeSDL; + return this; + } + public Builder setUseHighPerformanceGPU(boolean useHighPerformanceGPU) { options.useHighPerformanceGPU = useHighPerformanceGPU; return this; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java index 5d709d9ca0c..35222ab52a1 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java @@ -27,7 +27,10 @@ import org.jetbrains.annotations.NotNullByDefault; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; /// A class that describes a Minecraft dependency. /// @@ -191,9 +194,12 @@ public boolean isNative() { return true; } - return downloads != null - && downloads.classifiers() != null - && downloads.classifiers().keySet().stream().anyMatch(s -> s.startsWith("native")); + if (downloads != null && downloads.classifiers() != null + && downloads.classifiers().keySet().stream().anyMatch(s -> s.startsWith("native"))) { + return true; + } + + return this.artifact().getClassifier() != null && this.artifact().getClassifier().startsWith("natives-"); } public @Nullable LibraryDownloadInfo getRawDownloadInfo() { 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 319cef85c4f..ac83199d462 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -482,6 +482,9 @@ public void decompressNatives(Path destination) throws NotDecompressingNativesEx if (options.isUseNativeOpenAL() && FileUtils.getName(destFile).toLowerCase(Locale.ROOT).contains("openal")) { return false; } + if (options.isUseNativeSDL() && FileUtils.getName(destFile).toLowerCase(Locale.ROOT).contains("sdl")) { + return false; + } return library.getExtract().shouldExtract(relativePath); })