/// <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; } }
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; } }
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); }
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); }