PGRData/Script/matrix/xmanager/XFubenManagerEx.lua

446 lines
18 KiB
Lua
Raw Permalink Normal View History

2024-09-01 20:49:41 +00:00
local XExFubenActivityManager = require("XEntity/XFuben/XExFubenActivityManager")
XFubenManagerExCreator = function()
---@class FubenManagerEx
local FubenManagerEx = {}
local ManagerDic = {}
---@type table<number, XExFubenBaseManager>
local ActivityManagers = {}
local _IsInCheckShowFinish = false
local _InCheckShowTimeCache = 0
-- 初始化
function FubenManagerEx.Init()
_IsInCheckShowFinish = false
-- 注册FubenActivity配置的活动
local activityConfigs = XFubenConfigs.GetAllConfigs(XFubenConfigs.TableKey.FubenActivity)
local manager = nil
for _, config in ipairs(activityConfigs) do
if string.IsNilOrEmpty(config.ManagerName) then
manager = CreateAnonClassInstance({}, XExFubenActivityManager, nil, config)
else
manager = XDataCenter[config.ManagerName]
if manager == nil then
XLog.Error("FubenManagerEx.Init Failed: XDataCenter." .. config.ManagerName .. " is nil !!")
end
if not CheckClassSuper(manager, XExFubenActivityManager) then
if manager.__cname ~= "XExFubenActivityManager" then
local method = manager.ExOverrideBaseMethod and manager:ExOverrideBaseMethod() or {}
manager = CreateAnonClassInstance(method, XExFubenActivityManager, nil, config)
end
end
end
table.insert(ActivityManagers, manager)
end
end
--兼容XMVCA注册活动manager
function FubenManagerEx.RegisterActivityAgency(agencyList)
for _, agency in ipairs(agencyList) do
table.insert(ActivityManagers, agency)
end
end
--兼容XMVCA注册副本
function FubenManagerEx.RegisterFubenAgency(agencyList)
for _, agency in ipairs(agencyList) do
FubenManagerEx.RegisterManager(agency)
end
end
-- 注册管理器
function FubenManagerEx.RegisterManager(manager)
local chapterType = manager:ExGetChapterType()
ManagerDic[chapterType] = ManagerDic[chapterType] or {}
table.insert(ManagerDic[chapterType], manager)
end
-- 根据XFubenConfigs.ChapterType获取管理器数据
function FubenManagerEx.GetManagers(chapterType)
return ManagerDic[chapterType] or {}
end
-- 根据XFubenConfigs.ChapterType获取管理器数据默认第一个
---@return XExFubenBaseManager
function FubenManagerEx.GetManager(chapterType)
return FubenManagerEx.GetManagers(chapterType)[1]
end
-- 获取FubenActivity配置的活动数据
function FubenManagerEx.GetActivityManagers()
local managers = {}
for _, manager in ipairs(ActivityManagers or {}) do
if manager:ExCheckInTime() then
table.insert(managers, manager)
end
end
--获取的时候再排序
table.sort(managers, function (managerA, managerB)
return managerA:ExGetConfig().Order < managerB:ExGetConfig().Order
end)
return managers
end
-- 获取主线管理器
function FubenManagerEx.GetMainLineManager()
return ManagerDic[XFubenConfigs.ChapterType.MainLine][1]
end
-- 获取展示在主界面的周常副本管理器
---@return XExFubenBaseManager[]
function FubenManagerEx.GetShowOnMainWeeklyManagers(isNotSort)
local managerChapterList = XFubenConfigs.GetChallengeShowGridList()
local managers = {}
local indexRecord = {}
for _, chapterType in ipairs(managerChapterList) do
local manager = FubenManagerEx.GetManager(chapterType)
managers[#managers + 1] = manager
indexRecord[manager:ExGetChapterType()] = #managers
end
if isNotSort then
return managers
end
---@param managerA XExFubenBaseManager
---@param managerB XExFubenBaseManager
table.sort(managers, function (managerA, managerB)
if managerA:ExGetIsLocked() ~= managerB:ExGetIsLocked() then
return not managerA:ExGetIsLocked()
end
if managerA:ExCheckIsClear() ~= managerB:ExCheckIsClear() then
return not managerA:ExCheckIsClear()
end
return indexRecord[managerA:ExGetChapterType()] < indexRecord[managerB:ExGetChapterType()]
end)
local result = {}
for _, manager in ipairs(managers) do
if #result >= XFubenConfigs.GetChallengeShowGridCount() then
break
else
result[#result + 1] = manager
end
end
return result
end
function FubenManagerEx.CheckShowManagersFinish(cb)
local nowTime = XTime.GetServerNowTimestamp()
-- 有汇报未知操作下导致_IsInCheckShowFinish未解开
-- 因此新增时间计时超过5s重新刷新时锁未解开则直接解锁
if nowTime - _InCheckShowTimeCache > 5 then
if _IsInCheckShowFinish then
XLog.Debug("Weekly Activity Panel Refresh Auto UnLock")
_IsInCheckShowFinish = false
end
_InCheckShowTimeCache = nowTime
end
if _IsInCheckShowFinish then
return
end
_IsInCheckShowFinish = true
local managerChapterList = XFubenConfigs.GetChallengeShowGridList()
local managerCount = #managerChapterList
if managerCount <= 0 and cb then
cb()
return
end
local waitData = function()
managerCount = managerCount - 1
if managerCount <= 0 and cb then
_IsInCheckShowFinish = false
cb()
end
end
for _, chapterType in ipairs(managerChapterList) do
FubenManagerEx.GetManager(chapterType):ExCheckIsFinished(waitData)
end
end
-- 获取当前主界面展示的主线\浮点\活动记录最新章节(限时章节优先级最高)
function FubenManagerEx.GetCurrentRecordChapterAndManager()
local currConfig = nil
-- 先检查限时开放
local chapterViewModels = {}
-- 主线剧情
local mainLineManager = FubenManagerEx.GetMainLineManager()
for _, config in ipairs(mainLineManager:ExGetChapterGroupConfigs()) do
chapterViewModels = appendArray(chapterViewModels, mainLineManager:ExGetChapterViewModels(config.Id))
end
local mainLineManagerIndex = #chapterViewModels
-- 浮点纪实
local shortStoryManager = XDataCenter.ShortStoryChapterManager
chapterViewModels = appendArray(chapterViewModels, shortStoryManager:ExGetChapterViewModels())
local shortStoryManagerIndex = #chapterViewModels
-- 外篇
local extraManager = XDataCenter.ExtraChapterManager
chapterViewModels = appendArray(chapterViewModels, extraManager:ExGetChapterViewModels(XDataCenter.FubenMainLineManager.DifficultNormal))
chapterViewModels = appendArray(chapterViewModels, extraManager:ExGetChapterViewModels(XDataCenter.FubenMainLineManager.DifficultHard))
-- 活动记录
local festivalManager = XDataCenter.FubenFestivalActivityManager
chapterViewModels = appendArray(chapterViewModels, festivalManager:ExGetChapterViewModels(XFestivalActivityConfig.UiType.ExtralLine))
local festivalManagerIndex = #chapterViewModels
-- 根据下标获取管理器
local getManagerFunc = function(index)
if mainLineManagerIndex >= index then
return mainLineManager
end
if shortStoryManagerIndex >= index then
return shortStoryManager
end
if festivalManagerIndex >= index then
return festivalManager
end
end
local currActivityViewModel = nil
local currActivityManager = nil
for i, viewModel in ipairs(chapterViewModels) do
local currPrg, totalPrg = viewModel:GetCurrentAndMaxProgress()
local isPass = currPrg >= totalPrg
if viewModel:CheckHasTimeLimitTag() and not isPass then
currActivityViewModel = viewModel
currActivityManager = getManagerFunc(i)
if not viewModel:GetIsLocked() then
return viewModel, getManagerFunc(i)
end
end
end
-- 如果没有【限时开放】,开始执行下列代码
local configs = XFubenConfigs.GetAllConfigs(XFubenConfigs.TableKey.FubenStoryLine)
local normalList = {}
local passSkipConditionList = {} -- 通过SkipCondition条件的chapter
-- 分类
for id, v in pairs(configs) do
if v.SkipCondition and v.SkipCondition > 0 and XConditionManager.CheckCondition(v.SkipCondition) then
table.insert(passSkipConditionList,v)
else
table.insert(normalList,v)
end
end
-- 检查condition 规则:
-- 1.若当前condition通过,continue
-- 2.若未通过选择当前数据作为currConfig
local checkNum = 0 --检测通过的次数
for i, v in ipairs(normalList) do
if not XConditionManager.CheckCondition(v.Condition) then
currConfig = v
break
end
checkNum = checkNum + 1
end
-- 如果nm的condition全部通过就开始检查 passSkipConditionList 的condition
local isAllNormalPass = checkNum == #normalList
if isAllNormalPass and passSkipConditionList and next(passSkipConditionList) then
for i, v in ipairs(passSkipConditionList) do
if not XConditionManager.CheckCondition(v.Condition) then
currConfig = v
break
end
end
end
local cuurChapterViewModel, currManager
if currConfig then
currManager = FubenManagerEx.GetManagers(currConfig.ChapterType)[1]
cuurChapterViewModel = currManager:ExGetChapterViewModelBySubChapterId(currConfig.ChapterId)
end
-- 如果限时和当前进度中的chapter都上锁了进入判断
if currActivityViewModel and currActivityViewModel:GetIsLocked() and cuurChapterViewModel and cuurChapterViewModel:GetIsLocked() then
local currViewModelFirstStage = cuurChapterViewModel:GetConfig().FirstStage
local activityCondition = currActivityViewModel:GetConfig().ActivityCondition
if currViewModelFirstStage and activityCondition then
local stageRequireLevel = XDataCenter.FubenManager.GetStageCfg(currViewModelFirstStage).RequireLevel
local conditionTemplate = XConditionManager.GetConditionTemplate(activityCondition)
if conditionTemplate and conditionTemplate.Type == 10101 and stageRequireLevel then -- 如果2者都是等级限制条件
if conditionTemplate.Params[1] <= stageRequireLevel then -- 且如果限时条件副本所需等级 <= 正常进度副本所需等级 ,则优先显示限时的
cuurChapterViewModel = currActivityViewModel
currManager = currActivityManager
end
end
end
end
--所有的condition已通过 则返回nil
return cuurChapterViewModel, currManager
end
-- 获取主界面一级标签配置
function FubenManagerEx.GetMainUiTabConfigs()
return XFubenConfigs.GetAllConfigs(XFubenConfigs.TableKey.FubenTabConfig)
end
-- 获取主界面活动提示
function FubenManagerEx.GetActivityMainUiTips()
local configs = XFubenConfigs.GetAllConfigs(XFubenConfigs.TableKey.FubenActivityTimeTips)
for i = #configs, 1, -1 do
if XFunctionManager.CheckInTimeByTimeId(configs[i].TimeId) then
return configs[i].Desc
end
end
return ""
end
-- 根据chapter类型获取标签信息
function FubenManagerEx.GetTagConfigByChapterType(chapterType)
if not chapterType then return end
if chapterType == XFubenConfigs.ChapterType.MainLine then -- 主线特殊 无2级标签
for k, v in pairs(FubenManagerEx.GetMainUiTabConfigs()) do
if v.UiParentName == "PanelMainLine" then
return v.Id
end
end
end
local firstTag, secondtagIndex, secondTagId -- secondtagIndex。二级tag对应的左侧按钮的index 、Id
local allSecondTagConfigs = XFubenConfigs.GetAllConfigs(XFubenConfigs.TableKey.FubenSecondTag)
for k, config in pairs(allSecondTagConfigs) do
for k, type in pairs(config.ChapterType) do
if chapterType == type then
firstTag = config.FirstTagId
secondtagIndex = config.Order
secondTagId = config.Id
return firstTag, secondtagIndex, secondTagId
end
end
end
end
-- 根据一级标签id检测该标签下是否有入口开放
function FubenManagerEx.CheckHasOpenByFirstTagId(firstTagId)
if not firstTagId then return end
local allSecondTag = XFubenConfigs.GetSecondTagConfigsByFirstTagId(firstTagId) -- 拿到该模式下所有的二级标签
if not allSecondTag or not next(allSecondTag) then --没用二级标签配置的特殊标签都不会上锁(主线和战斗面板都没有配置,主线是自动生成的)
return true
end
for _, secondTagconfig in pairs(allSecondTag) do
if FubenManagerEx.CheckHasOpenBySecondTagId(secondTagconfig.Id) then
return true
end
end
return false
end
-- 根据二级标签id检测该标签下是否有入口开放
function FubenManagerEx.CheckHasOpenBySecondTagId(secondTagId)
if not secondTagId then return end
local secondTagConfig = XFubenConfigs.GetSecondTagConfigById(secondTagId)
if not secondTagConfig or not next(secondTagConfig) then
return true
end
local allManagers = {}
for k, chapterType in pairs(secondTagConfig.ChapterType) do
for k, manager in pairs(FubenManagerEx.GetManagers(chapterType)) do
table.insert(allManagers, manager) -- 根据2级标签拿到所有manager
end
end
-- 如果manager有顺序要按顺序检测
if allManagers[1]:ExGetConfig().Priority then
table.sort(allManagers, function (managerA, managerB)
return managerA:ExGetConfig().Priority < managerB:ExGetConfig().Priority
end)
end
-- 检测是否有开放(没上锁的)
for k, manager in ipairs(allManagers) do
if not manager:ExGetIsLocked() then
return true
end
end
-- 如果上锁的标签有多个入口返回优先级最高的manager的拦截提示
return false, allManagers[1]:ExGetLockTip()
end
-- 根据二级标签id返回离当前标签最近的解锁的id的下标
function FubenManagerEx.GetUnLockMostNearSecondTagIndex(secondTagId)
if not secondTagId then return end
local secondTagConfig = XFubenConfigs.GetSecondTagConfigById(secondTagId)
local firstTagId = secondTagConfig.FirstTagId
local currSecondIndex = secondTagConfig.Order
local allSecondTag = XFubenConfigs.GetSecondTagConfigsByFirstTagId(firstTagId)
local unLockSecondTags = {} -- 当前同级1级标签下 所有解锁的2级标签
for k, secondTagconfig in pairs(allSecondTag) do
if FubenManagerEx.CheckHasOpenBySecondTagId(secondTagconfig.Id) then
table.insert(unLockSecondTags, {
SecondTagId = secondTagconfig.Id,
IndexDistance = math.abs(currSecondIndex - secondTagconfig.Order),
Index = secondTagconfig.Order
})
end
end
if not next(unLockSecondTags) then
return 1
end
table.sort(unLockSecondTags, function (a, b)
return a.IndexDistance < b.IndexDistance
end)
return unLockSecondTags[1].Index
end
function FubenManagerEx.GetStoryStagePassCount(stageList)
local count = 0
local total = 0
for k, stageId in pairs(stageList) do
local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId)
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
if stageCfg.StageType == XFubenConfigs.STAGETYPE_STORY or stageCfg.StageType == XFubenConfigs.STAGETYPE_STORYEGG then
total = total + 1
if XDataCenter.FubenManager.CheckStageIsPass(stageId) then
count = count + 1
end
end
end
return count, total
end
-- 记录隐藏关卡每日红点,点击进活动界面,红点消失,当天未重置前不再显示
-- 每天凌晨5点通用重置时间检测是否存在未通关关卡存在则刷新红点显示
-- 检查红点是否显示
function FubenManagerEx.CheckHideChapterRedPoint(viewModel)
if viewModel:GetIsLocked() then -- 上锁不显示红点
return false
end
-- 如果没有隐藏关就返回false
local finishCount, totalCount = viewModel:GetCurrentAndMaxProgress()
if finishCount < totalCount and not FubenManagerEx.CheckHideChapterIsOpen(viewModel:GetId()) then
return true
end
return false
end
-- 本地保存key
function FubenManagerEx.GetHideChapterKey(chapterId)
return string.format("%s_%s_%s", "FubenHideChapterCheckResetDaily", XPlayer.Id, chapterId)
end
function FubenManagerEx.CheckHideChapterIsOpen(chapterId)
local key = FubenManagerEx.GetHideChapterKey(chapterId)
local updateTime = XSaveTool.GetData(key)
if not updateTime then
return false
end
return XTime.GetServerNowTimestamp() < updateTime
end
function FubenManagerEx.SaveHideChapterIsOpen(chapterId)
if FubenManagerEx.CheckHideChapterIsOpen(chapterId) then
return
end
local key = FubenManagerEx.GetHideChapterKey(chapterId)
local updateTime = XTime.GetSeverTomorrowFreshTime()
XSaveTool.SaveData(key, updateTime)
end
return FubenManagerEx
end