Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 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
                 }
             });
         }
     }
 }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 /// <summary>
 /// 添加项
 /// </summary>
 /// <param name="?"></param>
 /// <param name="ed"></param>
 public void AddData(int teamID, CopyTeamData td)
 {
     lock (_TeamDataDict)
     {
         _TeamDataDict[teamID] = td;
     }
 }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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
        }
Esempio n. 9
0
        /// <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);
        }
Esempio n. 10
0
        /// <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);
        }
Esempio n. 11
0
        public CopyTeamData GetTeamData(long teamid)
        {
            lock (Mutex)
            {
                CopyTeamData td = null;
                if (!CopyTeamDict.TryGetValue(teamid, out td))
                {
                    return(null);
                }

                return(td);
            }
        }
Esempio n. 12
0
        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);
        }
Esempio n. 13
0
        /// <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);
            }
        }
Esempio n. 14
0
        /// <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, "");
            }
        }
Esempio n. 15
0
 /// <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);
             }
         }
     }
 }
Esempio n. 16
0
        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);
        }
Esempio n. 17
0
        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);
        }
Esempio n. 18
0
        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);
            }
        }
Esempio n. 19
0
        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);
            }
        }
Esempio n. 20
0
        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);
        }
Esempio n. 21
0
        /// <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);
        }
Esempio n. 22
0
        /// <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);
        }
Esempio n. 23
0
        /// <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);
        }
Esempio n. 24
0
        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);
        }
Esempio n. 25
0
        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);
        }
Esempio n. 26
0
        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);
        }
Esempio n. 27
0
        /// <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);
        }
Esempio n. 28
0
        /// <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);
        }
Esempio n. 29
0
        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);
        }
Esempio n. 30
0
        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);
        }