From 948d64237e8efaf18dc08c1b3aa52f7d80ed63b4 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Tue, 12 Oct 2021 21:08:49 +0800 Subject: [PATCH] fix(multiplayer): show friendly message when cato file not found. --- .../ui/multiplayer/MultiplayerManager.java | 22 ++++++++++++++----- .../hmcl/ui/multiplayer/MultiplayerPage.java | 15 ++++++++----- .../resources/assets/lang/I18N.properties | 5 +++-- .../resources/assets/lang/I18N_zh.properties | 5 +++-- .../assets/lang/I18N_zh_CN.properties | 5 +++-- 5 files changed, 36 insertions(+), 16 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerManager.java index 18bf4fb40..744f6eb8d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerManager.java @@ -87,14 +87,14 @@ public final class MultiplayerManager { throw new IncompatibleCatoVersionException(version, CATO_VERSION); } - Path exe = getCatoExecutable(); - if (!Files.isRegularFile(exe)) { - throw new IllegalStateException("Cato file not found"); - } - LOG.info(String.format("Joining session (token=%s,version=%s,sessionName=%s,peer=%s,mode=%s,remotePort=%d,localPort=%d)", token, version, sessionName, peer, mode, remotePort, localPort)); return CompletableFuture.completedFuture(null).thenComposeAsync(unused -> { + Path exe = getCatoExecutable(); + if (!Files.isRegularFile(exe)) { + throw new CatoNotExistsException(exe); + } + if (!isPortAvailable(3478)) { throw new CatoAlreadyStartedException(); } @@ -478,4 +478,16 @@ public final class MultiplayerManager { public static class ConnectionErrorException extends RuntimeException { } + + public static class CatoNotExistsException extends RuntimeException { + private final Path file; + + public CatoNotExistsException(Path file) { + this.file = file; + } + + public Path getFile() { + return file; + } + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java index 9878b4807..ce45ccbb7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java @@ -213,6 +213,7 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP Controllers.dialog(new CreateMultiplayerRoomDialog((result, resolve, reject) -> { int gamePort = result.getServer().getAd(); + boolean isStaticToken = StringUtils.isNotBlank(globalConfig().getMultiplayerToken()); try { MultiplayerManager.CatoSession session = MultiplayerManager.createSession(globalConfig().getMultiplayerToken(), result.getServer().getMotd(), gamePort, result.isAllowAllJoinRequests()); session.getServer().setOnClientAdding((client, resolveClient, rejectClient) -> { @@ -238,13 +239,17 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP LOG.log(Level.WARNING, "Cato already started", e); reject.accept(i18n("multiplayer.session.error.already_started")); return; - } catch (FileNotFoundException e) { - LOG.log(Level.WARNING, "Cato not found", e); + } catch (MultiplayerManager.CatoNotExistsException e) { + LOG.log(Level.WARNING, "Cato not found " + e.getFile(), e); reject.accept(i18n("multiplayer.session.error.file_not_found")); return; } catch (Exception e) { LOG.log(Level.WARNING, "Failed to create session", e); - reject.accept(i18n("multiplayer.session.create.error") + e.getLocalizedMessage()); + if (isStaticToken) { + reject.accept(i18n("multiplayer.session.create.error.static_token") + e.getLocalizedMessage()); + } else { + reject.accept(i18n("multiplayer.session.create.error.dynamic_token") + e.getLocalizedMessage()); + } return; } @@ -333,8 +338,8 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP LOG.info("Cato already started"); reject.accept(i18n("multiplayer.session.error.already_started")); return null; - } else if (resolved instanceof FileNotFoundException) { - LOG.log(Level.WARNING, "Cato not found", resolved); + } else if (throwable instanceof MultiplayerManager.CatoNotExistsException) { + LOG.log(Level.WARNING, "Cato not found " + ((MultiplayerManager.CatoNotExistsException) throwable).getFile(), throwable); reject.accept(i18n("multiplayer.session.error.file_not_found")); return null; } else if (resolved instanceof MultiplayerManager.JoinRequestTimeoutException) { diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index bad24a151..4b62a54e9 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -651,7 +651,8 @@ multiplayer.session.close=Close Room multiplayer.session.close.warning=After closing room, all players joined the room will lost connection. Continue? multiplayer.session.copy_room_code=Copy Invitation Code multiplayer.session.create=Create Session -multiplayer.session.create.error=Failed to create multiplayer session. +multiplayer.session.create.error.dynamic_token=Failed to create multiplayer session. Please try again later. +multiplayer.session.create.error.static_token=Failed to create multiplayer session. You can try again with dynamic token. multiplayer.session.create.hint=Before creating multiplayer session, you must click "Open LAN Server" in running game, and type the port displayed in game in the blank below. multiplayer.session.create.join=Connection request multiplayer.session.create.join.allow=Accepts all join requests (When disabled, you need to accept join requests manually, so you can prevent from attacks.) @@ -666,7 +667,7 @@ multiplayer.session.create.token=Token multiplayer.session.create.token.apply=Apply for static token multiplayer.session.create.token.prompt=Default randomized. You can apply for your own token at noin.cn (Chinese website). multiplayer.session.error.already_started=Cato service has already started locally. Please check whether there are other multiplayer services served or not. Or you can kill cato process in task manager. -multiplayer.session.error.file_not_found=Cannot found cato. Please check if anti-virus software blocked our functionality. +multiplayer.session.error.file_not_found=Cannot find cato executable. This file should be downloaded when entering this page. Please check if your anti-virus software has isolated the file. If true, please rollback. multiplayer.session.expired=Multiplayer session has expired. You should re-create or re-join a room to continue. multiplayer.session.hint=You must click "Open LAN Server" in game in order to enable multiplayer functionality. multiplayer.session.join=Join Session diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 93fab730c..c5aa9b71f 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -651,7 +651,8 @@ multiplayer.session.close=關閉房間 multiplayer.session.close.warning=關閉房間後,已經加入聯機房間的玩家將會斷開連接,是否繼續? multiplayer.session.copy_room_code=複製邀請碼 multiplayer.session.create=創建房間 -multiplayer.session.create.error=創建聯機房間失敗。 +multiplayer.session.create.error.dynamic_token=創建聯機房間失敗,請稍後再試。 +multiplayer.session.create.error.static_token=創建聯機房間失敗,你可以使用動態 Token 再試。 multiplayer.session.create.hint=創建聯機房間前,你需要先在正在運行的遊戲內的遊戲菜單中選擇 對區域網路開放 選項,然後在下方的輸入框中輸入遊戲內提示的埠號(通常是 5 位的數字) multiplayer.session.create.join=連接申請 multiplayer.session.create.join.allow=自動接受所有連接申請(不啟用此選項時,你需要手動同意申請,以避免不相關人士誤連你的伺服器) @@ -666,7 +667,7 @@ multiplayer.session.create.token=Token multiplayer.session.create.token.apply=申請靜態 Token multiplayer.session.create.token.prompt=預設為臨時 Token。你可以在 noin.cn 上申請靜態 Token 並填寫至此處 multiplayer.session.error.already_started=本地已經開啟 cato 服務,請檢查是否有其他 HMCL 正在運行聯機服務。或者你可以在任務管理器裡殺掉 cato 進程以繼續。 -multiplayer.session.error.file_not_found=找不到 cato。請檢查防毒軟體是否攔截了 HMCL 的多人聯機服務(cato),如果被攔截,請取消攔截後重啟 HMCL。 +multiplayer.session.error.file_not_found=找不到 cato 程序。該程序應該在進入多人聯機頁面時完成下載。請檢查你電腦的防毒軟體是否將 cato 標記為病毒,如果是,請恢復 cato。 multiplayer.session.expired=聯機會話連續使用時間超過了 3 小時,你需要重新創建/加入房間以繼續聯機。 multiplayer.session.join=加入房間 multiplayer.session.join.error=加入房間失敗 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 c40d5d4a6..23f2a5e4c 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -652,7 +652,8 @@ multiplayer.session.close=关闭房间 multiplayer.session.close.warning=关闭房间后,已经加入联机房间的玩家将会断开连接,是否继续? multiplayer.session.copy_room_code=复制邀请码 multiplayer.session.create=创建房间 -multiplayer.session.create.error=创建联机房间失败。 +multiplayer.session.create.error.dynamic_token=创建联机房间失败,请稍后再试。 +multiplayer.session.create.error.static_token=创建联机房间失败,你可以使用动态 Token 再试。 multiplayer.session.create.hint=创建联机房间前,你需要先在正在运行的游戏内的游戏菜单中选择 对局域网开放 选项,然后在下方的输入框中确认游戏内提示的端口号(通常是 5 位的数字) multiplayer.session.create.join=连接申请 multiplayer.session.create.join.allow=自动接受所有连接申请(不启用此选项时,你需要手动同意申请,以避免不相关人士误连你的服务器) @@ -667,7 +668,7 @@ multiplayer.session.create.token=Token multiplayer.session.create.token.apply=申请静态 Token multiplayer.session.create.token.prompt=默认为临时 Token。你可以在 noin.cn 上申请静态 Token 并填写至此处 multiplayer.session.error.already_started=本地已经开启 cato 服务,请检查是否有其他 HMCL 正在运行联机服务。或者你可以在任务管理器里杀掉 cato 进程以继续。 -multiplayer.session.error.file_not_found=找不到 cato。请检查杀毒软件是否拦截了 HMCL 的多人联机服务(cato),如果被拦截,请取消拦截后重启 HMCL。 +multiplayer.session.error.file_not_found=找不到 cato 程序。该程序应该在进入多人联机页面时完成下载。请检查你电脑的杀毒软件是否将 cato 标记为病毒,如果是,请恢复 cato。 multiplayer.session.expired=联机会话连续使用时间超过了 3 小时,你需要重新创建/加入房间以继续联机。 multiplayer.session.join=加入房间 multiplayer.session.join.error=加入房间失败。如果你或对方的网络类型是差(对称型),可能无法使用联机功能。