local Rank_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') local RankTriggerType = 25 local LuaBit = require 'bit' Rank_Controller.MenuLevel = { Single = 1, -- 单独页签 Double = 2, -- 包含二级页签 SubItem = 3,-- 纯二级页签 } -- 展示UI Rank_Controller.ShowType = { Player = 0, -- 展示个人UI Guild = 1, -- 展示势力UI' Country = 2, --国家 } Rank_Controller.ToggleSwitchType = { WarZone = 0, MyCountry = 1, } Rank_Controller.ShowUIByRankType = { [MDL.Rank.RankType.FightGs] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.FightGs_Wei] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.FightGs_Shu] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.FightGs_Wu] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.FightGs_Qun] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.Level] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.ClimbTower] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.Fair3V3] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.BossChallenge] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.Guild] = Rank_Controller.ShowType.Guild, [MDL.Rank.RankType.SyncSolo] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.GuildBoss] = Rank_Controller.ShowType.Guild, [MDL.Rank.RankType.GuildWar] = Rank_Controller.ShowType.Guild, [MDL.Rank.RankType.GuildEscort] = Rank_Controller.ShowType.Guild, [MDL.Rank.RankType.GuildPower] = Rank_Controller.ShowType.Guild, [MDL.Rank.RankType.DemonGod] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.Storm] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.ThreeTeamFight] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.NationClimbTowerWei] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.NationClimbTowerShu] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.NationClimbTowerWu] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.NationClimbTowerQun] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.Country] = Rank_Controller.ShowType.Country, [MDL.Rank.RankType.Fair3V3AllServer] = Rank_Controller.ShowType.Player, [MDL.Rank.RankType.SyncSoloAllServer] = Rank_Controller.ShowType.Player, } Rank_Controller.SortType = { None = 0, MyServer = 1, WarZone = 2, AllServer = 3,--全服(国服:按照虚拟大区作为一个全服单位) } function Rank_Controller.GetAllRankData() local mainData = {} local rankData = {} for i, v in DataSheetManager.Rank:GetEnumerator() do if v.Menu ~= Rank_Controller.MenuLevel.SubItem then table.insert(rankData, v) end end table.sort(rankData, function(a, b) return a.Sort < b.Sort end) for i, v in ipairs(rankData) do --logging.log(LTAG.LOG, " GetAllRankData, ID: ", v.ID, "Param:", v.Parm, ", unlock:", MDL.Unlock.IsComplete(RankTriggerType, v.Parm)) if MDL.Unlock.IsComplete(RankTriggerType, v.Parm) then local data = Rank_Controller.GetSingleRankData(v) if data then table.insert(mainData, data) end end end return mainData end function Rank_Controller.GetSingleRankData(rankData) local rankType = rankData.ID if rankType == MDL.Rank.RankType.Level or rankType == MDL.Rank.RankType.Fair3V3 or rankType == MDL.Rank.RankType.SyncSolo or rankType == MDL.Rank.RankType.DemonGod or rankType == MDL.Rank.RankType.Fair3V3AllServer or rankType == MDL.Rank.RankType.SyncSoloAllServer or rankType == MDL.Rank.RankType.Storm then return private.GetSingleRankDataBase(rankData) elseif rankType == MDL.Rank.RankType.FightGs then return private.GetFightGsRankData(rankData) elseif rankType == MDL.Rank.RankType.ClimbTower then return private.GetClimbTowerRankData(rankData) elseif rankType == MDL.Rank.RankType.BossChallenge then return private.GetBossChallengeRankData(rankData) elseif rankType == MDL.Rank.RankType.Guild then return private.GetGuildRankData(rankData) elseif rankType == MDL.Rank.RankType.Country then return private.GetCountryData(rankData) elseif rankType == MDL.Rank.RankType.ThreeTeamFight then --玩法未开启不显示页签 if CTL.ThreeTeamFight.IsActivityOpen() then return private.GetSingleRankDataBase(rankData) end end end function private.GetSingleRankDataBase(rankData) local mainData = {MainTitle = UIUtils.GetLocalizedTxt(Const_IDS[rankData.Name]), Type = rankData.ID, Menu = rankData.Menu, GetServerDataFunc = Rank_Controller.TryGetRankInfo, } return mainData end function private.GetFightGsRankData(rankData) local fightGsSubData = {} -- 总战力排行 table.insert(fightGsSubData, { SubTitle = UIUtils.GetLocalizedTxt(Const_IDS.IDS_4ContryHeroRank_BRAll), Type = rankData.ID, Menu = rankData.Menu, GetServerDataFunc = Rank_Controller.TryGetRankInfo, }) -- 四国战力排行,随将星临世开启 for i, v in DataSheetManager.Rank:GetEnumerator() do if v.Menu == Rank_Controller.MenuLevel.Double and v.MainMenu == rankData.ID and MDL.Unlock.IsComplete(RankTriggerType, v.Parm) then table.insert(fightGsSubData, { SubTitle = UIUtils.GetLocalizedTxt(Const_IDS[v.Name]), Type = v.ID, Menu = v.Menu, GetServerDataFunc = Rank_Controller.TryGetRankInfo, }) end end local mainData = {MainTitle = UIUtils.GetLocalizedTxt(Const_IDS[rankData.Name]), Type = rankData.ID, Menu = rankData.Menu, subData = fightGsSubData } return mainData end function private.GetBossChallengeRankData(rankData) --boss挑战 local bossSeasonId = CTL.BossChallenge.GetSeasonId() local bossData = DataSheetManager.BossChallengeData:GetDataByID(CTL.BossChallenge.GetSeasonBossById(bossSeasonId)) local bossSubData = {} if bossData then table.insert(bossSubData, {SubTitle = UIUtils.GetLocalizedTxt(Const_IDS[bossData.BossChallengeName]), seasonId = bossSeasonId, Type = rankData.ID, Menu = rankData.Menu, GetServerDataFunc = Rank_Controller.TryGetRankInfo, }) end if CTL.BossChallenge.IsSeasonOpen(bossSeasonId) then local lastBossSeasonId = CTL.BossChallenge.GetLastSeasonId() if lastBossSeasonId > 0 then local bossData = DataSheetManager.BossChallengeData:GetDataByID(CTL.BossChallenge.GetSeasonBossById(lastBossSeasonId)) table.insert(bossSubData, {SubTitle = UIUtils.GetLocalizedTxt(Const_IDS[bossData.BossChallengeName]), seasonId = lastBossSeasonId, Type = rankData.ID, Menu = rankData.Menu, GetServerDataFunc = Rank_Controller.TryGetRankInfo, }) end end local mainData = nil if #bossSubData > 0 then mainData = {MainTitle = UIUtils.GetLocalizedTxt(Const_IDS[rankData.Name]), Type = rankData.ID, Menu = rankData.Menu, subData = bossSubData, } end return mainData end function private.GetClimbTowerRankData(rankData) local climbTowerSubData = {} -- 百战雄关 table.insert(climbTowerSubData, {SubTitle = UIUtils.GetLocalizedTxt(Const_IDS[rankData.Name]), Type = rankData.ID, Menu = rankData.Menu, GetServerDataFunc = Rank_Controller.TryGetRankInfo, }) -- 四国排行 for i, v in DataSheetManager.Rank:GetEnumerator() do if v.Menu == Rank_Controller.MenuLevel.Double and v.MainMenu == rankData.ID then table.insert(climbTowerSubData, {SubTitle = UIUtils.GetLocalizedTxt(Const_IDS[v.Name]), Type = v.ID, Menu = v.Menu, GetServerDataFunc = Rank_Controller.TryGetRankInfo, }) end end local mainData = {MainTitle = UIUtils.GetLocalizedTxt(Const_IDS[rankData.Name]), Type = rankData.ID, Menu = rankData.Menu, subData = climbTowerSubData } return mainData end function private.GetGuildRankData(rankData) local guildSubData = {} -- 势力名望 table.insert(guildSubData, {SubTitle = UIUtils.GetLocalizedTxt(Const_IDS.IDS_FunctionName_GuildRenown), Type = rankData.ID, Menu = rankData.Menu, GetServerDataFunc = Rank_Controller.TryGetRankInfo, }) for i, v in DataSheetManager.Rank:GetEnumerator() do if v.Menu == Rank_Controller.MenuLevel.SubItem and v.MainMenu == rankData.ID then table.insert(guildSubData, {SubTitle = UIUtils.GetLocalizedTxt(Const_IDS[v.Name]), Type = v.ID, Menu = v.Menu, GetServerDataFunc = Rank_Controller.TryGetRankInfo, }) end end local mainData = {MainTitle = UIUtils.GetLocalizedTxt(Const_IDS[rankData.Name]), Type = rankData.ID, Menu = rankData.Menu, subData = guildSubData, } return mainData end function private.GetCountryData(rankData) local guildSubData = {} -- 后续肯定会扩展折叠页签 暂时先注释 到时候打开就行 -- table.insert(guildSubData, {SubTitle = UIUtils.GetLocalizedTxt(Const_IDS.IDS_Country_NationPower), -- Type = rankData.ID, -- Menu = CTL.Rank.MenuLevel.Double, -- GetServerDataFunc = Rank_Controller.TryGetRankInfo, -- }) -- local mainData = {MainTitle = UIUtils.GetLocalizedTxt(Const_IDS[rankData.Name]), -- Type = rankData.ID, -- Menu = CTL.Rank.MenuLevel.Double, -- subData = guildSubData, -- } local mainData = { MainTitle = UIUtils.GetLocalizedTxt(Const_IDS[rankData.Name]), Type = rankData.ID, Menu = rankData.Menu, GetServerDataFunc = Rank_Controller.TryGetRankInfo, } return mainData end --- 打开指定排行榜 ---@param rankType Rank_Controller.ShowUIByRankType枚举 ---@param paramTable 目前未boss挑战参数 ---@param warZoneSortType 界面中的SortType参数 ---@param toggleSwitchType Rank_Controller.ToggleSwitchType界面右上的toggleIndex枚举(默认为0) function Rank_Controller.OpenRankPanelByType(rankType, paramTable, warZoneSortType, toggleSwitchType) if not rankType then rankType = MDL.Rank.RankType.FightGs end if not UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIRankListPanel) then local sortType, openToggleSwitchType if warZoneSortType then sortType = warZoneSortType else sortType = Rank_Controller.GetRankSort(rankType) == Rank_Controller.SortType.WarZone and Rank_Controller.SortType.WarZone or Rank_Controller.SortType.MyServer end if toggleSwitchType then openToggleSwitchType = toggleSwitchType else openToggleSwitchType = Rank_Controller.ToggleSwitchType.WarZone end UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIRankListPanel, {rankType = rankType, sortType = sortType, toggleSwitchType = openToggleSwitchType , paramTable = paramTable}) end end --后期可能需要加入时间戳,判断方法为IsCanSendRequest function Rank_Controller.TryGetRankInfo(rankType, paramTable, sortType) MDL.Rank.GetRankInfoReq(rankType, paramTable, sortType) end function Rank_Controller.IsCanSendRequest() if MDL.Rank.GetNextRefreshTime() then return MDL.Rank.GetNextRefreshTime() > UTL.Time.GetServerTimestamp() else return true end return true end function Rank_Controller.GetShowUITypeByRankType(rankType) return Rank_Controller.ShowUIByRankType[rankType] end function Rank_Controller.GetKudosNumByRankType(rankType) local rankData = DataSheetManager.Rank:GetDataByID(rankType) if rankData then return rankData.KudosNum else return 0 end end function Rank_Controller.GetRankSort(rankType) if not rankType then return 0 end local RANKTYPE = MDL.Rank.RankType if rankType == RANKTYPE.FightGs or Rank_Controller.IsNationFightGsRank(rankType) or rankType == RANKTYPE.Level or rankType == RANKTYPE.Guild or rankType == RANKTYPE.ClimbTower or Rank_Controller.IsNationClimbTowerRank(rankType) then local state = CTL.WarZone.GetTimeState() return state == CTL.WarZone.TimeState.Start and Rank_Controller.SortType.None or Rank_Controller.SortType.MyServer elseif rankType == RANKTYPE.GuildBoss or rankType == RANKTYPE.GuildWar or rankType == RANKTYPE.GuildEscort then local state = CTL.WarZone.GetTimeState() return state == CTL.WarZone.TimeState.Start and Rank_Controller.SortType.WarZone or Rank_Controller.SortType.MyServer elseif rankType == RANKTYPE.ThreeTeamFight then if CTL.ThreeTeamFight.IsActivityOpen() then return Rank_Controller.SortType.WarZone end elseif rankType == RANKTYPE.DemonGod or rankType == RANKTYPE.Storm then local state = CTL.WarZone.GetTimeState() return state == CTL.WarZone.TimeState.Start and Rank_Controller.SortType.WarZone or Rank_Controller.SortType.MyServer elseif rankType == RANKTYPE.Fair3V3 then return CTL.SyncTeamPVP.IsWarZoneStyle() and Rank_Controller.SortType.WarZone or Rank_Controller.SortType.MyServer elseif rankType == RANKTYPE.BossChallenge then return CTL.BossChallenge.IsWarZoneStyle() and Rank_Controller.SortType.WarZone or Rank_Controller.SortType.MyServer elseif rankType == RANKTYPE.SyncSolo then return CTL.SyncSolo.IsWarZoneStyle() and Rank_Controller.SortType.WarZone or Rank_Controller.SortType.MyServer elseif rankType == RANKTYPE.Country or rankType == RANKTYPE.GuildPower then local state = CTL.WarZone.GetTimeState() return state == CTL.WarZone.TimeState.Start and Rank_Controller.SortType.WarZone or Rank_Controller.SortType.MyServer elseif rankType == RANKTYPE.Fair3V3AllServer or rankType == RANKTYPE.SyncSoloAllServer then --全服榜单 return Rank_Controller.SortType.AllServer end return Rank_Controller.SortType.MyServer end function Rank_Controller.IsAllServerSortTypeUnlock() local unlockSyncSoloAllServer = MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.SyncSoloAllServer) local unlockFair3V3AllServer = MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Fair3V3AllServer) return unlockSyncSoloAllServer or unlockFair3V3AllServer end function Rank_Controller.IsNationClimbTowerRank(rankType) return rankType == MDL.Rank.RankType.NationClimbTowerWei or rankType == MDL.Rank.RankType.NationClimbTowerShu or rankType == MDL.Rank.RankType.NationClimbTowerWu or rankType == MDL.Rank.RankType.NationClimbTowerQun end function Rank_Controller.IsNationFightGsRank(rankType) return rankType == MDL.Rank.RankType.FightGs_Wei or rankType == MDL.Rank.RankType.FightGs_Shu or rankType == MDL.Rank.RankType.FightGs_Wu or rankType == MDL.Rank.RankType.FightGs_Qun end return Rank_Controller