From 2e099ecdf414206a3f094f67bd330c639586d79a Mon Sep 17 00:00:00 2001 From: CiiLu <109708109+CiiLu@users.noreply.github.com> Date: Tue, 18 Aug 2026 20:11:44 +0800 Subject: [PATCH 1/4] qwq --- .../java/org/jackhuang/hmcl/Launcher.java | 4 +-- .../hmcl/game/HMCLGameRepository.java | 23 +++++----------- .../jackhuang/hmcl/game/LauncherHelper.java | 4 +-- .../org/jackhuang/hmcl/java/JavaManager.java | 9 +++---- .../org/jackhuang/hmcl/setting/Accounts.java | 9 ++----- .../jackhuang/hmcl/ui/GameCrashWindow.java | 3 +-- .../org/jackhuang/hmcl/ui/HTMLRenderer.java | 2 +- .../java/org/jackhuang/hmcl/ui/LogWindow.java | 8 ++---- .../ui/account/MicrosoftAccountLoginPane.java | 4 +-- .../ui/download/AdditionalInstallersPage.java | 4 ++- .../hmcl/ui/main/PersonalizationPage.java | 22 +++------------- .../org/jackhuang/hmcl/ui/main/RootPage.java | 7 ++--- .../ModrinthRemoteAddonRepository.java | 7 +++-- .../org/jackhuang/hmcl/auth/offline/Skin.java | 4 +-- .../hmcl/auth/offline/YggdrasilServer.java | 5 ++-- .../download/forge/ForgeBMCLVersionList.java | 8 ++---- .../hmcl/game/JavaVersionConstraint.java | 3 +-- .../java/org/jackhuang/hmcl/game/Library.java | 8 +++--- .../jackhuang/hmcl/modpack/ModAdviser.java | 6 ++--- .../modpack/multimc/MultiMCInstancePatch.java | 10 +++---- .../multimc/MultiMCModpackInstallTask.java | 16 +++--------- .../jackhuang/hmcl/util/InfiniteSizeList.java | 3 ++- .../java/org/jackhuang/hmcl/util/Lang.java | 26 +------------------ 23 files changed, 63 insertions(+), 132 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index ce1e75c29df..e1bed75425b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -308,8 +308,8 @@ public static void main(String[] args) { LOG.info("Current Directory: " + Metadata.CURRENT_DIRECTORY); LOG.info("HMCL User Home: " + Metadata.HMCL_USER_HOME); LOG.info("HMCL Local Home: " + Metadata.HMCL_LOCAL_HOME); - LOG.info("HMCL Jar Path: " + Lang.requireNonNullElse(JarUtils.thisJarPath(), "Not Found")); - LOG.info("HMCL Log File: " + Lang.requireNonNullElse(LOG.getLogFile(), "In Memory")); + LOG.info("HMCL Jar Path: " + Objects.requireNonNullElse(JarUtils.thisJarPath(), "Not Found")); + LOG.info("HMCL Log File: " + Objects.requireNonNullElse(LOG.getLogFile(), "In Memory")); LOG.info("JVM Max Memory: " + MEGABYTES.formatBytes(Runtime.getRuntime().maxMemory())); try { for (MemoryPoolMXBean bean : ManagementFactory.getMemoryPoolMXBeans()) { 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..8d4b41725ed 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; @@ -207,7 +196,7 @@ private String getSelectedRunningDirectory( public Stream getDisplayInstanceManifests() { return getInstanceManifests().stream() .filter(v -> !v.isHidden()) - .sorted(Comparator.comparing((GameInstanceManifest v) -> Lang.requireNonNullElse(v.releaseTime(), Instant.EPOCH)) + .sorted(Comparator.comparing((GameInstanceManifest v) -> Objects.requireNonNullElse(v.releaseTime(), Instant.EPOCH)) .thenComparing(v -> VersionNumber.asVersion(v.id().id()))); } @@ -549,7 +538,7 @@ public void applyDefaultIsolationSetting(GameInstanceID instanceId) { GameSettings.Instance instanceSetting = getInstanceGameSettings(instanceId); GameSettings.Preset preset = getParentGameSettings(instanceSetting); - DefaultIsolationType type = Lang.requireNonNullElse(preset.defaultIsolationTypeProperty().getValue(), DefaultIsolationType.MODDED); + DefaultIsolationType type = Objects.requireNonNullElse(preset.defaultIsolationTypeProperty().getValue(), DefaultIsolationType.MODDED); boolean isolated = switch (type) { case NEVER -> false; case ALWAYS -> true; @@ -567,7 +556,7 @@ public void applyDefaultIsolationSetting(GameInstanceID instanceId) { /// Returns whether a new instance should use an isolated running directory under the default isolation settings. public boolean shouldIsolateNewInstance(boolean modded) { GameSettings.Preset preset = getParentGameSettings(null); - DefaultIsolationType type = Lang.requireNonNullElse(preset.defaultIsolationTypeProperty().getValue(), DefaultIsolationType.MODDED); + DefaultIsolationType type = Objects.requireNonNullElse(preset.defaultIsolationTypeProperty().getValue(), DefaultIsolationType.MODDED); return switch (type) { case NEVER -> false; case ALWAYS -> true; @@ -631,7 +620,7 @@ public Image getInstanceIconImage(@Nullable GameInstanceID instanceId) { return GameInstanceIconType.DEFAULT.getIcon(); GameSettings.Instance setting = getInstanceGameSettings(instanceId); - GameInstanceIconType iconType = setting != null ? Lang.requireNonNullElse(setting.iconProperty().getValue(), GameInstanceIconType.DEFAULT) : GameInstanceIconType.DEFAULT; + GameInstanceIconType iconType = setting != null ? Objects.requireNonNullElse(setting.iconProperty().getValue(), GameInstanceIconType.DEFAULT) : GameInstanceIconType.DEFAULT; if (iconType == GameInstanceIconType.DEFAULT) { GameInstanceManifest.Resolved resolvedInstanceManifest = getResolvedInstanceManifest(instanceId); 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 ea79242cf17..c08b10fffcf 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -437,7 +437,7 @@ private static Task checkGameState(HMCLGameRepository repository, G Task task; JavaVersionType javaVersionType = setting.getInheritable(GameSettings::javaTypeProperty); if (setting.getInheritable(GameSettings::notCheckJVMProperty)) { - task = getJavaTask.thenApplyAsync(java -> Lang.requireNonNullElse(java, JavaRuntime.getDefault())); + task = getJavaTask.thenApplyAsync(java -> Objects.requireNonNullElse(java, JavaRuntime.getDefault())); } else if (javaVersionType == JavaVersionType.AUTO || javaVersionType == JavaVersionType.VERSION) { task = getJavaTask.thenComposeAsync(Schedulers.javafx(), java -> { if (java != null) { @@ -979,7 +979,7 @@ public void onLog(String log, boolean isErrorStream) { Log4jLevel level = isErrorStream && !log.startsWith("[authlib-injector]") ? Log4jLevel.ERROR : null; if (showLogs) { if (level == null) - level = Lang.requireNonNullElse(Log4jLevel.guessLevel(log), Log4jLevel.INFO); + level = Objects.requireNonNullElse(Log4jLevel.guessLevel(log), Log4jLevel.INFO); logBuffer.add(new Log(log, level)); } else { lock.lock(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/java/JavaManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/java/JavaManager.java index 96b33964e9b..f31a30a5d01 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/java/JavaManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/java/JavaManager.java @@ -27,9 +27,9 @@ import org.jackhuang.hmcl.Metadata; import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.LibraryAnalyzer; +import org.jackhuang.hmcl.game.GameInstanceManifest; import org.jackhuang.hmcl.game.GameJavaVersion; import org.jackhuang.hmcl.game.JavaVersionConstraint; -import org.jackhuang.hmcl.game.GameInstanceManifest; import org.jackhuang.hmcl.setting.SettingsManager; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; @@ -37,7 +37,6 @@ import org.jackhuang.hmcl.util.CacheRepository; import org.jackhuang.hmcl.util.DigestUtils; import org.jackhuang.hmcl.util.FXThread; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.platform.Architecture; @@ -438,7 +437,7 @@ private static Map searchPotentialJavaExecutables(boolean use FileUtils.tryGetPath(System.getenv("localappdata"), "Packages\\Microsoft.4297127D64EC6_8wekyb3d8bbwe\\LocalCache\\Local\\runtime") .ifPresent(it -> searcher.searchAllOfficialJava(it, false)); - FileUtils.tryGetPath(Lang.requireNonNullElse(System.getenv("ProgramFiles(x86)"), "C:\\Program Files (x86)"), "Minecraft Launcher\\runtime") + FileUtils.tryGetPath(Objects.requireNonNullElse(System.getenv("ProgramFiles(x86)"), "C:\\Program Files (x86)"), "Minecraft Launcher\\runtime") .ifPresent(it -> searcher.searchAllOfficialJava(it, false)); } else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX && Architecture.SYSTEM_ARCH == Architecture.X86_64) { searcher.searchAllOfficialJava(Path.of(System.getProperty("user.home"), ".minecraft/runtime"), false); @@ -499,7 +498,7 @@ private static Map searchPotentialJavaExecutables(boolean use it.isJDK() ? "JDK" : "JRE", it.getVersion(), it.getPlatform().getArchitecture().getDisplayName(), - Lang.requireNonNullElse(it.getVendor(), "Unknown"), + Objects.requireNonNullElse(it.getVendor(), "Unknown"), it.getBinary())) .collect(Collectors.joining("\n", "Finished Java lookup, found " + searcher.javaRuntimes.size() + "\n", ""))); return searcher.javaRuntimes; @@ -842,7 +841,7 @@ void searchAllJavaInDirectory(Path directory) { } void searchJavaInProgramFiles(String env, String defaultValue) { - String programFiles = Lang.requireNonNullElse(System.getenv(env), defaultValue); + String programFiles = Objects.requireNonNullElse(System.getenv(env), defaultValue); Path path; try { path = Path.of(programFiles); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java index 713c5d698a2..30f3f194242 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java @@ -47,13 +47,8 @@ import static java.util.stream.Collectors.toList; import static javafx.collections.FXCollections.observableArrayList; -import static org.jackhuang.hmcl.setting.SettingsManager.settings; -import static org.jackhuang.hmcl.setting.SettingsManager.getAccountMetadataRecords; -import static org.jackhuang.hmcl.setting.SettingsManager.getAuthlibInjectorServers; -import static org.jackhuang.hmcl.setting.SettingsManager.getUserAccountMetadataRecords; -import static org.jackhuang.hmcl.setting.SettingsManager.userSettings; +import static org.jackhuang.hmcl.setting.SettingsManager.*; import static org.jackhuang.hmcl.ui.FXUtils.onInvalidating; -import static org.jackhuang.hmcl.util.Lang.immutableListOf; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Pair.pair; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -73,7 +68,7 @@ private Accounts() { public static final OfflineAccountFactory FACTORY_OFFLINE = new OfflineAccountFactory(AUTHLIB_INJECTOR_DOWNLOADER); public static final AuthlibInjectorAccountFactory FACTORY_AUTHLIB_INJECTOR = new AuthlibInjectorAccountFactory(AUTHLIB_INJECTOR_DOWNLOADER, Accounts::getOrCreateAuthlibInjectorServer); public static final MicrosoftAccountFactory FACTORY_MICROSOFT = new MicrosoftAccountFactory(new MicrosoftService(OAUTH_CALLBACK)); - public static final List> FACTORIES = immutableListOf(FACTORY_OFFLINE, FACTORY_MICROSOFT, FACTORY_AUTHLIB_INJECTOR); + public static final List> FACTORIES = List.of(FACTORY_OFFLINE, FACTORY_MICROSOFT, FACTORY_AUTHLIB_INJECTOR); // ==== login type / account factory mapping ==== private static final Map> type2factory = new HashMap<>(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java index 5037480bfe6..a32f008316b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java @@ -44,7 +44,6 @@ import org.jackhuang.hmcl.ui.construct.MessageDialogPane; import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.ui.construct.TwoLineListItem; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.Log4jLevel; import org.jackhuang.hmcl.util.Pair; import org.jackhuang.hmcl.util.StringUtils; @@ -365,7 +364,7 @@ private final class View extends VBox { TwoLineListItem os = new TwoLineListItem(); os.getStyleClass().setAll("two-line-item-second-large"); os.setTitle(i18n("system.operating_system")); - os.setSubtitle(Lang.requireNonNullElse(OperatingSystem.OS_RELEASE_NAME, OperatingSystem.SYSTEM_NAME)); + os.setSubtitle(Objects.requireNonNullElse(OperatingSystem.OS_RELEASE_NAME, OperatingSystem.SYSTEM_NAME)); TwoLineListItem arch = new TwoLineListItem(); arch.getStyleClass().setAll("two-line-item-second-large"); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/HTMLRenderer.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/HTMLRenderer.java index e0812636b5c..7559c1a6c7e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/HTMLRenderer.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/HTMLRenderer.java @@ -170,7 +170,7 @@ private void popNode() { private void applyStyle(Text text) { if (code) { text.getStyleClass().add("html-code"); - text.setStyle("-fx-font-family: \"%s\";".formatted(Lang.requireNonNullElse(settings().logFontFamilyProperty().get(), FXUtils.DEFAULT_MONOSPACE_FONT))); + text.setStyle("-fx-font-family: \"%s\";".formatted(Objects.requireNonNullElse(settings().logFontFamilyProperty().get(), FXUtils.DEFAULT_MONOSPACE_FONT))); return; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java index 2fae01d134b..1a382e04c78 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java @@ -40,7 +40,6 @@ import org.jackhuang.hmcl.ui.construct.MessageDialogPane; import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.util.CircularArrayList; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.Log4jLevel; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.platform.ManagedProcess; @@ -52,10 +51,7 @@ import java.nio.file.Paths; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.EnumMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import static org.jackhuang.hmcl.setting.SettingsManager.settings; @@ -324,7 +320,7 @@ private static final class LogWindowSkin extends SkinBase { listView.scrollTo(listView.getItems().size() - 1); }); - listView.setStyle("-fx-font-family: \"" + Lang.requireNonNullElse(settings().logFontFamilyProperty().get(), FXUtils.DEFAULT_MONOSPACE_FONT) + listView.setStyle("-fx-font-family: \"" + Objects.requireNonNullElse(settings().logFontFamilyProperty().get(), FXUtils.DEFAULT_MONOSPACE_FONT) + "\"; -fx-font-size: " + settings().logFontSizeProperty().get() + "px;"); listView.setCellFactory(x -> new ListCell<>() { { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/MicrosoftAccountLoginPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/MicrosoftAccountLoginPane.java index f372bcc2097..e6dc186de49 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/MicrosoftAccountLoginPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/MicrosoftAccountLoginPane.java @@ -49,10 +49,10 @@ import org.jackhuang.hmcl.ui.WeakListenerHolder; import org.jackhuang.hmcl.ui.construct.*; import org.jackhuang.hmcl.upgrade.IntegrityChecker; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.QrCodeUtils; import org.jackhuang.hmcl.util.StringUtils; +import java.util.Objects; import java.util.concurrent.CancellationException; import java.util.function.Consumer; @@ -217,7 +217,7 @@ private void onStep(Step currentStep) { var lblCode = new Label(wait.userCode()); lblCode.getStyleClass().add("code-label"); - lblCode.setStyle("-fx-font-family: \"" + Lang.requireNonNullElse(settings().logFontFamilyProperty().get(), FXUtils.DEFAULT_MONOSPACE_FONT) + "\";"); + lblCode.setStyle("-fx-font-family: \"" + Objects.requireNonNullElse(settings().logFontFamilyProperty().get(), FXUtils.DEFAULT_MONOSPACE_FONT) + "\";"); var codeBox = new StackPane(lblCode); codeBox.getStyleClass().add("code-box"); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java index 835b9d54b80..963a4ee9ccd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java @@ -30,6 +30,7 @@ import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.SettingsMap; +import java.util.Objects; import java.util.Optional; import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.MINECRAFT; @@ -60,6 +61,7 @@ public AdditionalInstallersPage(String gameVersion, GameInstanceManifest manifes } installable.bind(Bindings.createBooleanBinding(() -> compatible.get() && txtName.validate(), txtName.textProperty(), compatible)); + installable.bind(Bindings.createBooleanBinding(() -> compatible.get() && txtName.validate(), txtName.textProperty(), compatible)); } @Override @@ -90,7 +92,7 @@ protected void reload() { for (InstallerItem library : group.getLibraries()) { String libraryId = library.getLibraryId(); String version = analyzer.getVersion(libraryId).orElse(null); - String libraryVersion = Lang.requireNonNullElse(getVersion(libraryId), version); + String libraryVersion = Objects.requireNonNullElse(getVersion(libraryId), version); boolean alreadyInstalled = version != null && !(controller.getSettings().get(libraryId) instanceof UpdateInstallerWizardProvider.RemoveVersionAction); if (!"game".equals(libraryId) && currentGameVersion != null && !currentGameVersion.equals(game) && getVersion(libraryId) == null && alreadyInstalled) { // For third-party libraries, if game version is being changed, and the library is not being reinstalled, diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java index 5f852a18bd0..1a2547ae063 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java @@ -25,19 +25,15 @@ import javafx.beans.binding.StringBinding; import javafx.beans.property.BooleanProperty; import javafx.beans.property.Property; +import javafx.css.PseudoClass; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; -import javafx.scene.control.ColorPicker; -import javafx.scene.control.ContentDisplay; -import javafx.scene.control.Label; -import javafx.scene.control.ScrollPane; -import javafx.scene.control.Tooltip; +import javafx.scene.control.*; import javafx.scene.input.MouseEvent; import javafx.scene.layout.*; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; -import javafx.css.PseudoClass; import javafx.scene.text.Font; import javafx.scene.text.FontSmoothingType; import javafx.stage.FileChooser; @@ -45,23 +41,13 @@ import org.glavo.monetfx.ColorStyle; import org.glavo.uuid.UUIDs; import org.jackhuang.hmcl.setting.*; -import org.jackhuang.hmcl.theme.BackgroundLoadPolicy; -import org.jackhuang.hmcl.theme.BuiltinBackground; -import org.jackhuang.hmcl.theme.NetworkBackgroundImageCachePolicy; -import org.jackhuang.hmcl.theme.Theme; -import org.jackhuang.hmcl.theme.ThemeColor; -import org.jackhuang.hmcl.theme.ThemeColorSource; -import org.jackhuang.hmcl.theme.ThemePackExporter; -import org.jackhuang.hmcl.theme.ThemePackManifest; -import org.jackhuang.hmcl.theme.ThemePackManager; -import org.jackhuang.hmcl.theme.ThemeReference; +import org.jackhuang.hmcl.theme.*; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.construct.*; import org.jackhuang.hmcl.ui.construct.MessageDialogPane.MessageType; import org.jackhuang.hmcl.util.Holder; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.javafx.SafeStringConverter; @@ -1271,7 +1257,7 @@ protected Node createRightNode() { Label lblLogFontDisplay = new Label("[23:33:33] [Client Thread/INFO] [WaterPower]: Loaded mod WaterPower."); lblLogFontDisplay.fontProperty().bind(Bindings.createObjectBinding( - () -> Font.font(Lang.requireNonNullElse(settings().logFontFamilyProperty().get(), FXUtils.DEFAULT_MONOSPACE_FONT), settings().logFontSizeProperty().get()), + () -> Font.font(Objects.requireNonNullElse(settings().logFontFamilyProperty().get(), FXUtils.DEFAULT_MONOSPACE_FONT), settings().logFontSizeProperty().get()), settings().logFontFamilyProperty(), settings().logFontSizeProperty())); logFontPane.getChildren().add(lblLogFontDisplay); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java index 97478cf94f5..b4677b2a60e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java @@ -45,11 +45,11 @@ import org.jackhuang.hmcl.ui.decorator.DecoratorAnimatedPage; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; import org.jackhuang.hmcl.ui.download.ModpackInstallWizardProvider; -import org.jackhuang.hmcl.ui.nbt.NBTEditorPage; -import org.jackhuang.hmcl.ui.nbt.NBTFileType; import org.jackhuang.hmcl.ui.instances.GameAdvancedListItem; import org.jackhuang.hmcl.ui.instances.GameListPopupMenu; import org.jackhuang.hmcl.ui.instances.Instances; +import org.jackhuang.hmcl.ui.nbt.NBTEditorPage; +import org.jackhuang.hmcl.ui.nbt.NBTFileType; import org.jackhuang.hmcl.upgrade.UpdateChecker; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; @@ -65,6 +65,7 @@ import java.util.Comparator; import java.util.List; import java.util.Locale; +import java.util.Objects; import java.util.stream.Collectors; import static org.jackhuang.hmcl.ui.FXUtils.runInFX; @@ -128,7 +129,7 @@ public MainPage getMainPage() { List children = repository.getInstanceManifests().parallelStream() .filter(version -> !version.isHidden()) .sorted(Comparator - .comparing((GameInstanceManifest manifest) -> Lang.requireNonNullElse(manifest.releaseTime(), Instant.EPOCH)) + .comparing((GameInstanceManifest manifest) -> Objects.requireNonNullElse(manifest.releaseTime(), Instant.EPOCH)) .thenComparing(manifest -> VersionNumber.asVersion(repository.getGameVersion(manifest).orElse(manifest.id().toString())))) .collect(Collectors.toList()); runInFX(() -> { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/repository/ModrinthRemoteAddonRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/repository/ModrinthRemoteAddonRepository.java index b8de101b0e3..628783e2ce3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/repository/ModrinthRemoteAddonRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/repository/ModrinthRemoteAddonRepository.java @@ -23,7 +23,10 @@ import org.jackhuang.hmcl.addon.RemoteAddonRepository; import org.jackhuang.hmcl.addon.mod.ModLoaderType; import org.jackhuang.hmcl.download.DownloadProvider; -import org.jackhuang.hmcl.util.*; +import org.jackhuang.hmcl.util.DigestUtils; +import org.jackhuang.hmcl.util.Immutable; +import org.jackhuang.hmcl.util.PriorityComparator; +import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.JsonSerializable; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.HttpRequest; @@ -293,7 +296,7 @@ public Stream getRemoteVersionsById(DownloadProvider downlo try { List versions = HttpRequest.GET(candidate.toString()) .getJson(listTypeOf(ProjectVersion.class)); - return versions.stream().map(ProjectVersion::toVersion).flatMap(Lang::toStream); + return versions.stream().map(ProjectVersion::toVersion).flatMap(Optional::stream); } catch (IOException e) { IOException wrapper = new IOException("Failed to get remote versions: " + candidate, e); if (candidates.size() == 1) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/Skin.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/Skin.java index d0d8ebc7d2e..fea39c490a5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/Skin.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/Skin.java @@ -24,7 +24,6 @@ import org.jackhuang.hmcl.task.FetchTask; import org.jackhuang.hmcl.task.GetTask; import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.FileUtils; @@ -40,6 +39,7 @@ import java.nio.file.Path; import java.util.List; import java.util.Locale; +import java.util.Objects; import java.util.Optional; public record Skin(Type type, String cslApi, TextureModel textureModel, String localSkinPath, String localCapePath) { @@ -120,7 +120,7 @@ public Task load(String username) { case CUSTOM_SKIN_LOADER_API: String realCslApi = type == Type.LITTLE_SKIN ? "https://littleskin.cn/csl" - : NetworkUtils.addHttpsIfMissing(StringUtils.removeSuffix(Lang.requireNonNullElse(cslApi, ""), "/")); + : NetworkUtils.addHttpsIfMissing(StringUtils.removeSuffix(Objects.requireNonNullElse(cslApi, ""), "/")); return Task.composeAsync(() -> new GetTask(String.format("%s/%s.json", realCslApi, username))) .thenComposeAsync(json -> { SkinJson result = JsonUtils.GSON.fromJson(json, SkinJson.class); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/YggdrasilServer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/YggdrasilServer.java index 2ca68211a52..b35b18bba20 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/YggdrasilServer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/YggdrasilServer.java @@ -17,12 +17,11 @@ */ package org.jackhuang.hmcl.auth.offline; -import org.glavo.uuid.UUIDs; import org.glavo.png.javafx.PNGJavaFXUtils; +import org.glavo.uuid.UUIDs; import org.jackhuang.hmcl.auth.yggdrasil.GameProfile; import org.jackhuang.hmcl.auth.yggdrasil.TextureModel; import org.jackhuang.hmcl.util.KeyUtils; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.Pair; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.HttpServer; @@ -85,7 +84,7 @@ private Response profiles(Request request) throws IOException { List names = JsonUtils.fromNonNullJsonFully(request.getSession().getInputStream(), listTypeOf(String.class)); return ok(names.stream().distinct() .map(this::findCharacterByName) - .flatMap(Lang::toStream) + .flatMap(Optional::stream) .map(Character::toSimpleResponse) .collect(Collectors.toList())); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java index 14dbcaae3d8..1f06fe7d89d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java @@ -22,7 +22,6 @@ import org.jackhuang.hmcl.task.GetTask; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.Immutable; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.Validation; import org.jackhuang.hmcl.util.io.NetworkUtils; @@ -31,10 +30,7 @@ import java.time.Instant; import java.time.format.DateTimeParseException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; +import java.util.*; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Pair.pair; @@ -73,7 +69,7 @@ private static String toLookupBranch(String gameVersion, String branch) { if ("1.7.10-pre4".equals(gameVersion)) { return "prerelease"; } - return Lang.requireNonNullElse(branch, ""); + return Objects.requireNonNullElse(branch, ""); } @Override 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 11ac2f57a0f..2a5bedc852e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java @@ -19,7 +19,6 @@ import org.jackhuang.hmcl.download.LibraryAnalyzer; import org.jackhuang.hmcl.java.JavaRuntime; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.platform.Architecture; import org.jackhuang.hmcl.util.platform.OperatingSystem; import org.jackhuang.hmcl.util.versioning.GameVersionNumber; @@ -275,5 +274,5 @@ public boolean checkJava(GameVersionNumber gameVersionNumber, GameInstanceManife return getJavaVersionRange(version, analyzer).contains(java.getVersionNumber()); } - public static final List ALL = Lang.immutableListOf(values()); + public static final List ALL = List.of(values()); } 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..f43a33c18fe 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java @@ -19,7 +19,6 @@ import com.google.gson.annotations.SerializedName; import org.jackhuang.hmcl.util.Constants; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.ToStringBuilder; import org.jackhuang.hmcl.util.gson.JsonSerializable; import org.jackhuang.hmcl.util.platform.Architecture; @@ -27,7 +26,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. /// @@ -233,7 +235,7 @@ private String computePath(@Nullable LibraryDownloadInfo raw, String path) { } } - String repo = Lang.requireNonNullElse(url, Constants.DEFAULT_LIBRARY_URL); + String repo = Objects.requireNonNullElse(url, Constants.DEFAULT_LIBRARY_URL); if (!repo.endsWith("/")) { repo += '/'; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModAdviser.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModAdviser.java index 0310268db4f..7c83c6bab76 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModAdviser.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModAdviser.java @@ -17,8 +17,6 @@ */ package org.jackhuang.hmcl.modpack; -import org.jackhuang.hmcl.util.Lang; - import java.util.List; /** @@ -40,7 +38,7 @@ enum ModSuggestion { HIDDEN } - List MODPACK_BLACK_LIST = Lang.immutableListOf( + List MODPACK_BLACK_LIST = List.of( "regex:(.*?)\\.log", "regex:.*\\.dat_old$", "regex:.*\\.old$", // Backup files "regex:.*\\.BakaCoreInfo$", // BakaXL @@ -66,7 +64,7 @@ enum ModSuggestion { "mods/.connector" // Sinytra Connector ); - List MODPACK_SUGGESTED_BLACK_LIST = Lang.immutableListOf( + List MODPACK_SUGGESTED_BLACK_LIST = List.of( "fonts", // BetterFonts "saves", "servers.dat", "options.txt", // Minecraft "blueprints" /* BuildCraft */, diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java index cd826f2c1fb..cfcb855614a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java @@ -300,10 +300,10 @@ public static ResolvedInstance resolveArtifact(List patche for (String jvmArg : patch.getJvmArgs()) { jvmArguments.add(new StringArgument(jvmArg)); } - mainClass = Lang.requireNonNullElse(mainClass, patch.getMainClass()); - assetIndex = Lang.requireNonNullElse(patch.getAssetIndex(), assetIndex); - javaMajors = Lang.requireNonNullElse(patch.getJavaMajors(), javaMajors); - mainJar = Lang.requireNonNullElse(patch.getMainJar(), mainJar); + mainClass = Objects.requireNonNullElse(mainClass, patch.getMainClass()); + assetIndex = Objects.requireNonNullElse(patch.getAssetIndex(), assetIndex); + javaMajors = Objects.requireNonNullElse(patch.getJavaMajors(), javaMajors); + mainJar = Objects.requireNonNullElse(patch.getMainJar(), mainJar); traits = Lang.merge(patch.getTraits(), traits); tweakers = Lang.merge(patch.getTweakers(), tweakers); libraries = Lang.merge(patch.getLibraries(), libraries); @@ -311,7 +311,7 @@ public static ResolvedInstance resolveArtifact(List patche jarModFileNames = Lang.merge(patch.getJarMods().stream().map(library -> library.filename()).collect(Collectors.toList()), jarModFileNames); } - mainClass = Lang.requireNonNullElse(mainClass, "net.minecraft.client.Minecraft"); + mainClass = Objects.requireNonNullElse(mainClass, "net.minecraft.client.Minecraft"); if (minecraftArguments == null) { minecraftArguments = new ArrayList<>(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java index da24c80ecc6..67d5d6d8827 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java @@ -38,18 +38,8 @@ import java.io.IOException; import java.io.InputStream; -import java.nio.file.DirectoryStream; -import java.nio.file.FileSystem; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.nio.file.*; +import java.util.*; /** *

A task transforming MultiMC Modpack Scheme to Official Launcher Scheme. @@ -206,7 +196,7 @@ public void execute() throws Exception { String componentID = require.getID(); if (!existed.containsKey(componentID)) { Task task = new GetTask(MultiMCComponents.getMetaURL( - componentID, Lang.requireNonNullElse(require.getEqualsVersion(), require.getSuggests()), mcVersion + componentID, Objects.requireNonNullElse(require.getEqualsVersion(), require.getSuggests()), mcVersion )).thenApplyAsync(s -> MultiMCInstancePatch.read(componentID, s)); task.run(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/InfiniteSizeList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/InfiniteSizeList.java index 5533ed8f9fe..70b49d0a6cd 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/InfiniteSizeList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/InfiniteSizeList.java @@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; public final class InfiniteSizeList extends ArrayList { @@ -104,7 +105,7 @@ public T set(int index, T element) { @SuppressWarnings("unchecked") private void allocate0(int index) { - this.addAll(Lang.immutableListOf((T[])new Object[index + 1 - super.size()])); + this.addAll(Arrays.asList((T[]) new Object[index + 1 - super.size()])); } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java index c00a7767855..67ca847143e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java @@ -34,10 +34,6 @@ public final class Lang { private Lang() { } - public static T requireNonNullElse(T value, T defaultValue) { - return value != null ? value : defaultValue; - } - /** * Construct a mutable map by given key-value pairs. * @@ -66,11 +62,6 @@ public static Map mapOf(Iterable> pairs) { return map; } - @SafeVarargs - public static List immutableListOf(T... elements) { - return Collections.unmodifiableList(Arrays.asList(elements)); - } - public static boolean test(ExceptionalRunnable r) { try { r.run(); @@ -126,12 +117,6 @@ public static T merge(T a, T b, BinaryOperator operator) { return operator.apply(a, b); } - public static List removingDuplicates(List list) { - LinkedHashSet set = new LinkedHashSet<>(list.size()); - set.addAll(list); - return new ArrayList<>(set); - } - /** * Join two collections into one list. * @@ -149,10 +134,6 @@ public static List merge(Collection a, Collection List copyList(List list) { - return list == null ? null : list.isEmpty() ? null : new ArrayList<>(list); - } - public static int indexWhere(List list, Predicate predicate) { int idx = 0; for (T value : list) { @@ -349,16 +330,11 @@ public static BiConsumer wrap(ExceptionalBiConsumer fn) { }; } - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") - public static Stream toStream(Optional optional) { - return optional.map(Stream::of).orElseGet(Stream::empty); - } - public static Iterable toIterable(Enumeration enumeration) { if (enumeration == null) { throw new NullPointerException(); } - return () -> new Iterator() { + return () -> new Iterator<>() { public boolean hasNext() { return enumeration.hasMoreElements(); } From 51dd353103397d52fe144086c0cca447f2534643 Mon Sep 17 00:00:00 2001 From: CiiLu <109708109+CiiLu@users.noreply.github.com> Date: Thu, 20 Aug 2026 22:00:49 +0800 Subject: [PATCH 2/4] qwq --- .../org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java | 1 - 1 file changed, 1 deletion(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java index 963a4ee9ccd..85fcc60c3a8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java @@ -61,7 +61,6 @@ public AdditionalInstallersPage(String gameVersion, GameInstanceManifest manifes } installable.bind(Bindings.createBooleanBinding(() -> compatible.get() && txtName.validate(), txtName.textProperty(), compatible)); - installable.bind(Bindings.createBooleanBinding(() -> compatible.get() && txtName.validate(), txtName.textProperty(), compatible)); } @Override From 1ef9cd7b531d1ed511581b7a702ef780d258c9e2 Mon Sep 17 00:00:00 2001 From: CiiLu <109708109+CiiLu@users.noreply.github.com> Date: Thu, 20 Aug 2026 22:02:34 +0800 Subject: [PATCH 3/4] qwq --- .../main/java/org/jackhuang/hmcl/game/LauncherHelper.java | 2 +- .../hmcl/ui/download/AdditionalInstallersPage.java | 3 +-- .../hmcl/modpack/multimc/MultiMCInstancePatch.java | 8 ++++---- .../hmcl/modpack/multimc/MultiMCModpackInstallTask.java | 2 +- HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java | 4 ++++ 5 files changed, 11 insertions(+), 8 deletions(-) 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 c08b10fffcf..8d396bd31af 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -437,7 +437,7 @@ private static Task checkGameState(HMCLGameRepository repository, G Task task; JavaVersionType javaVersionType = setting.getInheritable(GameSettings::javaTypeProperty); if (setting.getInheritable(GameSettings::notCheckJVMProperty)) { - task = getJavaTask.thenApplyAsync(java -> Objects.requireNonNullElse(java, JavaRuntime.getDefault())); + task = getJavaTask.thenApplyAsync(java -> Lang.requireNonNullElse(java, JavaRuntime.getDefault())); } else if (javaVersionType == JavaVersionType.AUTO || javaVersionType == JavaVersionType.VERSION) { task = getJavaTask.thenComposeAsync(Schedulers.javafx(), java -> { if (java != null) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java index 85fcc60c3a8..835b9d54b80 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java @@ -30,7 +30,6 @@ import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.SettingsMap; -import java.util.Objects; import java.util.Optional; import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.MINECRAFT; @@ -91,7 +90,7 @@ protected void reload() { for (InstallerItem library : group.getLibraries()) { String libraryId = library.getLibraryId(); String version = analyzer.getVersion(libraryId).orElse(null); - String libraryVersion = Objects.requireNonNullElse(getVersion(libraryId), version); + String libraryVersion = Lang.requireNonNullElse(getVersion(libraryId), version); boolean alreadyInstalled = version != null && !(controller.getSettings().get(libraryId) instanceof UpdateInstallerWizardProvider.RemoveVersionAction); if (!"game".equals(libraryId) && currentGameVersion != null && !currentGameVersion.equals(game) && getVersion(libraryId) == null && alreadyInstalled) { // For third-party libraries, if game version is being changed, and the library is not being reinstalled, diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java index cfcb855614a..306db2ef9e5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java @@ -300,10 +300,10 @@ public static ResolvedInstance resolveArtifact(List patche for (String jvmArg : patch.getJvmArgs()) { jvmArguments.add(new StringArgument(jvmArg)); } - mainClass = Objects.requireNonNullElse(mainClass, patch.getMainClass()); - assetIndex = Objects.requireNonNullElse(patch.getAssetIndex(), assetIndex); - javaMajors = Objects.requireNonNullElse(patch.getJavaMajors(), javaMajors); - mainJar = Objects.requireNonNullElse(patch.getMainJar(), mainJar); + mainClass = Lang.requireNonNullElse(mainClass, patch.getMainClass()); + assetIndex = Lang.requireNonNullElse(patch.getAssetIndex(), assetIndex); + javaMajors = Lang.requireNonNullElse(patch.getJavaMajors(), javaMajors); + mainJar = Lang.requireNonNullElse(patch.getMainJar(), mainJar); traits = Lang.merge(patch.getTraits(), traits); tweakers = Lang.merge(patch.getTweakers(), tweakers); libraries = Lang.merge(patch.getLibraries(), libraries); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java index 67d5d6d8827..eedb75370b9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java @@ -196,7 +196,7 @@ public void execute() throws Exception { String componentID = require.getID(); if (!existed.containsKey(componentID)) { Task task = new GetTask(MultiMCComponents.getMetaURL( - componentID, Objects.requireNonNullElse(require.getEqualsVersion(), require.getSuggests()), mcVersion + componentID, Lang.requireNonNullElse(require.getEqualsVersion(), require.getSuggests()), mcVersion )).thenApplyAsync(s -> MultiMCInstancePatch.read(componentID, s)); task.run(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java index 67ca847143e..586ab45672e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java @@ -34,6 +34,10 @@ public final class Lang { private Lang() { } + public static T requireNonNullElse(T value, T defaultValue) { + return value != null ? value : defaultValue; + } + /** * Construct a mutable map by given key-value pairs. * From 22ea84c99559b618a2cbd75f9a7d21602c75190b Mon Sep 17 00:00:00 2001 From: CiiLu <109708109+CiiLu@users.noreply.github.com> Date: Thu, 20 Aug 2026 22:31:51 +0800 Subject: [PATCH 4/4] qwq --- HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java index 98b16f94f57..91521632ab1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java @@ -52,8 +52,6 @@ import java.nio.file.Path; import java.util.Locale; -import java.util.Objects; -import java.util.stream.Collectors; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import static org.jackhuang.hmcl.util.logging.Logger.LOG;