Esempio n. 1
0
        /// <summary>
        /// 从数据库t_server_game_config加载数据
        /// </summary>
        /// <param name="dbAge"></param>
        public void LoadServerGameConfigFromDataBase(int dbAge)
        {
            try
            {
                HashSet <int>   existIds = new HashSet <int>();
                MySqlDataReader sdr      = DbHelperMySQL.ExecuteReader("select * from t_server_game_config where gametype=" + (int)GameTypes.HuanYingSiYuan);
                while (sdr.Read())
                {
                    KuaFuServerGameConfig serverGame = new KuaFuServerGameConfig()
                    {
                        ServerId = (int)Convert.ToInt32(sdr["serverid"]),
                        GameType = (int)Convert.ToInt32(sdr["gametype"]),
                        Capacity = (int)Convert.ToInt32(sdr["capacity"]),
                    };

                    ServerIdGameConfigDict[serverGame.ServerId]      = serverGame;
                    KuaFuServerIdGameConfigDict[serverGame.ServerId] = serverGame;
                    existIds.Add(serverGame.ServerId);
                }

                lock (Mutex)
                {
                    foreach (var id in ServerIdGameConfigDict.Keys.ToList())
                    {
                        if (!existIds.Contains(id))
                        {
                            KuaFuServerGameConfig tmp;
                            ServerIdGameConfigDict.TryRemove(id, out tmp);
                            KuaFuServerIdGameConfigDict.TryRemove(id, out tmp);
                        }
                    }

                    ServerGameConfigAge = dbAge;
                }
            }
            catch (System.Exception ex)
            {
                LogManager.WriteExceptionUseCache(ex.ToString());
                return;
            }
        }
Esempio n. 2
0
        private void UpdateServerGameConfig(int serverId, int gameType, int capacity, ref bool serverGameConfigChanged)
        {
            KuaFuServerGameConfig data;

            if (!ServerIdGameConfigDict.TryGetValue(serverId, out data))
            {
                data = new KuaFuServerGameConfig()
                {
                    ServerId = serverId,
                    GameType = gameType,
                };

                ServerIdGameConfigDict[serverId]      = data;
                KuaFuServerIdGameConfigDict[serverId] = data;
                serverGameConfigChanged = true;
            }
            else if (data.Capacity != capacity)
            {
                data.Capacity = capacity;
                UpdateServerGameConfigToDb(serverId, gameType, capacity);
                serverGameConfigChanged = true;
            }
        }
Esempio n. 3
0
        public static bool UpdateServerGameConfig(int serverId, int gameType, int capacity, ConcurrentDictionary <int, KuaFuServerGameConfig> KuaFuServerIdGameConfigDict)
        {
            bool serverGameConfigChanged = false;
            KuaFuServerGameConfig data;

            if (!KuaFuServerIdGameConfigDict.TryGetValue(serverId, out data))
            {
                data = new KuaFuServerGameConfig()
                {
                    ServerId = serverId,
                    GameType = gameType,
                };

                KuaFuServerIdGameConfigDict[serverId] = data;
                serverGameConfigChanged = true;
            }
            else if (data.Capacity != capacity)
            {
                data.Capacity           = capacity;
                serverGameConfigChanged = true;
            }

            return(serverGameConfigChanged);
        }
Esempio n. 4
0
        private bool AssignGameFuben(KuaFuRoleData kuaFuRoleData, ServerLoadContext context, long waitSecs1, long waitSecs2, DateTime now)
        {
            int                     roleCount               = 0;
            DateTime                stateEndTime            = now.AddSeconds(EnterGameSecs);
            HuanYingSiYuanAgent     huanYingSiYuanAgent     = null;
            HuanYingSiYuanFuBenData huanYingSiYuanFuBenData = null;
            IKuaFuClient            kuaFuClient             = null;

            KuaFuFuBenRoleData kuaFuFuBenRoleData = new KuaFuFuBenRoleData()
            {
                ServerId  = kuaFuRoleData.ServerId,
                RoleId    = kuaFuRoleData.RoleId,
                ZhanDouLi = HuanYingSiYuanGameData.GetZhanDouLi(kuaFuRoleData.GameData),
            };

            List <KuaFuRoleData> updateRoleDataList = new List <KuaFuRoleData>();

            try
            {
                //先检测是否有需要补充人的队伍
                foreach (var fuBenData in ShotOfRolesFuBenDataDict.Values)
                {
                    //分组编号要相等
                    if (fuBenData.CanRemove())
                    {
                        RemoveGameFuBen(fuBenData);
                    }
                    else if (fuBenData.CanEnter(kuaFuRoleData.GroupIndex, waitSecs1, waitSecs2))
                    {
                        if (ServerId2KuaFuClientAgent.TryGetValue(fuBenData.ServerId, out huanYingSiYuanAgent) && huanYingSiYuanAgent.IsAlive)
                        {
                            roleCount = fuBenData.AddKuaFuFuBenRoleData(kuaFuFuBenRoleData, GameFuBenRoleCountChangedHandler);
                            if (roleCount > 0)
                            {
                                huanYingSiYuanFuBenData = fuBenData;
                                break;
                            }
                        }
                    }
                }

                if (null == huanYingSiYuanFuBenData)
                {
                    //按负载状态在一个跨服活动服务器上分配一个新的游戏副本,并加入
                    LinkedListNode <KuaFuServerGameConfig> node = context.IdelActiveServerQueue.First;
                    int count = context.IdelActiveServerQueue.Count;
                    for (int i = 0; i < count && node != null; i++)
                    {
                        KuaFuServerGameConfig srv = node.Value;
                        LinkedListNode <KuaFuServerGameConfig> next = node.Next;

                        if (ServerId2KuaFuClientAgent.TryGetValue(srv.ServerId, out huanYingSiYuanAgent) && huanYingSiYuanAgent.IsAlive)
                        {
                            int serverLoad = huanYingSiYuanAgent.GetAliveGameFuBenCount();
                            if (serverLoad < srv.Capacity && serverLoad <= context.ServerLoadAvg)
                            {
                                try
                                {
                                    huanYingSiYuanFuBenData = Persistence.CreateHysyGameFuBen(huanYingSiYuanAgent, kuaFuRoleData.GroupIndex, 1);
                                    if (huanYingSiYuanFuBenData != null)
                                    {
                                        AddGameFuBen(huanYingSiYuanFuBenData, huanYingSiYuanAgent);
                                        roleCount = huanYingSiYuanFuBenData.AddKuaFuFuBenRoleData(kuaFuFuBenRoleData, GameFuBenRoleCountChangedHandler);
                                        if (roleCount > 0)
                                        {
                                            context.AlivedGameFuBenCount++;
                                            context.CalcServerLoadAvg();
                                            break;
                                        }
                                    }
                                }
                                catch (System.Exception ex)
                                {
                                    huanYingSiYuanAgent.MaxActiveTicks = 0;
                                }
                            }
                            else
                            {
                                context.IdelActiveServerQueue.Remove(node);
                                if (serverLoad < srv.Capacity)
                                {
                                    context.IdelActiveServerQueue.AddLast(node);
                                }
                            }
                        }

                        node = next;
                    }
                }

                if (huanYingSiYuanFuBenData != null && roleCount > 0)
                {
                    if (roleCount == 1)
                    {
                        huanYingSiYuanFuBenData.EndTime = now; //第一个人进入时,重置副本创建时间
                    }

                    if (huanYingSiYuanFuBenData.State == GameFuBenState.Wait)
                    {
                        if (roleCount == Consts.HuanYingSiYuanRoleCountTotal)
                        {
                            List <KuaFuFuBenRoleData> roleList = huanYingSiYuanFuBenData.SortFuBenRoleList();
                            foreach (var role in roleList)
                            {
                                KuaFuRoleData kuaFuRoleDataTemp;
                                KuaFuRoleKey  key = KuaFuRoleKey.Get(role.ServerId, role.RoleId);
                                if (RoleIdKuaFuRoleDataDict.TryGetValue(key, out kuaFuRoleDataTemp))
                                {
                                    kuaFuRoleDataTemp.UpdateStateTime(huanYingSiYuanFuBenData.GameId, KuaFuRoleStates.NotifyEnterGame, stateEndTime.Ticks);
                                }
                            }

                            huanYingSiYuanFuBenData.State = GameFuBenState.Start;
                            NotifyFuBenRoleEnterGame(huanYingSiYuanFuBenData);
                        }
                        else
                        {
                            kuaFuRoleData.UpdateStateTime(huanYingSiYuanFuBenData.GameId, KuaFuRoleStates.SignUpWaiting, kuaFuRoleData.StateEndTicks);
                            NotifyFuBenRoleCount(huanYingSiYuanFuBenData);
                        }
                    }
                    else if (huanYingSiYuanFuBenData.State == GameFuBenState.Start)
                    {
                        kuaFuRoleData.UpdateStateTime(huanYingSiYuanFuBenData.GameId, KuaFuRoleStates.NotifyEnterGame, stateEndTime.Ticks);
                        NotifyFuBenRoleEnterGame(huanYingSiYuanFuBenData);
                    }
                }
                else
                {
                    //如果分配失败,则返回false,本轮不在尝试分配
                    return(false);
                }

                return(true);
            }
            catch (System.Exception ex)
            {
                LogManager.WriteExceptionUseCache(ex.ToString());
            }

            return(false);
        }