Пример #1
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);
        }
Пример #2
0
 public KFCopyRoomReadyEvent(CopyTeamReadyData data)
     : base((int)GlobalEventTypes.KFCopyTeamReady)
 {
     this.Data = data;
 }
Пример #3
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);
        }
Пример #4
0
        /// <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);
             *  }
             * }*/
        }