public void NotifyListTeamData(GameClient client, CopyTeamData ctd) { int memberCount = ctd.StartTime > 0 ? 0 : ctd.MemberCount; //如果开始了 string strcmd = string.Format("{0}:{1}:{2}:{3}:{4}", ctd.SceneIndex, ctd.TeamID, ctd.TeamName, ctd.MemberCount, ctd.MinZhanLi); client.sendCmd((int)TCPGameServerCmds.CMD_SPR_LISTCOPYTEAMDATA, strcmd); }
public void RemoveTeam(long teamId) { lock (this.Mutex) { CopyTeamData td = null; if (this.CopyTeamDict.TryGetValue(teamId, out td)) { this.CopyTeamDict.Remove(teamId); HashSet <long> teamList = null; if (this.CopyId2Teams.TryGetValue(td.FuBenId, out teamList)) { teamList.Remove(teamId); } this.TimeLimitCopy.Remove(td.TeamID); if (td.KFServerId > 0) { this._KFCopyService.RemoveGameTeam(td.KFServerId, td.TeamID); } foreach (CopyTeamMemberData role in td.TeamRoles) { this.RoleId2JoinedTeam.Remove(role.RoleID); } CopyTeamDestroyData data = new CopyTeamDestroyData(); data.TeamId = teamId; this.AddAsyncEvent(new AsyncDataItem { EventType = KuaFuEventTypes.KFCopyTeamDestroty, Args = new object[] { data } }); } } }
public bool HandleKuaFuLogin(KuaFuServerLoginData data) { if (data == null) { return(false); } lock (Mutex) { CopyTeamData td = null; if (!this.TeamDict.TryGetValue(data.GameId, out td) || td.StartTime <= 0) { // 防止本跨服服务器保存的队伍信息不是最新的,从中心取一下 td = KFCopyRpcClient.getInstance().GetTeamData(data.GameId); if (td == null) { return(false); } this.TeamDict[td.TeamID] = td; HashSet <long> teamList = null; if (this.FuBenId2Teams.TryGetValue(td.FuBenId, out teamList) && !teamList.Contains(td.TeamID)) { teamList.Add(td.TeamID); } } if (td == null) { return(false); } if (td.KFServerId != ThisServerId) { return(false); } if (td.StartTime <= 0) { return(false); } if (!td.TeamRoles.Exists(_role => _role.RoleID == data.RoleId)) { return(false); } if (td.FuBenSeqID <= 0) { td.FuBenSeqID = GameCoreInterface.getinstance().GetNewFuBenSeqId(); } data.FuBenSeqId = td.FuBenSeqID; FuBenSeq2TeamId[td.FuBenSeqID] = td.TeamID; return(true); } }
public KFCopyTeamAnalysis BuildAnalysisData() { KFCopyTeamAnalysis data = new KFCopyTeamAnalysis(); lock (Mutex) { foreach (var kvp in CopyTeamDict) { long teamId = kvp.Key; CopyTeamData td = kvp.Value; KFCopyTeamAnalysis.Item item = null; if (!data.AnalysisDict.TryGetValue(td.FuBenId, out item)) { item = new KFCopyTeamAnalysis.Item(); data.AnalysisDict[td.FuBenId] = item; } item.TotalCopyCount += 1; item.TotalRoleCount += td.TeamRoles.Count; if (td.StartTime > 0) { item.StartCopyCount += 1; item.StartRoleCount += td.TeamRoles.Count; } else { item.UnStartCopyCount += 1; item.UnStartRoleCount += td.TeamRoles.Count; } } } return(data); }
/// <summary> /// 添加项 /// </summary> /// <param name="?"></param> /// <param name="ed"></param> public void AddData(int teamID, CopyTeamData td) { lock (_TeamDataDict) { _TeamDataDict[teamID] = td; } }
public KFCopyTeamLeaveRsp LeaveTeam(KFCopyTeamLeaveReq req) { KFCopyTeamLeaveRsp rsp = new KFCopyTeamLeaveRsp(); try { lock (this.Mutex) { CopyTeamData td = null; if (!this.CopyTeamDict.TryGetValue(req.TeamId, out td)) { rsp.ErrorCode = CopyTeamErrorCodes.TeamIsDestoryed; return(rsp); } if (td.StartTime > 0L) { } CopyTeamMemberData member = td.TeamRoles.Find((CopyTeamMemberData _role) => _role.RoleID == req.RoleId); if (member == null) { rsp.ErrorCode = CopyTeamErrorCodes.NotInMyTeam; return(rsp); } this.RoleId2JoinedTeam.Remove(member.RoleID); td.TeamRoles.Remove(member); td.MemberCount = td.TeamRoles.Count; if (td.MemberCount <= 0) { this.RemoveTeam(td.TeamID); } else if (td.LeaderRoleID == member.RoleID) { td.LeaderRoleID = td.TeamRoles[0].RoleID; td.TeamRoles[0].IsReady = true; td.TeamName = td.TeamRoles[0].RoleName; } CopyTeamLeaveData data = new CopyTeamLeaveData(); data.TeamId = req.TeamId; data.RoleId = req.RoleId; this.AddAsyncEvent(new AsyncDataItem { EventType = KuaFuEventTypes.KFCopyTeamLeave, Args = new object[] { req.ReqServerId, data } }); 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, true); rsp.ErrorCode = CopyTeamErrorCodes.CenterServerFailed; } return(rsp); }
public KFCopyTeamJoinRsp JoinTeam(KFCopyTeamJoinReq req) { KFCopyTeamJoinRsp rsp = new KFCopyTeamJoinRsp(); try { lock (this.Mutex) { this.ForceLeaveRoom(req.Member.RoleID); CopyTeamData td = null; if (!this.CopyTeamDict.TryGetValue(req.TeamId, out td)) { rsp.ErrorCode = CopyTeamErrorCodes.TeamIsDestoryed; return(rsp); } if (td.StartTime > 0L) { rsp.ErrorCode = CopyTeamErrorCodes.TeamAlreadyStart; return(rsp); } if (td.MemberCount >= ConstData.CopyRoleMax(req.CopyId)) { rsp.ErrorCode = CopyTeamErrorCodes.TeamIsFull; return(rsp); } req.Member.IsReady = false; td.TeamRoles.Add(req.Member); td.MemberCount = td.TeamRoles.Count; if (!req.Member.IsReady) { req.Member.NoReadyTicks = TimeUtil.NOW(); } this.RoleId2JoinedTeam[req.Member.RoleID] = td.TeamID; CopyTeamJoinData data = new CopyTeamJoinData(); data.Member = req.Member; data.TeamId = req.TeamId; this.AddAsyncEvent(new AsyncDataItem { EventType = KuaFuEventTypes.KFCopyTeamJoin, Args = new object[] { req.Member.ServerId, data } }); rsp.ErrorCode = CopyTeamErrorCodes.Success; rsp.Data = data; } } catch (Exception ex) { LogManager.WriteLog(LogTypes.Error, string.Format("加入跨服副本队伍异常, serverid={0}, role={1}, teamid={2}", req.Member.ServerId, req.Member.RoleID, req.TeamId), ex, true); rsp.ErrorCode = CopyTeamErrorCodes.CenterServerFailed; } return(rsp); }
public void RoleLeaveFuBen(GameClient client) { #if true QuitFromTeam(client); #else int roleID = client.ClientData.RoleID; int teamID = FindRoleID2TeamID(client.ClientData.RoleID); if (teamID <= 0) //如果没有队伍 { return; } //查找组队的数据 CopyTeamData td = FindData(teamID); if (null == td) //没有找到组队数据 { //清空组队ID RemoveRoleID2TeamID(roleID); return; } bool destroy = false; lock (td) { if (td.MemberCount > 1) //转交队长 { for (int i = 0; i < td.TeamRoles.Count; i++) { if (td.TeamRoles[i].RoleID == client.ClientData.RoleID) { td.TeamRoles[i].OnlineState = 2; td.MemberCount--; break; } } } else { destroy = true; } } if (destroy) { //删除组队数据 RemoveData(teamID); } //清空组队ID RemoveRoleID2TeamID(roleID); //NotifyTeamStateChanged(client, CopyTeamErrorCodes.LeaveTeam, roleID, 0);//通知组队数据的指令信息 NotifyTeamData(td); #endif }
/// <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> /// 查找项 /// </summary> /// <param name="?"></param> /// <param name="ed"></param> public CopyTeamData FindData(int teamID) { CopyTeamData td = null; lock (_TeamDataDict) { _TeamDataDict.TryGetValue(teamID, out td); } return(td); }
public CopyTeamData GetTeamData(long teamid) { lock (Mutex) { CopyTeamData td = null; if (!CopyTeamDict.TryGetValue(teamid, out td)) { return(null); } return(td); } }
public bool CanEnterScene(GameClient client, out CopyTeamData td) { int roleID = client.ClientData.RoleID; int teamID = FindRoleID2TeamID(client.ClientData.RoleID); if (teamID <= 0) { NotifyTeamStateChanged(client, -1, roleID, 0); td = null; return(false); } td = FindData(teamID); if (null != td && roleID == td.LeaderRoleID) { int readyCount = 0; bool someoneOffline = false; lock (td) { for (int i = 0; i < td.TeamRoles.Count; i++) { GameClient gc = GameManager.ClientMgr.FindClient(td.TeamRoles[i].RoleID); if (gc == null) { td.TeamRoles[i].IsReady = false; someoneOffline = true; break; } if (td.TeamRoles[i].IsReady) { readyCount++; } } } if (someoneOffline) { NotifyTeamData(td); } if (readyCount == td.MemberCount) { return(true); } } td = null; return(false); }
/// <summary> /// 队伍销毁 回调 /// </summary> /// <param name="data"></param> private void OnTeamDestroy(CopyTeamDestroyData data) { if (data == null) { return; } lock (Mutex) { CopyTeamData td = null; if (!TeamDict.TryGetValue(data.TeamId, out td)) { return; } TeamDict.Remove(data.TeamId); FuBenSeq2TeamId.Remove(td.FuBenSeqID); HashSet <long> teamList = null; if (FuBenId2Teams.TryGetValue(td.FuBenId, out teamList)) { teamList.Remove(td.TeamID); } foreach (var member in td.TeamRoles) { RoleId2JoinedTeam.Remove(member.RoleID); if (member.ServerId != ThisServerId) { continue; } GameClient client = GameManager.ClientMgr.FindClient(member.RoleID); if (client != null) { NotifyTeamStateChanged(client, (int)CopyTeamErrorCodes.LeaveTeam, member.RoleID, 0); } } // 队长id设为-1, 通知整个队伍 td.LeaderRoleID = -1; NotifyTeamData(td); // 清空队伍,然后通知给所有关注列表的人 td.TeamRoles.Clear(); td.MemberCount = td.TeamRoles.Count; NotifyTeamListChange(td); } }
/// <summary> /// 快速加入队伍 /// </summary> /// <param name="?"></param> /// <param name="ed"></param> public void QuickJoinTeam(GameClient client, int sceneIndex) { int oldTeamID = FindRoleID2TeamID(client.ClientData.RoleID); if (oldTeamID > 0) //如果有队伍 { NotifyTeamCmd(client, CopyTeamErrorCodes.AllreadyHasTeam, (int)TeamCmds.QuickJoinTeam, 0, ""); return; } int zhanLi = client.ClientData.CombatForce; CopyTeamData td = null; lock (_TeamDataDict) { foreach (var teamData in _TeamDataDict.Values) { if (sceneIndex == teamData.SceneIndex && teamData.StartTime == 0 && zhanLi >= teamData.MinZhanLi && teamData.MemberCount < MaxTeamMemberCount) { lock (teamData) { CopyTeamMemberData tm = ClientDataToTeamMemberData(client.ClientData); teamData.TeamRoles.Add(tm); teamData.MemberCount = teamData.TeamRoles.Count; } td = teamData; } } } if (null != td) { AddRoleID2TeamID(client.ClientData.RoleID, td.TeamID); //通知角色组队的指令信息 NotifyTeamCmd(client, CopyTeamErrorCodes.Success, (int)TeamCmds.QuickJoinTeam, td.TeamID, td.TeamName); NotifyTeamData(td); NotifyTeamListChange(td); } else { NotifyTeamCmd(client, CopyTeamErrorCodes.NoAcceptableTeam, (int)TeamCmds.QuickJoinTeam, -1, ""); } }
/// <summary> /// 通知组队数据的指令信息 /// </summary> /// <param name="client"></param> public void NotifyTeamData(CopyTeamData td) { if (null != td) { lock (td) { for (int i = 0; i < td.TeamRoles.Count; i++) { GameClient client = GameManager.ClientMgr.FindClient(td.TeamRoles[i].RoleID); if (null == client) { continue; } client.sendCmd <CopyTeamData>((int)TCPGameServerCmds.CMD_SPR_COPYTEAMDATA, td); } } } }
public CopyTeamData GetTeamData(long teamid) { CopyTeamData result; lock (this.Mutex) { CopyTeamData td = null; if (!this.CopyTeamDict.TryGetValue(teamid, out td)) { result = null; } else { result = td; } } return(result); }
public void CreateCopyTeam(GameClient client, int sceneIndex, int minZhanLi, int autoStart) { int roleID = client.ClientData.RoleID; int teamID = FindRoleID2TeamID(roleID); if (teamID > 0) { QuitFromTeam(client); } teamID = GetNextAutoID(); AddRoleID2TeamID(roleID, teamID); CopyTeamData td = new CopyTeamData() { TeamID = teamID, LeaderRoleID = roleID, SceneIndex = sceneIndex, MinZhanLi = minZhanLi, AutoStart = autoStart > 0, }; if (null == td.TeamRoles) { td.TeamRoles = new List <CopyTeamMemberData>(); } td.TeamRoles.Add(ClientDataToTeamMemberData(client.ClientData)); td.TeamRoles[0].IsReady = true; td.TeamName = td.TeamRoles[0].RoleName; td.MemberCount = td.TeamRoles.Count; //存入组队管理队列 AddData(teamID, td); //通知组队数据的指令信息 NotifyTeamCmd(client, CopyTeamErrorCodes.Success, (int)TeamCmds.Create, teamID, td.TeamName); NotifyTeamData(td); //添加队伍需要向注册通知的用户发送变化列表 NotifyTeamListChange(td); }
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 bool HandleKuaFuInitGame(GameClient client) { if (client == null) { return(false); } lock (Mutex) { CopyTeamData td = null; if (!this.TeamDict.TryGetValue(client.ClientSocket.ClientKuaFuServerLoginData.GameId, out td)) { return(false); } SystemXmlItem systemFuBenItem = null; if (!GameManager.systemFuBenMgr.SystemXmlItemDict.TryGetValue(td.FuBenId, out systemFuBenItem)) { return(false); } int mapCode = systemFuBenItem.GetIntValue("MapCode"); int destX, destY; if (!GetBirthPoint(mapCode, out destX, out destY)) { LogManager.WriteLog(LogTypes.Error, string.Format("rolename={0} 跨服登录副本copyid={1}, 找不到出生点", client.ClientData.RoleName, td.FuBenId)); return(false); } client.ClientData.MapCode = mapCode; client.ClientData.PosX = (int)destX; client.ClientData.PosY = (int)destY; client.ClientData.FuBenSeqID = client.ClientSocket.ClientKuaFuServerLoginData.FuBenSeqId; // 记录跨服玩家参加的队伍ID,玩家下线的时候用 RoleId2JoinedTeam[client.ClientData.RoleID] = td.TeamID; return(true); } }
public void NotifyTeamListChange(CopyTeamData ctd) { List <GameClient> roleList = new List <GameClient>(); List <int> removeList = null; lock (SceneIndexRoleIDListDict) { HashSet <int> list; if (SceneIndexRoleIDListDict.TryGetValue(ctd.SceneIndex, out list)) { foreach (var id in list) { GameClient client = GameManager.ClientMgr.FindClient(id); if (null == client) { if (null == removeList) { removeList = new List <int>(); } removeList.Add(id); } else if (ctd.MemberCount == 0 || (ctd.MinZhanLi <= client.ClientData.CombatForce)) { roleList.Add(client); } } } } for (int i = 0; i < roleList.Count; i++) { NotifyListTeamData(roleList[i], ctd); } UnRegisterCopyTeamListNotifyForOfflineClient(removeList, ctd.SceneIndex); }
/// <summary> /// 开始游戏 /// </summary> public KFCopyTeamStartRsp StartGame(KFCopyTeamStartReq req) { KFCopyTeamStartRsp rsp = new KFCopyTeamStartRsp(); try { lock (Mutex) { CopyTeamData td = null; if (!CopyTeamDict.TryGetValue(req.TeamId, out td)) { rsp.ErrorCode = CopyTeamErrorCodes.TeamIsDestoryed; return(rsp); } if (td.StartTime > 0) { rsp.ErrorCode = CopyTeamErrorCodes.TeamAlreadyStart; return(rsp); } if (td.LeaderRoleID != req.RoleId) { rsp.ErrorCode = CopyTeamErrorCodes.NotTeamLeader; return(rsp); } CopyTeamMemberData leader = td.TeamRoles.Find(_role => _role.RoleID == req.RoleId); if (leader == null || leader.RoleID != req.RoleId) { rsp.ErrorCode = CopyTeamErrorCodes.NotTeamLeader; return(rsp); } if (td.TeamRoles.Exists(_role => _role.IsReady == false)) { rsp.ErrorCode = CopyTeamErrorCodes.MemeberNotReady; return(rsp); } int kfSrvId; if (!ClientAgentManager.Instance().AssginKfFuben(GameTypes.KuaFuCopy, td.TeamID, td.TeamRoles.Count, out kfSrvId)) { rsp.ErrorCode = CopyTeamErrorCodes.KFServerIsBusy; return(rsp); } td.StartTime = TimeUtil.NOW(); td.KFServerId = kfSrvId; td.FuBenSeqID = 0; // not set CopyTeamStartData data = new CopyTeamStartData(); data.TeamId = req.TeamId; data.StartMs = td.StartTime; data.ToServerId = kfSrvId; data.FuBenSeqId = td.FuBenSeqID; AsyncDataItem evItem = new AsyncDataItem(); evItem.EventType = KuaFuEventTypes.KFCopyTeamStart; evItem.Args = new object[2] { leader.ServerId, data }; AddAsyncEvent(evItem); // 副本超时强制关闭的时间 副本开始(客户端点击开始) + 副本持续时间 + 3分钟额外时间 TimeLimitCopy[td.TeamID] = td.StartTime + req.LastMs + 3 * 60 * 1000; 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> /// 退出队伍 /// </summary> public KFCopyTeamLeaveRsp LeaveTeam(KFCopyTeamLeaveReq req) { KFCopyTeamLeaveRsp rsp = new KFCopyTeamLeaveRsp(); try { lock (Mutex) { CopyTeamData td = null; if (!CopyTeamDict.TryGetValue(req.TeamId, out td)) { // 房间不存在!!! GameServer要检查这个错误码,可能出现的情况是 跨服中心重启了,那么GameServer要把这个房间清掉 rsp.ErrorCode = CopyTeamErrorCodes.TeamIsDestoryed; return(rsp); } if (td.StartTime > 0) { // 已经开始了,别走 //rsp.ErrorCode = (int)CopyTeamErrorCodes.TeamAlreadyStart; //return rsp; } CopyTeamMemberData member = td.TeamRoles.Find(_role => _role.RoleID == req.RoleId); if (member == null) { rsp.ErrorCode = CopyTeamErrorCodes.NotInMyTeam; return(rsp); } RoleId2JoinedTeam.Remove(member.RoleID); td.TeamRoles.Remove(member); td.MemberCount = td.TeamRoles.Count; if (td.MemberCount <= 0) { RemoveTeam(td.TeamID); } else { if (td.LeaderRoleID == member.RoleID) { // 移交队长 td.LeaderRoleID = td.TeamRoles[0].RoleID; td.TeamRoles[0].IsReady = true; td.TeamName = td.TeamRoles[0].RoleName; } } // 异步广播离开队伍的事件 CopyTeamLeaveData data = new CopyTeamLeaveData(); data.TeamId = req.TeamId; data.RoleId = req.RoleId; AsyncDataItem evItem = new AsyncDataItem(); evItem.EventType = KuaFuEventTypes.KFCopyTeamLeave; evItem.Args = new object[2] { req.ReqServerId, 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> /// 踢出队伍 /// </summary> public KFCopyTeamKickoutRsp KickoutTeam(KFCopyTeamKickoutReq req) { KFCopyTeamKickoutRsp rsp = new KFCopyTeamKickoutRsp(); try { lock (Mutex) { CopyTeamData td = null; if (!CopyTeamDict.TryGetValue(req.TeamId, out td)) { // 房间不存在!!! GameServer要检查这个错误码,可能出现的情况是 跨服中心重启了,那么GameServer要把这个房间清掉 rsp.ErrorCode = CopyTeamErrorCodes.TeamIsDestoryed; return(rsp); } if (td.StartTime > 0) { // 已经开始了,别踢 rsp.ErrorCode = CopyTeamErrorCodes.TeamAlreadyStart; return(rsp); } if (td.LeaderRoleID != req.FromRoleId) { // 不是队长 rsp.ErrorCode = CopyTeamErrorCodes.NotTeamLeader; return(rsp); } CopyTeamMemberData leader = td.TeamRoles.Find(_role => _role.RoleID == req.FromRoleId); if (leader == null || leader.RoleID != req.FromRoleId) { rsp.ErrorCode = CopyTeamErrorCodes.NotTeamLeader; return(rsp); } CopyTeamMemberData member = td.TeamRoles.Find(_role => _role.RoleID == req.ToRoleId); if (member == null) { // 不在本队伍??? rsp.ErrorCode = CopyTeamErrorCodes.NotInMyTeam; return(rsp); } td.TeamRoles.Remove(member); td.MemberCount = td.TeamRoles.Count; RoleId2JoinedTeam.Remove(req.ToRoleId); CopyTeamKickoutData data = new CopyTeamKickoutData(); data.FromRoleId = req.FromRoleId; data.ToRoleId = req.ToRoleId; data.TeamId = req.TeamId; AsyncDataItem evItem = new AsyncDataItem(); evItem.EventType = KuaFuEventTypes.KFCopyTeamKickout; evItem.Args = new object[2] { leader.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.FromRoleId, req.TeamId), ex); rsp.ErrorCode = CopyTeamErrorCodes.CenterServerFailed; } return(rsp); }
public KFCopyTeamSetReadyRsp TeamSetReady(KFCopyTeamSetReadyReq req) { KFCopyTeamSetReadyRsp rsp = new KFCopyTeamSetReadyRsp(); try { lock (this.Mutex) { CopyTeamData td = null; if (!this.CopyTeamDict.TryGetValue(req.TeamId, out td)) { rsp.ErrorCode = CopyTeamErrorCodes.TeamIsDestoryed; return(rsp); } if (req.Ready <= 0) { if (req.RoleId == td.LeaderRoleID) { rsp.ErrorCode = CopyTeamErrorCodes.TeamLeaderCant; return(rsp); } } CopyTeamMemberData member = td.TeamRoles.Find((CopyTeamMemberData _role) => _role.RoleID == req.RoleId); if (member == null) { rsp.ErrorCode = CopyTeamErrorCodes.NotInMyTeam; return(rsp); } if (td.StartTime > 0L) { rsp.ErrorCode = CopyTeamErrorCodes.TeamAlreadyStart; return(rsp); } member.IsReady = (req.Ready > 0); if (!member.IsReady) { member.NoReadyTicks = TimeUtil.NOW(); } CopyTeamReadyData data = new CopyTeamReadyData(); data.RoleId = req.RoleId; data.TeamId = req.TeamId; data.Ready = req.Ready; this.AddAsyncEvent(new AsyncDataItem { EventType = KuaFuEventTypes.KFCopyTeamSetReady, Args = new object[] { member.ServerId, data } }); 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, true); rsp.ErrorCode = CopyTeamErrorCodes.CenterServerFailed; } return(rsp); }
public CopyTeamErrorCodes RemoveMember(long teamId, int roleid) { CopyTeamErrorCodes result; try { lock (this.Mutex) { CopyTeamData td = null; if (!this.CopyTeamDict.TryGetValue(teamId, out td)) { result = CopyTeamErrorCodes.TeamIsDestoryed; } else if (td.StartTime > 0L) { result = CopyTeamErrorCodes.TeamAlreadyStart; } else { CopyTeamMemberData leader = td.TeamRoles.Find((CopyTeamMemberData _role) => _role.RoleID == td.LeaderRoleID); if (leader == null) { result = CopyTeamErrorCodes.NotTeamLeader; } else { CopyTeamMemberData member = td.TeamRoles.Find((CopyTeamMemberData _role) => _role.RoleID == roleid); if (member == null) { result = CopyTeamErrorCodes.NotInMyTeam; } else { td.TeamRoles.Remove(member); td.MemberCount = td.TeamRoles.Count; this.RoleId2JoinedTeam.Remove(roleid); CopyTeamKickoutData data = new CopyTeamKickoutData(); data.FromRoleId = td.LeaderRoleID; data.ToRoleId = roleid; data.TeamId = teamId; this.AddAsyncEvent(new AsyncDataItem { EventType = KuaFuEventTypes.KFCopyTeamKickout, Args = new object[] { 0, data } }); result = CopyTeamErrorCodes.Success; } } } } } catch (Exception ex) { LogManager.WriteLog(LogTypes.Error, string.Format("系统踢出跨服副本队伍异常, role={0}, teamid={1}", roleid, teamId), ex, true); result = CopyTeamErrorCodes.CenterServerFailed; } return(result); }
public KFCopyTeamStartRsp StartGame(KFCopyTeamStartReq req) { KFCopyTeamStartRsp rsp = new KFCopyTeamStartRsp(); try { lock (this.Mutex) { CopyTeamData td = null; if (!this.CopyTeamDict.TryGetValue(req.TeamId, out td)) { rsp.ErrorCode = CopyTeamErrorCodes.TeamIsDestoryed; return(rsp); } if (td.StartTime > 0L) { rsp.ErrorCode = CopyTeamErrorCodes.TeamAlreadyStart; return(rsp); } if (td.LeaderRoleID != req.RoleId) { rsp.ErrorCode = CopyTeamErrorCodes.NotTeamLeader; return(rsp); } CopyTeamMemberData leader = td.TeamRoles.Find((CopyTeamMemberData _role) => _role.RoleID == td.LeaderRoleID); if (leader == null || leader.RoleID != req.RoleId) { rsp.ErrorCode = CopyTeamErrorCodes.NotTeamLeader; return(rsp); } if (td.TeamRoles.Exists((CopyTeamMemberData _role) => !_role.IsReady)) { rsp.ErrorCode = CopyTeamErrorCodes.MemeberNotReady; return(rsp); } int kfSrvId; if (!ClientAgentManager.Instance().AssginKfFuben(GameTypes.KuaFuCopy, td.TeamID, td.TeamRoles.Count, out kfSrvId)) { rsp.ErrorCode = CopyTeamErrorCodes.KFServerIsBusy; return(rsp); } td.StartTime = TimeUtil.NOW(); td.KFServerId = kfSrvId; td.FuBenSeqID = 0; CopyTeamStartData data = new CopyTeamStartData(); data.TeamId = req.TeamId; data.StartMs = td.StartTime; data.ToServerId = kfSrvId; data.FuBenSeqId = td.FuBenSeqID; this.AddAsyncEvent(new AsyncDataItem { EventType = KuaFuEventTypes.KFCopyTeamStart, Args = new object[] { leader.ServerId, data } }); this.TimeLimitCopy[td.TeamID] = td.StartTime + (long)req.LastMs + 180000L; 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, true); rsp.ErrorCode = CopyTeamErrorCodes.CenterServerFailed; } return(rsp); }
/// <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); }
/// <summary> /// 加入房间 /// </summary> public KFCopyTeamJoinRsp JoinTeam(KFCopyTeamJoinReq req) { KFCopyTeamJoinRsp rsp = new KFCopyTeamJoinRsp(); try { lock (Mutex) { // 这里有个很微妙的情况,因为加入队伍时,首先GameServer要检查 // 但是如果GameServer重启了,那么必然能通过检查,但是其实在中心上已经为该角色加入了一个队伍,必须强制踢掉 ForceLeaveRoom(req.Member.RoleID); CopyTeamData td = null; if (!CopyTeamDict.TryGetValue(req.TeamId, out td)) { // 房间不存在!!! GameServer要检查这个错误码,可能出现的情况是 跨服中心重启了,那么GameServer要把这个房间清掉 rsp.ErrorCode = CopyTeamErrorCodes.TeamIsDestoryed; return(rsp); } if (td.StartTime > 0) { // 房间已经开始了 rsp.ErrorCode = CopyTeamErrorCodes.TeamAlreadyStart; return(rsp); } // 擦,写死了5个人 if (td.MemberCount >= ConstData.CopyRoleMax(req.CopyId)) { rsp.ErrorCode = CopyTeamErrorCodes.TeamIsFull; return(rsp); } req.Member.IsReady = false; td.TeamRoles.Add(req.Member); td.MemberCount = td.TeamRoles.Count; RoleId2JoinedTeam[req.Member.RoleID] = td.TeamID; // 异步广播加入队伍的事件 CopyTeamJoinData data = new CopyTeamJoinData(); data.Member = req.Member; data.TeamId = req.TeamId; AsyncDataItem evItem = new AsyncDataItem(); evItem.EventType = KuaFuEventTypes.KFCopyTeamJoin; 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}, teamid={2}", req.Member.ServerId, req.Member.RoleID, req.TeamId), ex); rsp.ErrorCode = CopyTeamErrorCodes.CenterServerFailed; } return(rsp); }
public KFCopyTeamSetFlagRsp TeamSetFlag(KFCopyTeamSetFlagReq req) { KFCopyTeamSetFlagRsp rsp = new KFCopyTeamSetFlagRsp(); try { lock (this.Mutex) { CopyTeamData td = null; if (!this.CopyTeamDict.TryGetValue(req.TeamId, out td)) { rsp.ErrorCode = CopyTeamErrorCodes.TeamIsDestoryed; return(rsp); } if (req.RoleId != td.LeaderRoleID) { rsp.ErrorCode = CopyTeamErrorCodes.NotTeamLeader; return(rsp); } CopyTeamMemberData member = td.TeamRoles.Find((CopyTeamMemberData _role) => _role.RoleID == req.RoleId); if (member == null) { rsp.ErrorCode = CopyTeamErrorCodes.NotInMyTeam; return(rsp); } if (td.StartTime > 0L) { rsp.ErrorCode = CopyTeamErrorCodes.Success; return(rsp); } if (req.AutoStart >= 0) { td.AutoStart = (req.AutoStart > 0); } if (req.AutoKick >= 0) { td.AutoKick = req.AutoKick; } CopyTeamFlagData data = new CopyTeamFlagData(); data.RoleId = req.RoleId; data.TeamId = req.TeamId; data.AutoStart = (td.AutoStart ? 1 : 0); data.AutoKick = td.AutoKick; this.AddAsyncEvent(new AsyncDataItem { EventType = KuaFuEventTypes.KFCopyTeamSetFlag, Args = new object[] { member.ServerId, data } }); 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, true); rsp.ErrorCode = CopyTeamErrorCodes.CenterServerFailed; } return(rsp); }
public KFCopyTeamCreateRsp CreateTeam(KFCopyTeamCreateReq req) { KFCopyTeamCreateRsp rsp = new KFCopyTeamCreateRsp(); try { lock (this.Mutex) { this.ForceLeaveRoom(req.Member.RoleID); if (!ClientAgentManager.Instance().IsAnyKfAgentAlive()) { rsp.ErrorCode = CopyTeamErrorCodes.KFServerIsBusy; return(rsp); } KFTeamCountControl control = this._KFCopyService.dbMgr.TeamControl; if (control == null) { LogManager.WriteLog(LogTypes.Error, string.Format("跨服队伍创建失败, 丢失副本上线控制的配置文件 KFTeamCountControl", new object[0]), null, true); rsp.ErrorCode = CopyTeamErrorCodes.ServerException; return(rsp); } HashSet <long> teamList = null; if (!this.CopyId2Teams.TryGetValue(req.CopyId, out teamList)) { teamList = new HashSet <long>(); this.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.AutoKick = req.AutoKick; td.TeamRoles.Add(req.Member); td.TeamRoles[0].IsReady = true; td.TeamName = td.TeamRoles[0].RoleName; td.MemberCount = td.TeamRoles.Count; this.CopyTeamDict.Add(td.TeamID, td); teamList.Add(td.TeamID); this.TimeLimitCopy.Add(td.TeamID, TimeUtil.NOW() + (long)(control.TeamMaxWaitMinutes * 60 * 1000)); this.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; data.AutoKick = req.AutoKick; this.AddAsyncEvent(new AsyncDataItem { EventType = KuaFuEventTypes.KFCopyTeamCreate, Args = new object[] { req.Member.ServerId, data } }); 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, true); rsp.ErrorCode = CopyTeamErrorCodes.CenterServerFailed; } return(rsp); }