From bd6a6fa9b6eae0a6fd4bc69c6365b744eb89edfe Mon Sep 17 00:00:00 2001 From: Glavo Date: Fri, 31 Oct 2025 21:07:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E4=B8=8D=E6=94=AF=E6=8C=81=E7=9A=84?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E4=B8=8A=E6=89=93=E5=BC=80=E9=99=B6=E7=93=A6?= =?UTF-8?q?=E8=81=94=E6=9C=BA=E9=A1=B5=E9=9D=A2=E6=97=B6=E5=BC=B9=E5=87=BA?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=20(#4735)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmcl/terracotta/TerracottaManager.java | 16 ++++++-------- .../hmcl/terracotta/TerracottaMetadata.java | 2 +- .../hmcl/terracotta/TerracottaState.java | 2 +- .../org/jackhuang/hmcl/ui/main/RootPage.java | 22 ++++++++++++++++++- .../resources/assets/lang/I18N.properties | 5 ++++- .../resources/assets/lang/I18N_zh.properties | 5 ++++- .../assets/lang/I18N_zh_CN.properties | 5 ++++- 7 files changed, 42 insertions(+), 15 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaManager.java index 0f6bf5f51..fa8accacd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaManager.java @@ -61,22 +61,20 @@ public final class TerracottaManager { private static final InvocationDispatcher STATE_D = InvocationDispatcher.runOn(Platform::runLater, STATE::set); static { - Task.runAsync(() -> { - if (TerracottaMetadata.PROVIDER == null) { - setState(new TerracottaState.Fatal(TerracottaState.Fatal.Type.OS)); - LOG.warning("Terracotta hasn't support your OS: " + org.jackhuang.hmcl.util.platform.Platform.SYSTEM_PLATFORM); - } else { + Schedulers.io().execute(() -> { + try { + if (TerracottaMetadata.PROVIDER == null) + throw new IOException("Unsupported platform: " + org.jackhuang.hmcl.util.platform.Platform.CURRENT_PLATFORM); + switch (TerracottaMetadata.PROVIDER.status()) { case NOT_EXIST -> setState(new TerracottaState.Uninitialized(false)); case LEGACY_VERSION -> setState(new TerracottaState.Uninitialized(true)); case READY -> launch(setState(new TerracottaState.Launching())); } - } - }).whenComplete(exception -> { - if (exception != null) { + } catch (Exception e) { compareAndSet(TerracottaState.Bootstrap.INSTANCE, new TerracottaState.Fatal(TerracottaState.Fatal.Type.UNKNOWN)); } - }).start(); + }); } public static ReadOnlyObjectProperty stateProperty() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java b/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java index c448fa364..e35387e93 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java @@ -147,7 +147,7 @@ public final class TerracottaMetadata { String arch = Architecture.SYSTEM_ARCH.getCheckedName(); return switch (OperatingSystem.CURRENT_OS) { case WINDOWS -> { - if (!OperatingSystem.SYSTEM_VERSION.isAtLeast(OSVersion.WINDOWS_8_1)) + if (!OperatingSystem.SYSTEM_VERSION.isAtLeast(OSVersion.WINDOWS_10)) yield null; TerracottaNative target = config.of("windows-%s.exe".formatted(arch)); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaState.java b/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaState.java index 246523aee..bce764013 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaState.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaState.java @@ -298,7 +298,7 @@ public abstract sealed class TerracottaState { } public boolean isRecoverable() { - return this.type != Type.OS && this.type != Type.UNKNOWN; + return this.type != Type.UNKNOWN; } } } 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 0a75bf753..4fce798cd 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 @@ -30,6 +30,7 @@ import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.Profiles; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; +import org.jackhuang.hmcl.terracotta.TerracottaMetadata; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; @@ -49,6 +50,7 @@ import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.TaskCancellationAction; import org.jackhuang.hmcl.util.io.CompressingUtils; +import org.jackhuang.hmcl.util.platform.*; import org.jackhuang.hmcl.util.versioning.VersionNumber; import java.nio.file.Files; @@ -186,7 +188,25 @@ public class RootPage extends DecoratorAnimatedPage implements DecoratorPage { terracottaItem.setLeftGraphic(wrap(SVG.GRAPH2)); terracottaItem.setActionButtonVisible(false); terracottaItem.setTitle(i18n("terracotta")); - terracottaItem.setOnAction(e -> Controllers.navigate(Controllers.getTerracottaPage())); + + terracottaItem.setOnAction(e -> { + if (TerracottaMetadata.PROVIDER != null) { + Controllers.navigate(Controllers.getTerracottaPage()); + } else { + String message; + if (Architecture.SYSTEM_ARCH.getBits() == Bits.BIT_32) + message = i18n("terracotta.unsupported.arch.32bit"); + else if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS + && !OperatingSystem.SYSTEM_VERSION.isAtLeast(OSVersion.WINDOWS_10)) + message = i18n("terracotta.unsupported.os.windows.old"); + else if (Platform.SYSTEM_PLATFORM.equals(OperatingSystem.LINUX, Architecture.LOONGARCH64_OW)) + message = i18n("terracotta.unsupported.arch.loongarch64_ow"); + else + message = i18n("terracotta.unsupported"); + + Controllers.dialog(message, null, MessageDialogPane.MessageType.WARNING); + } + }); // the left sidebar AdvancedListBox sideBar = new AdvancedListBox() diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index cfcad01c2..8cfd77bef 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1480,7 +1480,6 @@ terracotta.status.exception.desc.host_et_crash=Failed to create room: EasyTier c terracotta.status.exception.desc.ping_server_rst=Room closed: You exited the game world, room closed automatically terracotta.status.exception.desc.scaffolding_invalid_response=Invalid Protocol:Host has sent invalid response, please report this issue to developers terracotta.status.fatal.retry=Retry -terracotta.status.fatal.os=Sorry, HMCL cannot enable Terracotta | Multiplayer on your operating system or architecture. Please use a more modern operating system. terracotta.status.fatal.network=Failed to download Multiplayer Core. Please check your network connection and try again. terracotta.status.fatal.install=Fatal Error: Unable to install Multiplayer Core. terracotta.status.fatal.terracotta=Fatal Error: Unable to connect to Multiplayer Core. @@ -1490,6 +1489,10 @@ terracotta.player_anonymous=Anonymous Player terracotta.player_kind.host=Host terracotta.player_kind.local=Yourself terracotta.player_kind.guest=Guest +terracotta.unsupported=Multiplayer is not yet supported on the current platform. +terracotta.unsupported.os.windows.old=Multiplayer requires Windows 10 or later. Please update your system. +terracotta.unsupported.arch.32bit=Multiplayer is not supported on 32-bit systems. Please upgrade to a 64-bit system. +terracotta.unsupported.arch.loongarch64_ow=Multiplayer is not supported on Linux LoongArch64 Old World distributions. Please update to a New World distribution (such as AOSC OS). unofficial.hint=You are using an unofficial build of HMCL. We cannot guarantee its security. diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 64414ae54..fc562baa2 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1268,7 +1268,6 @@ terracotta.status.exception.desc.host_et_crash=建立房間失敗:EasyTier 已 terracotta.status.exception.desc.ping_server_rst=房間已關閉:您已退出遊戲存檔,房間已自動關閉 terracotta.status.exception.desc.scaffolding_invalid_response=協議錯誤:房主發送了錯誤的回應資料,請向開發者回報該問題 terracotta.status.fatal.retry=重試 -terracotta.status.fatal.os=抱歉,HMCL 不能在您的作業系統或架構上啟用多人連線。請使用更主流的作業系統 terracotta.status.fatal.network=未能下載線上核心。請檢查網路連接,然後再試一次 terracotta.status.fatal.install=嚴重錯誤:無法安裝線上核心 terracotta.status.fatal.terracotta=嚴重錯誤:無法與線上核心通訊 @@ -1278,6 +1277,10 @@ terracotta.player_anonymous=匿名玩家 terracotta.player_kind.host=房主 terracotta.player_kind.local=你 terracotta.player_kind.guest=房客 +terracotta.unsupported=多人聯機功能尚未支援目前平台。 +terracotta.unsupported.os.windows.old=多人聯機功能需要 Windows 10 或更高版本。請更新系統。 +terracotta.unsupported.arch.32bit=多人聯機功能不支援 32 位元系統。請更新至 64 位元系統。 +terracotta.unsupported.arch.loongarch64_ow=多人聯機功能不支援 Linux LoongArch64 舊世界發行版,請更新至新世界發行版 (如 AOSC OC)。 unofficial.hint=你正在使用第三方提供的 HMCL。我們無法保證其安全性,請注意甄別。 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 efdf78959..0d147e6e6 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1278,7 +1278,6 @@ terracotta.status.exception.desc.host_et_crash=创建房间失败:EasyTier 已 terracotta.status.exception.desc.ping_server_rst=房间已关闭:您已退出游戏存档,房间已自动关闭 terracotta.status.exception.desc.scaffolding_invalid_response=协议错误:房主发送了错误的响应数据,请向开发者反馈该问题 terracotta.status.fatal.retry=重试 -terracotta.status.fatal.os=抱歉,HMCL 不能在您的操作系统或架构上启用多人联机。请使用更主流的操作系统 terracotta.status.fatal.network=未能下载联机核心。请检查网络连接,然后再试一次 terracotta.status.fatal.install=严重错误:无法安装联机核心 terracotta.status.fatal.terracotta=严重错误:无法与联机核心通讯 @@ -1288,6 +1287,10 @@ terracotta.player_anonymous=匿名玩家 terracotta.player_kind.host=房主 terracotta.player_kind.local=你 terracotta.player_kind.guest=房客 +terracotta.unsupported=多人联机功能尚不支持当前平台。 +terracotta.unsupported.os.windows.old=多人联机功能需要 Windows 10 或更高版本。请更新系统。 +terracotta.unsupported.arch.32bit=多人联机功能不支持 32 位系统。请更新至 64 位系统。 +terracotta.unsupported.arch.loongarch64_ow=多人联机功能不支持 Linux LoongArch64 旧世界发行版,请更新至新世界发行版 (如 AOSC OC)。 unofficial.hint=你正在使用非官方构建的 HMCL。我们无法保证其安全性,请注意甄别。