/// <summary> /// 处理聊天包 /// </summary> /// <param name="data">聊天数据</param> /// <returns>返回封包</returns> public SocketModel ChatPacket(ChatDTO data) { string content = data.content; string senderName = data.senderName; string senderUUID = data.senderUUID; string toUUID = data.toUUID; //检查UUID if (!CheckUUID(senderUUID)) { return Offline(); } //群发 foreach (Player player in PlayerManager.Instance.GetLobbyPlayerList()) { if (player.UUID != senderUUID) { SocketModel chatmodel = new SocketModel(); chatmodel.areaCode = AreaCode.Server; chatmodel.protocol = SocketProtocol.CHAT; chatmodel.message = JsonCoding<ChatDTO>.encode(new ChatDTO(content, senderName, senderUUID)); UdpServer.Instance.SendToPlayerByUUID(JsonCoding<SocketModel>.encode(chatmodel), player.UUID); } } return null;//不返回数据包 }
/// <summary> /// 处理卡片信息包 /// </summary> public SocketModel CardInfoPacket(CardInfoDTO data) { CardInfoDTO returnData = new CardInfoDTO(); List<CardInfo> cardInfoList = new List<CardInfo>(); int cardOwnerId = data.cardOwnerId; //从数据库获取信息 string command = string.Format("SELECT * FROM cardinventory WHERE CardOwnerId = '{0}'", cardOwnerId); DataSet ds = MySQLHelper.GetDataSet(MySQLHelper.Conn, CommandType.Text, command, null); foreach (DataRow row in ds.Tables[0].Rows) { CardInfo cardInfo = new CardInfo(); int cardId = Convert.ToInt32(row["CardId"]); cardInfo.cardId = cardId; cardInfo.cardOwnerId = Convert.ToInt32(row["CardOwnerId"]); cardInfo.cardRarity = UdpServer.Instance.cardManager.GetRarityByCardId(cardId); cardInfo.cardName = UdpServer.Instance.cardManager.GetNameById(cardId); cardInfo.cardLevel = Convert.ToInt32(row["CardLevel"]); cardInfoList.Add(cardInfo); } returnData.cardOwnerId = cardOwnerId; returnData.cardInfoList = cardInfoList.ToArray(); SocketModel model = new SocketModel(); model.returnCode = ReturnCode.Success; model.protocol = SocketProtocol.CARDINFOLIST; model.message = JsonCoding<CardInfoDTO>.encode(returnData); return model; }
/// <summary> /// 处理命令 /// </summary> /// <param name="args">参数数组</param> private void ProcessCommand(string[] args) { if (args[0] == "server") { if (args.Length == 1) { ArgNotEnough(); return; } else { if (args[1] == "start") { UdpServer.Instance.Connect(); TcpServer.Instance.Init(); } else if (args[1] == "stop") { UdpServer.Instance.StopListen(); TcpServer.Instance.StopListen(); } else { UnkownCommand(); } } } else if (args[0] == "log") { if (args.Length == 1) { ArgNotEnough(); return; } else { if (args[1] == "open") { OpenLogFile(null, new RoutedEventArgs()); } else if (args[1] == "clear") { ClearScreen(null, new RoutedEventArgs()); } else if (args[1] == "openfolder") { OpenLogFileFolder(null, new RoutedEventArgs()); } else { UnkownCommand(); } } } else if (args[0] == "list") { ShowPlayerList(null, null); } else if (args[0] == "room") { if (args[1] == "detail") { try { int roomID = Convert.ToInt32(args[2]); GameRoomManager grm = TcpServer.Instance.GetGameRoomManager(); GameRoom room = grm.GetRoom(roomID); if (room != null) { string showTXT = ""; showTXT += "\n\t房间ID:" + room.roomID + "\n"; showTXT += string.Format("\t对战双方: {0}({1}) - {2}({3})\n", room.playerSocketA.playerInfo.playerName, room.playerSocketA.playerInfo.playerUid, room.playerSocketB.playerInfo.playerName, room.playerSocketB.playerInfo.playerUid); showTXT += "\tA方卡片背包列表:\n"; foreach (PlayerCard playerCard in room.playerDataA.characterCardInv) { showTXT += string.Format("\t\t{0}({1}-{2}-{3}-{4})\n", playerCard.cardName, playerCard.cardId, playerCard.cardLevel, playerCard.GetHealth(), playerCard.GetEnergy()); } showTXT += "\tB方卡片背包列表:\n"; foreach (PlayerCard playerCard in room.playerDataB.characterCardInv) { showTXT += string.Format("\t\t{0}({1}-{2}-{3}-{4})", playerCard.cardName, playerCard.cardId, playerCard.cardLevel, playerCard.GetHealth(), playerCard.GetEnergy()); } showTXT += "..."; logsSystem.Print(showTXT); } else { logsSystem.Print("房间号不存在", LogLevel.WARN); } } catch (Exception ex) { logsSystem.Print("出现异常,可是能输入的命令不合法:" + ex.ToString(), LogLevel.WARN); } } } else if (args[0] == "rooms") { ShowRoomsInfo(null, null); } else if (args[0] == "say") { if (args.Length == 1) { ArgNotEnough(); return; } else { string message = args[1]; if (args.Length > 2) { for (int i = 2; i < args.Length; i++) { message += " " + args[i]; } } SocketModel model = new SocketModel(); model.areaCode = AreaCode.Server; model.protocol = SocketProtocol.CHAT; model.message = JsonCoding<ChatDTO>.encode(new ChatDTO(message, "Server", "")); string sendMessage = JsonCoding<SocketModel>.encode(model); UdpServer.Instance.SendToAllPlayer(Encoding.UTF8.GetBytes(sendMessage)); logsSystem.Print("[系统公告]" + message); } } else if (args[0] == "kick") { if (args.Length == 1) { ArgNotEnough(); return; } else { try { int playerUid = Convert.ToInt32(args[1]); Player player = PlayerManager.Instance.GetLobbyPlayerByUid(playerUid); if (player != null) { //玩家在线 logsSystem.Print(string.Format("玩家[{0}({1})]已经被踢出了服务器", player.playerName, player.uid)); PlayerManager.Instance.LobbyPlayerLogout(playerUid); } else { //玩家不存在或不在线 logsSystem.Print("该玩家不存在", LogLevel.WARN); } } catch (Exception ex) { logsSystem.Print("请输入玩家的Uid" + ex.ToString()); } } } else if (args[0] == "version") { ShowVersionInfo(null, null); } else if (args[0] == "help") { //打开帮助页 OpenHelpURL(null, new RoutedEventArgs()); } else { UnkownCommand(); } }
/// <summary> /// 处理数据并根据数据返回相应的数据包 /// </summary> /// <param name="text">收到的文本</param> /// <param name="toIped">发送给对方的IP地址</param> /// <returns>数据包</returns> private byte[] ResponsePacket(string text, IPEndPoint toIped) { SocketModel model = JsonCoding<SocketModel>.decode(text); int areacode = model.areaCode; int returncode = model.returnCode; int protocol = model.protocol; string message = model.message; SocketModel returnModel = new SocketModel(); switch (protocol) { case SocketProtocol.LOGIN: { returnModel = pp.LoginPacket(JsonCoding<LoginDTO>.decode(message), toIped); break; } case SocketProtocol.CHAT: { returnModel = pp.ChatPacket(JsonCoding<ChatDTO>.decode(message)); break; } case SocketProtocol.PLAYERINFO: { returnModel = pp.PlayerInfoPacket(JsonCoding<PlayerInfoDTO>.decode(message)); break; } case SocketProtocol.CARDINFOLIST: { returnModel = pp.CardInfoPacket(JsonCoding<CardInfoDTO>.decode(message)); break; } case SocketProtocol.INVINFO: { returnModel = pp.InvInfoPacket(JsonCoding<InvInfoDTO>.decode(message)); break; } default: { LogsSystem.Instance.Print("接收到未知的数据包:" + text, LogLevel.WARN); break; } } //将model转码成二进制 if (returnModel != null) { return Encoding.UTF8.GetBytes(JsonCoding<SocketModel>.encode(returnModel));//返回给客户端信息 } else { return null;//不返回客户端信息 } }
/// <summary> /// 玩家登陆大厅 /// </summary> public void PlayerLoginLobby(int uid, string playerName, string UUID, IPEndPoint iped) { //检查玩家是否已经登陆。如果已登陆则踢出之前的 foreach (Player onlinePlayer in lobbyPlayerList) { if (onlinePlayer.uid == uid && onlinePlayer.UUID != UUID) { //踢出大厅 SocketModel model = new SocketModel(); model.protocol = SocketProtocol.OFFLINE; model.returnCode = ReturnCode.Refuse; UdpServer.Instance.SendMsg(JsonCoding<SocketModel>.encode(model), onlinePlayer.IPed.Address.ToString(), onlinePlayer.IPed.Port);//发送断线消息 this.lobbyPlayerList.Remove(onlinePlayer); //踢出游戏 foreach (PlayerSocket gameOnlinePlayer in gamePlayerList) { if (gameOnlinePlayer.playerInfo.playerUid == onlinePlayer.uid) { GameData data = new GameData(); data.operateCode = OperateCode.Offline; data.returnCode = ReturnCode.Refuse; TcpServer.Instance.Send(gameOnlinePlayer.socket, data); this.gamePlayerList.Remove(gameOnlinePlayer); break;//离开游戏玩家列表遍历循环 } } break;//离开大厅玩家列表遍历循环 } } //登陆系统 Player player = new Player(); player.uid = uid; player.playerName = playerName; player.UUID = UUID; player.IPed = iped; this.lobbyPlayerList.Add(player); //登陆成功 LogsSystem.Instance.Print(string.Format("玩家{0}[{1}]已登录到游戏", playerName, iped.Address.ToString())); }
public SocketModel InvInfoPacket(InvInfoDTO data) { int playerID = data.playerID; string playerUUID = data.playerUUID; int type = data.type;//player = 1,Hero = 2,Guide = 3,Inv = 4 int returnCode = ReturnCode.Success;//设定返回代码 if (CheckUUID(playerUUID)) { string returnData = ""; switch (type) { case 1://玩家页 { JsonData json = new JsonData(); json.SetJsonType(JsonType.Array);//设置为数组 //从数据库中获取玩家所有的卡片的ID、类型、是否上场并添加到返回字符串 string command = string.Format("SELECT CardId,CardType,IsUsing FROM cardinventory WHERE CardOwnerId = '{0}'", playerID); DataSet ds = MySQLHelper.GetDataSet(MySQLHelper.Conn, CommandType.Text, command, null); foreach (DataRow row in ds.Tables[0].Rows) { JsonData rowJson = new JsonData(); rowJson["CardId"] = Convert.ToInt32(row["CardId"]); rowJson["CardType"] = row["CardType"].ToString(); rowJson["IsUsing"] = Convert.ToBoolean(row["IsUsing"]); json.Add(rowJson); } returnData = json.ToJson(); break; } case 2://英雄页 { JsonData json = new JsonData(); json.SetJsonType(JsonType.Array);//设置为数组 //从数据库中获取玩家所有的英雄卡片的ID、是否上场并添加到返回字符串 string command = string.Format("SELECT CardId,IsUsing FROM cardinventory WHERE CardOwnerId = '{0}' AND CardType = '{1}'", playerID,"Character"); DataSet ds = MySQLHelper.GetDataSet(MySQLHelper.Conn, CommandType.Text, command, null); foreach (DataRow row in ds.Tables[0].Rows) { JsonData rowJson = new JsonData(); rowJson["CardId"] = Convert.ToInt32(row["CardId"]); rowJson["IsUsing"] = Convert.ToBoolean(row["IsUsing"]); json.Add(rowJson); } returnData = json.ToJson(); break; } case 3://图鉴页 { JsonData json = new JsonData(); json.SetJsonType(JsonType.Array);//设置为数组 //从数据库中获取玩家所有的英雄卡片的ID、是否上场并添加到返回字符串 string format = "SELECT *,COUNT(inv.CardId) AS OwnNum, " + "MAX(inv.SpecialAttack + inv.SpecialEnergy+ inv.SpecialHealth+ inv.SpecialSpeed) AS Talent " + "FROM cardinventory as inv " + "LEFT JOIN card " + "ON inv.CardId = card.CardId " + "WHERE inv.CardOwnerId = {0} AND inv.CardType = {1}" + "GROUP BY inv.CardId"; string command = string.Format(format, playerID, "Character"); DataSet ds = MySQLHelper.GetDataSet(MySQLHelper.Conn, CommandType.Text, command, null); foreach (DataRow row in ds.Tables[0].Rows) { JsonData rowJson = new JsonData(); rowJson["CardId"] = Convert.ToInt32(row["CardId"]); rowJson["CardName"] = Convert.ToString(row["CardName"]); rowJson["OwnNum"] = Convert.ToInt32(row["OwnNum"]); rowJson["MaxTalent"] = Convert.ToInt32(row["Talent"]); rowJson["CardRarity"] = Convert.ToInt32(row["CardRarity"]); rowJson["BaseHealth"] = Convert.ToInt32(row["BaseHealth"]); rowJson["BaseEnergy"] = Convert.ToInt32(row["BaseEnergy"]); rowJson["BaseAttack"] = Convert.ToInt32(row["BaseAttack"]); rowJson["BaseSpeed"] = Convert.ToInt32(row["BaseSpeed"]); rowJson["GrowHealth"] = Convert.ToInt32(row["GrowHealth"]); rowJson["GrowEnergy"] = Convert.ToInt32(row["GrowEnergy"]); rowJson["GrowAttack"] = Convert.ToInt32(row["GrowAttack"]); rowJson["GrowSpeed"] = Convert.ToInt32(row["GrowSpeed"]); json.Add(rowJson); } returnData = json.ToJson(); break; } case 4: { break; } default: { LogsSystem.Instance.Print("请求访问的类型非法非法:" + type, LogLevel.WARN); returnCode = ReturnCode.Failed;//请求失败 return null; } } data.returnData = returnData; } else { LogsSystem.Instance.Print("UUID非法:" + playerUUID, LogLevel.WARN); returnCode = ReturnCode.Failed;//请求失败 return null; } //重新封装 SocketModel model = new SocketModel(); model.returnCode = returnCode; model.protocol = SocketProtocol.INVINFO; model.message = JsonCoding<InvInfoDTO>.encode(data); return model; }
/// <summary> /// 返回断线信息包 /// </summary> /// <returns></returns> private SocketModel Offline() { SocketModel model = new SocketModel(); model.returnCode = ReturnCode.Refuse; model.protocol = SocketProtocol.OFFLINE; return model; }
/// <summary> /// 处理玩家信息包 /// </summary> public SocketModel PlayerInfoPacket(PlayerInfoDTO data) { string UUID = data.UUID; //检查UUID if (!CheckUUID(UUID)) { return Offline(); } Player senderPlayer = PlayerManager.Instance.GetLobbyPlayerByUUID(UUID); int uid = senderPlayer.uid; string command = string.Format("SELECT * FROM playerinfo WHERE Uid = '{0}'", uid); DataSet ds = MySQLHelper.GetDataSet(MySQLHelper.Conn, CommandType.Text, command, null); //构建返回数据包 SocketModel model = new SocketModel(); model.areaCode = AreaCode.Server; model.protocol = SocketProtocol.PLAYERINFO; model.returnCode = ReturnCode.Success; PlayerInfoDTO returnData = new PlayerInfoDTO(); returnData.UUID = UUID; returnData.uid = uid; returnData.playerName = ds.Tables[0].Rows[0]["PlayerName"].ToString(); returnData.level = Convert.ToInt32(ds.Tables[0].Rows[0]["Level"]); returnData.coin = Convert.ToInt32(ds.Tables[0].Rows[0]["Coin"]); returnData.gem = Convert.ToInt32(ds.Tables[0].Rows[0]["Gem"]); //returnData.vipExpire = DateTime.Parse(ds.Tables[0].Rows[0]["VipExpire"].ToString()); model.message = JsonCoding<PlayerInfoDTO>.encode(returnData); return model; }
/// <summary> /// 处理登陆包 /// </summary> /// <param name="data">登陆数据</param> /// <param name="iped">发送的ip</param> /// <returns>返回封包</returns> public SocketModel LoginPacket(LoginDTO data, IPEndPoint iped) { SocketModel model = new SocketModel(); model.areaCode = AreaCode.Server; model.protocol = SocketProtocol.LOGIN; string account = data.account; string password = data.password; if (PlayerManager.Instance.CanLogin()) { //查询数据库 string command = string.Format("SELECT * FROM account WHERE Account = '{0}' AND Password = '******'", account, password); DataSet ds = MySQLHelper.GetDataSet(MySQLHelper.Conn, CommandType.Text, command, null); if (ds.Tables[0].Rows.Count == 1) { //为数据表创建uuid并写入 string uuid = System.Guid.NewGuid().ToString(); command = string.Format("UPDATE account SET UUID = '{0}',LastLogin = '******' WHERE Account = '{2}' AND Password = '******'", uuid, CommonDTO.GetTimeStamp().ToString(), account, password); MySQLHelper.ExecuteNonQuery(MySQLHelper.Conn, CommandType.Text, command, null); //获取该用户的uid和玩家名 int uid = Convert.ToInt32(ds.Tables[0].Rows[0]["Uid"]); command = string.Format("SELECT PlayerName FROM playerinfo WHERE Uid = '{0}'", uid); ds = MySQLHelper.GetDataSet(MySQLHelper.Conn, CommandType.Text, command, null); string playerName = ds.Tables[0].Rows[0]["PlayerName"].ToString(); //添加到服务器的用户列表 PlayerManager.Instance.PlayerLoginLobby(uid, playerName, uuid, iped); //构造返回数据 if (data.internalVersion == MainWindow.instance.internalVersion) { //内部版本号一致 model.returnCode = ReturnCode.Success; } else { if (data.officialVersion == MainWindow.instance.officialVersion) { //外部版本号一致 model.returnCode = ReturnCode.Pass; } else { //外部版本号不一致 model.returnCode = ReturnCode.Repeal; } } LoginDTO returnData = new LoginDTO(); returnData.account = data.account; returnData.password = data.password; returnData.playerName = playerName; returnData.UUID = uuid; model.message = JsonCoding<LoginDTO>.encode(returnData); } else { //登陆失败 LogsSystem.Instance.Print(string.Format("账户{0}[{1}]试图登陆游戏失败:用户名或密码错误", account, iped.Address.ToString())); model.message = JsonCoding<LoginDTO>.encode(data); model.returnCode = ReturnCode.Failed; } } else { //服务器已满 LogsSystem.Instance.Print(string.Format("账户{0}[{1}]试图登陆游戏失败:服务器已满", account, iped.Address.ToString())); model.message = JsonCoding<LoginDTO>.encode(data); model.returnCode = ReturnCode.Refuse; } return model; }