PGRData/Script/matrix/xmanager/XWorldBossManager.lua

632 lines
No EOL
24 KiB
Lua
Raw Permalink 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.

XWorldBossManagerCreator = function()
local XWorldBossActivityEntity = require("XEntity/XWorldBoss/XWorldBossActivityEntity")
local XBuffEntity = require("XEntity/XWorldBoss/XBuffEntity")
local XWorldBossManager = {}
local CSTextManagerGetText = CS.XTextManager.GetText
local CSXGameClientConfig = CS.XGame.ClientConfig
local METHOD_NAME = {
GetWorldBossGlobalDataRequest = "GetWorldBossGlobalDataRequest",
GetAttributeAreaRewardRequest = "GetAttributeAreaRewardRequest",
GetAttributeAreaStageRewardRequest = "GetAttributeAreaStageRewardRequest",
GetBossPhasesRewardRequest = "GetBossPhasesRewardRequest",
WorldBossShopBuyRequest = "WorldBossShopBuyRequest",
WorldBossAttributeAreaRankRequest = "WorldBossAttributeAreaRankRequest",
GetWorldBossReportRequest = "GetWorldBossReportRequest",
}
local SYNC_GLOBALDATA_SECOND = 30
local LastSyncGlobaldataTime = 0
local WorldBossActivityDic = {}
local WorldBossGlobalData = {}
local WorldBossMySelfData = {}
local WorldBossBuffDic = {}
local WorldBossBuffGroupDic = {}
local WorldBossBossStageDic = {}
local FightReportList = {}
local AreaRankData = {}
local BossStageLevel = 1
function XWorldBossManager.Init()
WorldBossBuffGroupDic = {}
XWorldBossManager.CreateWorldBossActivity()
XWorldBossManager.CreateWorldBossBuffDic()
XWorldBossManager.CreateWorldBossBossStageDic()
end
function XWorldBossManager.CreateWorldBossActivity()
local activityCfgs = XWorldBossConfigs.GetActivityTemplates()
for _, cgf in pairs(activityCfgs) do
WorldBossActivityDic[cgf.Id] = XWorldBossActivityEntity.New(cgf.Id)
end
end
function XWorldBossManager.UpdateWorldBossActivity()
local worldBossActivity = XWorldBossManager.GetCurWorldBossActivity()
if worldBossActivity then
local tmpData = {}
tmpData.GlobalData = WorldBossGlobalData
tmpData.PrivateData = WorldBossMySelfData
worldBossActivity:UpdateData(tmpData)
worldBossActivity:UpdateEntityDic()
end
end
function XWorldBossManager.CreateWorldBossBuffDic()
local buffCfgs = XWorldBossConfigs.GetBuffTemplates()
for _, buffCfg in pairs(buffCfgs) do
local tmpEntity = XBuffEntity.New(buffCfg.Id)
WorldBossBuffDic[buffCfg.Id] = tmpEntity
end
end
function XWorldBossManager.UpdateGetedBossBuff(buffList)--如果在多个地方都涉及buff更新则因为等级关系所带来的条件提示文字也会得到正确的影响
for _, buffId in pairs(buffList) do
local buffEntity = XWorldBossManager.GetWorldBossBuffById(buffId)
local tmpEntity = WorldBossBuffGroupDic[buffEntity:GetGroupId()]
local tmpData = {}
if buffEntity:GetGroupId() == 0 then
tmpData.LockDesc = buffEntity:GetType() == XWorldBossConfigs.BuffType.Buff and
CSTextManagerGetText("WorldBossBuffGeted") or CSTextManagerGetText("WorldBossRobotGeted")
tmpData.LockDescColor = CSXGameClientConfig:GetString("WorldBossBuffUnLockColor")
tmpData.InfoTextColor = CSXGameClientConfig:GetString("WorldBossUnLockInfoColor")
buffEntity:UpdateData(tmpData)
else
if (not tmpEntity) or (tmpEntity:GetLevel() <= buffEntity:GetLevel()) then
if tmpEntity then
tmpData.LockDesc = CSTextManagerGetText("WorldBossBuffLevelLow")
tmpData.LockDescColor = CSXGameClientConfig:GetString("WorldBossBuffLowColor")
tmpData.InfoTextColor = CSXGameClientConfig:GetString("WorldBossLockInfoColor")
tmpEntity:UpdateData(tmpData)
end
tmpData.LockDesc = buffEntity:GetType() == XWorldBossConfigs.BuffType.Buff and
CSTextManagerGetText("WorldBossBuffGeted") or CSTextManagerGetText("WorldBossRobotGeted")
tmpData.LockDescColor = CSXGameClientConfig:GetString("WorldBossBuffUnLockColor")
tmpData.InfoTextColor = CSXGameClientConfig:GetString("WorldBossUnLockInfoColor")
buffEntity:UpdateData(tmpData)
WorldBossBuffGroupDic[buffEntity:GetGroupId()] = buffEntity
else
tmpData.LockDesc = CSTextManagerGetText("WorldBossBuffLevelLow")
tmpData.LockDescColor = CSXGameClientConfig:GetString("WorldBossBuffLowColor")
tmpData.InfoTextColor = CSXGameClientConfig:GetString("WorldBossLockInfoColor")
buffEntity:UpdateData(tmpData)
end
end
buffEntity:UpdateData({ IsLock = false })
end
end
function XWorldBossManager.CreateWorldBossBossStageDic()
local stageCfgs = XWorldBossConfigs.GetBossStageTemplates()
for _, stageCfg in pairs(stageCfgs) do
local bossStage = WorldBossBossStageDic[stageCfg.StageId]
if not bossStage then
bossStage = {}
WorldBossBossStageDic[stageCfg.StageId] = bossStage
end
bossStage[stageCfg.Level] = bossStage[stageCfg.Level] or {}
bossStage[stageCfg.Level] = stageCfg
end
end
function XWorldBossManager.IsInActivity()
local worldBossActivity = XWorldBossManager.GetCurWorldBossActivity()
if worldBossActivity then
local nowTime = XTime.GetServerNowTimestamp()
if nowTime > worldBossActivity:GetBeginTime() and nowTime < worldBossActivity:GetEndTime() then
return true
end
end
return false
end
function XWorldBossManager.GetCurWorldBossActivity()
local activityId = WorldBossMySelfData.ActivityId
if not activityId then
return nil
end
return WorldBossActivityDic[activityId]
end
function XWorldBossManager.GetWorldBossActivityById(activityId)
if not activityId then
return
end
return WorldBossActivityDic[activityId]
end
function XWorldBossManager.GetWorldBossBuffDic()
return WorldBossBuffDic
end
function XWorldBossManager.GetWorldBossBuffById(id)
return WorldBossBuffDic[id]
end
function XWorldBossManager.GetBossStageGroupByIdAndLevel(stageId, Level)
if not WorldBossBossStageDic[stageId] then
XLog.Error("Share/Fuben/WorldBoss/WorldBossBossStage.tab Id = " .. stageId .. " Is Null")
return
end
return Level and WorldBossBossStageDic[stageId][Level] or WorldBossBossStageDic[stageId]
end
function XWorldBossManager.GetSameGroupBossBuffByGroupId(id)
local buffList = {}
if not id or id == 0 then
return nil
end
for _, buff in pairs(WorldBossBuffDic) do
if buff:GetGroupId() == id then
table.insert(buffList, buff)
end
end
table.sort(buffList, function(a, b)
return a:GetLevel() < b:GetLevel()
end)
return buffList
end
function XWorldBossManager.GetSameGroupToLevelpBossBuffByGroupId(id)
local buffList = {}
local DefaultIndex = 1
if not id or id == 0 then
return nil
end
for _, buff in pairs(WorldBossBuffDic) do
if buff:GetGroupId() == id then
table.insert(buffList, buff)
end
end
table.sort(buffList, function(a, b)
if a:GetIsLock() and b:GetIsLock() then
return a:GetLevel() < b:GetLevel()
elseif not a:GetIsLock() and not b:GetIsLock() then
return a:GetLevel() > b:GetLevel()
else
return not a:GetIsLock()
end
end)
return buffList[DefaultIndex]
end
function XWorldBossManager.GetFightReportTypeById(id)
local reportCfg = XWorldBossConfigs.GetReportTemplatesById(id)
if reportCfg.Type == 1 or reportCfg.Type == 2 or reportCfg.Type == 3 then
return 1
else
return 2
end
end
function XWorldBossManager.GetWorldBossSection()--获取入口数据
local sections = {}
if XFunctionManager.CheckFunctionFitter(XFunctionManager.FunctionName.WorldBoss) then
return sections
end
local worldBossActivity = XWorldBossManager.GetCurWorldBossActivity()
if worldBossActivity and XWorldBossManager.IsInActivity() then
local defaultBossAreaId = worldBossActivity:GetBossAreaIds()[1]
local bossArea = worldBossActivity:GetBossAreaEntityById(defaultBossAreaId)
local section = {
Id = worldBossActivity:GetId(),
Type = XDataCenter.FubenManager.ChapterType.WorldBoss,
Name = worldBossActivity:GetName(),
BannerBg = worldBossActivity:GetBg(),
BossHpPercent = bossArea:GetHpPercent(),
}
table.insert(sections, section)
end
return sections
end
function XWorldBossManager.GetWorldBossBossTaskDataDic()
local bossAreaDatas = XWorldBossManager.GetBossAreaDic()
local bossTaskDataDic = {}
if not bossAreaDatas then
return bossTaskDataDic
end
for _, data in pairs(bossAreaDatas) do
local taskIds = data:GetBossTaskIds()
for _, taskId in pairs(taskIds) do
bossTaskDataDic[taskId] = bossTaskDataDic[taskId] or {}
table.insert(bossTaskDataDic[taskId], data)
end
end
return bossTaskDataDic
end
function XWorldBossManager.GetAttributeAreaDic()
local worldBossActivity = XWorldBossManager.GetCurWorldBossActivity()
return worldBossActivity and worldBossActivity:GetAttributeAreaEntityDic()
end
function XWorldBossManager.GetBossAreaDic()
local worldBossActivity = XWorldBossManager.GetCurWorldBossActivity()
return worldBossActivity and worldBossActivity:GetBossAreaEntityDic()
end
function XWorldBossManager.GetSpecialSaleDic()
local worldBossActivity = XWorldBossManager.GetCurWorldBossActivity()
return worldBossActivity and worldBossActivity:GetSpecialSaleEntityDic()
end
function XWorldBossManager.GetAttributeAreaById(id)
local worldBossActivity = XWorldBossManager.GetCurWorldBossActivity()
return worldBossActivity and worldBossActivity:GetAttributeAreaEntityById(id)
end
function XWorldBossManager.GetAttributeStageById(areaId, id)
local worldBossActivity = XWorldBossManager.GetCurWorldBossActivity()
local attributeArea = worldBossActivity:GetAttributeAreaEntityById(areaId)
return worldBossActivity and attributeArea and attributeArea:GetStageEntityById(id)
end
function XWorldBossManager.GetBossAreaById(id)
local worldBossActivity = XWorldBossManager.GetCurWorldBossActivity()
return worldBossActivity and worldBossActivity:GetBossAreaEntityById(id)
end
function XWorldBossManager.GetSpecialSaleById(id)
local worldBossActivity = XWorldBossManager.GetCurWorldBossActivity()
return worldBossActivity and worldBossActivity:GetSpecialSaleEntityById(id)
end
function XWorldBossManager.GetCurrentActivityNo()--获取当前活动ID,如果活动未开始则返回默认活动ID
local DefaultActivityId = XWorldBossConfigs.GetActivityLastTemplate().Id
return WorldBossMySelfData.ActivityId or DefaultActivityId
end
function XWorldBossManager.GetActivityBeginTime()
local activityId = XWorldBossManager.GetCurrentActivityNo()
if not activityId then
return nil
end
local worldBossActivity = XWorldBossManager.GetWorldBossActivityById(activityId)
return worldBossActivity and worldBossActivity:GetBeginTime() or 0
end
function XWorldBossManager.GetActivityEndTime()
local activityId = XWorldBossManager.GetCurrentActivityNo()
if not activityId then
return nil
end
local worldBossActivity = XWorldBossManager.GetWorldBossActivityById(activityId)
return worldBossActivity and worldBossActivity:GetEndTime() or 0
end
function XWorldBossManager.SetBossStageLevel(level)
BossStageLevel = level
end
function XWorldBossManager.GetBossStageLevel()
return BossStageLevel
end
function XWorldBossManager.UpdateWorldBossGlobalData(globalData)
WorldBossGlobalData = globalData
end
function XWorldBossManager.UpdateWorldBossMySelfData(mySelfData)
WorldBossMySelfData = mySelfData
end
function XWorldBossManager.SetWorldBossReportList(reportList)
FightReportList = reportList
end
function XWorldBossManager.GetWorldBossReportList()
return FightReportList
end
function XWorldBossManager.GetWorldBossNewReport()
return FightReportList and #FightReportList > 0 and FightReportList[#FightReportList] or nil
end
function XWorldBossManager.SetAreaRankData(rankList)
AreaRankData = rankList
end
function XWorldBossManager.GetMyAreaRankData()
local tmpData = {}
tmpData.Rank = AreaRankData.Rank
tmpData.ToTalRank = AreaRankData.ToTalRank
tmpData.Score = AreaRankData.Score
return tmpData
end
function XWorldBossManager.GetOtherAreaRankData()
return AreaRankData.RankList or {}
end
function XWorldBossManager.UpdateMySelfBossAreaData(mySelfData)
local IsHave = false
for index, areaData in pairs(WorldBossMySelfData.BossAreaDatas) do
if areaData.Id == mySelfData.Id then
WorldBossMySelfData.BossAreaDatas[index] = mySelfData
IsHave = true
break
end
end
if not IsHave then
table.insert(WorldBossMySelfData.BossAreaDatas, mySelfData)
end
end
function XWorldBossManager.UpdateMySelfAttributeAreaData(mySelfData)
local IsHave = false
for index, areaData in pairs(WorldBossMySelfData.AttributeAreaDatas) do
if areaData.Id == mySelfData.Id then
WorldBossMySelfData.AttributeAreaDatas[index] = mySelfData
IsHave = true
break
end
end
if not IsHave then
table.insert(WorldBossMySelfData.AttributeAreaDatas, mySelfData)
end
end
function XWorldBossManager.CheckWorldBossActivityReset()
if CS.XFight.IsRunning or XLuaUiManager.IsUiLoad("UiLoading") then
return
end
local notInActivity = not XWorldBossManager.IsInActivity()
if notInActivity then
XUiManager.TipMsg(CS.XTextManager.GetText("WorldBossNotInActivityTime"))
XScheduleManager.ScheduleOnce(function()
XLuaUiManager.RunMain()
end, 200)
end
end
function XWorldBossManager.CheckWorldBossActivityRedPoint()
local worldBossActivity = XWorldBossManager.GetCurWorldBossActivity()
local attributeAreaIds = worldBossActivity:GetAttributeAreaIds()
local bossAreaIds = worldBossActivity:GetBossAreaIds()
local IsHaveRed = false
for _, areaId in pairs(attributeAreaIds) do
IsHaveRed = XWorldBossManager.CheckWorldBossAttributeArearRedPoint(areaId)
if IsHaveRed then
return true
end
end
for _, areaId in pairs(bossAreaIds) do
IsHaveRed = XWorldBossManager.CheckWorldBossBossArearRedPoint(areaId)
if IsHaveRed then
return true
end
end
end
function XWorldBossManager.CheckWorldBossBossArearRedPoint(areaId)
local IsHaveRed = false
local areaData = XWorldBossManager.GetBossAreaById(areaId)
local phasesRewardDatas = areaData:GetPhasesRewardEntityDic()
for _, phasesRewardData in pairs(phasesRewardDatas) do
local IsCanGet = phasesRewardData:GetIsCanGet()
local IsGeted = phasesRewardData:GetIsGeted()
IsHaveRed = IsCanGet and not IsGeted
if IsHaveRed then
return true
end
end
return IsHaveRed
end
function XWorldBossManager.CheckWorldBossAttributeArearRedPoint(areaId)
local IsHaveRed = false
local areaData = XWorldBossManager.GetAttributeAreaById(areaId)
local stageIds = areaData:GetStageIds()
local IsCanGet = areaData:GetIsAreaFinish()
local IsGeted = areaData:GetIsRewardGeted()
IsHaveRed = IsCanGet and not IsGeted
if IsHaveRed then
return true
end
for _, stageId in pairs(stageIds) do
IsHaveRed = XWorldBossManager.CheckWorldBossStageRedPoint(areaId, stageId)
if IsHaveRed then
return true
end
end
return IsHaveRed
end
function XWorldBossManager.CheckWorldBossStageRedPoint(areaId, stageId)
local stageData = XWorldBossManager.GetAttributeStageById(areaId, stageId)
local rewardId = stageData:GetFinishReward()
local IsCanGet = stageData:GetIsFinish()
local IsGeted = stageData:GetIsRewardGeted()
local IsHaveRed = IsCanGet and not IsGeted and rewardId > 0
return IsHaveRed
end
function XWorldBossManager.CheckAnyTaskFinished()
local taskDatas = XDataCenter.TaskManager.GetWorldBossFullTaskList()
if not taskDatas then
return false
end
local achieved = XDataCenter.TaskManager.TaskState.Achieved
for _, taskData in pairs(taskDatas or {}) do
if taskData.State == achieved then
return true
end
end
return false
end
---------------------------------------stage相关-------------------------------------->>>
function XWorldBossManager.InitStageInfo()
for _, activity in pairs(WorldBossActivityDic) do
local attributeAreaDic = activity:GetAttributeAreaEntityDic()
local bossAreaDic = activity:GetBossAreaEntityDic()
for _, attributeArea in pairs(attributeAreaDic) do
for _, stageId in pairs(attributeArea:GetStageIds()) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
stageInfo.Type = XDataCenter.FubenManager.StageType.WorldBoss
stageInfo.ChapterName = attributeArea:GetName()
stageInfo.AreaType = XWorldBossConfigs.AreaType.Attribute
end
end
for _, bossArea in pairs(bossAreaDic) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(bossArea:GetStageId())
stageInfo.Type = XDataCenter.FubenManager.StageType.WorldBoss
stageInfo.ChapterName = bossArea:GetName()
stageInfo.AreaType = XWorldBossConfigs.AreaType.Boss
end
end
end
function XWorldBossManager.FinishFight(settle)
if settle.IsWin then
XLuaUiManager.Open("UiSettleWinWorldBoss", settle)
else
XLuaUiManager.Open("UiSettleLose", settle)
end
end
function XWorldBossManager.OpenWorldMainWind()
XWorldBossManager.GetWorldBossGlobalData(function()
XWorldBossManager.GetWorldBossReport(function()
XLuaUiManager.Open("UiWorldBossMain")
end)
end)
end
---------------------------------------stage相关---------------------------------------<<<
function XWorldBossManager.CheckIsNewStoryID(Id)
if XSaveTool.GetData(string.format("%d%s%s", XPlayer.Id, "WorldBossStory", Id)) then
return false
end
return true
end
function XWorldBossManager.MarkStoryID(Id)
if not XSaveTool.GetData(string.format("%d%s%s", XPlayer.Id, "WorldBossStory", Id)) then
XSaveTool.SaveData(string.format("%d%s%s", XPlayer.Id, "WorldBossStory", Id), Id)
end
end
function XWorldBossManager.GetWorldBossGlobalData(cb)
local now = XTime.GetServerNowTimestamp()
local syscTime = LastSyncGlobaldataTime
if syscTime and now - syscTime < SYNC_GLOBALDATA_SECOND then
if cb then
cb()
end
return
end
XNetwork.Call(METHOD_NAME.GetWorldBossGlobalDataRequest, {}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XWorldBossManager.UpdateWorldBossGlobalData(res.GlobalData)
XWorldBossManager.UpdateWorldBossActivity()
LastSyncGlobaldataTime = XTime.GetServerNowTimestamp()
XEventManager.DispatchEvent(XEventId.EVENT_WORLDBOSS_SYNCDATA)
if cb then cb() end
end)
end
function XWorldBossManager.GetAttributeAreaReward(areaId, cb)
XNetwork.Call(METHOD_NAME.GetAttributeAreaRewardRequest, { AreaId = areaId }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XUiManager.OpenUiObtain(res.RewardGoodsList)
if cb then cb() end
end)
end
function XWorldBossManager.GetAttributeAreaStageReward(areaId, stageId, cb)
XNetwork.Call(METHOD_NAME.GetAttributeAreaStageRewardRequest, { AreaId = areaId, StageId = stageId }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XUiManager.OpenUiObtain(res.RewardGoodsList)
if cb then cb() end
end)
end
function XWorldBossManager.GetBossPhasesReward(bossAreaId, bossPhasesId, cb)
XNetwork.Call(METHOD_NAME.GetBossPhasesRewardRequest, { AreaId = bossAreaId, PhasesId = bossPhasesId }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XUiManager.OpenUiObtain(res.RewardGoodsList)
if cb then cb() end
end)
end
function XWorldBossManager.WorldBossShopBuy(bossShopId, cb)
XNetwork.Call(METHOD_NAME.WorldBossShopBuyRequest, { ShopId = bossShopId }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XUiManager.OpenUiObtain(res.RewardGoodsList)
if cb then cb() end
end)
end
function XWorldBossManager.GetAttributeAreaRank(areaId, cb)
XNetwork.Call(METHOD_NAME.WorldBossAttributeAreaRankRequest, { AreaId = areaId }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XWorldBossManager.SetAreaRankData(res)
if cb then cb() end
end)
end
function XWorldBossManager.GetWorldBossReport(cb)
XNetwork.Call(METHOD_NAME.GetWorldBossReportRequest, {}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XEventManager.DispatchEvent(XEventId.EVENT_WORLDBOSS_REPORT)
XWorldBossManager.SetWorldBossReportList(res.ReportList)
if cb then cb() end
end)
end
XWorldBossManager.Init()
return XWorldBossManager
end
XRpc.NotifyWorldBossData = function(data)
XDataCenter.WorldBossManager.UpdateWorldBossMySelfData(data.SingleData)
XDataCenter.WorldBossManager.UpdateWorldBossGlobalData(data.GlobalData)
XDataCenter.WorldBossManager.UpdateWorldBossActivity()
XEventManager.DispatchEvent(XEventId.EVENT_WORLDBOSS_TASK_RESET)
end
XRpc.NotifyWorldBossAttributeAreaData = function(data)
XDataCenter.WorldBossManager.UpdateMySelfAttributeAreaData(data.AttributeAreaData)
XDataCenter.WorldBossManager.UpdateWorldBossActivity()
end
XRpc.NotifyWorldBossBossAreaData = function(data)
XDataCenter.WorldBossManager.UpdateMySelfBossAreaData(data.BossAreaData)
XDataCenter.WorldBossManager.UpdateWorldBossActivity()
end