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); } } }
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); } } } } }
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) { } }
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 { } }
private void AddAsyncEvent(AsyncDataItem evItem) { if (evItem != null) { lock (this.RoomEventQ) { this.RoomEventQ.Enqueue(evItem); } } }
public void EventCallBackHandler(AsyncDataItem item) { try { } catch (Exception ex) { LogManager.WriteExceptionUseCache(ex.ToString()); } }
/// <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); }
/// <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); } } }
/// <summary> /// 投递一个房间事件 创建、解散、开始游戏,进人,踢人等等 /// NOTE!!! This is Import!!! /// 投递房间事件的时候,要lock住KFCopyRoom,保证对同一个房间的修改和投递是个原子操作 /// </summary> private void AddAsyncEvent(AsyncDataItem evItem) { if (evItem == null) { return; } lock (RoomEventQ) { RoomEventQ.Enqueue(evItem); } }
public void KFBroadCastAsyncEvent(GameTypes gameType, AsyncDataItem evItem) { if (evItem != null) { lock (this.Mutex) { foreach (int sid in this.AllKfServerId) { this.PostAsyncEvent(sid, gameType, evItem); } } } }
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)); }
/// <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); } } }
/// <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); } } }
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); } } } } }
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(); } } }
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); }
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); } }
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); }
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) { } }
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); } }
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()); } }
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 { } }
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); }
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); }
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()); } }
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()); } }
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) { } }
/// <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; } } } } }
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()); } }
/// <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); }