示例#1
0
        public bool KuaFuLogin(KuaFuServerLoginData kuaFuServerLoginData)
        {
            HuanYingSiYuanFuBenData huanYingSiYuanFuBenData = this.GetKuaFuFuBenData((int)kuaFuServerLoginData.GameId);

            if (huanYingSiYuanFuBenData != null && huanYingSiYuanFuBenData.State < GameFuBenState.End)
            {
                if (huanYingSiYuanFuBenData.ServerId == GameManager.ServerId)
                {
                    if (huanYingSiYuanFuBenData.RoleDict.ContainsKey(kuaFuServerLoginData.RoleId))
                    {
                        KuaFuRoleData kuaFuRoleData = this.GetKuaFuRoleDataFromServer(kuaFuServerLoginData.ServerId, kuaFuServerLoginData.RoleId);
                        if (kuaFuRoleData.GameId == huanYingSiYuanFuBenData.GameId)
                        {
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
示例#2
0
 private void NotifyFuBenRoleEnterGame(HuanYingSiYuanFuBenData fuBenData)
 {
     try
     {
         lock (fuBenData)
         {
             foreach (var role in fuBenData.RoleDict.Values)
             {
                 KuaFuRoleData kuaFuRoleData;
                 if (RoleIdKuaFuRoleDataDict.TryGetValue(KuaFuRoleKey.Get(role.ServerId, role.RoleId), out kuaFuRoleData) && kuaFuRoleData.State == KuaFuRoleStates.NotifyEnterGame)
                 {
                     AsyncDataItem evItem = new AsyncDataItem(KuaFuEventTypes.UpdateAndNotifyEnterGame, kuaFuRoleData);
                     ClientAgentManager.Instance().PostAsyncEvent(kuaFuRoleData.ServerId, GameType, evItem);
                 }
             }
         }
     }
     catch (System.Exception ex)
     {
     }
 }
示例#3
0
        private void RemoveGameFuBen(HuanYingSiYuanFuBenData huanYingSiYuanFuBenData, HuanYingSiYuanAgent huanYingSiYuanAgent = null)
        {
            int gameId = huanYingSiYuanFuBenData.GameId;
            HuanYingSiYuanFuBenData huanYingSiYuanFuBenDataTemp;

            ShotOfRolesFuBenDataDict.TryRemove(gameId, out huanYingSiYuanFuBenDataTemp);
            if (HuanYingSiYuanFuBenDataDict.TryRemove(gameId, out huanYingSiYuanFuBenDataTemp))
            {
                huanYingSiYuanFuBenDataTemp.State = GameFuBenState.End;

                //减少服务器负载计数
                if (null == huanYingSiYuanAgent)
                {
                    if (!ServerId2KuaFuClientAgent.TryGetValue(huanYingSiYuanFuBenDataTemp.ServerId, out huanYingSiYuanAgent))
                    {
                        huanYingSiYuanAgent = null;
                    }
                }

                if (null != huanYingSiYuanAgent)
                {
                    huanYingSiYuanAgent.RemoveGameFuBen(huanYingSiYuanFuBenDataTemp.GameId);
                }
            }

            lock (huanYingSiYuanFuBenData)
            {
                foreach (var fuBenRoleData in huanYingSiYuanFuBenData.RoleDict.Values)
                {
                    KuaFuRoleData kuaFuRoleData;
                    if (RoleIdKuaFuRoleDataDict.TryGetValue(KuaFuRoleKey.Get(fuBenRoleData.ServerId, fuBenRoleData.RoleId), out kuaFuRoleData))
                    {
                        if (kuaFuRoleData.GameId == gameId)
                        {
                            kuaFuRoleData.State = KuaFuRoleStates.None;
                        }
                    }
                }
            }
        }
示例#4
0
        private HuanYingSiYuanFuBenData GetKuaFuFuBenData(int gameId)
        {
            HuanYingSiYuanFuBenData huanYingSiYuanFuBenData = null;

            if (huanYingSiYuanFuBenData == null)
            {
                IKuaFuService kuaFuService = this.GetKuaFuService(false);
                if (null != kuaFuService)
                {
                    try
                    {
                        huanYingSiYuanFuBenData = kuaFuService.GetFuBenData(gameId);
                    }
                    catch (Exception ex)
                    {
                        LogManager.WriteException(ex.ToString());
                        huanYingSiYuanFuBenData = null;
                    }
                }
            }
            return(huanYingSiYuanFuBenData);
        }
示例#5
0
        /// <summary>
        /// 创建一个幻影寺院副本
        /// </summary>
        /// <param name="huanYingSiYuanAgent"></param>
        /// <param name="groupIndex"></param>
        /// <param name="roleNum"></param>
        /// <returns></returns>
        public HuanYingSiYuanFuBenData CreateHysyGameFuBen(HuanYingSiYuanAgent huanYingSiYuanAgent, int groupIndex, int roleNum)
        {
            int fuBenSeqId = huanYingSiYuanAgent.PopFuBenSeqId();

            if (fuBenSeqId <= 0)
            {
                return(null);
            }

            int gameId;
            int serverId = huanYingSiYuanAgent.ClientInfo.ServerId;

            try
            {
                gameId = (int)DbHelperMySQL.GetSingle(string.Format("select CreateHysyGameFuBen({0},{1},{2})", serverId, fuBenSeqId, roleNum));
                //id = (int)DbHelperMySQL.GetSingle(string.Format("select CreateHysyGameFuBen('{0}',{1},{2},{3})", DateTime.Now.ToString("yyMMdd"), serverId, fuBenSeqId, roleNum));
            }
            catch (System.Exception ex)
            {
                LogManager.WriteExceptionUseCache(ex.ToString());
                gameId = -1;
            }

            HuanYingSiYuanFuBenData huanYingSiYuanFuBenData = null;

            if (gameId > 0)
            {
                huanYingSiYuanFuBenData = new HuanYingSiYuanFuBenData()
                {
                    ServerId   = serverId,
                    GroupIndex = groupIndex,
                    SequenceId = fuBenSeqId,
                    GameId     = gameId,
                    EndTime    = Global.NowTime.AddMinutes(Consts.HuanYingSiYuanGameFuBenMaxExistMinutes),
                };
            }

            return(huanYingSiYuanFuBenData);
        }
示例#6
0
 private void NotifyFuBenRoleCount(HuanYingSiYuanFuBenData fuBenData)
 {
     try
     {
         lock (fuBenData)
         {
             int roleCount = fuBenData.RoleDict.Count;
             foreach (var role in fuBenData.RoleDict.Values)
             {
                 KuaFuRoleData kuaFuRoleData;
                 if (RoleIdKuaFuRoleDataDict.TryGetValue(KuaFuRoleKey.Get(role.ServerId, role.RoleId), out kuaFuRoleData))
                 {
                     AsyncDataItem evItem = new AsyncDataItem(KuaFuEventTypes.NotifyWaitingRoleCount, kuaFuRoleData.RoleId, roleCount);
                     ClientAgentManager.Instance().PostAsyncEvent(kuaFuRoleData.ServerId, GameType, evItem);
                 }
             }
         }
     }
     catch
     {
     }
 }
示例#7
0
        private HuanYingSiYuanFuBenData GetKuaFuFuBenData(int gameId)
        {
            HuanYingSiYuanFuBenData huanYingSiYuanFuBenData = null;

            if (huanYingSiYuanFuBenData == null)
            {
                IKuaFuService kuaFuService = GetKuaFuService();
                if (null != kuaFuService)
                {
                    try
                    {
                        huanYingSiYuanFuBenData = (HuanYingSiYuanFuBenData)kuaFuService.GetFuBenData(gameId);
                    }
                    catch (System.Exception ex)
                    {
                        huanYingSiYuanFuBenData = null;
                    }
                }
            }

            return(huanYingSiYuanFuBenData);
        }
        public int GameFuBenChangeState(int gameId, GameFuBenState state, DateTime time)
        {
            int result = -11;
            HuanYingSiYuanFuBenData huanYingSiYuanFuBenData = null;
            int result2;

            if (this.HuanYingSiYuanFuBenDataDict.TryGetValue(gameId, out huanYingSiYuanFuBenData))
            {
                lock (huanYingSiYuanFuBenData)
                {
                    huanYingSiYuanFuBenData.State = state;
                    if (state == GameFuBenState.End)
                    {
                        this.RemoveGameFuBen(huanYingSiYuanFuBenData);
                    }
                }
                result2 = result;
            }
            else
            {
                result2 = -20;
            }
            return(result2);
        }
示例#9
0
 private void NotifyFuBenRoleEnterGame(HuanYingSiYuanFuBenData fuBenData)
 {
     try
     {
         lock (fuBenData)
         {
             foreach (var role in fuBenData.RoleDict.Values)
             {
                 KuaFuRoleData kuaFuRoleData;
                 if (RoleIdKuaFuRoleDataDict.TryGetValue(KuaFuRoleKey.Get(role.ServerId, role.RoleId), out kuaFuRoleData) && kuaFuRoleData.State == KuaFuRoleStates.NotifyEnterGame)
                 {
                     HuanYingSiYuanAgent huanYingSiYuanAgent;
                     if (ServerId2KuaFuClientAgent.TryGetValue(kuaFuRoleData.ServerId, out huanYingSiYuanAgent))
                     {
                         huanYingSiYuanAgent.NotifyEnterGame(kuaFuRoleData);
                     }
                 }
             }
         }
     }
     catch (System.Exception ex)
     {
     }
 }
示例#10
0
 private void AddGameFuBen(HuanYingSiYuanFuBenData huanYingSiYuanFuBenData)
 {
     this.HuanYingSiYuanFuBenDataDict[huanYingSiYuanFuBenData.GameId] = huanYingSiYuanFuBenData;
 }
示例#11
0
        private bool AssignGameFuben(KuaFuRoleData kuaFuRoleData, long waitSecs1, long waitSecs2, DateTime now)
        {
            int      roleCount    = 0;
            DateTime stateEndTime = now.AddSeconds((double)this.EnterGameSecs);
            HuanYingSiYuanFuBenData selectFuben        = null;
            KuaFuFuBenRoleData      kuaFuFuBenRoleData = new KuaFuFuBenRoleData
            {
                ServerId  = kuaFuRoleData.ServerId,
                RoleId    = kuaFuRoleData.RoleId,
                ZhanDouLi = kuaFuRoleData.GameData.ZhanDouLi
            };

            try
            {
                foreach (HuanYingSiYuanFuBenData tmpFuben in this.ShotOfRolesFuBenDataDict.Values)
                {
                    if (tmpFuben.CanRemove())
                    {
                        this.RemoveGameFuBen(tmpFuben);
                    }
                    else if (tmpFuben.CanEnter(kuaFuRoleData.GroupIndex, waitSecs1, waitSecs2))
                    {
                        if (ClientAgentManager.Instance().IsAgentAlive(tmpFuben.ServerId))
                        {
                            roleCount = tmpFuben.AddKuaFuFuBenRoleData(kuaFuFuBenRoleData, new GameFuBenRoleCountChanged(this.GameFuBenRoleCountChangedHandler));
                            if (roleCount > 0)
                            {
                                selectFuben = tmpFuben;
                                break;
                            }
                        }
                    }
                }
                if (null == selectFuben)
                {
                    int gameId  = this.Persistence.GetNextGameId();
                    int kfSrvId = 0;
                    if (ClientAgentManager.Instance().AssginKfFuben(this.GameType, (long)gameId, 1, out kfSrvId))
                    {
                        selectFuben            = new HuanYingSiYuanFuBenData();
                        selectFuben.ServerId   = kfSrvId;
                        selectFuben.GameId     = gameId;
                        selectFuben.GroupIndex = kuaFuRoleData.GroupIndex;
                        selectFuben.EndTime    = Global.NowTime.AddMinutes(15.0);
                        this.AddGameFuBen(selectFuben);
                        roleCount = selectFuben.AddKuaFuFuBenRoleData(kuaFuFuBenRoleData, new GameFuBenRoleCountChanged(this.GameFuBenRoleCountChangedHandler));
                        this.Persistence.LogCreateHysyFuben(gameId, kfSrvId, 0, 1);
                    }
                }
                if (selectFuben != null && roleCount > 0)
                {
                    if (roleCount == 1)
                    {
                        selectFuben.EndTime = now;
                    }
                    if (selectFuben.State == GameFuBenState.Wait)
                    {
                        if (roleCount == Consts.HuanYingSiYuanRoleCountTotal)
                        {
                            List <KuaFuFuBenRoleData> roleList = selectFuben.SortFuBenRoleList();
                            foreach (KuaFuFuBenRoleData role in roleList)
                            {
                                KuaFuRoleKey  key = KuaFuRoleKey.Get(role.ServerId, role.RoleId);
                                KuaFuRoleData kuaFuRoleDataTemp;
                                if (this.RoleIdKuaFuRoleDataDict.TryGetValue(key, out kuaFuRoleDataTemp))
                                {
                                    kuaFuRoleDataTemp.UpdateStateTime(selectFuben.GameId, KuaFuRoleStates.NotifyEnterGame, stateEndTime.Ticks);
                                }
                            }
                            selectFuben.State = GameFuBenState.Start;
                            this.NotifyFuBenRoleEnterGame(selectFuben);
                        }
                        else
                        {
                            kuaFuRoleData.UpdateStateTime(selectFuben.GameId, KuaFuRoleStates.SignUpWaiting, kuaFuRoleData.StateEndTicks);
                            this.NotifyFuBenRoleCount(selectFuben);
                        }
                    }
                    else if (selectFuben.State == GameFuBenState.Start)
                    {
                        kuaFuRoleData.UpdateStateTime(selectFuben.GameId, KuaFuRoleStates.NotifyEnterGame, stateEndTime.Ticks);
                        this.NotifyFuBenRoleEnterGame(selectFuben);
                    }
                    return(true);
                }
                return(false);
            }
            catch (Exception ex)
            {
                LogManager.WriteExceptionUseCache(ex.ToString());
            }
            return(false);
        }
示例#12
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);
        }
示例#13
0
        public void EventCallBackHandler(AsyncDataItem item)
        {
            try
            {
                int      eventType = (int)item.EventType;
                object[] args      = item.Args;
                int      num       = eventType;
                if (num <= 9996)
                {
                    switch (num)
                    {
                    case 0:
                    case 1:
                        if (args.Length == 1)
                        {
                            KuaFuRoleData kuaFuRoleData = args[0] as KuaFuRoleData;
                            if (null != kuaFuRoleData)
                            {
                                this.UpdateRoleData(kuaFuRoleData, kuaFuRoleData.RoleId);
                            }
                        }
                        break;

                    case 2:
                        if (args.Length == 2)
                        {
                            int rid   = (int)args[0];
                            int count = (int)args[1];
                            this.CoreInterface.GetEventSourceInterface().fireEvent(new KuaFuFuBenRoleCountEvent(rid, count), this.SceneType);
                        }
                        break;

                    case 3:
                        if (args.Length == 1)
                        {
                            KuaFuRoleData kuaFuRoleData = args[0] as KuaFuRoleData;
                            if (null != kuaFuRoleData)
                            {
                                this.UpdateRoleData(kuaFuRoleData, kuaFuRoleData.RoleId);
                                HuanYingSiYuanFuBenData huanYingSiYuanFuBenData = this.GetKuaFuFuBenData(kuaFuRoleData.GameId);
                                if (huanYingSiYuanFuBenData != null && huanYingSiYuanFuBenData.State == GameFuBenState.Start)
                                {
                                    KuaFuServerLoginData kuaFuServerLoginData = new KuaFuServerLoginData
                                    {
                                        RoleId   = kuaFuRoleData.RoleId,
                                        GameType = kuaFuRoleData.GameType,
                                        GameId   = (long)kuaFuRoleData.GameId,
                                        EndTicks = kuaFuRoleData.StateEndTicks
                                    };
                                    kuaFuServerLoginData.ServerId = this.ClientInfo.ServerId;
                                    KuaFuServerInfo kuaFuServerInfo;
                                    if (KuaFuManager.getInstance().TryGetValue(huanYingSiYuanFuBenData.ServerId, out kuaFuServerInfo))
                                    {
                                        kuaFuServerLoginData.ServerIp   = kuaFuServerInfo.Ip;
                                        kuaFuServerLoginData.ServerPort = kuaFuServerInfo.Port;
                                    }
                                    else
                                    {
                                        LogManager.WriteLog(LogTypes.Error, string.Format("服务器列表中无法找到serverid={0}的IP和端口信息", huanYingSiYuanFuBenData.ServerId), null, true);
                                    }
                                    this.CoreInterface.GetEventSourceInterface().fireEvent(new KuaFuNotifyEnterGameEvent(kuaFuServerLoginData), this.SceneType);
                                }
                            }
                        }
                        break;

                    default:
                        if (num == 9996)
                        {
                            if (args.Length == 1)
                            {
                                GMCmdData data = args[0] as GMCmdData;
                                GVoiceManager.getInstance().UpdateGVoicePriority(data, true);
                            }
                        }
                        break;
                    }
                }
                else if (num != 10015)
                {
                    if (num == 10029)
                    {
                        KuaFuLueDuoNtfEnterData data2 = args[0] as KuaFuLueDuoNtfEnterData;
                        KuaFuLueDuoManager.getInstance().HandleNtfEnterEvent(data2);
                    }
                }
                else if (args != null && args.Length == 2)
                {
                    KuaFuManager.getInstance().UpdateServerInfoList(args[1] as List <KuaFuServerInfo>);
                }
            }
            catch (Exception ex)
            {
                LogManager.WriteExceptionUseCache(ex.ToString());
            }
        }
示例#14
0
        private bool AssignGameFuben(KuaFuRoleData kuaFuRoleData, long waitSecs1, long waitSecs2, DateTime now)
        {
            int      roleCount    = 0;
            DateTime stateEndTime = now.AddSeconds(EnterGameSecs);
            HuanYingSiYuanFuBenData selectFuben = null;

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

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

                if (null == selectFuben)
                {
                    int gameId  = Persistence.GetNextGameId();
                    int kfSrvId = 0;
                    if (ClientAgentManager.Instance().AssginKfFuben(GameType, gameId, 1, out kfSrvId))
                    {
                        selectFuben            = new HuanYingSiYuanFuBenData();
                        selectFuben.ServerId   = kfSrvId;
                        selectFuben.GameId     = gameId;
                        selectFuben.GroupIndex = kuaFuRoleData.GroupIndex;
                        selectFuben.EndTime    = Global.NowTime.AddMinutes(Consts.HuanYingSiYuanGameFuBenMaxExistMinutes);
                        AddGameFuBen(selectFuben);
                        roleCount = selectFuben.AddKuaFuFuBenRoleData(kuaFuFuBenRoleData, GameFuBenRoleCountChangedHandler);
                        Persistence.LogCreateHysyFuben(gameId, kfSrvId, 0, 1);
                    }
                }

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

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

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

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

            return(false);
        }
示例#15
0
        public void EventCallBackHandler(int eventType, params object[] args)
        {
            try
            {
                switch (eventType)
                {
                case (int)KuaFuEventTypes.NotifyWaitingRoleCount:
                {
                    if (args.Length == 2)
                    {
                        int rid   = (int)args[0];
                        int count = (int)args[1];
                        CoreInterface.GetEventSourceInterface().fireEvent(new KuaFuFuBenRoleCountEvent(rid, count), SceneType);
                    }
                }
                break;

                case (int)KuaFuEventTypes.RoleSignUp:
                case (int)KuaFuEventTypes.RoleStateChange:
                {
                    if (args.Length == 1)
                    {
                        KuaFuRoleData kuaFuRoleData = args[0] as KuaFuRoleData;
                        if (null != kuaFuRoleData)
                        {
                            UpdateRoleData(kuaFuRoleData, kuaFuRoleData.RoleId);
                        }
                    }
                }
                break;

                case (int)KuaFuEventTypes.UpdateAndNotifyEnterGame:
                {
                    if (args.Length == 1)
                    {
                        KuaFuRoleData kuaFuRoleData = args[0] as KuaFuRoleData;
                        if (null != kuaFuRoleData)
                        {
                            UpdateRoleData(kuaFuRoleData, kuaFuRoleData.RoleId);

                            HuanYingSiYuanFuBenData huanYingSiYuanFuBenData = GetKuaFuFuBenData(kuaFuRoleData.GameId);
                            if (null != huanYingSiYuanFuBenData && huanYingSiYuanFuBenData.State == GameFuBenState.Start)
                            {
                                KuaFuServerLoginData kuaFuServerLoginData = new KuaFuServerLoginData()
                                {
                                    RoleId   = kuaFuRoleData.RoleId,
                                    GameType = kuaFuRoleData.GameType,
                                    GameId   = kuaFuRoleData.GameId,
                                    EndTicks = kuaFuRoleData.StateEndTicks,
                                };

                                kuaFuServerLoginData.ServerId = ClientInfo.ServerId;
                                lock (Mutex)
                                {
                                    KuaFuServerInfo kuaFuServerInfo;
                                    if (ServerIdServerInfoDict.TryGetValue(huanYingSiYuanFuBenData.ServerId, out kuaFuServerInfo))
                                    {
                                        kuaFuServerLoginData.ServerIp   = kuaFuServerInfo.Ip;
                                        kuaFuServerLoginData.ServerPort = kuaFuServerInfo.Port;
                                    }
                                }

                                CoreInterface.GetEventSourceInterface().fireEvent(new KuaFuNotifyEnterGameEvent(kuaFuServerLoginData), SceneType);
                            }
                        }
                    }
                }
                break;
                }
            }
            catch (Exception ex)
            {
                LogManager.WriteExceptionUseCache(ex.ToString());
            }
        }