PGRData/Resources/Scripts/XManager/XFubenBossOnlineManager.lua
2022-12-26 14:06:01 +05:30

393 lines
No EOL
14 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.

XFubenBossOnlineManagerCreator = function()
local XFubenBossOnlineManager = {}
XFubenBossOnlineManager.OnlineBossDifficultLevel = {
SIMPLE = 1,
NORMAL = 2,
HARD = 3,
HELL = 4,
NightMare = 5,
}
local NORMAL_BOSS_COUNT = 4
local ACTIVITY_BOSS_COUNT = 5
local METHOD_NAME = {
GetActivityBossDataRequest = "GetActivityBossDataRequest"
}
local CsXTextManager = CS.XTextManager
local TABLE_FUBEN_ONLINE_OPEN_TIME = "Share/Fuben/BossOnline/BossOnlineOpenTime.tab"
local OnlineBossNormalOpenTimeTemplates = {} --联机boss常规开放时间限制
local OnlineBossNormalOpenTimeList = {}
local IsActivity
local BossDataList
local OnlineLelfTime --联机Boss刷新时间
local OnlineBeginTime
local OnlineBossSectionTemplates = {}
local OnlineBossChapterTemplates = {}
local NormalChapterId = CS.XGame.Config:GetInt("OnlineBossNormalChapterId")
local ActivityChapterId = CS.XGame.Config:GetInt("OnlineBossActivityChapterId")
local LastRequestTime = 0
local RequestInterval = 30
function XFubenBossOnlineManager.Init()
OnlineBossSectionTemplates = XFubenBossOnlineConfig.GetSectionTemplates()
OnlineBossChapterTemplates = XFubenBossOnlineConfig.GetChapterTemplates()
OnlineBossNormalOpenTimeTemplates = XTableManager.ReadByIntKey(TABLE_FUBEN_ONLINE_OPEN_TIME, XTable.XTableActivityBossOnlineOpenTime, "Id")
for _, openTimeCfg in pairs(OnlineBossNormalOpenTimeTemplates) do
table.insert(OnlineBossNormalOpenTimeList, openTimeCfg)
end
end
function XFubenBossOnlineManager.GetBossOnlineChapters()
if not BossDataList then
return {}
end
local list = {}
local chapterId = IsActivity and ActivityChapterId or NormalChapterId
for k, v in pairs(OnlineBossChapterTemplates) do
if k == chapterId then
table.insert(list, v)
end
end
table.sort(list, function(a, b)
return a.Id < b.Id
end)
return list
end
function XFubenBossOnlineManager.UpdateStageUnlock(stageId, diff)
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId)
stageInfo.Unlock = false
stageInfo.IsOpen = false
if stageCfg.RequireLevel > 0 and XPlayer.Level < stageCfg.RequireLevel then
return
end
if diff > 1 then
for _, v in pairs(OnlineBossSectionTemplates) do
if v.DifficultType == diff - 1 then
local preStageInfo = XDataCenter.FubenManager.GetStageInfo(v.StageId)
if preStageInfo.Passed then
stageInfo.Unlock = true
stageInfo.IsOpen = true
return
end
end
end
else
stageInfo.Unlock = true
stageInfo.IsOpen = true
end
end
function XFubenBossOnlineManager.InitStageInfo()
for _, sectionCfg in pairs(OnlineBossSectionTemplates) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(sectionCfg.StageId)
stageInfo.BossSectionId = sectionCfg.Id
stageInfo.Type = XDataCenter.FubenManager.StageType.BossOnline
stageInfo.Difficult = sectionCfg.DifficultType
XFubenBossOnlineManager.UpdateStageUnlock(sectionCfg.StageId, sectionCfg.DifficultType)
end
end
function XFubenBossOnlineManager.CheckAutoExitFight(stageId)
return true
end
function XFubenBossOnlineManager.OpenFightLoading(stageId)
XLuaUiManager.Open("UiOnLineLoading")
end
function XFubenBossOnlineManager.CloseFightLoading()
XLuaUiManager.Remove("UiOnLineLoading")
end
function XFubenBossOnlineManager.ShowReward(winData)
-- XEventManager.DispatchEvent(XEventId.EVENT_FUBEN_SHOW_REWARD, winData)
-- XLuaUiManager.Open("UiSettleWin", winData)
if XDataCenter.FubenManager.CheckHasFlopReward(winData) then
XLuaUiManager.Open("UiFubenFlopReward", function()
XLuaUiManager.PopThenOpen("UiMultiplayerFightGrade", function()
XLuaUiManager.PopThenOpen("UiSettleWin", winData)
end)
end, winData)
if XDataCenter.FubenManager.CheckHasFlopReward(winData, true) and not XDataCenter.FubenManager.CheckCanFlop(winData.StageId) then
XUiManager.TipText("BossOnlineConsumeFinish", XUiManager.UiTipType.Success)
end
else
XLuaUiManager.Open("UiMultiplayerFightGrade", function()
XLuaUiManager.PopThenOpen("UiSettleWin", winData)
end)
end
end
function XFubenBossOnlineManager.CheckIsInvade()
local key = "OnlineBossBeginTime_" .. XPlayer.Id
local time = XSaveTool.GetData(key)
return OnlineBeginTime == time
end
function XFubenBossOnlineManager.RecordInvade()
local key = "OnlineBossBeginTime_" .. XPlayer.Id
XSaveTool.SaveData(key, OnlineBeginTime)
end
function XFubenBossOnlineManager.GetActOnlineBossSectionForDiff(difficult)
if not BossDataList then
return
end
for _, v in pairs(BossDataList) do
if v.DifficultyType == difficult then
return v
end
end
end
function XFubenBossOnlineManager.GetStageIdByDiff(difficult)
for _, v in pairs(OnlineBossSectionTemplates) do
if v.DifficultType == difficult then
return v.StageId
end
end
return 0
end
function XFubenBossOnlineManager.GetActOnlineBossSectionById(secitonId, useLastTemplate)
if useLastTemplate then
local tmp = OnlineBossSectionTemplates[secitonId]
return OnlineBossSectionTemplates[tmp.LastSectionId]
end
return OnlineBossSectionTemplates[secitonId]
end
function XFubenBossOnlineManager.GetBossOnlineNormalOpenTimeList()
return OnlineBossNormalOpenTimeList
end
--获取不在指定时间段提示
function XFubenBossOnlineManager.GetNotInTimeTip()
local tipStr
local timeQuantum = {}
for _, openTimeCfg in pairs(OnlineBossNormalOpenTimeList) do
local str = openTimeCfg.BeginTime .. "-" .. openTimeCfg.EndTime
table.insert(timeQuantum, str)
end
tipStr = CsXTextManager.GetText("BossOnlineOpenTimeTip", timeQuantum[1], timeQuantum[2])
return tipStr or ""
end
--判断常规BossOnLine是不是在指定时间内
function XFubenBossOnlineManager.CheckNormalBossOnlineInTime()
for _, openTimeCfg in pairs(OnlineBossNormalOpenTimeList) do
local beginTimes = string.Split(openTimeCfg.BeginTime, ":")
local endTimes = string.Split(openTimeCfg.EndTime, ":")
local beginTime = XTime.GeyServerTime(beginTimes[1], beginTimes[2], 0)
local endTime = XTime.GeyServerTime(endTimes[1], endTimes[2], 0)
local nowTime = XTime.GetServerNowTimestamp()
if nowTime >= beginTime and nowTime <= endTime then
return true
end
end
return false
end
function XFubenBossOnlineManager.GetBossDataList()
return BossDataList
end
function XFubenBossOnlineManager.GetIsActivity()
return IsActivity
end
function XFubenBossOnlineManager.CheckBossDataCorrect()
if not BossDataList then
XLog.Error("XFubenBossOnlineManager.CheckBossDataCorrect 错误, 联网获取的Boss信息列表为空")
return false
end
local count = IsActivity and ACTIVITY_BOSS_COUNT or NORMAL_BOSS_COUNT
for diff = 1, count, 1 do
local correct = false
for _, bossInfo in pairs(BossDataList) do
if bossInfo.DifficultyType == diff then
correct = true
break
end
end
if not correct then
XLog.Error("XFubenBossOnlineManager.CheckBossDataCorrect错误, Boss无法根据DifficultyType找到 DifficultyType:" .. diff)
return false
end
end
for _, v in pairs(BossDataList) do
if not OnlineBossSectionTemplates[v.BossId] then
XLog.Error("XFubenBossOnlineManager.CheckBossDataCorrect错误, 无法根据BossId" .. v.BossId .. "" .. TABLE_FUBEN_ONLINEBOSS_SECTION .. "表中找到数据")
return false
end
end
return true
end
function XFubenBossOnlineManager.OnRefreshBossData(data)
local oldBeginTime = OnlineBeginTime
IsActivity = data.Activity == 1
OnlineBeginTime = data.BeginTime
OnlineLelfTime = data.LeftTime + XTime.GetServerNowTimestamp()
BossDataList = data.BossDataList
if oldBeginTime == OnlineBeginTime then
XEventManager.DispatchEvent(XEventId.EVENT_ONLINEBOSS_UPDATE)
else
XEventManager.DispatchEvent(XEventId.EVENT_ONLINEBOSS_REFRESH)
end
end
-- 获取联机BOSS信息
function XFubenBossOnlineManager.RequsetGetBossDataList(cb)
LastRequestTime = XTime.GetServerNowTimestamp()
XNetwork.Call(METHOD_NAME.GetActivityBossDataRequest, nil, function(reply)
if reply.Code ~= XCode.Success then
XUiManager.TipCode(reply.Code)
return
end
XFubenBossOnlineManager.OnRefreshBossData(reply)
if cb then
cb()
end
end)
end
function XFubenBossOnlineManager.RefreshBossData(cb)
if not XFubenBossOnlineManager.BossDataList or
XFubenBossOnlineManager.CheckOnlineBossTimeOut() or
XTime.GetServerNowTimestamp() - LastRequestTime > RequestInterval then
XFubenBossOnlineManager.RequsetGetBossDataList(cb)
else
if cb then
cb()
end
end
end
function XFubenBossOnlineManager.GetOnlineBossUpdateTime()
return OnlineLelfTime
end
--检测boss是否已经更新
function XFubenBossOnlineManager.CheckOnlineBossTimeOut()
if OnlineLelfTime == nil then
return false
end
local curTime = XTime.GetServerNowTimestamp()
local offset = OnlineLelfTime - curTime
return offset <= 0
end
--检测前置条件
function XFubenBossOnlineManager.CheckOnlineBossUnlock(diffcult, needTips)
if not BossDataList then
return false
end
local bossData = XFubenBossOnlineManager.GetActOnlineBossSectionForDiff(diffcult)
if not bossData then
return false
end
local boSection = XFubenBossOnlineManager.GetActOnlineBossSectionById(bossData.BossId)
if not boSection then
return false
end
local stageCfg = XDataCenter.FubenManager.GetStageCfg(boSection.StageId)
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageCfg.StageId)
if needTips then
if not stageInfo.Unlock then
XUiManager.TipMsg(XDataCenter.FubenManager.GetFubenOpenTips(stageCfg.StageId, CS.XTextManager.GetText("BossOnlineNotUnlock")))
end
end
return stageInfo.Unlock
end
function XFubenBossOnlineManager.GetFlopConsumeItemCount()
local template
for _, v in pairs(OnlineBossSectionTemplates) do
template = v
break
end
if not template then
return 0
end
local itemId = XDataCenter.FubenManager.GetFlopConsumeItemId(template.StageId)
local item = XDataCenter.ItemManager.GetItem(itemId)
return item and item:GetCount() or 0
end
function XFubenBossOnlineManager.OpenBossOnlineUi(selectIdx)
XFubenBossOnlineManager.RefreshBossData(function()
if not XDataCenter.FubenBossOnlineManager.CheckBossDataCorrect() then
CsXUiManager.Instance:RunMain()
return
end
local isActivity = XFubenBossOnlineManager.GetIsActivity()
if isActivity and XFubenBossOnlineManager.CheckIsInvade() then
XLuaUiManager.Open("UiOnlineBossActivity", selectIdx)
else
XLuaUiManager.Open("UiOnlineBoss", selectIdx)
end
end)
end
function XFubenBossOnlineManager.OpenBossOnlineUiWithoutCheck(selectIdx)
local isActivity = XFubenBossOnlineManager.GetIsActivity()
if isActivity and XFubenBossOnlineManager.CheckIsInvade() then
XLuaUiManager.Open("UiOnlineBossActivity", selectIdx)
else
XLuaUiManager.Open("UiOnlineBoss", selectIdx)
end
end
function XFubenBossOnlineManager.PopOverTips()
if XFubenBossOnlineManager.GetIsActivity() then
XUiManager.TipText("ActivityBossOnlineOver")
else
XUiManager.TipText("BossOnlineOver")
end
end
function XFubenBossOnlineManager.OnActivityEnd()
BossDataList = nil
XFubenBossOnlineManager.RequsetGetBossDataList()
XEventManager.DispatchEvent(XEventId.EVENT_ONLINE_BOSS_REFRESH)
if CS.XFight.IsRunning or XLuaUiManager.IsUiLoad("UiLoading") then
return
end
if XFubenBossOnlineManager.TryPopOverTips() then
XLuaUiManager.RunMain()
end
end
function XFubenBossOnlineManager.TryPopOverTips()
if XLuaUiManager.IsUiShow("UiOnlineBoss") or XLuaUiManager.IsUiShow("UiOnlineBossActivity") then
XFubenBossOnlineManager.PopOverTips()
return true
end
return false
end
XFubenBossOnlineManager.Init()
return XFubenBossOnlineManager
end
XRpc.NotifyBossOnlineActivityStatus = function(data)
XDataCenter.FubenBossOnlineManager.OnRefreshBossData(data)
end