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); }
/// <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 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> /// 将ClientData 类型转换为 TeamMemberData类型(组队时使用) /// </summary> /// <param name="clientData"></param> /// <returns></returns> public CopyTeamMemberData ClientDataToTeamMemberData(SafeClientData clientData) { CopyTeamMemberData teamMemberData = new CopyTeamMemberData() { RoleID = clientData.RoleID, RoleName = Global.FormatRoleName2(clientData, clientData.RoleName), RoleSex = clientData.RoleSex, Level = clientData.Level, Occupation = clientData.Occupation, RolePic = clientData.RolePic, MapCode = clientData.MapCode, OnlineState = 1, MaxLifeV = clientData.LifeV, CurrentLifeV = clientData.CurrentLifeV, MaxMagicV = clientData.MagicV, CurrentMagicV = clientData.CurrentMagicV, PosX = clientData.PosX, PosY = clientData.PosY, CombatForce = clientData.CombatForce, ChangeLifeLev = clientData.ChangeLifeCount, }; return(teamMemberData); }
/// <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 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); }
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 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 KFCopyTeamKickoutRsp KickoutTeam(KFCopyTeamKickoutReq req) { KFCopyTeamKickoutRsp rsp = new KFCopyTeamKickoutRsp(); 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.FromRoleId) { rsp.ErrorCode = CopyTeamErrorCodes.NotTeamLeader; return(rsp); } CopyTeamMemberData leader = td.TeamRoles.Find((CopyTeamMemberData _role) => _role.RoleID == td.LeaderRoleID); if (leader == null || leader.RoleID != req.FromRoleId) { rsp.ErrorCode = CopyTeamErrorCodes.NotTeamLeader; return(rsp); } CopyTeamMemberData member = td.TeamRoles.Find((CopyTeamMemberData _role) => _role.RoleID == req.ToRoleId); if (member == null) { rsp.ErrorCode = CopyTeamErrorCodes.NotInMyTeam; return(rsp); } td.TeamRoles.Remove(member); td.MemberCount = td.TeamRoles.Count; this.RoleId2JoinedTeam.Remove(req.ToRoleId); CopyTeamKickoutData data = new CopyTeamKickoutData(); data.FromRoleId = req.FromRoleId; data.ToRoleId = req.ToRoleId; data.TeamId = req.TeamId; this.AddAsyncEvent(new AsyncDataItem { EventType = KuaFuEventTypes.KFCopyTeamKickout, Args = new object[] { leader.ServerId, data } }); 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, true); rsp.ErrorCode = CopyTeamErrorCodes.CenterServerFailed; } return(rsp); }
/// <summary> /// 设置准备状态 回调 /// </summary> /// <param name="data"></param> private void OnTeamSetReady(CopyTeamReadyData data) { if (data == null) { return; } lock (Mutex) { CopyTeamData td = null; if (!TeamDict.TryGetValue(data.TeamId, out td)) { return; } CopyTeamMemberData member = td.TeamRoles.Find(_role => _role.RoleID == data.RoleId); if (member == null) { return; } member.IsReady = data.Ready > 0; if (member.ServerId == ThisServerId) { GameClient client = GameManager.ClientMgr.FindClient(member.RoleID); if (client != null) { NotifyTeamStateChanged(client, td.TeamID, member.RoleID, data.Ready); } } NotifyTeamData(td); // 满员了,所有人都已经准备,那么就开吧 if (member.IsReady && td.AutoStart && td.MemberCount >= ConstData.CopyRoleMax(td.FuBenId) && td.TeamRoles.All(_role => _role.IsReady)) { CopyTeamMemberData leader = td.TeamRoles.Find(_role => _role.RoleID == td.LeaderRoleID); if (leader != null && leader.ServerId == ThisServerId) { GameClient client = GameManager.ClientMgr.FindClient(leader.RoleID); if (client != null) { NotifyTeamCmd(client, CopyTeamErrorCodes.Success, (int)TeamCmds.Start, 0, ""); } } } } /* * //int teamType = (int)TeamCmds.Ready; * int roleID = client.ClientData.RoleID; * long teamID = FindRoleID2TeamID(client.ClientData.RoleID); * if (teamID <= 0) * { * * } * * CopyTeamData td = FindData(teamID); * if (null != td) * { * int readyCount = 0; * bool someoneOffline = false; * lock (td) * { * for (int i = 0; i < td.TeamRoles.Count; i++) * { * GameClient gc; * if (td.TeamRoles[i].RoleID == roleID) * { * td.TeamRoles[i].IsReady = ready > 0; //更新状态 * gc = client; * } * else * { * gc = GameManager.ClientMgr.FindClient(td.TeamRoles[i].RoleID); * } * * if (null == gc) * { * td.TeamRoles[i].IsReady = false; * someoneOffline = true; * continue; * } * * //状态变化通知 * NotifyTeamStateChanged(gc, teamID, roleID, ready); * * if (!someoneOffline && td.TeamRoles[i].IsReady && td.AutoStart) * { * readyCount++; * if (readyCount == MaxTeamMemberCount) * { * GameClient leader = GameManager.ClientMgr.FindClient(td.LeaderRoleID); * NotifyTeamCmd(leader, CopyTeamErrorCodes.Success, (int)TeamCmds.Start, 0, ""); * } * } * } * } * * if (someoneOffline) * { * NotifyTeamData(td); * } * }*/ }
/// <summary> /// 离开队伍回调 /// </summary> /// <param name="data"></param> private void OnTeamLeave(CopyTeamLeaveData data) { if (data == null) { return; } lock (Mutex) { CopyTeamData td = null; if (!TeamDict.TryGetValue(data.TeamId, out td)) { return; } CopyTeamMemberData member = td.TeamRoles.Find(_role => _role.RoleID == data.RoleId); if (member == null) { return; } td.TeamRoles.Remove(member); td.MemberCount = td.TeamRoles.Count; if (td.MemberCount <= 0) { td.LeaderRoleID = -1; OnTeamDestroy(new CopyTeamDestroyData() { TeamId = 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; } } if (member.ServerId == ThisServerId) { RoleId2JoinedTeam.Remove(member.RoleID); GameClient client = GameManager.ClientMgr.FindClient(member.RoleID); if (client != null) { NotifyTeamStateChanged(client, (int)CopyTeamErrorCodes.LeaveTeam, member.RoleID, 0); } } NotifyTeamData(td); NotifyTeamListChange(td); } /* * int roleID = client.ClientData.RoleID; * long teamID = FindRoleID2TeamID(client.ClientData.RoleID); * if (teamID <= 0) //如果没有队伍 * { * return; * } * * //查找组队的数据 * CopyTeamData td = FindData(teamID); * if (null == td) //没有找到组队数据 * { * //清空组队ID * RemoveRoleID2TeamID(roleID); * return; * } * * bool updateTeamList = false; * bool destroy = false; * lock (td) * { * if (td.TeamRoles.Count > 1) //转交队长 * { * for (int i = 0; i < td.TeamRoles.Count; i++) * { * if (td.TeamRoles[i].RoleID == client.ClientData.RoleID) * { * td.TeamRoles.RemoveAt(i); * break; * } * } * * //判断是否是队长 * if (td.LeaderRoleID == client.ClientData.RoleID) * { * td.LeaderRoleID = td.TeamRoles[0].RoleID; //转交队长 * td.TeamRoles[0].IsReady = true; * td.TeamName = td.TeamRoles[0].RoleName; * } * td.MemberCount = td.TeamRoles.Count; * } * else * { * destroy = true; * td.LeaderRoleID = -1; //强迫解散 * td.TeamRoles.Clear(); * updateTeamList = true; * } * td.MemberCount = td.TeamRoles.Count; * * if (td.StartTime == 0) * { * updateTeamList = true; * } * } * * if (destroy) * { * //删除组队数据 * RemoveData(teamID); * } * * //清空组队ID * RemoveRoleID2TeamID(roleID); * * //发送队伍状态 * NotifyTeamStateChanged(client, CopyTeamErrorCodes.LeaveTeam, roleID, 0); * * if (notifyOther) * { * //通知组队数据的指令信息 * NotifyTeamData(td); //发送null数据,强迫组队解散 * } * * if (updateTeamList) * { * //组队状态变化通知 * NotifyTeamListChange(td); * } * */ }
/// <summary> /// 踢出队伍回调 /// </summary> /// <param name="data"></param> private void OnTeamKickout(CopyTeamKickoutData data) { if (data == null) { return; } lock (Mutex) { CopyTeamData td = null; if (!TeamDict.TryGetValue(data.TeamId, out td)) { return; } CopyTeamMemberData member = td.TeamRoles.Find(_role => _role.RoleID == data.ToRoleId); if (member == null) { return; } td.TeamRoles.Remove(member); td.MemberCount = td.TeamRoles.Count; if (member.ServerId == ThisServerId) { RoleId2JoinedTeam.Remove(member.RoleID); GameClient client = GameManager.ClientMgr.FindClient(member.RoleID); if (client != null) { NotifyTeamStateChanged(client, (int)CopyTeamErrorCodes.BeRemovedFromTeam, member.RoleID, 0); } } NotifyTeamData(td); NotifyTeamListChange(td); } /* * bool destroy = false; * lock (td) * { * //判断是否是队长 * if (td.LeaderRoleID != client.ClientData.RoleID) * { * //通知角色组队的指令信息 * * } * * if (td.TeamRoles.Count > 1) //转交队长 * { * for (int i = 0; i < td.TeamRoles.Count; i++) * { * if (td.TeamRoles[i].RoleID == otherRoleID) * { * td.TeamRoles.RemoveAt(i); * break; * } * } * * //判断是否是队长 * if (td.LeaderRoleID == client.ClientData.RoleID) * { * td.LeaderRoleID = td.TeamRoles[0].RoleID; //转交队长 * td.TeamRoles[0].IsReady = true; * td.TeamName = td.TeamRoles[0].RoleName; * } * } * else * { * destroy = true; * td.TeamRoles.Clear(); * td.LeaderRoleID = -1; //强迫解散 * } * td.MemberCount = td.TeamRoles.Count; * } * * if (destroy) * { * //删除组队数据 * RemoveData(teamID); * } * * //通知组队数据的指令信息 * NotifyTeamData(td); //发送null数据,强迫组队解散 * * //清空组队ID * RemoveRoleID2TeamID(otherRoleID); * * GameClient otherClient = GameManager.ClientMgr.FindClient(otherRoleID); * if (null != otherClient) * { * NotifyTeamStateChanged(otherClient, CopyTeamErrorCodes.BeRemovedFromTeam, otherRoleID, 0); * } * * NotifyTeamListChange(td); */ }