public void addAllPlayer(StringGroup pList)
        {
            uiPlayerList.Dispatcher.Invoke(() => {
                uiPlayerList.ItemsSource = null;

                var cache = pList.ToStringGroup();
                foreach (string item in cache) {
                    gm.gamePlayerList.Add(new Player { PlayerIPAddress = item });
                }

                uiPlayerList.ItemsSource = gm.gamePlayerList;

            });
        }
        public void inputPlayerData(StringGroup input)
        {
            var cache = input.ToStringGroup();

            foreach (Player item in gm.gamePlayerList) {
                if (item.PlayerName == cache[4]) {
                    item.NowLife = cache[1];
                    item.NowTime = cache[0];
                    item.NowUnit = cache[2];

                    //压入成就宣布队列
                    if (cache[4] != "") {
                        prizeLine.Enqueue(new PrizeStructure { PlayerName = cache[3], PrizeName = cache[4] });
                    }

                    return;
                }
            }

            //刷新
            this.FlushPlayerList();
        }
        public void allPlayerData(StringGroup data)
        {
            //split player
            var playerSplit = data.ToStringGroup();

            //先取出组信息
            var groupMsg = new StringGroup(playerSplit[0], "#").ToStringGroup();
            if (groupMsg[0] == gm.ms.TeamAName) {
                uiTeamAMark.Dispatcher.Invoke(() => { uiTeamAMark.Text = groupMsg[1]; });
                uiTeamBMark.Dispatcher.Invoke(() => { uiTeamBMark.Text = groupMsg[4]; });
                uiTeamAPP.Dispatcher.Invoke(() => { uiTeamAPP.Text = groupMsg[2]; });
                uiTeamBPP.Dispatcher.Invoke(() => { uiTeamBPP.Text = groupMsg[5]; });
            } else {
                uiTeamAMark.Dispatcher.Invoke(() => { uiTeamAMark.Text = groupMsg[4]; });
                uiTeamBMark.Dispatcher.Invoke(() => { uiTeamBMark.Text = groupMsg[1]; });
                uiTeamAPP.Dispatcher.Invoke(() => { uiTeamAPP.Text = groupMsg[5]; });
                uiTeamBPP.Dispatcher.Invoke(() => { uiTeamBPP.Text = groupMsg[2]; });
            }

            int index = 0;
            foreach (string item in playerSplit) {
                if (index == 0) { index++; continue; }

                //split data
                var dataSplit = new StringGroup(item, "#").ToStringGroup();

                //process untiData
                var cache1 = new StringGroup(dataSplit[0], "@").ToStringGroup();
                var unitData = new List<PlayerUnitData>();

                foreach (string item2 in cache1) {
                    var cache2 = new StringGroup(item2, "%").ToStringGroup();
                    unitData.Add(new PlayerUnitData { Unit = cache2[3], Mark = cache2[0], Life = cache2[1], PerfomancePoint = cache2[2] });
                }

                foreach (Player item3 in gm.gamePlayerList) {
                    if (item3.PlayerName == dataSplit[4]) {
                        item3.PlayerUnitPrize = unitData;
                        item3.FinallyMark = dataSplit[1];
                        item3.FinallyPP = dataSplit[2];
                        item3.FinallyPrize = dataSplit[3];
                    }
                }

                index++;
            }

            //input to list
            var teamAList = new List<Player>();
            var teamBList = new List<Player>();

            var result = from i in gm.gamePlayerList
                         where i.PlayerGroupName != ""
                         group i by i.PlayerGroupName;

            foreach (IGrouping<string, Player> item in result) {
                if (item.Key == gm.ms.TeamAName) {
                    foreach (Player item2 in item) {
                        teamAList.Add(item2);
                    }
                } else {
                    foreach (Player item2 in item) {
                        teamBList.Add(item2);
                    }
                }
            }

            //show
            uiTeamAList.Dispatcher.Invoke(() => { uiTeamAList.ItemsSource = teamAList;});
            uiTeamBList.Dispatcher.Invoke(() => { uiTeamBList.ItemsSource = teamBList; });

            uiNewPlay.Dispatcher.Invoke(() => { uiNewPlay.IsEnabled = true; });
            uiExit.Dispatcher.Invoke(() => { uiExit.IsEnabled = true;});
        }
        public void addPlayerInformation(StringGroup playerInfo)
        {
            var cache1 = playerInfo.ToStringGroup();

            List<string> cache2 = new StringGroup(cache1[5], "#").ToList();
            List<string> cache3 = new StringGroup(cache1[7], "#").ToList();

            //add to core
            foreach (Player item in gm.gamePlayerList) {
                if (item.PlayerIPAddress == cache1[10]) {
                    item.PlayerName = cache1[0];
                    item.ModList = cache3;
                    item.BackgroundName = cache1[8];
                    item.BGMName = cache1[9];
                    item.DutyUnit = cache2;
                    item.PlayerGroupName = cache1[6];
                }
            }

            if (gm.ms.MapName == "") {
                gm.ms.MapName = cache1[1];
                gm.ms.MapMD5 = cache1[2];
                gm.ms.GameMode = cache1[4];
                gm.ms.CountMode = cache1[3];
            }

            //add team
            if (gm.ms.TeamAName == "") {
                gm.ms.TeamAName = cache1[6];
                uiTeamAName.Dispatcher.Invoke(() => { uiTeamAName.Text = cache1[6]; });
            } else if (gm.ms.TeamBName == "") {
                gm.ms.TeamBName = cache1[6];
                uiTeamBName.Dispatcher.Invoke(() => { uiTeamBName.Text = cache1[6]; });
            } else { }

            //add to ui
            uiGameMapName.Dispatcher.Invoke(() =>
            {
                if (uiGameMapName.Text == "") {
                    uiGameMapName.Text = cache1[1];
                }
            });
            uiGameMode.Dispatcher.Invoke(() =>
            {
                if (uiGameMode.Text == "") {
                    switch (cache1[4]) {
                        case BallanceOnline.Const.GameMode.RankedRace:
                            uiGameMode.Text = "排位赛";
                            break;
                        case BallanceOnline.Const.GameMode.RelayRace:
                            uiGameMode.Text = "接力赛";
                            break;
                    }
                }
            });
            uiGameRule.Dispatcher.Invoke(() =>
            {
                if (uiGameRule.Text == "") {
                    switch (cache1[3]) {
                        case BallanceOnline.Const.CountMode.HighScore:
                            uiGameRule.Text = "HS";
                            break;
                        case BallanceOnline.Const.CountMode.SpeedRun:
                            uiGameRule.Text = "SR";
                            break;
                        case BallanceOnline.Const.CountMode.CrazyHighScore:
                            uiGameRule.Text = "疯狂HS";
                            break;
                        case BallanceOnline.Const.CountMode.CrazySpeedRun:
                            uiGameRule.Text = "疯狂SR";
                            break;

                    }
                }
            });

            //show player
            var playerSplit = from item in gm.gamePlayerList
                              where item.PlayerGroupName != ""
                              group item by item.PlayerGroupName;
            foreach (var item in playerSplit) {
                if (item.Key == gm.ms.TeamAName) {
                    uiTeamAList.Dispatcher.Invoke(() => { uiTeamAList.ItemsSource = item.ToList<Player>();});
                } else {
                    uiTeamBList.Dispatcher.Invoke(() => { uiTeamBList.ItemsSource = item.ToList<Player>();});
                }
            }
        }
        /// <summary>
        /// 确认地图
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void uiGSetMap_Click(object sender, RoutedEventArgs e)
        {
            if (nowStep != 0) { return; }

            if (uiMapPath.Text != "" && uiGroupAName.Text != "" && uiGroupBName.Text != "") {

                gm.ms.TeamAName = uiGroupAName.Text;
                gm.ms.TeamBName = uiGroupBName.Text;

                //set map name
                //todo:不知道为何要用双斜杠,不然出错
                //分开文件,文件夹
                var cache = new StringGroup(uiMapPath.Text, @"\\").ToStringGroup();
                //分开名字,扩展名
                var cache2 = cache[cache.Length - 1].Split('.');
                string cache3 = cache2[cache2.Length - 2];

                cache3 = cache3.Replace(",", "");
                cache3 = cache3.Replace("#", "");
                cache3 = cache3.Replace("@", "");
                cache3 = cache3.Replace("%", "");

                if (cache3.Length == 0) {
                    cache3 = "UnknowMap";
                }

                gm.ms.MapName = cache3;

                gm.ms.MapMD5 = uiMapMD5.Text;
                switch (uiGameMode.SelectedIndex) {
                    case 0:
                        gm.ms.GameMode = GameMode.RankedRace;
                        break;
                    case 1:
                        gm.ms.GameMode = GameMode.RelayRace;
                        break;
                }
                switch (uiCountMode.SelectedIndex) {
                    case 0:
                        gm.ms.CountMode = CountMode.HighScore;
                        break;
                    case 1:
                        gm.ms.CountMode = CountMode.SpeedRun;
                        break;
                    case 2:
                        gm.ms.CountMode = CountMode.CrazyHighScore;
                        break;
                    case 3:
                        gm.ms.CountMode = CountMode.CrazySpeedRun;
                        break;
                }

                //lock contorl
                uiGroupAName.IsReadOnly = true;
                uiGroupBName.IsReadOnly = true;

                uiMapPath.IsReadOnly = true;
                uiSelectMap.IsEnabled = false;

                uiSetMap.IsEnabled = false;
                uiGiveOutTask.IsEnabled = true;

                uiGameMode.IsEnabled = false;
                uiCountMode.IsEnabled = false;

                uiUnitCount.IsEnabled = false;

                //set unit selector
                for (int i = 0; i < uiUnitCount.Value; i++) {
                    var temp = new SetUnitToggleButton();

                    temp.Description = "第" + (i + 1).ToString() + "小节";
                    temp.IsChecked = false;
                    temp.Margin = new Thickness(15, 5, 15, 5);

                    //add to ui and core
                    uiUnitSelectorContainer.Children.Add(temp);
                    unitSelector.Add(temp);
                }

                nowStep++;
            } else {
                MessageBox.Show("某些信息您为填写完整");
            }
        }
        /// <summary>
        /// 主消息处理函数
        /// </summary>
        /// <param name="head"></param>
        /// <param name="data"></param>
        /// <param name="host"></param>
        public void MainMessageProcess(string head, byte[] data, Player host)
        {
            switch (head) {
                case ClientAndServerSign.Client + SocketSign.Ping:
                    host.PingCount--;
                    break;

                case ClientAndServerSign.Client + SocketSign.Message:
                    //转发,不交给界面处理
                    this.allPlayerBroadcast(CombineAndSplitSign.Combine(ClientAndServerSign.Server, SocketSign.Message, (host.PlayerName != "" ? host.PlayerName : host.PlayerIPAddress) + ":" + CombineAndSplitSign.ConvertToString(data)));
                    break;

                case ClientAndServerSign.Client + SocketSign.InformationTurnIn:
                    //set data
                    var cache = new StringGroup(CombineAndSplitSign.ConvertToString(data), ",").ToStringGroup();

                    host.ModList = new StringGroup(cache[0], "#").ToList();
                    host.BackgroundName = cache[1];
                    host.BGMName = cache[2];
                    host.PlayerName = cache[3];

                    var cache2 = new StringGroup(cache[4], "#").ToStringGroup();
                    host.HistoryWinCount = cache2[0];
                    host.HistoryFailCount = cache2[1];
                    host.HistoryRankedRaceCount = cache2[2];
                    host.HistoryRelayRaceCount = cache2[3];

                    //刷新
                    flushPlayerList();

                    break;

                case ClientAndServerSign.Client + SocketSign.PlayerIsReady:
                    //ready
                    host.playerIsReady();
                    this.allPlayerBroadcast(CombineAndSplitSign.Combine(ClientAndServerSign.Server, SocketSign.PlayerIsReady, host.PlayerName));

                    //刷新
                    flushPlayerList();

                    break;

                case ClientAndServerSign.Client + SocketSign.GameDataTurnIn:
                    var cache3 = new StringGroup(CombineAndSplitSign.ConvertToString(data), ",").ToStringGroup();
                    host.NowTime = cache3[0];
                    host.NowLife = cache3[1];
                    host.NowUnit = cache3[2];
                    host.NowState = "";

                    //判断游戏状态
                    if (host.NowState == PlayerState.Success || host.NowState==PlayerState.Died) {
                        //拒绝数据
                        break;
                    }

                    /* 判定方法
                     * 暂停:状态在正在游戏,数据保持不变<20次,且有命,时间数据不变。(放弃判断)
                     * 继续:状态为暂停,数据有变动,同时清空数据不变标识符。(放弃判断)
                     * 死亡:状态在正在游戏,数据不变>=20次,且命=0
                     * 成功:状态在正在游戏,时间减少,减少量>20点
                     * */

                    //***********************判断状态

                    //要传出的数据
                    List<string> outPrize = new List<string>();

                    if (host.dataCache.previousState == PlayerState.Playing && host.NowTime == host.dataCache.previousTime) {
                        //增加数据静止值
                        host.dataCache.dataCompareNotChangeCount++;
                    } else host.dataCache.dataCompareNotChangeCount = 0;

                    //先判断死亡
                    if (host.dataCache.previousState == PlayerState.Playing && host.dataCache.dataCompareNotChangeCount >= 20 && host.NowLife == "0" && host.NowTime == host.dataCache.previousTime) {

                        //###########################成就-沉默#######################
                        //不是一次性输出,可以多次输出
                        //信息压入玩家队列传出
                        outPrize.Add(GamePrize.Silence);
                        //###########################成就#######################
                        host.NowState = PlayerState.Died;
                        //增加完成任务数量人数
                        nowFinishPlayerCount++;

                        //判断一波组死亡
                        if (this.ms.GameMode == GameMode.RelayRace) {
                            foreach (string item in host.DutyUnit) {
                                if (int.Parse(item) >= int.Parse(host.NowUnit)) {
                                    //组死亡

                                    //组死亡肯定包含上面已经死的人,所以完成人数--防止重复计算
                                    nowFinishPlayerCount--;

                                    //循环死亡
                                    foreach (Player item2 in this.clientPlayerList) {
                                        if (item2.PlayerGroupName == host.PlayerGroupName) {
                                            item2.NowState = PlayerState.Died;
                                            //增加完成任务数量人数
                                            nowFinishPlayerCount++;

                                            //###########################成就-团灭#######################
                                            if (this.globalPrize.Ace == false) {
                                                //信息压入玩家队列传出
                                                outPrize.Add(GamePrize.Ace);
                                                this.globalPrize.Ace = true;
                                            }
                                            //###########################成就#######################

                                            //小节线最终写入
                                            item2.dataCache.AddUnitData(item2.NowTime, item2.NowLife);
                                            //停止计时器
                                            item2.gameTime.Stop();
                                        }
                                    }

                                    this.allPlayerBroadcast(CombineAndSplitSign.Combine(ClientAndServerSign.Server, SocketSign.TeamDied, host.PlayerGroupName));
                                }
                            }
                        }else {
                            //不是组死亡
                            //单独广播
                            this.allPlayerBroadcast(CombineAndSplitSign.Combine(ClientAndServerSign.Server, SocketSign.PlayerDied, host.PlayerName));
                        }
                    }

                    //成功
                    if (host.dataCache.previousState == PlayerState.Playing && (int.Parse(host.dataCache.previousTime) - int.Parse(host.NowTime)) > 20) {
                        this.allPlayerBroadcast(CombineAndSplitSign.Combine(ClientAndServerSign.Server, SocketSign.PlayerSuccess, host.PlayerName));
                        host.NowState = PlayerState.Success;
                        //增加完成任务数量人数
                        nowFinishPlayerCount++;

                        //小节线最终写入,用之前的数据写入,更加准确
                        host.dataCache.AddUnitData(host.dataCache.previousTime, host.dataCache.previousLife);
                        //停止计时器
                        host.gameTime.Stop();
                    }

                    //判断计时器
                    if (host.dataCache.previousTime == "") {
                        //第一次,启动计时器
                        host.gameTime.Start();
                    }

                    //判断小节线变动
                    if (host.dataCache.previousState == PlayerState.Playing) {
                        if (host.dataCache.previousTime == "") {
                            //刚开始,立即写入
                            host.dataCache.AddUnitData(host.NowTime, host.NowLife);

                        } else if (host.dataCache.previousUnit != host.NowUnit) {
                            //新小节
                            //###########################成就-通过#######################
                            //不是一次性成就
                            //信息压入玩家队列传出
                            outPrize.Add(GamePrize.Cross);
                            //###########################成就#######################
                            host.dataCache.AddUnitData(host.NowTime, host.NowLife);
                        }//否则不写入
                    }

                    //暂停
                    //if (host.previousState == PlayerState.Playing && host.dataCompareNotChangeCount <10 && host.NowLife != "0" && host.NowTime == host.previousTime) {
                    //    host.gameData.SendData(CombineAndSplitSign.Combine(ClientAndServerSign.Server, SocketSign.PlayerPaused, host.PlayerName));
                    //    host.NowState = PlayerState.Paused;
                    //}

                    //**********************************************************************todo:判断成就

                    //###########################成就-第一次死亡#######################
                    if (this.globalPrize.FirstBlood == false) {
                        //信息压入玩家队列传出
                        if (int.Parse(host.NowLife) < int.Parse(host.dataCache.previousLife)) {
                            outPrize.Add(GamePrize.FirstBlood);
                            this.globalPrize.FirstBlood = true;
                        }
                    }
                    //###########################成就#######################
                    //###########################成就-重生#######################
                    //非一次性成就
                    //信息压入玩家队列传出
                    if (int.Parse(host.NowLife) > int.Parse(host.dataCache.previousLife)) {
                        outPrize.Add(GamePrize.Reborn);
                    }
                    //###########################成就#######################
                    //###########################成就-时间#######################
                    //非一次性成就
                    //信息压入玩家队列传出
                    if (int.Parse(host.NowTime) > int.Parse(host.dataCache.previousTime)) {
                        outPrize.Add(GamePrize.Time);
                    }
                    //###########################成就#######################

                    //判断写入
                    host.dataCache.previousLife = host.NowLife;
                    host.dataCache.previousTime = host.NowTime;
                    host.dataCache.previousUnit = host.NowUnit;
                    if (host.NowState != "") host.dataCache.previousState = host.NowState;

                    //传出
                    this.allPlayerBroadcast(CombineAndSplitSign.Combine(
                        ClientAndServerSign.Server,
                        SocketSign.GameDataGiveOut,
                        new StringGroup(new List<string> {
                            host.dataCache.previousTime,
                            host.dataCache.previousLife,
                            host.dataCache.previousUnit,
                            outPrize.Count == 0 ? "" : new StringGroup(outPrize,"#").ToString(),
                            host.PlayerName
                        }, ",").ToString()));

                    //提醒服务器注意
                    if (nowFinishPlayerCount == clientPlayerList.Count) {
                        //可能都完成了
                        warnPlayerFinishGame();
                    }

                    //刷新
                    flushPlayerList();

                    break;

            }
        }
        /// <summary>
        /// 消息主处理函数
        /// </summary>
        /// <param name="head"></param>
        /// <param name="data"></param>
        public void dataProcess(string head, byte[] data)
        {
            switch (head) {

                case ClientAndServerSign.Server + SocketSign.Ping:
                    dataGiveIn.SendData(CombineAndSplitSign.Combine(ClientAndServerSign.Client, SocketSign.Ping, ""));
                    break;
                case ClientAndServerSign.Server + SocketSign.ReturnAllPlayer:

                    var cache = new StringGroup(CombineAndSplitSign.ConvertToString(data), ",");
                    WaitPlayer_addAllPlayer(cache);

                    break;
                case ClientAndServerSign.Server + SocketSign.NewPlayer:
                    WaitPlayer_addSinglePlayer(CombineAndSplitSign.ConvertToString(data));
                    break;

                case ClientAndServerSign.Server + SocketSign.DeletePlayer:
                    WaitPlayer_deletePlayer(CombineAndSplitSign.ConvertToString(data));
                    break;

                case ClientAndServerSign.Server + SocketSign.Message:
                    switch (nowPage) {
                        case 0:
                            WaitPlayer_newMessage(CombineAndSplitSign.ConvertToString(data));
                            break;
                        case 1:
                            //没有
                            break;
                        case 2:
                            PlayNow_newMessage(CombineAndSplitSign.ConvertToString(data));
                            break;
                        case 3:
                            //没有
                            break;
                    }

                    break;

                case ClientAndServerSign.Server + SocketSign.OrderTurnIn:
                    //返回数据
                    var cache2 = new ArrayList {
                        new StringGroup(gameSettings.ModList, "#").ToString(),
                        gameSettings.backgroundName,
                        gameSettings.BGMName,
                        gameSettings.playerName,
                        gameSettings.historyWinCount,
                        gameSettings.historyFailCount,
                        gameSettings.historyRankedCount,
                        gameSettings.historyRelayRaceCount
                    };
                    dataGiveIn.SendData(CombineAndSplitSign.Combine(ClientAndServerSign.Client, SocketSign.InformationTurnIn, new StringGroup(cache2, ",").ToString()));

                    nowPage += 1;

                    WaitPlayer_turnToNewWindow();

                    break;

                case ClientAndServerSign.Server + SocketSign.PlayerTask:
                    LoadResources_addPlayerInformation(new StringGroup(CombineAndSplitSign.ConvertToString(data), ","));
                    break;

                //********************************************
                case ClientAndServerSign.Server + SocketSign.StartDownloadingMap:
                    df.Start("");
                    break;
                case ClientAndServerSign.Server + SocketSign.DownloadingMapData:
                    df.Write(data);
                    break;
                case ClientAndServerSign.Server + SocketSign.EndDownloadingMap:
                    df.Stop();
                    //change file
                    System.IO.File.Delete(gameSettings.rootFolder + @"3D Entities\Level\Level_01.NMO");
                    System.IO.File.Copy(Environment.CurrentDirectory + @"\cacheMap.nmo", gameSettings.rootFolder + @"3D Entities\Level\Level_01.NMO");
                    //send message
                    dataGiveIn.SendData(CombineAndSplitSign.Combine(ClientAndServerSign.Client, SocketSign.PlayerIsReady, ""));
                    break;
                case ClientAndServerSign.Server + SocketSign.PlayerIsReady:
                    LoadResources_singlePlayerReady(CombineAndSplitSign.ConvertToString(data));
                    break;

                case ClientAndServerSign.Server + SocketSign.ReadyPlay:
                    LoadResources_turnToNewWindow();
                    nowPage += 1;
                    break;

                //********************************************
                case ClientAndServerSign.Server + SocketSign.GameDataGiveOut:
                    PlayNow_inputPlayerData(new StringGroup(CombineAndSplitSign.ConvertToString(data), ","));
                    break;

                case ClientAndServerSign.Server + SocketSign.PlayerDied:
                    PlayNow_playerDied(CombineAndSplitSign.ConvertToString(data));
                    break;

                case ClientAndServerSign.Server + SocketSign.PlayerSuccess:
                    PlayNow_playerSuccess(CombineAndSplitSign.ConvertToString(data));
                    break;

                case ClientAndServerSign.Server + SocketSign.TeamDied:
                    PlayNow_teamDied(CombineAndSplitSign.ConvertToString(data));
                    break;

                case ClientAndServerSign.Server + SocketSign.GameEnd:
                    PlayNow_turnToNewWindow();
                    nowPage += 1;
                    break;

                //********************************************

                case ClientAndServerSign.Server + SocketSign.AllPlayerGameData:
                    GameResult_allPlayerData(new StringGroup(CombineAndSplitSign.ConvertToString(data), ","));
                    //连接关闭
                    dataGiveIn.Dispose();
                    break;

            }
        }