コード例 #1
0
        private void CheckRoleTimerProc(DateTime now, out int signUpCount, out int startCount)
        {
            signUpCount = 0;
            startCount  = 0;
            bool assgionGameFuBen   = true;
            long maxRemoveRoleTicks = now.AddHours(-2.0).Ticks;
            long waitTicks          = now.AddSeconds((double)(-(double)this.Persistence.SignUpWaitSecs1)).Ticks;
            long waitTicks2         = now.AddSeconds((double)(-(double)this.Persistence.SignUpWaitSecs2)).Ticks;

            foreach (KuaFuRoleData kuaFuRoleData in this.RoleIdKuaFuRoleDataDict.Values)
            {
                int oldGameId = 0;
                lock (kuaFuRoleData)
                {
                    if (kuaFuRoleData.State == KuaFuRoleStates.None || kuaFuRoleData.State > KuaFuRoleStates.StartGame)
                    {
                        if (kuaFuRoleData.StateEndTicks < maxRemoveRoleTicks)
                        {
                            KuaFuRoleData kuaFuRoleDataTemp;
                            this.RoleIdKuaFuRoleDataDict.TryRemove(KuaFuRoleKey.Get(kuaFuRoleData.ServerId, kuaFuRoleData.RoleId), out kuaFuRoleDataTemp);
                            continue;
                        }
                    }
                    else if (kuaFuRoleData.State == KuaFuRoleStates.NotifyEnterGame || kuaFuRoleData.State == KuaFuRoleStates.EnterGame)
                    {
                        if (kuaFuRoleData.StateEndTicks < now.Ticks)
                        {
                            kuaFuRoleData.Age++;
                            kuaFuRoleData.State = KuaFuRoleStates.None;
                            oldGameId           = kuaFuRoleData.GameId;
                        }
                    }
                }
                if (kuaFuRoleData.State == KuaFuRoleStates.SignUp)
                {
                    signUpCount++;
                    if (assgionGameFuBen)
                    {
                        assgionGameFuBen = this.AssignGameFuben(kuaFuRoleData, waitTicks, waitTicks2, now);
                    }
                }
                else if (kuaFuRoleData.State == KuaFuRoleStates.SignUpWaiting)
                {
                    signUpCount++;
                }
                else if (kuaFuRoleData.State == KuaFuRoleStates.StartGame)
                {
                    startCount++;
                }
                if (oldGameId > 0)
                {
                    this.RemoveRoleFromFuBen(oldGameId, kuaFuRoleData.RoleId);
                    AsyncDataItem evItem = new AsyncDataItem(KuaFuEventTypes.RoleStateChange, new object[]
                    {
                        kuaFuRoleData
                    });
                    ClientAgentManager.Instance().PostAsyncEvent(kuaFuRoleData.ServerId, this.GameType, evItem);
                }
            }
        }
コード例 #2
0
 public void HandleChangeEraID(DateTime now, bool broadCast = false)
 {
     lock (this.Mutex)
     {
         int dayID = TimeUtil.GetOffsetDay(now);
         if (dayID != this.RuntimeData.EraUpdateDayID)
         {
             this.RuntimeData.EraUpdateDayID = dayID;
             int CurrentEraID = this.CalCurrentEraID(now);
             if (CurrentEraID != this.RuntimeData.CurrentEraID)
             {
                 this.EraDataDict.Clear();
                 this.EraRankList.V.Clear();
                 TimeUtil.AgeByNow(ref this.EraRankList.Age);
                 this.RuntimeData.CurrentEraID           = CurrentEraID;
                 this.RuntimeData.CurFastEraStage        = 1;
                 this.RuntimeData.CurFastEraStateProcess = 0;
                 if (broadCast)
                 {
                     AsyncDataItem evItem = new AsyncDataItem(KuaFuEventTypes.JunTuanEraChg, new object[]
                     {
                         CurrentEraID
                     });
                     ClientAgentManager.Instance().BroadCastAsyncEvent(GameTypes.JunTuan, evItem, 0);
                 }
             }
         }
     }
 }
コード例 #3
0
 public static void NotifyFuBenRoleEnterGame(KuaFu5v5FuBenData fuBenData)
 {
     try
     {
         lock (fuBenData)
         {
             List <int> serverIDs = new List <int>();
             foreach (KuaFuFuBenRoleData role in fuBenData.RoleDict.Values)
             {
                 if (!serverIDs.Contains(role.ServerId))
                 {
                     serverIDs.Add(role.ServerId);
                     AsyncDataItem evItem = new AsyncDataItem(KuaFuEventTypes.KuaFu5v5UpdateAndNotifyEnterGame, new object[]
                     {
                         fuBenData
                     });
                     ClientAgentManager.Instance().PostAsyncEvent(role.ServerId, TianTi5v5Service.ChannelGameType, evItem);
                 }
             }
         }
     }
     catch (Exception ex)
     {
     }
 }
コード例 #4
0
ファイル: TianTiService.cs プロジェクト: qiuhoude/mu_server
 private void NotifyFuBenRoleCount(TianTiFuBenData fuBenData)
 {
     try
     {
         lock (fuBenData)
         {
             int roleCount = fuBenData.RoleDict.Count;
             foreach (KuaFuFuBenRoleData role in fuBenData.RoleDict.Values)
             {
                 KuaFuRoleData kuaFuRoleData;
                 if (this.RoleIdKuaFuRoleDataDict.TryGetValue(KuaFuRoleKey.Get(role.ServerId, role.RoleId), out kuaFuRoleData))
                 {
                     AsyncDataItem evItem = new AsyncDataItem(KuaFuEventTypes.NotifyWaitingRoleCount, new object[]
                     {
                         kuaFuRoleData.RoleId,
                         roleCount
                     });
                     ClientAgentManager.Instance().PostAsyncEvent(kuaFuRoleData.ServerId, this.GameType, evItem);
                 }
             }
         }
     }
     catch
     {
     }
 }
コード例 #5
0
 private void AddAsyncEvent(AsyncDataItem evItem)
 {
     if (evItem != null)
     {
         lock (this.RoomEventQ)
         {
             this.RoomEventQ.Enqueue(evItem);
         }
     }
 }
コード例 #6
0
 public void EventCallBackHandler(AsyncDataItem item)
 {
     try
     {
     }
     catch (Exception ex)
     {
         LogManager.WriteExceptionUseCache(ex.ToString());
     }
 }
コード例 #7
0
ファイル: KFCopyTeamManager.cs プロジェクト: chenchungit/ky
        /// <summary>
        /// 更新准备状态
        /// </summary>
        public KFCopyTeamSetReadyRsp TeamSetReady(KFCopyTeamSetReadyReq req)
        {
            KFCopyTeamSetReadyRsp rsp = new KFCopyTeamSetReadyRsp();

            try
            {
                lock (Mutex)
                {
                    CopyTeamData td = null;
                    if (!CopyTeamDict.TryGetValue(req.TeamId, out td))
                    {
                        // 房间不存在!!! GameServer要检查这个错误码,可能出现的情况是 跨服中心重启了,那么GameServer要把这个房间清掉
                        rsp.ErrorCode = CopyTeamErrorCodes.TeamIsDestoryed;
                        return(rsp);
                    }

                    CopyTeamMemberData member = td.TeamRoles.Find(_role => _role.RoleID == req.RoleId);
                    if (member == null)
                    {
                        rsp.ErrorCode = CopyTeamErrorCodes.NotInMyTeam;
                        return(rsp);
                    }

                    if (td.StartTime > 0)
                    {
                        rsp.ErrorCode = CopyTeamErrorCodes.TeamAlreadyStart;
                        return(rsp);
                    }

                    member.IsReady = req.Ready > 0;

                    // 异步广播准备事件
                    CopyTeamReadyData data = new CopyTeamReadyData();
                    data.RoleId = req.RoleId;
                    data.TeamId = req.TeamId;
                    data.Ready  = req.Ready;
                    AsyncDataItem evItem = new AsyncDataItem();
                    evItem.EventType = KuaFuEventTypes.KFCopyTeamSetReady;
                    evItem.Args      = new object[2] {
                        member.ServerId, data
                    };
                    AddAsyncEvent(evItem);

                    rsp.ErrorCode = CopyTeamErrorCodes.Success;
                    rsp.Data      = data;
                }
            }
            catch (Exception ex)
            {
                LogManager.WriteLog(LogTypes.Error, string.Format("更新跨服副本队伍准备状态异常, role={0}, teamid={1}", req.RoleId, req.TeamId), ex);
                rsp.ErrorCode = CopyTeamErrorCodes.CenterServerFailed;
            }

            return(rsp);
        }
コード例 #8
0
ファイル: ClientAgentManager.cs プロジェクト: chenchungit/ky
 /// <summary>
 /// 给特定GameServer投递异步事件
 /// </summary>
 /// <param name="ServerId"></param>
 /// <param name="gameType"></param>
 /// <param name="evItem"></param>
 public void PostAsyncEvent(int ServerId, GameTypes gameType, AsyncDataItem evItem)
 {
     lock (Mutex)
     {
         ClientAgent agent = null;
         if (ServerId2ClientAgent.TryGetValue(ServerId, out agent))
         {
             agent.PostAsyncEvent(gameType, evItem);
         }
     }
 }
コード例 #9
0
ファイル: KFCopyTeamManager.cs プロジェクト: chenchungit/ky
 /// <summary>
 /// 投递一个房间事件 创建、解散、开始游戏,进人,踢人等等
 /// NOTE!!! This is Import!!!
 /// 投递房间事件的时候,要lock住KFCopyRoom,保证对同一个房间的修改和投递是个原子操作
 /// </summary>
 private void AddAsyncEvent(AsyncDataItem evItem)
 {
     if (evItem == null)
     {
         return;
     }
     lock (RoomEventQ)
     {
         RoomEventQ.Enqueue(evItem);
     }
 }
コード例 #10
0
 public void KFBroadCastAsyncEvent(GameTypes gameType, AsyncDataItem evItem)
 {
     if (evItem != null)
     {
         lock (this.Mutex)
         {
             foreach (int sid in this.AllKfServerId)
             {
                 this.PostAsyncEvent(sid, gameType, evItem);
             }
         }
     }
 }
コード例 #11
0
 public static void StartServices()
 {
     AsyncDataItem.InitKnownTypes();
     ConfigData.InitConfig();
     RemotingConfiguration.Configure(Process.GetCurrentProcess().MainModule.FileName + ".config", false);
     AutoCSer.Net.TcpInternalServer.ServerAttribute attribute = AutoCSer.Net.TcpStaticServer.ServerAttribute.GetConfig("K", typeof(ZhanDuiZhengBa_K), true);
     attribute.IsAutoServer            = true;
     attribute.Port                    = ConfigData.ServicePort;
     attribute.Host                    = ConfigData.ServiceHost;
     attribute.SendBufferSize          = Size.Kilobyte64;
     attribute.ReceiveBufferSize       = Size.Kilobyte64;
     attribute.ServerSendBufferMaxSize = 33554432;
     attribute.ClientSendBufferMaxSize = 4194304;
     Program.AutoCserServices.Add(new KfCall(attribute, null, null, null));
 }
コード例 #12
0
ファイル: ClientAgentManager.cs プロジェクト: chenchungit/ky
        /// <summary>
        /// 广播异步时间给所有的GameServer
        /// </summary>
        /// <param name="gameType"></param>
        /// <param name="evItem"></param>
        public void BroadCastAsyncEvent(GameTypes gameType, AsyncDataItem evItem)
        {
            if (evItem == null)
            {
                return;
            }

            lock (Mutex)
            {
                foreach (var sid in ServerId2ClientAgent.Keys)
                {
                    PostAsyncEvent(sid, gameType, evItem);
                }
            }
        }
コード例 #13
0
ファイル: ClientAgentManager.cs プロジェクト: chenchungit/ky
        /// <summary>
        /// 广播异步时间给所有的跨服GameServer
        /// </summary>
        /// <param name="gameType"></param>
        /// <param name="evItem"></param>
        public void KFBroadCastAsyncEvent(GameTypes gameType, AsyncDataItem evItem)
        {
            if (evItem == null)
            {
                return;
            }

            lock (Mutex)
            {
                foreach (var sid in AllKfServerId)
                {
                    PostAsyncEvent(sid, gameType, evItem);
                }
            }
        }
コード例 #14
0
 public void BroadCastAsyncEvent(GameTypes gameType, AsyncDataItem evItem, int srcServerId = 0)
 {
     if (evItem != null)
     {
         lock (this.Mutex)
         {
             foreach (int sid in this.ServerId2ClientAgent.Keys)
             {
                 if (sid != srcServerId)
                 {
                     this.PostAsyncEvent(sid, gameType, evItem);
                 }
             }
         }
     }
 }
コード例 #15
0
ファイル: ClientAgent.cs プロジェクト: qiuhoude/mu_server
 public void PostAsyncEvent(GameTypes gameType, AsyncDataItem evItem)
 {
     lock (this.Mutex)
     {
         Queue <AsyncDataItem> evQ = null;
         if (!this.EvItemOfGameType.TryGetValue((int)gameType, out evQ))
         {
             evQ = new Queue <AsyncDataItem>();
             this.EvItemOfGameType[(int)gameType] = evQ;
         }
         evQ.Enqueue(evItem);
         while (evQ.Count > 100000)
         {
             evQ.Dequeue();
         }
     }
 }
コード例 #16
0
ファイル: TianTiService.cs プロジェクト: qiuhoude/mu_server
        public int RoleChangeState(int serverId, int roleId, int state)
        {
            KuaFuRoleKey  key = KuaFuRoleKey.Get(serverId, roleId);
            KuaFuRoleData kuaFuRoleData;
            int           result;

            if (!this.RoleIdKuaFuRoleDataDict.TryGetValue(key, out kuaFuRoleData))
            {
                result = -11003;
            }
            else
            {
                int oldGameId = 0;
                lock (kuaFuRoleData)
                {
                    if (state == 0)
                    {
                        if (kuaFuRoleData.GameId > 0)
                        {
                            TianTiFuBenData fuBenData;
                            if (this.TianTiFuBenDataDict.TryGetValue(kuaFuRoleData.GameId, out fuBenData))
                            {
                                AsyncDataItem evItem = new AsyncDataItem(KuaFuEventTypes.CopyCanceled, new object[]
                                {
                                    kuaFuRoleData.GameId
                                });
                                ClientAgentManager.Instance().PostAsyncEvent(fuBenData.ServerId, this.GameType, evItem);
                            }
                        }
                        oldGameId            = kuaFuRoleData.GameId;
                        kuaFuRoleData.GameId = 0;
                    }
                    kuaFuRoleData.Age++;
                    kuaFuRoleData.State = (KuaFuRoleStates)state;
                }
                if (oldGameId > 0)
                {
                    this.RemoveRoleFromFuBen(oldGameId, roleId);
                }
                result = state;
            }
            return(result);
        }
コード例 #17
0
        public void EnqueueCacheItem(KuaFuEventTypes eventType, params object[] args)
        {
            lock (CacheItemQueue)
            {
                AsyncDataItem item = new AsyncDataItem()
                {
                    EventType = eventType, Args = args
                };
                int count = CacheItemQueue.Count;
                if (count > MaxCachedAsyncDataItemCount)
                {
                    for (count -= MaxCachedAsyncDataItemCount; count >= 0; count--)
                    {
                        CacheItemQueue.Dequeue();
                    }
                }

                CacheItemQueue.Enqueue(item);
            }
        }
コード例 #18
0
        public object GetKuaFuLineDataList(int mapCode)
        {
            IYongZheZhanChangService kuaFuService = this.GetKuaFuService(false);

            if (null != kuaFuService)
            {
                try
                {
                    AsyncDataItem item = kuaFuService.GetKuaFuLineDataList(mapCode);
                    if (item != null && item.Args != null && item.Args.Length > 0)
                    {
                        return(item.Args[0]);
                    }
                }
                catch (Exception ex)
                {
                    this.ResetKuaFuService();
                }
            }
            return(null);
        }
コード例 #19
0
ファイル: TianTiService.cs プロジェクト: chenchungit/ky
 private void NotifyFuBenRoleEnterGame(TianTiFuBenData 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)
     {
     }
 }
コード例 #20
0
ファイル: KFCopyTeamManager.cs プロジェクト: chenchungit/ky
        public void RemoveTeam(long teamId)
        {
            lock (Mutex)
            {
                CopyTeamData td = null;
                if (!CopyTeamDict.TryGetValue(teamId, out td))
                {
                    return;
                }

                CopyTeamDict.Remove(teamId);
                HashSet <long> teamList = null;
                if (CopyId2Teams.TryGetValue(td.FuBenId, out teamList))
                {
                    teamList.Remove(teamId);
                }

                TimeLimitCopy.Remove(td.TeamID);

                if (td.KFServerId > 0)
                {
                    _KFCopyService.RemoveGameTeam(td.KFServerId, td.TeamID);
                }

                foreach (var role in td.TeamRoles)
                {
                    RoleId2JoinedTeam.Remove(role.RoleID);
                }

                // 异步广播队伍摧毁的事件
                CopyTeamDestroyData data = new CopyTeamDestroyData();
                data.TeamId = teamId;
                AsyncDataItem evItem = new AsyncDataItem();
                evItem.EventType = KuaFuEventTypes.KFCopyTeamDestroty;
                evItem.Args      = new object[1] {
                    data
                };
                AddAsyncEvent(evItem);
            }
        }
コード例 #21
0
 public void EventCallBackHandler(AsyncDataItem item)
 {
     try
     {
         int      eventType = (int)item.EventType;
         object[] args      = item.Args;
         int      num       = eventType;
         if (num != 39)
         {
             if (num == 9997)
             {
                 if (GMCommands.EnableGMSetAllServerTime && item.Args.Length == 4)
                 {
                     string[] a = new string[item.Args.Length];
                     for (int i = 0; i < a.Length; i++)
                     {
                         a[i] = (item.Args[i] as string);
                         if (string.IsNullOrEmpty(a[i]))
                         {
                             return;
                         }
                     }
                     if (a[0] == "-settime")
                     {
                         GMCommands.GMSetTime(null, a, false);
                     }
                 }
             }
         }
         else
         {
             RebornManager.getInstance().OnChatListData(args[0] as byte[]);
         }
     }
     catch (Exception ex)
     {
         LogManager.WriteExceptionUseCache(ex.ToString());
     }
 }
コード例 #22
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
     {
     }
 }
コード例 #23
0
ファイル: TianTiService.cs プロジェクト: chenchungit/ky
        private int ChangeRoleState(KuaFuRoleData kuaFuRoleData, KuaFuRoleStates state)
        {
            int result = -1;

            try
            {
                IKuaFuClient  kuaFuClient = null;
                KuaFuRoleData roleData    = null;
                int           oldGameId   = 0;
                lock (kuaFuRoleData)
                {
                    kuaFuRoleData.Age++;
                    kuaFuRoleData.State = state;
                    if (state == KuaFuRoleStates.None && kuaFuRoleData.GameId > 0)
                    {
                        oldGameId = kuaFuRoleData.GameId;
                    }

                    roleData = (KuaFuRoleData)kuaFuRoleData;
                }

                if (oldGameId > 0)
                {
                    RemoveRoleFromFuBen(oldGameId, kuaFuRoleData.RoleId);
                }

                if (null != roleData)
                {
                    AsyncDataItem evItem = new AsyncDataItem(KuaFuEventTypes.RoleStateChange, kuaFuRoleData);
                    ClientAgentManager.Instance().PostAsyncEvent(kuaFuRoleData.ServerId, GameType, evItem);
                }
            }
            catch (System.Exception ex)
            {
                return(-1);
            }

            return(result);
        }
コード例 #24
0
ファイル: ClientAgent.cs プロジェクト: qiuhoude/mu_server
 public AsyncDataItem[] PickAsyncEvent(GameTypes gameType)
 {
     lock (this.Mutex)
     {
         this.ClientHeartTick();
         Queue <AsyncDataItem> evQ = null;
         if (this.EvItemOfGameType.TryGetValue((int)gameType, out evQ))
         {
             int count = Math.Min(evQ.Count, KuaFuServerManager.MaxGetAsyncItemDataCount);
             if (count > 0)
             {
                 AsyncDataItem[] result = new AsyncDataItem[count];
                 for (int i = 0; i < count; i++)
                 {
                     result[i] = evQ.Dequeue();
                 }
                 return(result);
             }
         }
     }
     return(null);
 }
コード例 #25
0
 public void EventCallBackHandler(AsyncDataItem item)
 {
     try
     {
         int      eventType = (int)item.EventType;
         object[] args      = item.Args;
         int      num       = eventType;
         if (num == 10008)
         {
             if (args.Length == 5)
             {
                 int          zoneID     = (int)args[0];
                 int          roleID     = (int)args[1];
                 int          countRole  = (int)args[2];
                 int          countVip   = (int)args[3];
                 int          countLevle = (int)args[4];
                 KFSpreadData data;
                 if (this._RoleId2KFSpreadDataDict.TryGetValue(roleID, out data))
                 {
                     lock (data)
                     {
                         data.CountRole  = countRole;
                         data.CountVip   = countVip;
                         data.CountLevel = countLevle;
                         data.UpdateLogtime();
                         this._CoreInterface.GetEventSourceInterface().fireEvent(new KFNotifySpreadCountGameEvent(zoneID, roleID, countRole, countVip, countLevle), 10002);
                     }
                 }
             }
         }
     }
     catch (Exception ex)
     {
         LogManager.WriteExceptionUseCache(ex.ToString());
     }
 }
コード例 #26
0
ファイル: RebornService.cs プロジェクト: qiuhoude/mu_server
 public void PlatFormChat(int serverId, byte[] bytes)
 {
     try
     {
         AsyncDataItem evItem = new AsyncDataItem(KuaFuEventTypes.PlatFormChat, new object[]
         {
             bytes
         });
         HashSet <int> SpecialLineSet = new HashSet <int>();
         lock (this.Mutex)
         {
             foreach (KeyValuePair <int, List <RebornBossConfig> > item in this.RebornBossConfigDict)
             {
                 List <KuaFuLineData> lineList = KuaFuServerManager.GetKuaFuLineDataList(item.Key);
                 if (null != lineList)
                 {
                     foreach (KuaFuLineData line in lineList)
                     {
                         SpecialLineSet.Add(line.ServerId);
                     }
                 }
             }
         }
         foreach (int lineServerId in SpecialLineSet)
         {
             if (serverId != lineServerId)
             {
                 ClientAgentManager.Instance().PostAsyncEvent(lineServerId, this.EvItemGameType, evItem);
             }
         }
     }
     catch (Exception ex)
     {
         LogManager.WriteException(ex.ToString());
     }
 }
コード例 #27
0
 private void NotifyFuBenRoleEnterGame(HuanYingSiYuanFuBenData fuBenData)
 {
     try
     {
         lock (fuBenData)
         {
             foreach (KuaFuFuBenRoleData role in fuBenData.RoleDict.Values)
             {
                 KuaFuRoleData kuaFuRoleData;
                 if (this.RoleIdKuaFuRoleDataDict.TryGetValue(KuaFuRoleKey.Get(role.ServerId, role.RoleId), out kuaFuRoleData) && kuaFuRoleData.State == KuaFuRoleStates.NotifyEnterGame)
                 {
                     AsyncDataItem evItem = new AsyncDataItem(KuaFuEventTypes.UpdateAndNotifyEnterGame, new object[]
                     {
                         kuaFuRoleData
                     });
                     ClientAgentManager.Instance().PostAsyncEvent(kuaFuRoleData.ServerId, this.GameType, evItem);
                 }
             }
         }
     }
     catch (Exception ex)
     {
     }
 }
コード例 #28
0
ファイル: CoupleArenaService.cs プロジェクト: chenchungit/ky
        /// <summary>
        /// 夫妻匹配
        /// </summary>
        /// <param name="now"></param>
        private void CheckRoleMatch(DateTime now)
        {
            lock (Mutex)
            {
                var joinDatas = JoinDataUtil.GetJoinList();
                if (joinDatas == null || joinDatas.Count <= 0)
                {
                    return;
                }

                CoupleArenaJoinMatcher joinMatcher = new CoupleArenaJoinMatcher();
                foreach (var joinData in joinDatas)
                {
                    if ((now - joinData.StartTime).TotalSeconds >= 60 || joinData.ToKfServerId > 0)
                    {
                        JoinDataUtil.DelJoinData(joinData);
                    }
                    else if ((now - joinData.StartTime).TotalSeconds >= 30)
                    {
                        joinMatcher.AddGlobalJoinData(joinData);
                    }
                    else
                    {
                        joinMatcher.AddJoinData(joinData.DuanWeiType, joinData.DuanWeiLevel, joinData);
                    }
                }

                foreach (var list in joinMatcher.GetAllMatch())
                {
                    for (int i = 0; i < list.Count - 1;)
                    {
                        var one = list[i];
                        var two = list[i + 1];
                        if (MatchTimeLimiter.GetMatchTimes(one.RoleId1, one.RoleId2, two.RoleId1, two.RoleId2)
                            >= TianTiPersistence.Instance.MaxRolePairFightCount)
                        {
                            // 次数先知 第i个元素,让第i+1个元素和第i+2个元素进行匹配
                            i += 1;
                            continue;
                        }

                        CoupleArenaFuBenData fubenData = new CoupleArenaFuBenData();
                        fubenData.GameId    = Persistence.GetNextGameId();
                        fubenData.StartTime = now;
                        fubenData.RoleList  = new List <KuaFuFuBenRoleData>();
                        fubenData.RoleList.Add(new KuaFuFuBenRoleData()
                        {
                            ServerId = one.ServerId, RoleId = one.RoleId1, Side = 1
                        });
                        fubenData.RoleList.Add(new KuaFuFuBenRoleData()
                        {
                            ServerId = one.ServerId, RoleId = one.RoleId2, Side = 1
                        });
                        fubenData.RoleList.Add(new KuaFuFuBenRoleData()
                        {
                            ServerId = two.ServerId, RoleId = two.RoleId1, Side = 2
                        });
                        fubenData.RoleList.Add(new KuaFuFuBenRoleData()
                        {
                            ServerId = two.ServerId, RoleId = two.RoleId2, Side = 2
                        });
                        if (ClientAgentManager.Instance().AssginKfFuben(GameType, fubenData.GameId, 4, out fubenData.KfServerId))
                        {
                            MatchTimeLimiter.AddMatchTimes(one.RoleId1, one.RoleId2, two.RoleId1, two.RoleId2);
                            GameFuBenDict[fubenData.GameId] = fubenData;
                            i += 2;

                            one.ToKfServerId = fubenData.KfServerId;
                            two.ToKfServerId = fubenData.KfServerId;

                            CoupleArenaCanEnterData enterData1 = new CoupleArenaCanEnterData()
                            {
                                GameId     = fubenData.GameId,
                                KfServerId = fubenData.KfServerId,
                                RoleId1    = one.RoleId1,
                                RoleId2    = one.RoleId2
                            };
                            ClientAgentManager.Instance().PostAsyncEvent(one.ServerId, EvItemGameType,
                                                                         new AsyncDataItem(KuaFuEventTypes.CoupleArenaCanEnter, enterData1));

                            CoupleArenaCanEnterData enterData2 = new CoupleArenaCanEnterData()
                            {
                                GameId     = fubenData.GameId,
                                KfServerId = fubenData.KfServerId,
                                RoleId1    = two.RoleId1,
                                RoleId2    = two.RoleId2
                            };
                            AsyncDataItem evItem2 = new AsyncDataItem(KuaFuEventTypes.CoupleArenaCanEnter, fubenData.GameId, fubenData.KfServerId, two.RoleId1, two.RoleId2);
                            ClientAgentManager.Instance().PostAsyncEvent(two.ServerId, EvItemGameType,
                                                                         new AsyncDataItem(KuaFuEventTypes.CoupleArenaCanEnter, enterData2));
                        }
                        else
                        {
                            LogManager.WriteLog(LogTypes.Error, "CoupleArena 没有跨服可以分配");
                            return;
                        }
                    }
                }
            }
        }
コード例 #29
0
        public void EventCallBackHandler(AsyncDataItem item)
        {
            try
            {
                int      eventType = (int)item.EventType;
                object[] args      = item.Args;
                switch (eventType)
                {
                case 10000:
                    if (args != null && args.Length == 2 && (int)args[0] != this.ClientInfo.ServerId)
                    {
                        this.CoreInterface.GetEventSourceInterface().fireEvent(new KFCopyRoomCreateEvent((CopyTeamCreateData)args[1]), 10001);
                    }
                    break;

                case 10001:
                    if (args != null && args.Length == 2 && (int)args[0] != this.ClientInfo.ServerId)
                    {
                        this.CoreInterface.GetEventSourceInterface().fireEvent(new KFCopyRoomJoinEvent((CopyTeamJoinData)args[1]), 10001);
                    }
                    break;

                case 10002:
                    if (args != null && args.Length == 2 && (int)args[0] != this.ClientInfo.ServerId)
                    {
                        this.CoreInterface.GetEventSourceInterface().fireEvent(new KFCopyRoomKickoutEvent((CopyTeamKickoutData)args[1]), 10001);
                    }
                    break;

                case 10003:
                    if (args != null && args.Length == 2 && (int)args[0] != this.ClientInfo.ServerId)
                    {
                        this.CoreInterface.GetEventSourceInterface().fireEvent(new KFCopyRoomLeaveEvent((CopyTeamLeaveData)args[1]), 10001);
                    }
                    break;

                case 10004:
                    if (args != null && args.Length == 2 && (int)args[0] != this.ClientInfo.ServerId)
                    {
                        this.CoreInterface.GetEventSourceInterface().fireEvent(new KFCopyRoomReadyEvent((CopyTeamReadyData)args[1]), 10001);
                    }
                    break;

                case 10005:
                    if (args != null && args.Length == 2 && (int)args[0] != this.ClientInfo.ServerId)
                    {
                        this.CoreInterface.GetEventSourceInterface().fireEvent(new KFCopyRoomStartEvent((CopyTeamStartData)args[1]), 10001);
                    }
                    break;

                case 10006:
                    if (args != null && args.Length == 1)
                    {
                        this.CoreInterface.GetEventSourceInterface().fireEvent(new KFCopyTeamDestroyEvent((CopyTeamDestroyData)args[0]), 10001);
                    }
                    break;
                }
            }
            catch (Exception ex)
            {
                LogManager.WriteExceptionUseCache(ex.ToString());
            }
        }
コード例 #30
0
ファイル: KFCopyTeamManager.cs プロジェクト: chenchungit/ky
        /// <summary>
        /// 创建房间
        /// </summary>
        public KFCopyTeamCreateRsp CreateTeam(KFCopyTeamCreateReq req)
        {
            KFCopyTeamCreateRsp rsp = new KFCopyTeamCreateRsp();

            try
            {
                lock (Mutex)
                {
                    // 这里有个很微妙的情况,因为创建队伍时,首先GameServer要检查是否已经加入了一个队伍
                    // 但是如果GameServer重启了,那么必然能通过检查,但是其实在中心上已经为该角色加入了一个房间,必须强制踢掉
                    ForceLeaveRoom(req.Member.RoleID);

                    if (!ClientAgentManager.Instance().IsAnyKfAgentAlive())
                    {
                        rsp.ErrorCode = CopyTeamErrorCodes.KFServerIsBusy;
                        return(rsp);
                    }

                    // 房间数量和 跨服活动服务器负载的检查
                    KFTeamCountControl control = _KFCopyService.dbMgr.TeamControl;
                    if (control == null)
                    {
                        LogManager.WriteLog(LogTypes.Error, string.Format("跨服队伍创建失败,  丢失副本上线控制的配置文件 KFTeamCountControl"));
                        rsp.ErrorCode = CopyTeamErrorCodes.ServerException;
                        return(rsp);
                    }

                    HashSet <long> teamList = null;
                    if (!CopyId2Teams.TryGetValue(req.CopyId, out teamList))
                    {
                        teamList = new HashSet <long>();
                        CopyId2Teams[req.CopyId] = teamList;
                    }

                    CopyTeamData td = new CopyTeamData();
                    td.TeamID       = req.TeamId;
                    td.LeaderRoleID = req.Member.RoleID;
                    td.FuBenId      = req.CopyId;
                    td.MinZhanLi    = req.MinCombat;
                    td.AutoStart    = req.AutoStart > 0;
                    td.TeamRoles.Add(req.Member);
                    td.TeamRoles[0].IsReady = true;
                    td.TeamName             = td.TeamRoles[0].RoleName;
                    td.MemberCount          = td.TeamRoles.Count;

                    CopyTeamDict.Add(td.TeamID, td);
                    teamList.Add(td.TeamID);
                    TimeLimitCopy.Add(td.TeamID, TimeUtil.NOW() + control.TeamMaxWaitMinutes * 60 * 1000);

                    RoleId2JoinedTeam[req.Member.RoleID] = td.TeamID;

                    CopyTeamCreateData data = new CopyTeamCreateData();
                    data.Member    = req.Member;
                    data.MinCombat = req.MinCombat;
                    data.CopyId    = req.CopyId;
                    data.TeamId    = td.TeamID;
                    data.AutoStart = req.AutoStart;

                    // 异步广播创建房间的事件
                    AsyncDataItem evItem = new AsyncDataItem();
                    evItem.EventType = KuaFuEventTypes.KFCopyTeamCreate;
                    evItem.Args      = new object[2] {
                        req.Member.ServerId, data
                    };
                    AddAsyncEvent(evItem);

                    rsp.ErrorCode = CopyTeamErrorCodes.Success;
                    rsp.Data      = data;
                }
            }
            catch (Exception ex)
            {
                LogManager.WriteLog(LogTypes.Error, string.Format("跨服队伍创建异常, serverid={0}, role={1}, copyid={2}", req.Member.ServerId, req.Member.RoleID, req.CopyId), ex);
                rsp.ErrorCode = CopyTeamErrorCodes.CenterServerFailed;
            }

            return(rsp);
        }