diff --git a/robots/majiang/robot_mj_hz/pom.xml b/robots/majiang/robot_mj_hz/pom.xml
index f4e2433..8faa7fa 100644
--- a/robots/majiang/robot_mj_hz/pom.xml
+++ b/robots/majiang/robot_mj_hz/pom.xml
@@ -25,7 +25,26 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
robot
@@ -41,7 +60,29 @@
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.2.4
+
+
+ package
+
+ shade
+
+
+
+
+ robot.mj.EXMainServer
+
+
+
+
+
+
+
-
+
+
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 684ded3..cdfc9f4 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
@@ -36,11 +36,11 @@ 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 = "426149";
- public static final String GAME_SERVER_HOST = "127.0.0.1";
+ 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_PORT = "6421";
+ public static final String GAME_SERVER_PORT = "26421";
/** 默认密码 */
public static final String DEFAULT_PASSWORD = "123456";
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 2af2725..612521d 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
@@ -416,6 +416,8 @@ public class EXGameController extends GameController {
//成功响应后才建立映射关系
synchronized (robotRoomMapping) {
robotRoomMapping.put(robotUser.getConnecId(), robotUser);
+ robotConnectionManager.reconnectToGameServer(response, robotUser, client);
+
}
log.info("机器人{"+robotId+"}已成功加入房间{"+roomId+"},建立映射关系");
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 dac1d3b..10ca3f5 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
@@ -8,8 +8,8 @@ import com.taurus.core.events.Event;
import com.taurus.core.events.IEventListener;
import com.taurus.core.plugin.redis.Redis;
import com.taurus.core.util.ICallback;
+import com.taurus.core.util.Logger;
import com.taurus.core.util.StringUtil;
-import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import robot.mj.business.AccountBusiness;
import robot.mj.handler.HuNanHongZhong;
@@ -20,6 +20,7 @@ import taurus.client.TaurusClient;
import taurus.client.SocketCode;
import redis.clients.jedis.Jedis;
import taurus.util.ROBOTEventType;
+import com.taurus.core.util.Logger;
import java.util.*;
import java.util.concurrent.*;
@@ -31,8 +32,9 @@ import static robot.mj.thread.ThreadPoolConfig.scheduleDelay;
* 机器人连接管理器 - 管理与游戏服务器的连接
*/
public class RobotConnectionManager {
+ private static final Logger log = Logger.getLogger(RobotConnectionManager.class);
- private static final Logger log = LoggerFactory.getLogger(RobotConnectionManager.class);
+ // private static final Logger log = LoggerFactory.getLogger(RobotConnectionManager.class);
private static final Map huNanHongZhongInstances = new ConcurrentHashMap<>();
//记录活跃连接 用于资源清理判断
@@ -45,8 +47,8 @@ public class RobotConnectionManager {
private static final long MAX_CONNECTION_LIFETIME = 5 * 60 * 1000;
private final EXGameController exGameController;
- private final String host= Config.GAME_SERVER_HOST;
- private final int port= Integer.parseInt(Config.GAME_SERVER_PORT);
+ private final String host = Config.GAME_SERVER_HOST;
+ private final int port = Integer.parseInt(Config.GAME_SERVER_PORT);
public RobotConnectionManager() {
exGameController = new EXGameController();
@@ -69,7 +71,7 @@ public class RobotConnectionManager {
}
HuNanHongZhong newInstance = new HuNanHongZhong();
-
+
//从Redis恢复状态
boolean restored = newInstance.restoreFromRedis(connecId);
if (restored) {
@@ -77,7 +79,7 @@ public class RobotConnectionManager {
} else {
log.info("创建新的HuNanHongZhong实例: " + connecId);
}
-
+
huNanHongZhongInstances.put(connecId, newInstance);
log.info("当前HuNanHongZhong实例总数: " + huNanHongZhongInstances.size());
return newInstance;
@@ -103,7 +105,7 @@ public class RobotConnectionManager {
//创建Taurus客户端
TaurusClient client = new TaurusClient(host + ":" + port, clientId, TaurusClient.ConnectionProtocol.Tcp);
-
+
//设置事件监听器
setupEventListeners(client, connecId);
@@ -204,18 +206,18 @@ public class RobotConnectionManager {
try {
//获取 msg
Message message = (Message) event.getParameter("msg");
-
+
ITObject param = message.param;
//回调协议号
String command = message.command;
-
+ log.info("收到游戏协议 " + command);
//根据玩法 ID 处理不同的回调
if (StringUtil.isNotEmpty(command)) {
//直接处理协议
handleProtocol(command, message, client, connecId);
}
} catch (Exception e) {
- log.error("处理游戏协议时发生异常:connecId: {}, command: {}", connecId, ((Message)event.getParameter("msg")).command, e);
+ log.error("处理游戏协议时发生异常:connecId: {}, command: {}", connecId, ((Message) event.getParameter("msg")).command, e);
}
}
};
@@ -243,14 +245,14 @@ public class RobotConnectionManager {
* 机器人断线重连
*/
public void reconnectToGameServer(MessageResponse response, RobotUser robotUser, TaurusClient client) {
- String connecId = robotUser.getCurrentRoomId()+"_"+robotUser.getRobotId();
+ String connecId = robotUser.getCurrentRoomId() + "_" + robotUser.getRobotId();
//先设置机器人状态为准备状态
robotUser.setStatus(ROBOTEventType.ROBOT_INTOROOM_READY);
-
- if(client.isConnected()){
+
+ if (client.isConnected()) {
try {
log.info(String.valueOf(response.messageData.param));
- if (response.messageData.param==null) {
+ if (response.messageData.param == null) {
log.info("警告:reconnectToGameServer 重连时未获取到参数");
return;
}
@@ -363,10 +365,10 @@ public class RobotConnectionManager {
}
}
}
- }finally {
+ } finally {
}
- }else {
+ } else {
renconnect(robotUser);
}
}
@@ -376,326 +378,321 @@ public class RobotConnectionManager {
*/
private void handleProtocol(String command, Message message, TaurusClient client, String connecId) {
RobotUser robotUser = robotRoomMapping.get(connecId);
+ log.info("connecId " + connecId);
- //更新连接的最后访问时间
- EXGameController.updateLastAccessTime(connecId);
- if (robotUser == null) {
- log.info("未找到机器人用户信息,连接ID: " + connecId);
- return;
+ for (Map.Entry entry : robotRoomMapping.entrySet()) {
+ String key = entry.getKey();
+ RobotUser user = entry.getValue();
+ log.info("Key" + key);
+ log.info("user seat" + user.getSeat());
+ log.info("user connecId" + user.getConnecId());
+ log.info("user robotId" + user.getRobotId());
+
+ log.info("robotRoomMapping " + robotRoomMapping);
}
- int robotId = Integer.parseInt(robotUser.getRobotId());
- ITObject param = message.param;
- HuNanHongZhong huNanHongZhong = getHuNanHongZhongInstance(connecId);
- Jedis jedis0 = Redis.use().getJedis();
- Jedis jedis2 = Redis.use("group1_db2").getJedis();
- try {
- //红中麻将 机器人处理事件
- //初始化手牌
- if ("811".equalsIgnoreCase(command)) {
- robotUser.setStatus(ROBOTEventType.ROBOT_INTOROOM_WORKING);
- huNanHongZhong.cardInHead(command, message, client);
- //处理完协议后保存到Redis
- HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
- currentInstance.saveToRedis(connecId);
+ //更新连接的最后访问时间
+ EXGameController.updateLastAccessTime(connecId);
+
+ if (robotUser == null) {
+ log.info("未找到机器人用户信息,连接ID: " + connecId);
+ return;
}
- //出牌广播
- else if ("812".equalsIgnoreCase(command)) {
- huNanHongZhong.drawCard(command, message);
- //处理完协议后保存到Redis
- HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
- currentInstance.saveToRedis(connecId);
- }
- //摸牌
- else if ("819".equalsIgnoreCase(command)) {
- huNanHongZhong.getCard(command, message);
- //处理完协议后保存到Redis
- HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
- currentInstance.saveToRedis(connecId);
- }
- //出牌,牌权
- else if ("813".equalsIgnoreCase(command)) {
- huNanHongZhong.outCard(client);
- //处理完协议后保存到Redis
- HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
- currentInstance.saveToRedis(connecId);
- }
- //结算
- else if ("817".equalsIgnoreCase(command)) {
- huNanHongZhong.getHongZhongCardInhand().clear();
- huNanHongZhong.getChuGuoCardInhand().clear();
- log.info("红中结算");
- Integer type = param.getInt("type");
- if (type == 1 || type == 2) { //为1为大结算 为2为解散
- //更新机器人剩余数量
- updateLeftoverRobot(Integer.parseInt(robotUser.getRobotId()));
-
- //游戏结束后主动断开连接
- disconnectFromGameServer(connecId);
+
+ int robotId = Integer.parseInt(robotUser.getRobotId());
+ ITObject param = message.param;
+ HuNanHongZhong huNanHongZhong = getHuNanHongZhongInstance(connecId);
+ Jedis jedis0 = Redis.use().getJedis();
+ Jedis jedis2 = Redis.use("group1_db2").getJedis();
+ try {
+ //红中麻将 机器人处理事件
+ //初始化手牌
+ if ("811".equalsIgnoreCase(command)) {
+ robotUser.setStatus(ROBOTEventType.ROBOT_INTOROOM_WORKING);
+ huNanHongZhong.cardInHead(command, message, client);
+ //处理完协议后保存到Redis
+ HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
+ currentInstance.saveToRedis(connecId);
}
- ITObject params = TObject.newInstance();
- params.putString("session", client.getSession());
- client.send("1003", params, new ICallback() {
- @Override
- public void action(MessageResponse messageResponse) {
+ //出牌广播
+ else if ("812".equalsIgnoreCase(command)) {
+ huNanHongZhong.drawCard(command, message);
+ //处理完协议后保存到Redis
+ HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
+ currentInstance.saveToRedis(connecId);
+ }
+ //摸牌
+ else if ("819".equalsIgnoreCase(command)) {
+ huNanHongZhong.getCard(command, message, robotUser);
+ //处理完协议后保存到Redis
+ HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
+ currentInstance.saveToRedis(connecId);
+ }
+ //出牌,牌权
+ else if ("813".equalsIgnoreCase(command)) {
+ huNanHongZhong.outCard(client);
+ //处理完协议后保存到Redis
+ HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
+ currentInstance.saveToRedis(connecId);
+ }
+ //结算
+ else if ("817".equalsIgnoreCase(command)) {
+ huNanHongZhong.getHongZhongCardInhand().clear();
+ huNanHongZhong.getChuGuoCardInhand().clear();
+ log.info("红中结算");
+ Integer type = param.getInt("type");
+ if (type == 1 || type == 2) { //为1为大结算 为2为解散
+ //更新机器人剩余数量
+ updateLeftoverRobot(Integer.parseInt(robotUser.getRobotId()));
+ //游戏结束后主动断开连接
+ disconnectFromGameServer(connecId);
}
- });
- }
- //杠碰胡通知协议
- else if ("814".equalsIgnoreCase(command)) {
- huNanHongZhong.actionCard(param, client);
- //处理完协议后保存到Redis
- HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
- currentInstance.saveToRedis(connecId);
- } else if ("820".equalsIgnoreCase(command)) {
- HuNanHongZhong.changePlayer(command, message);
- //处理完协议后保存到Redis
- HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
- currentInstance.saveToRedis(connecId);
- }
- //服务器通知客户端有玩家执行了操作
- else if ("815".equalsIgnoreCase(command)) {
- huNanHongZhong.shanchuchuguopai(param);
- //处理完协议后保存到Redis
- HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
- currentInstance.saveToRedis(connecId);
- }
- //玩家加入房间
- else if ("2001".equalsIgnoreCase(command)) {
- scheduleDelay(() -> {
- Jedis jedis = Redis.use().getJedis();
- try {
- String roomKey = String.valueOf(robotUser.getCurrentRoomId());
+ ITObject params = TObject.newInstance();
+ params.putString("session", client.getSession());
+ client.send("1003", params, new ICallback() {
+ @Override
+ public void action(MessageResponse messageResponse) {
- //查询该房间的玩家信息
- String playersStr = jedis.hget("room:"+roomKey, "players");
- if (!playersStr.equals("[]")) {
- String players = playersStr.substring(1, playersStr.length() - 1);
- String[] playerIds = players.split(",");
-
- //判断只有当前机器人一个玩家
- if (playerIds.length == 1) {
- int playerId = Integer.parseInt(playerIds[0].trim());
- if (playerId == robotId) {
-
- //发送退出房间协议
- ITObject params = TObject.newInstance();
- client.send("1005", params, response -> {
- EXGameController.removeRobotRoomInfo(String.valueOf(robotId));
- //更新机器人剩余数量
- updateLeftoverRobot(robotId);
- disconnectFromGameServer(connecId);
- log.info("2002发送退出房间协议1005,robotId: {"+robotId+"}");
- });
- }
- }
}
- } catch (Exception e) {
- log.error("处理玩家加入房间检查时发生异常", e);
- } finally {
- //确保Jedis连接关闭
- if (jedis != null) {
- jedis.close();
- }
- }
- }, 6, TimeUnit.SECONDS);
- log.info("玩家{"+ robotUser.getCurrentRoomId()+"}加入房间:"+ param);
- }
- //玩家退出房间也要检查
- else if ("2002".equalsIgnoreCase(command)) {
- //直接使用定时任务替代Thread.sleep,避免嵌套异步调用
- scheduleDelay(() -> {
- Jedis jedis = Redis.use().getJedis();
- try {
- String roomKey = String.valueOf(robotUser.getCurrentRoomId());
-
- //查询该房间的玩家信息
- String playersStr = jedis.hget("room:"+roomKey, "players");
- if (!playersStr.equals("[]")) {
- String players = playersStr.substring(1, playersStr.length() - 1);
- String[] playerIds = players.split(",");
-
- //判断只有当前机器人一个玩家
- if (playerIds.length == 1) {
- int playerId = Integer.parseInt(playerIds[0].trim());
- if (playerId == robotId) {
-
- //发送退出房间协议
- ITObject params = TObject.newInstance();
- client.send("1005", params, response -> {
- EXGameController.removeRobotRoomInfo(String.valueOf(robotId));
- //更新机器人剩余数量
- updateLeftoverRobot(robotId);
- disconnectFromGameServer(connecId);
- log.info("2002发送退出房间协议1005,robotId: {"+robotId+"}");
- });
- }
- }
- }
- } catch (Exception e) {
- log.error("处理玩家退出房间检查时发生异常");
- } finally {
- if (jedis != null) {
- jedis.close();
- }
- }
- }, 6, TimeUnit.SECONDS);
- }
- //玩家解散房间
- else if ("2005".equalsIgnoreCase(command)) {
- EXGameController.removeRobotRoomInfo(String.valueOf(robotId));
- //更新机器人剩余数量
- updateLeftoverRobot(robotId);
- disconnectFromGameServer(connecId);
- log.info("2005玩家发送解散房间协议,robotId: {"+robotId+"}");
- }
- //解散房间时候恢复机器人账号可以使用
- else if ("2008".equalsIgnoreCase(command)) {
- updateLeftoverRobot(Integer.parseInt(robotUser.getRobotId()));
- disconnectFromGameServer(connecId);
- }
- else if ("2009".equalsIgnoreCase(command)) {
- scheduleDelay(() -> {
- Jedis jedis = null;
- try {
- jedis = Redis.use().getJedis();
- Integer paramRobotId = param.getInt("aid");
- if (robotUser != null && paramRobotId != null) {
+ });
+ }
+ //杠碰胡通知协议
+ else if ("814".equalsIgnoreCase(command)) {
+ huNanHongZhong.actionCard(param, client);
+ //处理完协议后保存到Redis
+ HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
+ currentInstance.saveToRedis(connecId);
+ } else if ("820".equalsIgnoreCase(command)) {
+ HuNanHongZhong.changePlayer(command, message);
+ //处理完协议后保存到Redis
+ HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
+ currentInstance.saveToRedis(connecId);
+ }
+ //服务器通知客户端有玩家执行了操作
+ else if ("815".equalsIgnoreCase(command)) {
+ huNanHongZhong.shanchuchuguopai(param);
+ //处理完协议后保存到Redis
+ HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId);
+ currentInstance.saveToRedis(connecId);
+ }
+ //玩家加入房间
+ else if ("2001".equalsIgnoreCase(command)) {
+ scheduleDelay(() -> {
+ Jedis jedis = Redis.use().getJedis();
+ try {
String roomKey = String.valueOf(robotUser.getCurrentRoomId());
//查询该房间的玩家信息
- String playersStr = jedis.hget(roomKey, "players");
- if (playersStr != null && !playersStr.equals("[]")) {
+ String playersStr = jedis.hget("room:" + roomKey, "players");
+ if (!playersStr.equals("[]")) {
String players = playersStr.substring(1, playersStr.length() - 1);
String[] playerIds = players.split(",");
//判断只有当前机器人一个玩家
if (playerIds.length == 1) {
int playerId = Integer.parseInt(playerIds[0].trim());
- if (playerId == paramRobotId) {
+ if (playerId == robotId) {
+
//发送退出房间协议
ITObject params = TObject.newInstance();
client.send("1005", params, response -> {
- EXGameController.removeRobotRoomInfo(String.valueOf(paramRobotId));
- //断开连接
- disconnectFromGameServer(connecId);
+ EXGameController.removeRobotRoomInfo(String.valueOf(robotId));
//更新机器人剩余数量
- updateLeftoverRobot(paramRobotId);
- log.info("2009发送退出房间协议1005,robotId: {"+paramRobotId+"}");
+ updateLeftoverRobot(robotId);
+ disconnectFromGameServer(connecId);
+ log.info("2002发送退出房间协议1005,robotId: {" + robotId + "}");
});
}
}
}
+ } catch (Exception e) {
+ log.error("处理玩家加入房间检查时发生异常", e);
+ } finally {
+ //确保Jedis连接关闭
+ if (jedis != null) {
+ jedis.close();
+ }
}
- } catch (NumberFormatException e) {
- log.error("2009协议数字格式异常,robotId: " + param.get("aid") + ", connecId: " + connecId);
- } catch (NullPointerException e) {
- log.error("2009协议空指针异常,connecId: " + connecId);
- } catch (Exception e) {
- log.error("2009协议处理异常: " + e.getMessage() + ", connecId: " + connecId);
- } finally {
- if (jedis != null) {
- jedis.close();
+ }, 6, TimeUnit.SECONDS);
+ log.info("玩家{" + robotUser.getCurrentRoomId() + "}加入房间:" + param);
+ }
+ //玩家退出房间也要检查
+ else if ("2002".equalsIgnoreCase(command)) {
+ //直接使用定时任务替代Thread.sleep,避免嵌套异步调用
+ scheduleDelay(() -> {
+ Jedis jedis = Redis.use().getJedis();
+ try {
+ String roomKey = String.valueOf(robotUser.getCurrentRoomId());
+
+ //查询该房间的玩家信息
+ String playersStr = jedis.hget("room:" + roomKey, "players");
+ if (!playersStr.equals("[]")) {
+ String players = playersStr.substring(1, playersStr.length() - 1);
+ String[] playerIds = players.split(",");
+
+ //判断只有当前机器人一个玩家
+ if (playerIds.length == 1) {
+ int playerId = Integer.parseInt(playerIds[0].trim());
+ if (playerId == robotId) {
+
+ //发送退出房间协议
+ ITObject params = TObject.newInstance();
+ client.send("1005", params, response -> {
+ EXGameController.removeRobotRoomInfo(String.valueOf(robotId));
+ //更新机器人剩余数量
+ updateLeftoverRobot(robotId);
+ disconnectFromGameServer(connecId);
+ log.info("2002发送退出房间协议1005,robotId: {" + robotId + "}");
+ });
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error("处理玩家退出房间检查时发生异常");
+ } finally {
+ if (jedis != null) {
+ jedis.close();
+ }
+ }
+ }, 6, TimeUnit.SECONDS);
+ }
+ //玩家解散房间
+ else if ("2005".equalsIgnoreCase(command)) {
+ EXGameController.removeRobotRoomInfo(String.valueOf(robotId));
+ //更新机器人剩余数量
+ updateLeftoverRobot(robotId);
+ disconnectFromGameServer(connecId);
+ log.info("2005玩家发送解散房间协议,robotId: {" + robotId + "}");
+ }
+ //解散房间时候恢复机器人账号可以使用
+ else if ("2008".equalsIgnoreCase(command)) {
+ updateLeftoverRobot(Integer.parseInt(robotUser.getRobotId()));
+ disconnectFromGameServer(connecId);
+ } else if ("2009".equalsIgnoreCase(command)) {
+ scheduleDelay(() -> {
+ Jedis jedis = null;
+ try {
+ jedis = Redis.use().getJedis();
+ Integer paramRobotId = param.getInt("aid");
+ if (robotUser != null && paramRobotId != null) {
+ String roomKey = String.valueOf(robotUser.getCurrentRoomId());
+
+ //查询该房间的玩家信息
+ String playersStr = jedis.hget(roomKey, "players");
+ if (playersStr != null && !playersStr.equals("[]")) {
+ String players = playersStr.substring(1, playersStr.length() - 1);
+ String[] playerIds = players.split(",");
+
+ //判断只有当前机器人一个玩家
+ if (playerIds.length == 1) {
+ int playerId = Integer.parseInt(playerIds[0].trim());
+ if (playerId == paramRobotId) {
+ //发送退出房间协议
+ ITObject params = TObject.newInstance();
+ client.send("1005", params, response -> {
+ EXGameController.removeRobotRoomInfo(String.valueOf(paramRobotId));
+ //断开连接
+ disconnectFromGameServer(connecId);
+ //更新机器人剩余数量
+ updateLeftoverRobot(paramRobotId);
+ log.info("2009发送退出房间协议1005,robotId: {" + paramRobotId + "}");
+ });
+ }
+ }
+ }
+ }
+ } catch (NumberFormatException e) {
+ log.error("2009协议数字格式异常,robotId: " + param.get("aid") + ", connecId: " + connecId);
+ } catch (NullPointerException e) {
+ log.error("2009协议空指针异常,connecId: " + connecId);
+ } catch (Exception e) {
+ log.error("2009协议处理异常: " + e.getMessage() + ", connecId: " + connecId);
+ } finally {
+ if (jedis != null) {
+ jedis.close();
+ }
+ }
+ }, 6, TimeUnit.SECONDS);
+ }
+ } catch (Exception e) {
+ log.error("处理接收到的游戏协议异常");
+ } finally {
+ jedis0.close();
+ jedis2.close();
+ }
+ }
+
+ /**
+ * 增加leftover_robot数量 机器人退出房间
+ */
+ private void updateLeftoverRobot ( int robotId){
+ Jedis jedis2 = Redis.use("group1_db2").getJedis();
+ try {
+
+ jedis2.hset("gallrobot", String.valueOf(robotId), "0");
+
+ jedis2.hset("{grobot}:" + robotId, "start", "0");
+
+ log.info("机器人 {" + robotId + "} 退出房间,修改gallrobot为0");
+ } finally {
+ jedis2.close();
+ }
+ }
+
+ /**
+ * 机器人登录
+ */
+ public void login (RobotUser robotUser){
+ log.info("开始机器人登录,robotId: {" + robotUser.getRobotId() + "}");
+ ITObject object = null;
+ AccountBusiness accountBusiness = null;
+ accountBusiness = new AccountBusiness();
+ try {
+ //先快速登录
+ object = accountBusiness.fastLogin(Integer.parseInt(robotUser.getRobotId()));
+ log.info("机器人登录成功,robotId: {" + robotUser.getRobotId() + "}");
+ if (object == null) {
+ object = accountBusiness.idPasswordLogin(Integer.parseInt(robotUser.getRobotId()), robotUser.getPassword());
+ }
+ ITObject finalObject = object;
+ CompletableFuture.runAsync(() -> {
+ if (finalObject != null) {
+ //判断是否有房间
+ if (finalObject.getTObject("account") != null) {
+ ITObject validate = TObject.newInstance();
+ validate.putString("token", finalObject.getString("token"));
+ robotUser.setToken(finalObject.getString("token"));
+ ;
+ robotUser.setLoginsession("{user}:" + robotUser.getRobotId());
+ if (robotUser.getLoginsession() != null) {
+ robotUser.setIsLogin(true);
+ }
+ if (finalObject.getTObject("account").get("roomid") != null) {
+ String roomid = finalObject.getTObject("account").get("roomid").toString();
+ robotUser.setCurrentRoomId(Integer.parseInt(roomid));
+ connectGame(robotUser);
+
+ robotUser.setConnecId(robotUser.getCurrentRoomId() + "_" + robotUser.getRobotId());
+ log.info("重启获取的机器人还有当前房间,准备加入: " + robotUser.getConnecId());
+ exGameController.webGroupJoinRoom(robotUser);
+ }
}
}
- }, 6, TimeUnit.SECONDS);
+ });
+ } catch (Exception e) {
+ log.error("机器人登录异常");
}
- } catch (Exception e) {
- log.error("处理接收到的游戏协议异常");
- } finally {
- jedis0.close();
- jedis2.close();
}
- }
- /**
- * 增加leftover_robot数量 机器人退出房间
- */
- private void updateLeftoverRobot(int robotId) {
- Jedis jedis2 = Redis.use("group1_db2").getJedis();
- try {
-
- jedis2.hset("gallrobot", String.valueOf(robotId), "0");
-
- jedis2.hset("{grobot}:" + robotId, "start", "0");
-
- log.info("机器人 {"+robotId+"} 退出房间,修改gallrobot为0");
- } finally {
- jedis2.close();
- }
- }
-
- /**
- * 机器人登录
- */
- public void login(RobotUser robotUser){
- log.info("开始机器人登录,robotId: {"+robotUser.getRobotId()+"}");
- ITObject object = null;
- AccountBusiness accountBusiness = null;
- accountBusiness = new AccountBusiness();
- try {
- //先快速登录
- object = accountBusiness.fastLogin(Integer.parseInt(robotUser.getRobotId()));
- log.info("机器人登录成功,robotId: {"+robotUser.getRobotId()+"}");
- if(object==null){
- object = accountBusiness.idPasswordLogin(Integer.parseInt(robotUser.getRobotId()), robotUser.getPassword());
- }
- ITObject finalObject = object;
- CompletableFuture.runAsync(() -> {
- if (finalObject != null) {
- //判断是否有房间
- if(finalObject.getTObject("account")!=null){
- ITObject validate = TObject.newInstance();
- validate.putString("token", finalObject.getString("token"));
- robotUser.setToken(finalObject.getString("token"));;
- robotUser.setLoginsession("{user}:"+robotUser.getRobotId());
- if (robotUser.getLoginsession() != null) {
- robotUser.setIsLogin(true);
- }
- if(finalObject.getTObject("account").get("roomid")!=null){
- String roomid = finalObject.getTObject("account").get("roomid").toString();
- robotUser.setCurrentRoomId(Integer.parseInt(roomid));
- connectGame(robotUser);
-
- robotUser.setConnecId(robotUser.getCurrentRoomId()+"_"+robotUser.getRobotId());
- log.info("重启获取的机器人还有当前房间,准备加入: "+robotUser.getConnecId());
- exGameController.webGroupJoinRoom(robotUser);
- }
- }
- }
- });
- } catch (Exception e) {
- log.error("机器人登录异常");
- }
- }
-
- public void connectGame(RobotUser robotUser){
- if(robotUser.isLogin){
- if(robotUser.getClient()==null){
- TaurusClient client = new TaurusClient(robotUser.getGameHost()+":"+robotUser.getGamePort(), "hz"+robotUser.getRobotId(), TaurusClient.ConnectionProtocol.Tcp);
- client.setSession(robotUser.getLoginsession());
- client.connect();
- setupEventListeners(client, robotUser.getCurrentRoomId()+"_"+robotUser.getRobotId());
- robotUser.setIsconnect(client.isConnected());
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- log.error("连接超时异常");
- }
- robotUser.setClient(client);
- EXGameController.robotRoomMapping.put(robotUser.getCurrentRoomId()+"_"+robotUser.getRobotId(), robotUser);
- }else{
- log.info("机器人已连接,准备加入房间");
- log.info("client.isConnected()"+robotUser.getClient().isConnected());
- if(robotUser.getClient().isConnected()){
- robotUser.setIsconnect(true);
- }else{
- log.info("reconnect"+robotUser.getClient().getGameID());
- TaurusClient client = new TaurusClient(robotUser.getGameHost()+":"+robotUser.getGamePort(), "hz"+robotUser.getRobotId(), TaurusClient.ConnectionProtocol.Tcp);
+ public void connectGame (RobotUser robotUser){
+ if (robotUser.isLogin) {
+ if (robotUser.getClient() == null) {
+ TaurusClient client = new TaurusClient(robotUser.getGameHost() + ":" + robotUser.getGamePort(), "hz" + robotUser.getRobotId(), TaurusClient.ConnectionProtocol.Tcp);
client.setSession(robotUser.getLoginsession());
client.connect();
+ setupEventListeners(client, robotUser.getCurrentRoomId() + "_" + robotUser.getRobotId());
robotUser.setIsconnect(client.isConnected());
try {
Thread.sleep(1000);
@@ -703,44 +700,62 @@ public class RobotConnectionManager {
log.error("连接超时异常");
}
robotUser.setClient(client);
- EXGameController.robotRoomMapping.put(robotUser.getCurrentRoomId()+"_"+robotUser.getRobotId(), robotUser);
+ EXGameController.robotRoomMapping.put(robotUser.getCurrentRoomId() + "_" + robotUser.getRobotId(), robotUser);
+ } else {
+ log.info("机器人已连接,准备加入房间");
+ log.info("client.isConnected()" + robotUser.getClient().isConnected());
+ if (robotUser.getClient().isConnected()) {
+ robotUser.setIsconnect(true);
+ } else {
+ log.info("reconnect" + robotUser.getClient().getGameID());
+ TaurusClient client = new TaurusClient(robotUser.getGameHost() + ":" + robotUser.getGamePort(), "hz" + robotUser.getRobotId(), TaurusClient.ConnectionProtocol.Tcp);
+ client.setSession(robotUser.getLoginsession());
+ client.connect();
+ robotUser.setIsconnect(client.isConnected());
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ log.error("连接超时异常");
+ }
+ robotUser.setClient(client);
+ EXGameController.robotRoomMapping.put(robotUser.getCurrentRoomId() + "_" + robotUser.getRobotId(), robotUser);
+ }
}
}
}
- }
- /**
- * 重连
- */
- public void renconnect(RobotUser robotUser){
- TaurusClient client = robotUser.getClient();
- if(client!=null){
- if(client.isConnected()){
- client.connect();
- robotUser.setIsconnect(client.isConnected());
+ /**
+ * 重连
+ */
+ public void renconnect (RobotUser robotUser){
+ TaurusClient client = robotUser.getClient();
+ if (client != null) {
+ if (client.isConnected()) {
+ client.connect();
+ robotUser.setIsconnect(client.isConnected());
+ }
}
}
- }
- /**
- * 根据connecId获取游戏服务器连接
- */
- public TaurusClient getGameClient(String connecId) {
- return robotRoomMapping.get(connecId) != null ? robotRoomMapping.get(connecId).getClient() : null;
- }
-
-
- public int getTime(){
- return Integer.parseInt((System.currentTimeMillis() + "").substring(0, 10));
- }
-
- public static void sleepTime(int time) {
- try {
- //添加延迟
- Thread.sleep(time);
- } catch (InterruptedException e) {
- log.error("连接超时异常");
+ /**
+ * 根据connecId获取游戏服务器连接
+ */
+ public TaurusClient getGameClient (String connecId){
+ return robotRoomMapping.get(connecId) != null ? robotRoomMapping.get(connecId).getClient() : null;
}
- }
-}
\ No newline at end of file
+
+ public int getTime () {
+ return Integer.parseInt((System.currentTimeMillis() + "").substring(0, 10));
+ }
+
+ public static void sleepTime ( int time){
+ try {
+ //添加延迟
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ log.error("连接超时异常");
+ }
+ }
+
+ }
\ No newline at end of file
diff --git a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/handler/HuNanHongZhong.java b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/handler/HuNanHongZhong.java
index 0306c91..17e40d8 100644
--- a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/handler/HuNanHongZhong.java
+++ b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/handler/HuNanHongZhong.java
@@ -6,22 +6,26 @@ import com.taurus.core.entity.ITArray;
import com.taurus.core.entity.ITObject;
import com.taurus.core.entity.TObject;
import com.taurus.core.plugin.redis.Redis;
+import com.taurus.core.util.Logger;
import com.taurus.core.util.StringUtil;
-import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
+import robot.mj.info.RobotUser;
import taurus.client.Message;
import taurus.client.TaurusClient;
import taurus.util.CardUtil;
import taurus.util.HongZhongSuanFaTest;
import taurus.util.Util;
+import com.taurus.core.util.Logger;
import java.util.*;
import static robot.mj.thread.ThreadPoolConfig.getBusinessThreadPool;
public class HuNanHongZhong {
- private static final Logger log = LoggerFactory.getLogger(HuNanHongZhong.class);
+ // private static final Logger log = LoggerFactory.getLogger(HuNanHongZhong.class);
+ private static final Logger log = Logger.getLogger(HuNanHongZhong.class);
+
//红中麻将手牌
private final List hongZhongCardInhand = new ArrayList<>();
@@ -78,7 +82,7 @@ public class HuNanHongZhong {
public void setSession(String session) {
this.session = session;
}
-
+
public String getToken() {
return token;
}
@@ -92,9 +96,9 @@ public class HuNanHongZhong {
}
-
/**
* 将当前实例状态序列化为JSON字符串并保存到Redis
+ *
* @param connecId 连接ID
*/
public void saveToRedis(String connecId) {
@@ -122,6 +126,7 @@ public class HuNanHongZhong {
/**
* 从Redis恢复实例状态
+ *
* @param connecId 连接ID
* @return 是否成功恢复
*/
@@ -140,14 +145,16 @@ public class HuNanHongZhong {
if (stateMap.containsKey("hongZhongCardInhand")) {
hongZhongCardInhand.clear();
List handCards = gson.fromJson(stateMap.get("hongZhongCardInhand"),
- new TypeToken>(){}.getType());
+ new TypeToken>() {
+ }.getType());
if (handCards != null) hongZhongCardInhand.addAll(handCards);
}
if (stateMap.containsKey("hongZhongchuguopai")) {
hongZhongchuguopai.clear();
List handCards = gson.fromJson(stateMap.get("hongZhongchuguopai"),
- new TypeToken>(){}.getType());
+ new TypeToken>() {
+ }.getType());
if (handCards != null) hongZhongchuguopai.addAll(handCards);
}
@@ -167,6 +174,7 @@ public class HuNanHongZhong {
/**
* 从Redis清除实例状态
+ *
* @param connecId 连接ID
*/
public static void removeFromRedis(String connecId) {
@@ -184,6 +192,7 @@ public class HuNanHongZhong {
/**
* 同步手牌
+ *
* @param handCard
*/
public void updateHandCard(List handCard) {
@@ -227,18 +236,19 @@ public class HuNanHongZhong {
* @param message 消息对象
* @return
*/
- public String getCard(String command, Message message) {
- log.info("摸牌协议-----{} message---{}", command, message);
+ public String getCard(String command, Message message, RobotUser robotUser) {
if (command.equalsIgnoreCase("819")) {
ITObject param = message.param;
if (param == null) {
return null;
}
-// {seat=2, Ishupai=0, isBaoTing=-1, tingcard=0, isgang=0, card=101, left_count=106}
- log.info("轮到用户:{}的用户摸牌, 牌为:{}", param.getInt("player"), param.getInt("card"));
- log.debug("用户id: {}", playerId);
- log.debug("座位号: {}", param.getInt("seat"));
- if (param.getInt("player") != null) {
+ log.info("819机器人摸牌所有参数" + param);
+ Integer seat1 = param.getInt("seat");
+ Integer seat2 = robotUser.getSeat();
+ log.info("819摸牌 后台发的座位号" + seat1);
+ log.info("819摸牌 机器人座位号" + seat2);
+
+ if (Objects.equals(seat1, seat2)) {
int drawnCard = param.getInt("card");
hongZhongSuanFaTest.drawnCards = drawnCard;
@@ -434,56 +444,55 @@ public class HuNanHongZhong {
public String outCard(TaurusClient client) {
// 调用分离分析方法,将刻子、顺子、红中单独拎出后分析剩余牌
try {
- System.out.println("当前机器人手牌" + hongZhongCardInhand);
- log.info("[HuNanHongZhong] 出牌前分离分析手牌结构...");
- hongZhongSuanFaTest.separateAndAnalyzeHand(hongZhongCardInhand);
+ System.out.println("当前机器人手牌" + hongZhongCardInhand);
+ log.info("[HuNanHongZhong] 出牌前分离分析手牌结构...");
+ hongZhongSuanFaTest.separateAndAnalyzeHand(hongZhongCardInhand);
- // 红中麻将出牌
- String hongzhongOutCard = hongZhongSuanFaTest.outCardSuanFa(hongZhongCardInhand, hongZhongCard);
-// String hongzhongOutCard = hongZhongSuanFaTest.outCardSuanFa(list, hongZhongCard);
- ITObject params = TObject.newInstance();
- int cardToOut;
- if (StringUtil.isNotEmpty(hongzhongOutCard)) {
- cardToOut = Integer.parseInt(hongzhongOutCard);
- } else {
- cardToOut = hongZhongCardInhand.get(0);
- }
- params.putInt("card", cardToOut);
-
- int outCountBefore = hongZhongchuguopai.size(); // 当前历史出牌数量
-
- // 第n次出牌时,发送前n-1张出牌
- if (outCountBefore >= 1) {
- // 发送前n-1张(所有历史出牌)
- List cardsToSend = hongZhongchuguopai.subList(0, outCountBefore);
- params.putTArray("outcard_list", CardUtil.maJiangToTArray(cardsToSend));
- }
- params.putTArray("card_list", CardUtil.maJiangToTArray(hongZhongCardInhand));
- log.info("机器人牌============{}", params);
- // 将当前出的牌添加到历史出牌列表
- hongZhongchuguopai.add(cardToOut);
- // 从手牌中移除
- hongZhongCardInhand.remove(Integer.valueOf(cardToOut));
- log.info("出牌: {}", cardToOut);
- log.info("目前机器人剩余手牌:{}", hongZhongCardInhand.toString());
- params.putString("session", session + "," + token);
-
- //使用线程池替代CompletableFuture.runAsync + Thread.sleep
- getBusinessThreadPool().execute(() -> {
- try {
- int ot = new Random().nextInt(2);
- Thread.sleep(ot * 1000+1000);
- client.send("611", params, response -> {
-
- });
- } catch (Exception e) {
- log.error("线程执行错误");
+ // 红中麻将出牌
+ String hongzhongOutCard = hongZhongSuanFaTest.outCardSuanFa(hongZhongCardInhand, hongZhongCard);
+ // String hongzhongOutCard = hongZhongSuanFaTest.outCardSuanFa(list, hongZhongCard);
+ ITObject params = TObject.newInstance();
+ int cardToOut;
+ if (StringUtil.isNotEmpty(hongzhongOutCard)) {
+ cardToOut = Integer.parseInt(hongzhongOutCard);
+ } else {
+ cardToOut = hongZhongCardInhand.get(0);
}
- });
+ params.putInt("card", cardToOut);
+
+ int outCountBefore = hongZhongchuguopai.size(); // 当前历史出牌数量
+
+ // 第n次出牌时,发送前n-1张出牌
+ if (outCountBefore >= 1) {
+ // 发送前n-1张(所有历史出牌)
+ List cardsToSend = hongZhongchuguopai.subList(0, outCountBefore);
+ params.putTArray("outcard_list", CardUtil.maJiangToTArray(cardsToSend));
+ }
+ params.putTArray("card_list", CardUtil.maJiangToTArray(hongZhongCardInhand));
+ // 将当前出的牌添加到历史出牌列表
+ hongZhongchuguopai.add(cardToOut);
+ // 从手牌中移除
+ hongZhongCardInhand.remove(Integer.valueOf(cardToOut));
+ log.info("机器人 出牌"+ cardToOut);
+ log.info("目前机器人剩余手牌"+ hongZhongCardInhand);
+ params.putString("session", session + "," + token);
+ log.info("机器人params" + params);
+ //使用线程池替代CompletableFuture.runAsync + Thread.sleep
+ getBusinessThreadPool().execute(() -> {
+ try {
+ int ot = new Random().nextInt(2);
+ Thread.sleep(ot * 1000 + 1000);
+ client.send("611", params, response -> {
+
+ });
+ } catch (Exception e) {
+ log.error("线程执行错误");
+ }
+ });
- }catch (Exception e) {
- // e.printStackTrace();
+ } catch (Exception e) {
+ // e.printStackTrace();
}
return null;
}