Exemplo n.º 1
0
        /// <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;//不返回数据包
        }
Exemplo n.º 2
0
        /// <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;
        }
Exemplo n.º 3
0
        /// <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();
            }
        }
Exemplo n.º 4
0
        /// <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;//不返回客户端信息
            }
        }
Exemplo n.º 5
0
        /// <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()));
        }
Exemplo n.º 6
0
        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;
        }
Exemplo n.º 7
0
        /// <summary>
        /// 返回断线信息包
        /// </summary>
        /// <returns></returns>
        private SocketModel Offline()
        {
            SocketModel model = new SocketModel();
            model.returnCode = ReturnCode.Refuse;
            model.protocol = SocketProtocol.OFFLINE;

            return model;
        }
Exemplo n.º 8
0
        /// <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;
        }
Exemplo n.º 9
0
        /// <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;
        }