From 9c76fc748eb70a5387c93eeb2b37f41e01627bd8 Mon Sep 17 00:00:00 2001 From: zxw Date: Thu, 18 Mar 2021 11:31:39 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=A7=82=E6=88=98=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=80=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ratel/landlords/client/entity/User.java | 4 +- .../ClientEventListener_CODE_GAME_WATCH.java | 5 +++ ...ntListener_CODE_GAME_WATCH_SUCCESSFUL.java | 41 +++++++++++++++++++ ...verEventListener_CODE_GAME_WATCH_EXIT.java | 23 +++++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 landlords-server/src/main/java/org/nico/ratel/landlords/server/event/ServerEventListener_CODE_GAME_WATCH_EXIT.java diff --git a/landlords-client/src/main/java/org/nico/ratel/landlords/client/entity/User.java b/landlords-client/src/main/java/org/nico/ratel/landlords/client/entity/User.java index 32c907e..32bc179 100644 --- a/landlords-client/src/main/java/org/nico/ratel/landlords/client/entity/User.java +++ b/landlords-client/src/main/java/org/nico/ratel/landlords/client/entity/User.java @@ -4,10 +4,10 @@ public class User { public static final User INSTANCE = new User(); /** 是否游戏中 */ - private boolean isPlaying = false; + private volatile boolean isPlaying = false; /** 是否观战中 */ - private boolean isWatching = false; + private volatile boolean isWatching = false; private User() {} diff --git a/landlords-client/src/main/java/org/nico/ratel/landlords/client/event/ClientEventListener_CODE_GAME_WATCH.java b/landlords-client/src/main/java/org/nico/ratel/landlords/client/event/ClientEventListener_CODE_GAME_WATCH.java index c5a3b5e..1a65451 100644 --- a/landlords-client/src/main/java/org/nico/ratel/landlords/client/event/ClientEventListener_CODE_GAME_WATCH.java +++ b/landlords-client/src/main/java/org/nico/ratel/landlords/client/event/ClientEventListener_CODE_GAME_WATCH.java @@ -18,6 +18,11 @@ public class ClientEventListener_CODE_GAME_WATCH extends ClientEventListener { @Override public void call(Channel channel, String wrapData) { + // 退出观战模式后不处理观战请求 + if (!User.INSTANCE.isWatching()) { + return; + } + Map wrapMap = MapHelper.parser(wrapData); ClientEventCode rawCode = ClientEventCode.valueOf(wrapMap.get("code").toString()); Object rawData = wrapMap.get("data"); diff --git a/landlords-client/src/main/java/org/nico/ratel/landlords/client/event/ClientEventListener_CODE_GAME_WATCH_SUCCESSFUL.java b/landlords-client/src/main/java/org/nico/ratel/landlords/client/event/ClientEventListener_CODE_GAME_WATCH_SUCCESSFUL.java index e2a463f..ad34bf4 100644 --- a/landlords-client/src/main/java/org/nico/ratel/landlords/client/event/ClientEventListener_CODE_GAME_WATCH_SUCCESSFUL.java +++ b/landlords-client/src/main/java/org/nico/ratel/landlords/client/event/ClientEventListener_CODE_GAME_WATCH_SUCCESSFUL.java @@ -1,10 +1,16 @@ package org.nico.ratel.landlords.client.event; import io.netty.channel.Channel; +import org.nico.noson.Noson; import org.nico.ratel.landlords.client.entity.User; +import org.nico.ratel.landlords.enums.ClientEventCode; +import org.nico.ratel.landlords.enums.ServerEventCode; import org.nico.ratel.landlords.helper.MapHelper; import org.nico.ratel.landlords.print.SimplePrinter; +import org.nico.ratel.landlords.print.SimpleWriter; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Map; public class ClientEventListener_CODE_GAME_WATCH_SUCCESSFUL extends ClientEventListener { @@ -14,6 +20,7 @@ public class ClientEventListener_CODE_GAME_WATCH_SUCCESSFUL extends ClientEventL "|You are already watching the game. \n" + "|Room owner: %s. Room current status: %s.\n" + "+------------------------------------------------\n" + + "(Hint: enter [exit|e] to exit.) \n" + " "; @Override @@ -26,5 +33,39 @@ public void call(Channel channel, String data) { // Enter spectator mode Map map = MapHelper.parser(data); SimplePrinter.printNotice(String.format(WATCH_SUCCESSFUL_TIPS, map.get("owner"), map.get("status"))); + + // 监听输入用于退出 + // Listen enter event to exit spectator mode + new Thread(() -> registerExitEvent(channel), "exit-spectator-input-thread").start(); + } + + private void registerExitEvent(Channel channel) { + String enter = SimpleWriter.write("watch"); + if ("exit".equalsIgnoreCase(enter) || "e".equalsIgnoreCase(enter)) { + quitWatch(channel); + return; + } + + printCommandUsage(); + registerExitEvent(channel); + } + + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + private void quitWatch(Channel channel) { + SimplePrinter.printNotice(FORMATTER.format(LocalDateTime.now()) + " Spectating ended. Bye."); + SimplePrinter.printNotice(""); + SimplePrinter.printNotice(""); + + // 修改玩家是否观战状态 + User.INSTANCE.setWatching(false); + + // 退出观战模式 + pushToServer(channel, ServerEventCode.CODE_GAME_WATCH_EXIT); + get(ClientEventCode.CODE_SHOW_OPTIONS).call(channel, ""); + } + + private void printCommandUsage() { + SimplePrinter.printNotice("Enter [exit|e] to exit"); } } diff --git a/landlords-server/src/main/java/org/nico/ratel/landlords/server/event/ServerEventListener_CODE_GAME_WATCH_EXIT.java b/landlords-server/src/main/java/org/nico/ratel/landlords/server/event/ServerEventListener_CODE_GAME_WATCH_EXIT.java new file mode 100644 index 0000000..1484f29 --- /dev/null +++ b/landlords-server/src/main/java/org/nico/ratel/landlords/server/event/ServerEventListener_CODE_GAME_WATCH_EXIT.java @@ -0,0 +1,23 @@ +package org.nico.ratel.landlords.server.event; + +import org.nico.ratel.landlords.entity.ClientSide; +import org.nico.ratel.landlords.entity.Room; +import org.nico.ratel.landlords.print.SimplePrinter; +import org.nico.ratel.landlords.server.ServerContains; + +public class ServerEventListener_CODE_GAME_WATCH_EXIT implements ServerEventListener { + + @Override + public void call(ClientSide clientSide, String data) { + Room room = ServerContains.getRoom(clientSide.getRoomId()); + + if (room != null) { + // 房间如果存在,则将观战者从房间观战列表中移除 + clientSide.setRoomId(room.getId()); + boolean successful = room.getWatcherList().remove(clientSide); + if (successful) { + SimplePrinter.serverLog(clientSide.getNickname() + " exit room " + room.getId()); + } + } + } +} From ca6d2b75d56d7ea760e0761c07cbaf802f67893b Mon Sep 17 00:00:00 2001 From: zxw Date: Wed, 24 Mar 2021 22:41:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E4=BA=8B=E4=BB=B6=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nico/ratel/landlords/enums/ServerEventCode.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/landlords-common/src/main/java/org/nico/ratel/landlords/enums/ServerEventCode.java b/landlords-common/src/main/java/org/nico/ratel/landlords/enums/ServerEventCode.java index dbdd6e9..6f72e71 100644 --- a/landlords-common/src/main/java/org/nico/ratel/landlords/enums/ServerEventCode.java +++ b/landlords-common/src/main/java/org/nico/ratel/landlords/enums/ServerEventCode.java @@ -30,7 +30,9 @@ public enum ServerEventCode implements Serializable{ CODE_GAME_POKER_PLAY_PASS("不出"), - CODE_GAME_WATCH("观战"); + CODE_GAME_WATCH("观战"), + + CODE_GAME_WATCH_EXIT("退出观战"); private String msg;