local XExFubenSimulationChallengeManager = require("XEntity/XFuben/XExFubenSimulationChallengeManager") --- --- 竞技副本管理器 --- XArenaManagerCreator = function() local XArenaManager = XExFubenSimulationChallengeManager.New(XFubenConfigs.ChapterType.ARENA) local SYNC_RANK_LIST_SECOND = 60 --获取排行榜List请求保护时间 local SYNC_HALL_SECOND = 5 --获取其他请求保护时间 local SYNC_OTHER_SECOND = 15 --获取其他请求保护时间 local SYNC_GOURP_MEMBER_SECOND = 10 --请求小队排行保护时间 local LastSyncRankListTime = 0 --排行榜List最后刷新时间 local LastHallTeamListTime = 0 --大厅队伍列表最后刷新时间 local LastHallPlayerListTime = 0 --大厅个人玩家列表最后刷新时间 local LastFriendPlayerTime = 0 --请求好友竞技信息最后刷新时间 local LasGroupMemberTime = 0 --请求小队排信息最后刷新时间 --队伍数据 local HallTeamMap = {} --大厅队伍 local HallPlayerMap = {} --大厅玩家 local FriendMap = {} --好友列表 local TeamInfo = nil --队伍信息 local ApplyMap = {} --申请列表 local InviteMap = {} --邀请列表 local HaveToRequestApplyData = -1 local APPLY_TYPE = { TEAM = 1, --自己有队伍 SINGLE = 2, --自己无队伍 } --竞技全局数据 local ActivityNo = 0 -- 活动编号 local LastActivityNo = 0 -- 上一期活动编号 local ActivityStatus = XArenaActivityStatus.Default --当前活动状态 local CountDownTime = 0 -- 进入下一阶段倒计时 local TeamStartTime = 0 -- 组队期开始时间 local FightStartTime = 0 -- 战斗期开始时间 local ResultStartTime = 0 -- 结算期开始时间 local WaveRate = 0 -- 波动指数 local WaveLastRate = 0 -- 上一期波动指数 local GroupFightEvent = nil --战区Buff --竞技排行数据 local PlayerResultRankList = {} -- 该段位玩家排行 local PlayerLoaclResultRanlList = nil -- 该段位玩家排行(本地数据) local PlayerLastResultRanlList = {} -- 该段位上一期玩家排行 local TeamRankChallengeId = 0 -- 队伍排行榜的挑战ID local TeamRankData = {} -- 队伍排行 local TeamResultList = {} -- 该段位队员成绩 local TeamLastResultList = nil -- 该段位队员上一期成绩 -- local AreaIdToStageDetailList = {} -- 各战区玩家通关详情 local LastDataRespone = nil --竞技个人数据 local ChallengeId = 0 -- 挑战Id(根据玩家等级与竞技段位决定) local ContributeScore = 0 -- 当前战区贡献总分 local LastChallengeId = 0 -- 上一期挑战Id(根据玩家等级与竞技段位决定) local ArenaLevel = 0 -- 竞技段位 local LastArenaLevel = 0 -- 上一期竞技段位 local LastContributeScore = 0 --上一期战区贡献分 local IsJoinActivity = false -- 是否已报名 local UnlockCount = 0 -- 剩余解锁次数 local TotalPoint = 0 -- 总分数 local AreaDatas = {} -- 战区信息列表 local ArenaActivityResultData = nil --竞技奖励缓存数据 local ArenaStatusInFightChangeCache = false -- 竞技状态改变是否在战斗中缓存 local EnterAreaStageInfo = {} -- 进入战斗的区域信息 local MaxPointStageDic = {} -- 已经通关的满分列表 local ArenaRequest = { RequestMyTeamInfo = "MyTeamRequest", -- 获取我的队伍信息 RequestHallTeamList = "HallTeamRequest", -- 获取大厅队伍列表 RequestHallPlayerList = "HallPlayerRequest", -- 获取大厅个人玩家列表 RequestApplyData = "ApplyDataRequest", -- 获取邀请申请信息列表 RequestFriendArenaInfo = "FriendPlayerRequest", -- 请求好友竞技信息 RequestCreateTeam = "CreateTeamRequest", -- 请求创建队伍 RequestApplyTeam = "ApplyTeamRequest", -- 申请入队 RequestRefuseApply = "RefuseApplyRequest", -- 拒绝申请 RequestAcceptApply = "AcceptApplyRequest", -- 接受申请 RequestLeaveTeam = "LeaveTeamRequest", -- 请求离队 RequestKickTeam = "KickTeamRequest", -- 请求踢人 RequestInvitePlayer = "InvitePlayerRequest", -- 邀请玩家 RequestRefuseInvite = "PersonalRefuseRequest", -- 拒绝邀请 RequestAcceptInvite = "PersonalAcceptRequest", -- 接受邀请 RequestSignUpArena = "JoinActivityRequest", -- 报名参加竞技活动 RequestGroupMember = "GroupMemberRequest", -- 请求主页面成员信息 RequestAreaData = "AreaDataRequest", -- 请求区域信息 RequestStagePassDetail = "StagePassDetailRequest", -- 请求通关详情 RequestUnlockArea = "UnlockAreaRequest", -- 请求解锁战区 RequestTeamRankData = "TeamRankDataRequest", -- 请求队伍排行 ScoreQueryReq = "ScoreQueryRequest", -- 请求上一期主页面成员信息 AreaAutoFightRequest = "AreaAutoFightRequest", ArenaChallengeGetRankRequest = "ArenaChallengeGetRankRequest", --根据ChallengeId获取个人排行榜 } ----------------------------Team start-------------------------- --监听UI界面打开事件 --function XArenaManager.Init() -- CsXGameEventManager.Instance:RegisterEvent(CS.XEventId.EVENT_UI_ENABLE, function(_, ui) -- XArenaManager.OpenArenaActivityResult(ui[0].UiData.UiName) -- end) --end -- 打开竞技奖励界面 function XArenaManager.OpenArenaActivityResult() if ArenaActivityResultData == nil then return end XLuaUiManager.Open("UiArenaActivityResult", ArenaActivityResultData, function() ArenaActivityResultData = nil end) end function XArenaManager.GetGroupFightEvent() return GroupFightEvent end function XArenaManager.GetActivityNo() return ActivityNo end function XArenaManager.GetChallengeId() return ChallengeId end -- 检测竞技奖励界面 function XArenaManager.CheckOpenArenaActivityResult() if ArenaActivityResultData == nil then return false end XLuaUiManager.Open("UiArenaActivityResult", ArenaActivityResultData, function() ArenaActivityResultData = nil end, function() XEventManager.DispatchEvent(XEventId.EVENT_ARENA_RESULT_CLOSE) end) return true end -- 处理竞技活动结果 function XArenaManager.HandleArenaActivityResult(data) ArenaLevel = data.NewArenaLevel ContributeScore = data.ContributeScore ArenaActivityResultData = data end -- 获取我队队伍Id function XArenaManager.GetTeamId() if not TeamInfo then return 0 end return TeamInfo.TeamId or 0 end -- 检测指定玩家是否是我队队长 function XArenaManager.CheckPlayerIsCaptain(Id) if not Id then return false end if Id == 0 then return false end if not TeamInfo then return false end local captain = TeamInfo.Captain or 0 return captain == Id end -- 检测自己是否是我队队长 function XArenaManager.CheckSelfIsCaptain() return XArenaManager.CheckPlayerIsCaptain(XPlayer.Id) end -- 获取我的队伍成员列表 function XArenaManager.GetMyTeamMemberList() if not TeamInfo then return {} end return TeamInfo.ShowList end -- 获取大厅玩家列表 function XArenaManager.GetHallPlayerList() local list = {} if HallPlayerMap then for _, v in pairs(HallPlayerMap) do table.insert(list, v) end end return list end -- 获取大厅队伍列表 function XArenaManager.GetHallTeamList() local list = {} if HallTeamMap then for _, v in pairs(HallTeamMap) do table.insert(list, v) end end return list end -- 获取申请数据列表 function XArenaManager.GetApplyDataList() local teamId = XArenaManager.GetTeamId() local list = {} if teamId > 0 then if XArenaManager.CheckSelfIsCaptain() then for _, v in pairs(ApplyMap) do table.insert(list, v) end return list else return list end else for _, v in pairs(InviteMap) do table.insert(list, v) end return list end end -- 检测是否有申请数据 function XArenaManager.CheckHaveApplyData() local list = XArenaManager.GetApplyDataList() return #list > 0 or HaveToRequestApplyData > 0 end -- 获取竞技好友列表 function XArenaManager.GetArenaFriendList() local list = {} if FriendMap then for _, v in pairs(FriendMap) do table.insert(list, v) end end table.sort(list, function(a, b) local isSameIdA = ChallengeId == a.ChallengeId local isSameIdB = ChallengeId == b.ChallengeId if isSameIdA ~= isSameIdB then return isSameIdA end local isEnterFightA = a.ChallengeId > 0 local isEnterFightB = b.ChallengeId > 0 if isEnterFightA ~= isEnterFightB then return isEnterFightB end return a.Info.Id > b.Info.Id end) return list end -- 处理被队长踢出队伍 function XArenaManager.HandleIsKickedByCaptain() TeamInfo = {} XEventManager.DispatchEvent(XEventId.EVENT_ARENA_TEAM_CHANGE) end -- 收到新申请信息 function XArenaManager.HandleNewApplyData() HaveToRequestApplyData = 1 XEventManager.DispatchEvent(XEventId.EVENT_ARENA_TEAM_NEW_APPLY_ENTER) end -- 处理队伍信息 function XArenaManager.HandleTeamInfo(info) if (not TeamInfo or not TeamInfo.TeamId) and info.TeamId > 0 and HaveToRequestApplyData > 0 then HaveToRequestApplyData = 0 end TeamInfo = info XEventManager.DispatchEvent(XEventId.EVENT_ARENA_TEAM_CHANGE) end -- 处理大厅队伍列表 function XArenaManager.HandleHallTeamList(data) HallTeamMap = {} for _, v in ipairs(data.TeamList) do HallTeamMap[v.Info.TeamId] = v end end -- 处理大厅玩家列表 function XArenaManager.HandleHallPlayerList(data) HallPlayerMap = {} for _, v in ipairs(data.PlayerList) do HallPlayerMap[v.Info.Id] = v end end -- 处理好友列表 function XArenaManager.HandleFriendList(data) FriendMap = {} if data and data.FriendPlayerList then for _, v in ipairs(data.FriendPlayerList) do --TODO 筛选相同段位的 FriendMap[v.Info.Id] = v end end end -- 处理邀请申请信息列表 function XArenaManager.HandleApplyData(data) if not data then return end ApplyMap = {} InviteMap = {} local map = {} for _, v in ipairs(data.ApplyList) do map[v.Id] = v end if data.ApplyType == APPLY_TYPE.SINGLE then --队伍邀请信息列表 InviteMap = map elseif data.ApplyType == APPLY_TYPE.TEAM then --玩家请求消息列表 ApplyMap = map end XEventManager.DispatchEvent(XEventId.EVENT_ARENA_TEAM_RECEIVE_APPLY_DATA) end -- 检查是否在组队期状态 function XArenaManager.CheckInTeamState() return ActivityStatus == XArenaActivityStatus.Rest end -- 检查是否在战斗期状态 function XArenaManager.CheckInFightState() return ActivityStatus == XArenaActivityStatus.Fight end -- 检查玩家是否可以打纷争战区副本 function XArenaManager.IsPlayerCanEnterFight() local isOpen = XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.FubenArena) return isOpen and XArenaManager.CheckInFightState() end -- 获取我的队伍信息 function XArenaManager.RequestMyTeamInfo(cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end if TeamInfo then if cb then cb() end return end XNetwork.Call(ArenaRequest.RequestMyTeamInfo, nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XArenaManager.HandleTeamInfo(res.MyTeam) if cb then cb() end end) end -- 请求大厅队伍列表 function XArenaManager.RequestHallTeamList(cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end -- 请求间隔保护 local now = XTime.GetServerNowTimestamp() if LastHallTeamListTime + SYNC_HALL_SECOND >= now then if cb then cb() end return end LastHallTeamListTime = now --TODO 受刷新时间限制 XNetwork.Call(ArenaRequest.RequestHallTeamList, nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XArenaManager.HandleHallTeamList(res.HallTeamData) if cb then cb() end end) end -- 请求大厅玩家列表 function XArenaManager.RequestHallPlayerList(cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end -- 请求间隔保护 local now = XTime.GetServerNowTimestamp() if LastHallPlayerListTime + SYNC_HALL_SECOND >= now then if cb then cb() end return end LastHallPlayerListTime = now --TODO 受刷新时间限制 XNetwork.Call(ArenaRequest.RequestHallPlayerList, nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XArenaManager.HandleHallPlayerList(res.HallPlayerData) if cb then cb() end end) end -- 获取邀请申请信息列表 function XArenaManager.RequestApplyData(cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end --TODO 受刷新时间限制 XNetwork.Call(ArenaRequest.RequestApplyData, nil, function(res) HaveToRequestApplyData = 0 if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XArenaManager.HandleApplyData(res.ApplyData) if cb then cb() end end) end -- 获取所有好友竞技信息 function XArenaManager.RequestFriendArenaInfo(cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end -- 请求间隔保护 local now = XTime.GetServerNowTimestamp() if LastFriendPlayerTime + SYNC_OTHER_SECOND >= now then if cb then cb() end return end LastFriendPlayerTime = now XNetwork.Call(ArenaRequest.RequestFriendArenaInfo, nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XArenaManager.HandleFriendList(res.FriendPlayerData) if cb then cb() end end) end -- 请求创建队伍 function XArenaManager.RequestCreateTeam(cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end XNetwork.Call(ArenaRequest.RequestCreateTeam, nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 申请入队 function XArenaManager.RequestApplyTeam(teamId, cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end XNetwork.Call(ArenaRequest.RequestApplyTeam, { TeamId = teamId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local info = HallTeamMap[teamId] if info then info.Apply = 1 end if cb then cb() end end) end -- 拒绝申请 function XArenaManager.RequestRefuseApply(targetId, cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end XNetwork.Call(ArenaRequest.RequestRefuseApply, { TargetId = targetId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end ApplyMap[targetId] = nil XEventManager.DispatchEvent(XEventId.EVENT_ARENA_TEAM_APPLY_CHANGE) if cb then cb() end end) end -- 接受申请 function XArenaManager.RequestAcceptApply(targetId, cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end XNetwork.Call(ArenaRequest.RequestAcceptApply, { TargetId = targetId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end ApplyMap[targetId] = nil XEventManager.DispatchEvent(XEventId.EVENT_ARENA_TEAM_APPLY_CHANGE) if cb then cb() end end) end -- 请求离队 function XArenaManager.RequestLeaveTeam(cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end XNetwork.Call(ArenaRequest.RequestLeaveTeam, nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end TeamInfo = {} if HaveToRequestApplyData > 0 then HaveToRequestApplyData = 0 end XEventManager.DispatchEvent(XEventId.EVENT_ARENA_TEAM_INITIATIVE_LEAVE) if cb then cb() end end) end -- 踢除队员 function XArenaManager.RequestKickTeam(targetId, cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end XNetwork.Call(ArenaRequest.RequestKickTeam, { TargetId = targetId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 邀请玩家入队 function XArenaManager.RequestInvitePlayer(targetId, cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end XNetwork.Call(ArenaRequest.RequestInvitePlayer, { TargetId = targetId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local info = HallPlayerMap[targetId] if info then info.Invite = 1 end local friend = FriendMap[targetId] if friend then friend.Invite = 1 end if cb then cb() end end) end -- 拒绝邀请 function XArenaManager.RequestRefuseInvite(targetId, cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end XNetwork.Call(ArenaRequest.RequestRefuseInvite, { TargetId = targetId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end InviteMap[targetId] = nil XEventManager.DispatchEvent(XEventId.EVENT_ARENA_TEAM_APPLY_CHANGE) if cb then cb() end end) end -- 接受邀请 function XArenaManager.RequestAcceptInvite(targetId, cb) if ActivityStatus ~= XArenaActivityStatus.Rest then XUiManager.TipText("ArenaActivityStatusWrong") return end XNetwork.Call(ArenaRequest.RequestAcceptInvite, { TargetId = targetId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end InviteMap[targetId] = nil XEventManager.DispatchEvent(XEventId.EVENT_ARENA_TEAM_APPLY_CHANGE) if cb then cb() end end) end -- 保存排名到本地 function XArenaManager.SaveResultToLocal() if ActivityNo <= 0 then return end local key = XPrefs.ArenaTeamResult .. tostring(XPlayer.Id) local value = tostring(ActivityNo) .. "|" for i, info in ipairs(PlayerResultRankList) do value = value .. tostring(info.Id) if i < #PlayerResultRankList then value = value .. "|" end end CS.UnityEngine.PlayerPrefs.SetString(key, value) CS.UnityEngine.PlayerPrefs.Save() end -- 获取本地排名数据 function XArenaManager.GetResultFormLocal(playerId) PlayerLoaclResultRanlList = {} local key = XPrefs.ArenaTeamResult .. tostring(XPlayer.Id) if not CS.UnityEngine.PlayerPrefs.HasKey(key) then return nil end local value = CS.UnityEngine.PlayerPrefs.GetString(key) local strs = string.Split(value) if not strs or #strs < 2 then return nil end if tonumber(strs[1]) ~= LastActivityNo then return nil end for i=2, #strs do PlayerLoaclResultRanlList[tonumber(strs[i])] = i - 1 end return PlayerLoaclResultRanlList[playerId] or nil end ----------------------------Team end-------------------------- ----------------------------Arena start-------------------------- -- 获取活动状态 function XArenaManager.GetArenaActivityStatus() return ActivityStatus end -- 获取进入下一阶段时间戳 function XArenaManager.GetEnterNextStatusTime() return CountDownTime end -- 获取功能开启时间 local GetTimeStr = function(time) if not time or time <= 0 then return "" end local str = XTime.TimestampToGameDateTimeString(time, "yy/MM/dd HH:mm") return str end -- 获取组队期开始时间 function XArenaManager.GetTeamStartTime() return GetTimeStr(TeamStartTime) end -- 获取战斗期开始时间 function XArenaManager.GetFightStartTime() return GetTimeStr(FightStartTime) end -- 获取结算期开始时间 function XArenaManager.GetResultStartTime() return GetTimeStr(ResultStartTime) end -- 获取当前的竞技段位 function XArenaManager.GetCurArenaLevel() return ArenaLevel end -- 获取上一期的竞技段位 function XArenaManager.GetLastArenaLevel() return LastArenaLevel end -- 获取上一期战区贡献分 function XArenaManager.GetLastContributeScore() return LastContributeScore end -- 获取波动指数 function XArenaManager.GetWaveRate() return WaveRate end -- 获取上一期波动指数 function XArenaManager.GetWaveLastRate() return WaveLastRate end -- 获取当前挑战id function XArenaManager.GetCurChallengeId() return ChallengeId end -- 获取当前战区贡献总分 function XArenaManager.GetContributeScore() return ContributeScore end -- 获取当前挑战配置 function XArenaManager.GetCurChallengeCfg() return XArenaConfigs.GetChallengeArenaCfgById(ChallengeId) end -- 获取上一期挑战配置 function XArenaManager.GetLastChallengeCfg() return XArenaConfigs.GetChallengeArenaCfgById(LastChallengeId) end -- 获取竞技挑战最高等级 function XArenaManager.IsMaxArenaLevel(level) return level >= XArenaConfigs.GetChallengeMaxArenaLevel(ChallengeId) end -- 获取玩家竞技信息 function XArenaManager.GetPlayerArenaInfo() for _, info in ipairs(TeamResultList) do if info.Id == XPlayer.Id then return info end end end -- 获取玩家上一期竞技信息 function XArenaManager.GetPlayerLastArenaInfo() for _, info in ipairs(TeamLastResultList or {}) do if info.Id == XPlayer.Id then return info end end end -- 获取玩家竞技个人排名 function XArenaManager.GetPlayerArenaRankAndRegion() local rank = 0 local point = 0 local region = XArenaPlayerRankRegion.DownRegion for i, info in ipairs(PlayerResultRankList) do if info.Id == XPlayer.Id then rank = i point = info.Point end end if point == 0 then if ArenaLevel <= 1 then region = XArenaPlayerRankRegion.KeepRegion end return rank, region end local challengeCfg = XArenaConfigs.GetChallengeArenaCfgById(ChallengeId) if challengeCfg then if rank <= challengeCfg.DanUpRank then region = XArenaPlayerRankRegion.UpRegion elseif rank > challengeCfg.DanUpRank and rank <= challengeCfg.DanKeepRank then region = XArenaPlayerRankRegion.KeepRegion end end return rank, region end -- 获取玩家上一期竞技个人排名 function XArenaManager.GetLastPlayerArenaRankAndRegion() local rank = 0 local point = 0 local region = XArenaPlayerRankRegion.DownRegion for i, info in ipairs(PlayerLastResultRanlList) do if info.Id == XPlayer.Id then rank = i point = info.Point end end if point == 0 then if ArenaLevel <= 1 then region = XArenaPlayerRankRegion.KeepRegion end return rank, region end local challengeCfg = XArenaConfigs.GetChallengeArenaCfgById(LastChallengeId) if challengeCfg then if rank <= challengeCfg.DanUpRank then region = XArenaPlayerRankRegion.UpRegion elseif rank > challengeCfg.DanUpRank and rank <= challengeCfg.DanKeepRank then region = XArenaPlayerRankRegion.KeepRegion end end return rank, region end -- 获取队员竞技信息列表 function XArenaManager.GetPlayerArenaTeamMemberInfo() local list = {} for _, info in ipairs(TeamResultList) do if info.Id ~= XPlayer.Id then table.insert(list, info) end end return list end -- 获取队员上一期竞技信息列表 function XArenaManager.GetPlayerLastArenaTeamMemberInfo() local list = {} for _, info in ipairs(TeamLastResultList or {}) do if info.Id ~= XPlayer.Id then table.insert(list, info) end end return list end -- 获取队伍竞技总分 function XArenaManager.GetArenaTeamTotalPoint() local point = 0 for _, info in ipairs(TeamResultList) do point = point + info.Point end return point end -- 获取队伍上一期竞技总分 function XArenaManager.GetLastArenaTeamTotalPoint() local point = 0 for _, info in ipairs(TeamLastResultList or {}) do point = point + info.Point end return point end -- 获取玩家竞技排行数据 function XArenaManager.GetPlayerArenaRankList() local challengeCfg = XArenaConfigs.GetChallengeArenaCfgById(ChallengeId) if not challengeCfg then return nil end local rankData = {} rankData.UpList = {} rankData.KeepList = {} rankData.DownList = {} for i, info in ipairs(PlayerResultRankList) do local Data = { Rank = i, PlayerInfo = info } if info.Point > 0 then if (i - challengeCfg.DanUpRank <= 0) then table.insert(rankData.UpList, Data) elseif (i - challengeCfg.DanKeepRank <= 0) then table.insert(rankData.KeepList, Data) else table.insert(rankData.DownList, Data) end else if challengeCfg.ArenaLv <= 1 then table.insert(rankData.KeepList, Data) else table.insert(rankData.DownList, Data) end end end return rankData end -- 获取玩家上一期竞技排行数据 function XArenaManager.GetLastPlayerArenaRankList() local challengeCfg = XArenaConfigs.GetChallengeArenaCfgById(LastChallengeId) if not challengeCfg then return nil end local rankData = {} rankData.UpList = {} rankData.KeepList = {} rankData.DownList = {} for i, info in ipairs(PlayerLastResultRanlList) do local Data = { Rank = i, PlayerInfo = info } if info.Point > 0 then if (i - challengeCfg.DanUpRank <= 0) then table.insert(rankData.UpList, Data) elseif (i - challengeCfg.DanKeepRank <= 0) then table.insert(rankData.KeepList, Data) else table.insert(rankData.DownList, Data) end else if challengeCfg.ArenaLv <= 1 then table.insert(rankData.KeepList, Data) else table.insert(rankData.DownList, Data) end end end return rankData end -- 获取队伍排行榜的挑战配置 function XArenaManager.GetTeamRankChallengeCfg() if TeamRankChallengeId <= 0 then return nil end return XArenaConfigs.GetChallengeArenaCfgById(TeamRankChallengeId) end -- 获取队伍排行统计时间 function XArenaManager.GetArenaTeamRankTime(index) if not TeamRankData.BeginTime or not TeamRankData.BeginTime then return "" end local begin_time = XTime.TimestampToGameDateTimeString(TeamRankData.BeginTime, "yy.MM.dd") local end_time = XTime.TimestampToGameDateTimeString(TeamRankData.EndTime, "yy.MM.dd") local desc = index == 1 and CS.XTextManager.GetText("ArenaRankDesc") or "" return begin_time .. "-" .. end_time .. desc end -- 获取竞技队伍排行列表 function XArenaManager.GetTeamRankList() return TeamRankData.TeamRowList end -- 获取自己队伍排行百分比 function XArenaManager.GetMyTeamRankRate() local rankRate = TeamRankData.RankRate or 0 return rankRate / 10000 end -- 获取竞技我的队伍排行及数据 function XArenaManager.GetMyTeamRankAndData() return TeamRankData.MyRank, TeamRankData.TotalRank, TeamRankData.MyTeamInfo end -- 获取剩余解锁战区次数 function XArenaManager.GetUnlockArenaAreaCount() return UnlockCount end -- 获取玩家战区总分 function XArenaManager.GetArenaAreaTotalPoint() return TotalPoint end -- 通过战区Id获取战区信息 function XArenaManager.GetArenaAreaDataByAreaId(areaId) return AreaDatas[areaId] end -- 通过战区Id获取战区当前关卡进度 function XArenaManager.GetCurStageIndexByAreaId(areaId) local stageInfos = AreaDatas[areaId].StageInfos if not stageInfos then return 1 end if #stageInfos >= XArenaConfigs.GetTheMaxStageCountOfArenaArea() then return #stageInfos else return #stageInfos + 1 end end -- 通过战区Id、关卡Id获取关卡积分 function XArenaManager.GetArenaStageScore(areaId, stageId) local stageInfos = AreaDatas[areaId].StageInfos if not stageInfos then return 0 end for _, v in ipairs(stageInfos) do if v.StageId == stageId then return v.Point end end return 0 end -- 通过战区Id、关卡Id修改关卡积分 function XArenaManager.ChangeArenaStageScore(areaId, stageId, score) local stageInfos = AreaDatas[areaId].StageInfos if not stageInfos then return end for _, v in ipairs(stageInfos) do if v.StageId == stageId then v.Point = score end end end -- 设置正在战斗的竞技区域 function XArenaManager.SetEnterAreaStageInfo(areaId, index) EnterAreaStageInfo = {} EnterAreaStageInfo.AreaId = areaId EnterAreaStageInfo.StageIndex = index local stageId = XArenaConfigs.GetArenaAreaStageCfgByAreaId(areaId).StageId[index] local chaperName, stageName = XArenaConfigs.GetChapterAndStageName(areaId, stageId) EnterAreaStageInfo.ChapterName = chaperName EnterAreaStageInfo.StageName = stageName end -- 获取竞技结算分数配置 function XArenaManager.GetMarkCfg() if not EnterAreaStageInfo.AreaId or not EnterAreaStageInfo.StageIndex then return nil end local stageCfg = XArenaConfigs.GetArenaAreaStageCfgByAreaId(EnterAreaStageInfo.AreaId) if not stageCfg then return nil end local markCfg = XArenaConfigs.GetMarkCfgById(stageCfg.MarkId[EnterAreaStageInfo.StageIndex]) return markCfg end -- 状态改变直接回到主界面 local JudgeGotoMain = function() if not XLuaUiManager.IsUiLoad("UiArena") then return end if ActivityStatus == XArenaActivityStatus.Loading or ActivityStatus == XArenaActivityStatus.Default then return end -- 如果玩家在竞技战斗中 先做缓存 if CS.XFight.IsRunning or XLuaUiManager.IsUiLoad("UiLoading") then ArenaStatusInFightChangeCache = true return end -- 如果玩家在好友宿舍中 退出宿舍 if XLuaUiManager.IsUiLoad("UiDormSecond") then XHomeSceneManager.LeaveScene() XEventManager.DispatchEvent(XEventId.EVENT_DORM_CLOSE_COMPONET) end XUiManager.TipText("ArenaActivityStatusChange") XLuaUiManager.RunMain() end -- 竞技战斗结束后判断是否跳到主界面 function XArenaManager.JudgeGotoMainWhenFightOver() if not XLuaUiManager.IsUiLoad("UiArena") then return false end if not ArenaStatusInFightChangeCache then return false end ArenaStatusInFightChangeCache = false XUiManager.TipText("ArenaActivityStatusChange") XLuaUiManager.RunMain() return true end -- 是否战斗中改变了状态 function XArenaManager.IsChangeStatusInFight() return ArenaStatusInFightChangeCache end -- 处理竞技活动相关数据 function XArenaManager.HandleArenaActivity(data) -- 清空数据 HallTeamMap = {} HallPlayerMap = {} FriendMap = {} TeamInfo = nil ApplyMap = {} InviteMap = {} MaxPointStageDic = {} HaveToRequestApplyData = -1 ActivityNo = 0 ActivityStatus = XArenaActivityStatus.Default CountDownTime = 0 TeamStartTime = 0 FightStartTime = 0 ResultStartTime = 0 WaveRate = 0 PlayerResultRankList = {} TeamRankChallengeId = 0 TeamRankData = {} TeamResultList = {} -- AreaIdToStageDetailList = {} ChallengeId = 0 ArenaLevel = 0 UnlockCount = 0 TotalPoint = 0 AreaDatas = {} EnterAreaStageInfo = {} -- 请求保护时间清0 LastSyncRankListTime = 0 LastHallTeamListTime = 0 LastHallPlayerListTime = 0 LastFriendPlayerTime = 0 LasGroupMemberTime = 0 -- 重设数据 ActivityNo = data.ActivityNo ChallengeId = data.ChallengeId ActivityStatus = data.Status CountDownTime = data.NextStatusTime TeamStartTime = data.TeamTime FightStartTime = data.FightTime ResultStartTime = data.ResultTime ArenaLevel = data.ArenaLevel IsJoinActivity = data.JoinActivity == 1 -- 是否参加过当前活动 UnlockCount = data.UnlockCount ContributeScore = data.ContributeScore for _, v in pairs(data.MaxPointStageList) do MaxPointStageDic[v] = true end if ActivityStatus == XArenaActivityStatus.Over then IsJoinActivity = false WaveLastRate = nil PlayerLastResultRanlList = {} TeamLastResultList = nil LastChallengeId = nil LastActivityNo = nil LastArenaLevel = nil LastDataRespone = nil LastContributeScore = nil end local remainTime = CountDownTime - XTime.GetServerNowTimestamp() XCountDown.CreateTimer(XArenaConfigs.ArenaTimerName, remainTime) JudgeGotoMain() XEventManager.DispatchEvent(XEventId.EVENT_TASK_SYNC) end -- 获取正在战斗的竞技区域 function XArenaManager.GetEnterAreaStageInfo() return EnterAreaStageInfo end -- 获取是否参加过当前活动 function XArenaManager.GetIsJoinActivity() return IsJoinActivity end -- 报名参加竞技活动 function XArenaManager.RequestSignUpArena(cb) if ActivityStatus == XArenaActivityStatus.Over then if cb then cb() end return end if IsJoinActivity then if cb then cb() end return end XNetwork.Call(ArenaRequest.RequestSignUpArena, nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end IsJoinActivity = true if res.ChallengeId then ChallengeId = res.ChallengeId end if cb then cb() end end) end -- 请求主页面成员信息 function XArenaManager.RequestGroupMember(cb) if ActivityStatus ~= XArenaActivityStatus.Fight then XUiManager.TipText("ArenaActivityStatusWrong") return end -- 请求间隔保护 local now = XTime.GetServerNowTimestamp() if LasGroupMemberTime + SYNC_GOURP_MEMBER_SECOND >= now then XEventManager.DispatchEvent(XEventId.EVENT_ARENA_MAIN_INFO) if cb then cb() end return end LasGroupMemberTime = now XNetwork.Call(ArenaRequest.RequestGroupMember, nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end WaveRate = res.WaveRate PlayerResultRankList = res.GroupPlayerList TeamResultList = res.TeamPlayerList XArenaManager.SaveResultToLocal() XEventManager.DispatchEvent(XEventId.EVENT_ARENA_MAIN_INFO) if cb then cb() end end) end -- 请求上一期主界面信息 function XArenaManager.ScoreQueryReq(cb) -- -- TODO:::等待服务器完成功能 -- if true then -- XUiManager.TipMsg(CS.XTextManager.GetText("ComingSoon"), XUiManager.UiTipType.Tip) -- return -- end if LastDataRespone and LastDataRespone.Code ~= XCode.Success then XUiManager.TipCode(LastDataRespone.Code) return end if TeamLastResultList ~= nil then if cb then cb() end return end XNetwork.Call(ArenaRequest.ScoreQueryReq, nil, function(res) LastDataRespone = res if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end WaveLastRate = res.WaveRate PlayerLastResultRanlList = res.GroupPlayerList TeamLastResultList = res.TeamPlayerList LastChallengeId = res.ChallengeId LastActivityNo = res.ActivityNo LastArenaLevel = res.ArenaLevel LastContributeScore = res.ContributeScore if cb then cb() end end) end -- 请求区域信息 function XArenaManager.RequestAreaData(cb, failCb) if ActivityStatus ~= XArenaActivityStatus.Fight then XUiManager.TipText("ArenaActivityStatusWrong") if failCb then failCb() end return end XNetwork.Call(ArenaRequest.RequestAreaData, nil, function(res) if res.Code ~= XCode.Success then -- XUiManager.TipCode(res.Code) if failCb then failCb() end return end TotalPoint = res.TotalPoint GroupFightEvent = res.GroupFightEvent for _, areaShowData in ipairs(res.AreaList) do AreaDatas[areaShowData.AreaId] = areaShowData end XEventManager.DispatchEvent(XEventId.EVENT_ARENA_REFRESH_AREA_INFO) CsXGameEventManager.Instance:Notify(XEventId.EVENT_ARENA_REFRESH_AREA_INFO) if cb then cb() end end) end function XArenaManager.RequestSelfRankList(challengeId,cb) XNetwork.Call(ArenaRequest.ArenaChallengeGetRankRequest,{ChallengeId = challengeId},function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb(res) end end) end -- 请求通关详情 function XArenaManager.RequestStagePassDetail(areaId, cb) if ActivityStatus ~= XArenaActivityStatus.Fight then XUiManager.TipText("ArenaActivityStatusWrong") return end XNetwork.Call(ArenaRequest.RequestStagePassDetail, { AreaId = areaId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local detailMap = {} for _, data in ipairs(res.StageDetailList) do detailMap[data.StageId] = data end -- AreaIdToStageDetailList[areaId] = detailMap if cb then cb(detailMap) end end) end -- 请求解锁战区 function XArenaManager.RequestUnlockArea(areaId, cb) if ActivityStatus ~= XArenaActivityStatus.Fight then XUiManager.TipText("ArenaActivityStatusWrong") return end if UnlockCount <= 0 then XUiManager.TipError(CS.XTextManager.GetText("ArenaActivityUnlockCountNotEnough")) return end XNetwork.Call(ArenaRequest.RequestUnlockArea, { AreaId = areaId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end UnlockCount = UnlockCount - 1 local data = AreaDatas[areaId] data.Lock = 0 XEventManager.DispatchEvent(XEventId.EVENT_ARENA_UNLOCK_AREA) CsXGameEventManager.Instance:Notify(XEventId.EVENT_ARENA_UNLOCK_AREA) if cb then cb() end end) end -- 请求队伍排行 function XArenaManager.RequestTeamRankData(cb) -- 请求间隔保护 local now = XTime.GetServerNowTimestamp() if LastSyncRankListTime + SYNC_RANK_LIST_SECOND >= now and TeamRankChallengeId > 0 then if cb then cb() end return end LastSyncRankListTime = now XNetwork.Call(ArenaRequest.RequestTeamRankData, nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end TeamRankChallengeId = res.ChallengeId TeamRankData = res.RankData XEventManager.DispatchEvent(XEventId.EVENT_ARENA_REFRESH_TEAM_RANK_INFO) CsXGameEventManager.Instance:Notify(XEventId.EVENT_ARENA_REFRESH_TEAM_RANK_INFO) if cb then cb() end end) end --记录满分通关的关卡列表 function XArenaManager.NotifyMaxPointList(data) MaxPointStageDic = {} for _, v in pairs(data.MaxPointStageList) do MaxPointStageDic[v] = true end end function XArenaManager.IsCanAutoFightByStageId(stageId,areaId) local areaStageCfg = XArenaConfigs.GetArenaAreaStageCfgByAreaId(areaId) local targetIsMaxPoint = MaxPointStageDic[stageId] == true local otherIsMaxPoint = false if areaStageCfg then for i, sId in pairs(areaStageCfg.StageId) do if sId == stageId then local stageStr = areaStageCfg.ActiveAutoFightStageStr[i] if not string.IsNilOrEmpty(stageStr) then local stageIdList = string.Split(stageStr,"|") for _, id in pairs(stageIdList) do otherIsMaxPoint = MaxPointStageDic[tonumber(id)] == true or otherIsMaxPoint end end end end end return targetIsMaxPoint or otherIsMaxPoint end function XArenaManager.NotifyArenaAutoJoinActivity(data) XLog.Debug("XArenaManager.NotifyArenaAutoJoinActivity 战区自动加入", data) ChallengeId = data.ChallengeId end function XArenaManager.RequestAutoFight(areaId, stageId) XNetwork.Call(ArenaRequest.AreaAutoFightRequest, { AreaId = areaId, StageId = stageId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XArenaManager.RequestAreaData(function() CsXGameEventManager.Instance:Notify(XEventId.EVENT_ARENA_RESULT_AUTOFIGHT) XUiManager.TipText("ArenaAutoFightSuccess") end) end) end function XArenaManager.InitStageInfo() local arenaStageInfo = XArenaConfigs.GetArenaStageCfg() for _, stageList in ipairs(arenaStageInfo) do for _, v in ipairs(stageList.StageId) do local stageInfo = XDataCenter.FubenManager.GetStageInfo(v) stageInfo.Type = XDataCenter.FubenManager.StageType.Arena end end end --计算竞技场贡献分(需要根据战区积分判断) function XArenaManager.GetContributeScoreByCfg(index, challengeCfg, point) if point > 0 then return challengeCfg.ContributeScore[index] or 0 else return 0 end end -- 获取当前挑战任务 function XArenaManager.GetCurChallengeTasks() local tasks = {} local dailyTasks = XDataCenter.TaskManager.GetArenaChallengeTaskList() local challengeCfg = XArenaConfigs.GetChallengeArenaCfgById(ChallengeId) if challengeCfg then for _, cfgTaskId in pairs(challengeCfg.TaskId or {}) do for _, dailyTask in pairs(dailyTasks) do if cfgTaskId == dailyTask.Id then table.insert(tasks, dailyTask) end end end end return tasks end --XArenaManager.Init() ----------------------------Arena start-------------------------- ------------------副本入口扩展 start------------------------- function XArenaManager:ExGetChapterType() return XDataCenter.FubenManager.ChapterType.ARENA end function XArenaManager:ExGetProgressTip() local status = XDataCenter.ArenaManager.GetArenaActivityStatus() if status == XArenaActivityStatus.Rest then return CS.XTextManager.GetText("ArenaTeamDescription") elseif status == XArenaActivityStatus.Fight then local isJoin = XDataCenter.ArenaManager.GetIsJoinActivity() if isJoin then return CS.XTextManager.GetText("ArenaFightJoinDescription") else return CS.XTextManager.GetText("ArenaFightNotJoinDescription") end elseif status == XArenaActivityStatus.Over then return CS.XTextManager.GetText("ArenaOverDescription") end return "" end function XArenaManager:ExGetRunningTimeStr() local remainTime = CountDownTime - XTime.GetServerNowTimestamp() local state = XDataCenter.ArenaManager.GetArenaActivityStatus() local timeText = "" if state == XArenaActivityStatus.Rest then timeText = CS.XTextManager.GetText("ArenaActivityBeginCountDown") .. XUiHelper.GetTime(remainTime, XUiHelper.TimeFormatType.CHALLENGE) elseif state == XArenaActivityStatus.Fight then timeText = CS.XTextManager.GetText("ArenaActivityEndCountDown", XUiHelper.GetTime(remainTime, XUiHelper.TimeFormatType.CHALLENGE)) elseif state == XArenaActivityStatus.Over then timeText = CS.XTextManager.GetText("ArenaActivityResultCountDown") .. XUiHelper.GetTime(remainTime, XUiHelper.TimeFormatType.CHALLENGE) end return timeText end function XArenaManager:ExCheckIsFinished(cb) local state = XDataCenter.ArenaManager.GetArenaActivityStatus() if state ~= XArenaActivityStatus.Fight then -- 特殊,只要不在战斗期就一定显示Clear self.IsClear = true if cb then cb(true) end return end self.IsClear = false -- 检测完成的数据必现先报名战区并请求下发数据,不然会弹提示。所以把提示关掉 XArenaManager.RequestAreaData(function() local isHasAreaUnlock = false --有战区未解锁 local isHasArealock = false --有战区已解锁 local isAreaUnLockButHasStageUnpassed = false --解锁的区有关卡没打 for k, areaInfo in pairs(AreaDatas) do if areaInfo.Lock == 1 and not isHasAreaUnlock then isHasAreaUnlock = true end if areaInfo.Lock == 0 then if not isHasArealock then isHasArealock = true end if areaInfo.StageInfos and #areaInfo.StageInfos < 3 then isAreaUnLockButHasStageUnpassed = true end end end local result = true if (isHasAreaUnlock and UnlockCount > 0) -- 有次数且未解锁区 or (isHasArealock and isAreaUnLockButHasStageUnpassed) -- 有战区已解锁 且 解锁的区有关卡没打 or XRedPointManager.CheckConditions({"CONDITION_ARENA_MAIN_TASK"}) -- 有奖励未领取 or self:ExGetIsLocked() then result = false end self.IsClear = result if cb then cb(result) end end, cb) end function XArenaManager:ExOpenMainUi() if XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.FubenArena) then XArenaManager.RequestSignUpArena(function() XLuaUiManager.Open("UiArena", XFubenConfigs.GetChapterBannerByType(XDataCenter.FubenManager.ChapterType.ARENA)) end) end end ------------------副本入口扩展 end------------------------- return XArenaManager end XRpc.NotifyArenaActivity = function(data) XDataCenter.ArenaManager.HandleArenaActivity(data) end XRpc.NotifyMyTeam = function(data) XDataCenter.ArenaManager.HandleTeamInfo(data.MyTeam) end XRpc.NotifyPlayerKick = function() XDataCenter.ArenaManager.HandleIsKickedByCaptain() end XRpc.NotifyNewApply = function(data) XDataCenter.ArenaManager.HandleNewApplyData(data) end XRpc.ActivityResultNotify = function(data) XDataCenter.ArenaManager.HandleArenaActivityResult(data) end --已经满分通关的关卡列表(用于自动作战) XRpc.NotifyMaxPointList = function(data) XDataCenter.ArenaManager.NotifyMaxPointList(data) end XRpc.NotifyArenaAutoJoinActivity = function(data) XDataCenter.ArenaManager.NotifyArenaAutoJoinActivity(data) end