diff --git a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/Config.java b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/Config.java index 0f29553..cd595c7 100644 --- a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/Config.java +++ b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/Config.java @@ -39,9 +39,8 @@ public class Config { /** 游戏服务器主机地址 */ /*public static final String GAME_SERVER_HOST = "8.134.76.43"; public static final String DEFAULT_GROUP_ID = "762479";*/ - /*public static final String DEFAULT_GROUP_ID = "383709"; - public static final String GAME_SERVER_HOST = "8.163.97.101";*/ public static final String DEFAULT_GROUP_ID = "383709"; + /*public static final String GAME_SERVER_HOST = "8.163.97.101";*/ public static final String GAME_SERVER_HOST = "8.138.6.129"; /** 游戏服务器端口 */ diff --git a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java index 71550fc..cc2b036 100644 --- a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java +++ b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java @@ -314,6 +314,14 @@ public class EXGameController extends GameController { } } } + //检查房间内的真人玩家是否今天已经和机器人对打过 + if (hasPlayedToday(roomId)) { + log.warn("房间{"+roomId+"}中的真人玩家今天已和机器人对打过,拒绝机器人{"+robotId+"}加入"); + result.putInt("code", 1); + result.putString("message", "房间内有玩家今天已对打"); + return result; + } + log.info("225 开始进房间:room:{"+roomId+"} robot:{"+robotId+"}"); //加入房间 joinRoomCommon(robotId, roomId, groupId, params); @@ -760,6 +768,64 @@ public class EXGameController extends GameController { } } + /** + * 检查房间内的真人玩家是否今天已经和机器人对打过 + * @param roomId 房间ID + * @return true=有玩家今天打过(应阻止), false=都没打过(允许) + */ + private boolean hasPlayedToday(String roomId) { + Jedis jedis = Redis.use().getJedis(); + Jedis jedis3 = Redis.use("group1_db3").getJedis(); + try { + //查询该房间的玩家信息 + String playersStr = jedis.hget("room:" + roomId, "players"); + if (playersStr == null || playersStr.equals("[]")) { + log.info("房间{"+roomId+"}为空,无需检查"); + return false; + } + + String players = playersStr.substring(1, playersStr.length() - 1); + String[] playerIds = players.split(","); + + //获取DB3中的机器人集合 + Set robotSet = jedis3.smembers("robots"); + log.info("DB3 robots集合大小: " + robotSet.size()); + + for (String playerIdStr : playerIds) { + try { + int playerId = Integer.parseInt(playerIdStr.trim()); + + //判断是否是机器人 + if (robotSet.contains(String.valueOf(playerId))) { + log.debug("玩家{"+playerId+"}是机器人,跳过"); + continue; //是机器人跳过 + } + + //检查该真人玩家今天是否已和机器人对打过 + String matchedDate = jedis3.get("player_user:" + playerId); + if (matchedDate != null) { + String today = new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date()); + if (matchedDate.equals(today)) { + log.warn("检测到玩家{"+playerId+"}今天已和机器人对打过,日期:{"+matchedDate+"}"); + return true; + } + } + } catch (NumberFormatException e) { + log.error("解析玩家 ID 失败: "+playerIdStr); + } + } + + log.info("房间{"+roomId+"}中的真人玩家今天都未和机器人对打过"); + return false; + } catch (Exception e) { + log.error("检查玩家对打记录时发生异常,roomId: {"+roomId+"}" + e); + return false; + } finally { + jedis.close(); + jedis3.close(); + } + } + /** * 检查机器人 ID 是否与房间内已有玩家冲突 */ diff --git a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java index c1275c3..e1fec45 100644 --- a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java +++ b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java @@ -490,6 +490,33 @@ public class RobotConnectionManager { } //玩家加入房间 else if ("2001".equalsIgnoreCase(command)) { + try { + Integer newPlayerId = param.getInt("aid"); + if (newPlayerId != null && newPlayerId != robotId) { + String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + //判断是否是机器人 + Set robotSet = jedis3.smembers("robots"); + if (!robotSet.contains(String.valueOf(newPlayerId))) { + //是真人检查是否打过 + String matchedDate = jedis3.get("player_user:" + newPlayerId); + if (matchedDate != null && matchedDate.equals(today)) { + log.warn("玩家{"+newPlayerId+"}今天已和机器人对打过,机器人立即退出房间"); + //立即退出 + ITObject exitParams = TObject.newInstance(); + client.send("1005", exitParams, response -> { + EXGameController.removeRobotRoomInfo(String.valueOf(robotId)); + updateLeftoverRobot(robotId); + disconnectFromGameServer(connecId); + log.info("发送退出房间协议1005,robotId: {" + robotId + "}"); + }); + } + } + } + } catch (Exception e) { + log.error("2001即时检查时发生异常", e); + } + + //【延迟检查】6秒后检查完整状态(用于只剩机器人的场景) scheduleDelay(() -> { Jedis jedis = Redis.use().getJedis(); try { @@ -516,15 +543,52 @@ public class RobotConnectionManager { log.info("2002发送退出房间协议1005,robotId: {" + robotId + "}"); }); } + } else { + //多人情况:检查新加入的真人玩家是否今天已和机器人对打过 + boolean shouldExit = false; + String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + + Set robotSet = jedis3.smembers("robots"); + + for (String playerIdStr : playerIds) { + try { + int playerId = Integer.parseInt(playerIdStr.trim()); + + //跳过机器人自己 + if (playerId == robotId) continue; + + //判断是否是机器人 + if (robotSet.contains(String.valueOf(playerId))) { + log.debug("玩家{"+playerId+"}是机器人,跳过"); + continue; + } + + //检查该真人玩家今天是否已和机器人对打过 + String matchedDate = jedis3.get("player_user:" + playerId); + if (matchedDate != null && matchedDate.equals(today)) { + log.warn("检测到玩家{"+playerId+"}今天已和机器人对打过,机器人将退出房间,日期:{"+matchedDate+"}"); + shouldExit = true; + break; + } + } catch (NumberFormatException e) { + log.error("解析玩家ID失败: "+playerIdStr); + } + } + + if (shouldExit) { + //有玩家今天已打过 机器人退出房间 + ITObject exitParams = TObject.newInstance(); + client.send("1005", exitParams, response -> { + EXGameController.removeRobotRoomInfo(String.valueOf(robotId)); + updateLeftoverRobot(robotId); + disconnectFromGameServer(connecId); + log.info("玩家已打过-2001发送退出房间协议1005,robotId: {" + robotId + "}"); + }); + } } } } catch (Exception e) { log.error("处理玩家加入房间检查时发生异常", e); - } finally { - //确保Jedis连接关闭 - if (jedis != null) { - jedis.close(); - } } }, 6, TimeUnit.SECONDS); log.info("玩家{" + robotUser.getCurrentRoomId() + "}加入房间:" + param);