Пример #1
0
 public void CheckLogAsyncEvents(AsyncDataItem[] evList)
 {
     if (evList != null)
     {
         foreach (AsyncDataItem ev in evList)
         {
             string sql = string.Empty;
             try
             {
                 if (ev.EventType == KuaFuEventTypes.KFCopyTeamCreate)
                 {
                     CopyTeamCreateData data = ev.Args[1] as CopyTeamCreateData;
                     sql = string.Format("INSERT INTO t_kuafu_fuben_game_team(teamid,copyid,by_serverid,by_roleid,createtime) VALUES({0},{1},{2},{3},'{4}')", new object[]
                     {
                         data.TeamId,
                         data.CopyId,
                         data.Member.ServerId,
                         data.Member.RoleID,
                         TimeUtil.NowDateTime().ToString("yyyy-MM-dd HH:mm:ss")
                     });
                 }
                 else if (ev.EventType == KuaFuEventTypes.KFCopyTeamStart)
                 {
                     CopyTeamStartData data2 = ev.Args[1] as CopyTeamStartData;
                     sql = string.Format("UPDATE t_kuafu_fuben_game_team SET starttime='{0}', kf_serverid={1} WHERE teamid={2}", TimeUtil.NowDateTime().ToString("yyyy-MM-dd HH:mm:ss"), data2.ToServerId, data2.TeamId);
                 }
                 else if (ev.EventType == KuaFuEventTypes.KFCopyTeamDestroty)
                 {
                     CopyTeamDestroyData data3 = ev.Args[0] as CopyTeamDestroyData;
                     sql = string.Format("UPDATE t_kuafu_fuben_game_team SET endtime='{0}' WHERE teamid={1}", TimeUtil.NowDateTime().ToString("yyyy-MM-dd HH:mm:ss"), data3.TeamId);
                 }
             }
             catch (Exception ex)
             {
                 LogManager.WriteLog(LogTypes.Error, "KuaFuCopyDbMgr.CheckLogAsyncEvents Failed!!!", ex, true);
             }
             if (!string.IsNullOrEmpty(sql))
             {
                 this.ExecuteSqlNoQuery(sql);
             }
         }
     }
 }
Пример #2
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);
        }
Пример #3
0
 public KFCopyRoomCreateEvent(CopyTeamCreateData data)
     : base((int)GlobalEventTypes.KFCopyTeamCreate)
 {
     this.Data = data;
 }
Пример #4
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);
        }
Пример #5
0
        /// <summary>
        /// 队伍创建回调
        /// </summary>
        /// <param name="data"></param>
        private void OnTeamCreate(CopyTeamCreateData data)
        {
            if (data == null)
            {
                return;
            }

            bool isKuaFuCopy = IsKuaFuCopy(data.CopyId);

            CopyTeamData td = new CopyTeamData();

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

            lock (Mutex)
            {
                TeamDict[td.TeamID] = td;

                HashSet <long> teams = null;
                if (FuBenId2Teams.TryGetValue(td.FuBenId, out teams) && !teams.Contains(td.TeamID))
                {
                    teams.Add(td.TeamID);
                }

                if (data.Member.ServerId == ThisServerId)
                {
                    RoleId2JoinedTeam[data.Member.RoleID] = td.TeamID;

                    GameClient client = GameManager.ClientMgr.FindClient(data.Member.RoleID);
                    if (client != null)
                    {
                        NotifyTeamCmd(client, CopyTeamErrorCodes.Success, (int)TeamCmds.Create, td.TeamID, td.TeamName);
                    }
                }

                NotifyTeamData(td);
                NotifyTeamListChange(td);
            }

            /*
             * int roleID = client.ClientData.RoleID;
             * long teamID = FindRoleID2TeamID(roleID);
             * if (teamID > 0)
             * {
             *  QuitFromTeam(client);
             * }
             *
             * teamID = GetNextAutoID();
             * AddRoleID2TeamID(roleID, teamID);
             *
             * CopyTeamData td = new CopyTeamData()
             * {
             *  TeamID = teamID,
             *  LeaderRoleID = roleID,
             *  SceneIndex = copyId,
             *  MinZhanLi = minCombat,
             *  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);*/
        }