PGRData/Script/matrix/xmanager/XArenaManager.lua

1620 lines
No EOL
49 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
--- 竞技副本管理器
---
XArenaManagerCreator = function()
local XArenaManager = {}
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 = nil -- 该段位上一期玩家排行
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.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) 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) 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) 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
if info.Point > 0 then
if (i - challengeCfg.DanUpRank <= 0) then
table.insert(rankData.UpList, info)
elseif (i - challengeCfg.DanKeepRank <= 0) then
table.insert(rankData.KeepList, info)
else
table.insert(rankData.DownList, info)
end
else
if challengeCfg.ArenaLv <= 1 then
table.insert(rankData.KeepList, info)
else
table.insert(rankData.DownList, info)
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
if info.Point > 0 then
if (i - challengeCfg.DanUpRank <= 0) then
table.insert(rankData.UpList, info)
elseif (i - challengeCfg.DanKeepRank <= 0) then
table.insert(rankData.KeepList, info)
else
table.insert(rankData.DownList, info)
end
else
if challengeCfg.ArenaLv <= 1 then
table.insert(rankData.KeepList, info)
else
table.insert(rankData.DownList, info)
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 = nil
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)
if ActivityStatus ~= XArenaActivityStatus.Fight then
XUiManager.TipText("ArenaActivityStatusWrong")
return
end
XNetwork.Call(ArenaRequest.RequestAreaData, nil, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
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
--XArenaManager.Init()
----------------------------Arena start--------------------------
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