Beispiel #1
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);
        }
Beispiel #2
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);
        }
        /// <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);
        }
Beispiel #5
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);
        }
Beispiel #6
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);
        }
Beispiel #7
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);
        }
Beispiel #8
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);
        }
Beispiel #9
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);
        }
Beispiel #10
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);
        }
Beispiel #11
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);
        }
Beispiel #12
0
        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);
        }
Beispiel #13
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);
             *  }
             * }*/
        }
Beispiel #14
0
        /// <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);
             * }
             * */
        }
Beispiel #15
0
        /// <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);
             */
        }