PGRData/Script/matrix/xui/xuiareawar/XUiAreaWarMain.lua

517 lines
16 KiB
Lua

local XUiPanelAreaWarMainBlockList3D = require("XUi/XUiAreaWar/XUiPanelAreaWarMainBlockList3D")
local XUiPanelAreaWarMainRank3D = require("XUi/XUiAreaWar/XUiPanelAreaWarMainRank3D")
local pairs = pairs
local CsXTextManagerGetText = CsXTextManagerGetText
local AUTO_REQ_ACTIVITY_DATA_INTERVAL = 2 * 60 * 1000 --界面打开后自动请求最新活动数据时间间隔(ms)
local XUiAreaWarMain = XLuaUiManager.Register(XLuaUi, "UiAreaWarMain")
function XUiAreaWarMain:OnAwake()
self.AssetActivityPanel = XUiPanelActivityAsset.New(self.PanelSpecialTool)
XDataCenter.ItemManager.AddCountUpdateListener(
{
XDataCenter.ItemManager.ItemId.AreaWarCoin,
XDataCenter.ItemManager.ItemId.AreaWarActionPoint
},
handler(self, self.UpdateAssets),
self.AssetActivityPanel
)
self:AutoAddListener()
self:InitSceneRoot()
end
function XUiAreaWarMain:OnStart()
self:InitView()
self:InitReqActivityDataTimer()
end
function XUiAreaWarMain:OnEnable()
if self.IsEnd then
return
end
if XDataCenter.AreaWarManager.OnActivityEnd() then
self.IsEnd = true
return
end
self:UpdateAssets()
self:UpdateLeftTime()
self:UpdateProgress()
self:UpdateHangUp()
self:UpdateTask()
self:UpdateShop()
self:UpdatePurificationLevel()
self:UpdateSpecialRole()
self:UpdateBlocks()
self:CheckPopups()
end
function XUiAreaWarMain:OnDisable()
XCountDown.UnBindTimer(self, XCountDown.GTimerName.AreaWar)
end
function XUiAreaWarMain:OnDestroy()
self:DisposeReqActivityDataTimer()
self.BlockList3DPanel:OnDispose()
end
function XUiAreaWarMain:OnGetEvents()
return {
XEventId.EVENT_AREA_WAR_HANG_UP_REWARD_REMIND_CHANGE,
XEventId.EVENT_AREA_WAR_BLOCK_STATUS_CHANGE,
XEventId.EVENT_AREA_WAR_SELF_BLOCK_PURIFICATION_CHANGE,
XEventId.EVENT_AREA_WAR_ACTIVITY_END,
XEventId.EVENT_AREA_WAR_PURIFICATION_LEVEL_CHANGE
}
end
function XUiAreaWarMain:OnNotify(evt, ...)
if self.IsEnd then
return
end
local args = {...}
if evt == XEventId.EVENT_AREA_WAR_HANG_UP_REWARD_REMIND_CHANGE then
self:UpdateHangUp()
elseif evt == XEventId.EVENT_AREA_WAR_BLOCK_STATUS_CHANGE then
self:UpdateSpecialRole()
self:UpdateProgress()
self:UpdateBlocks()
self:CheckPopups()
elseif evt == XEventId.EVENT_AREA_WAR_SELF_BLOCK_PURIFICATION_CHANGE then
self:UpdateBlocks()
elseif evt == XEventId.EVENT_AREA_WAR_PURIFICATION_LEVEL_CHANGE then
self:UpdatePurificationLevel()
self:CheckPopups()
elseif evt == XEventId.EVENT_AREA_WAR_ACTIVITY_END then
if XDataCenter.AreaWarManager.OnActivityEnd() then
self.IsEnd = true
return
end
end
end
function XUiAreaWarMain:AutoAddListener()
self:BindHelpBtn(self.BtnHelp, "AreaWarMain")
self.BtnBack.CallBack = function()
self:Close()
end
self.BtnMainUi.CallBack = function()
XLuaUiManager.RunMain()
end
self.BtnProgress.CallBack = function()
self:OnClickBtnProgress()
end
self.BtnProfit.CallBack = function()
self:OnClickBtnProfit()
end
self.BtnTask.CallBack = function()
self:OnClickBtnTask()
end
self.BtnShop.CallBack = function()
self:OnClickBtnShop()
end
self.BtnBuff.CallBack = function()
self:OnClickBtnBuff()
end
self.BtnRole.CallBack = function()
self:OnClickBtnRole()
end
self.BtnLocation.CallBack = function()
self:OnClickBtnLocation()
end
end
function XUiAreaWarMain:InitView()
self.TxtTitle.text = XDataCenter.AreaWarManager.GetActivityName()
end
function XUiAreaWarMain:UpdateAssets()
self.AssetActivityPanel:Refresh(
{
XDataCenter.ItemManager.ItemId.AreaWarCoin,
XDataCenter.ItemManager.ItemId.AreaWarActionPoint
},
{
XDataCenter.ItemManager.ItemId.AreaWarActionPoint
}
)
end
function XUiAreaWarMain:UpdateLeftTime()
XCountDown.UnBindTimer(self, XCountDown.GTimerName.AreaWar)
XCountDown.BindTimer(
self,
XCountDown.GTimerName.AreaWar,
function(time)
time = time > 0 and time or 0
local timeText = XUiHelper.GetTime(time, XUiHelper.TimeFormatType.ACTIVITY)
self.TxtTime.text = timeText
end
)
end
--全服进度
function XUiAreaWarMain:UpdateProgress()
local clearCount, totalCount = XDataCenter.AreaWarManager.GetBlockProgress()
self.TxtJd.text = clearCount
self.TxtJdTotal.text = "/" .. totalCount
self.ImgJdFillAmount.fillAmount = totalCount ~= 0 and clearCount / totalCount or 1
end
function XUiAreaWarMain:OnClickBtnProgress()
XLuaUiManager.Open("UiAreaWarInformation")
end
--挂机收益
function XUiAreaWarMain:UpdateHangUp()
if not XDataCenter.AreaWarManager.IsHangUpUnlock() then
self.BtnProfit:SetDisable(true)
return
end
self.BtnProfit:SetDisable(false)
XRedPointManager.AddRedPointEvent(
self.BtnProfit,
function(_, count)
self.BtnProfit:ShowReddot(count >= 0)
end,
self,
{XRedPointConditions.Types.XRedPointConditionAreaWarHangUpReward}
)
end
function XUiAreaWarMain:OnClickBtnProfit()
XDataCenter.AreaWarManager.OpenUiHangUp()
end
--任务目标
function XUiAreaWarMain:UpdateTask()
local tipStr = XDataCenter.AreaWarManager.GetNextTaskProgressTip()
if not string.IsNilOrEmpty(tipStr) then
self.BtnTask:SetNameByGroup(0, tipStr)
self.BtnTask:SetDisable(false)
else
self.BtnTask:SetDisable(true)
end
XRedPointManager.AddRedPointEvent(
self.BtnTask,
function(_, count)
self.BtnTask:ShowReddot(count >= 0)
end,
self,
{XRedPointConditions.Types.XRedPointConditionAreaWarTask}
)
end
function XUiAreaWarMain:OnClickBtnTask()
XLuaUiManager.Open("UiAreaWarTask")
end
--商店
function XUiAreaWarMain:UpdateShop()
XRedPointManager.AddRedPointEvent(
self.BtnShop,
function(_, count)
self.BtnShop:ShowReddot(count >= 0)
end,
self,
{XRedPointConditions.Types.XRedPointConditionAreaWarCanBuy}
)
end
function XUiAreaWarMain:OnClickBtnShop()
XDataCenter.AreaWarManager.OpenUiShop()
end
--净化加成
function XUiAreaWarMain:UpdatePurificationLevel()
local usingCount, unlockCount = XDataCenter.AreaWarManager.GetPluginProgress()
self.BtnBuff:SetNameByGroup(0, usingCount)
self.BtnBuff:SetNameByGroup(1, "/" .. unlockCount)
if not XDataCenter.AreaWarManager.IsPurificationLevelUnlock() then
self.BtnBuff:SetDisable(true)
return
end
self.BtnBuff:SetDisable(false)
XRedPointManager.AddRedPointEvent(
self.BtnBuff,
function(_, count)
self.BtnBuff:ShowReddot(count >= 0)
end,
self,
{XRedPointConditions.Types.XRedPointConditionAreaWarPluginToUnlock}
)
end
function XUiAreaWarMain:OnClickBtnBuff()
XDataCenter.AreaWarManager.OpenUiPurificationLevel()
end
--特攻角色
function XUiAreaWarMain:UpdateSpecialRole()
local unlockCount = XDataCenter.AreaWarManager.GetUnlockSpecialRoleCount()
self.BtnRole:SetNameByGroup(0, unlockCount)
if not XDataCenter.AreaWarManager.IsAnySpecialRoleUnlock() then
self.BtnRole:SetDisable(true)
return
end
self.BtnRole:SetDisable(false)
XRedPointManager.AddRedPointEvent(
self.BtnRole,
function(_, count)
self.BtnRole:ShowReddot(count >= 0)
end,
self,
{XRedPointConditions.Types.XRedPointConditionAreaWarSpecialRoleReward}
)
end
function XUiAreaWarMain:OnClickBtnRole()
XDataCenter.AreaWarManager.OpenUiSpecialRole()
end
function XUiAreaWarMain:OnClickBtnLocation()
self.NextFightingBlockId = XDataCenter.AreaWarManager.GetNextFightingBlockId(self.NextFightingBlockId)
if not XTool.IsNumberValid(self.NextFightingBlockId) then
XUiManager.TipText("AreaWarNoBlockFighting")
return
end
self.BlockList3DPanel:SetNormalCameraFollowBlock(self.NextFightingBlockId)
end
--活动数据刷新定时器
function XUiAreaWarMain:InitReqActivityDataTimer()
self.ActivityDataTimer =
self.ActivityDataTimer or
XScheduleManager.ScheduleForever(
function()
XDataCenter.AreaWarManager.AreaWarGetActivityDataRequest()
end,
AUTO_REQ_ACTIVITY_DATA_INTERVAL
)
end
function XUiAreaWarMain:DisposeReqActivityDataTimer()
if self.ActivityDataTimer then
XScheduleManager.UnSchedule(self.ActivityDataTimer)
self.ActivityDataTimer = nil
end
end
------------------3D场景相关----------------------------
function XUiAreaWarMain:InitSceneRoot()
local root = self.UiModelGo.transform
self.VitrulCameraDic = {
--普通状态下相机
Normal = {
root:FindTransform("UiCamFarMain1"):GetComponent("CinemachineVirtualCamera"),
root:FindTransform("UiCamNearMain1"):GetComponent("CinemachineVirtualCamera")
},
--关卡详情下相机
StageDetail = {
root:FindTransform("UiCamFarMain2"):GetComponent("CinemachineVirtualCamera"),
root:FindTransform("UiCamNearMain2"):GetComponent("CinemachineVirtualCamera")
}
}
--区块地图
local go = root:FindTransform("PanelStageList")
local go1 = self.UiSceneInfo.Transform:FindTransform("Uimqfjz_02Bai")
local grids3d = XTool.InitUiObjectByUi({}, go1) --场景中区块对应的3D格子
local clickBlockCb = handler(self, self.OnClickBlock)
self.BlockList3DPanel = XUiPanelAreaWarMainBlockList3D.New(go, grids3d, self.VitrulCameraDic, clickBlockCb)
--区块排行榜
local go = root:FindTransform("PanelRank")
self.RankPanel = XUiPanelAreaWarMainRank3D.New(go)
self.RankPanel.GameObject:SetActiveEx(false)
self:UpdateVirtualCameras(self.VitrulCameraDic.Normal)
end
function XUiAreaWarMain:UpdateVirtualCameras(showCameras)
for _, group in pairs(self.VitrulCameraDic) do
for _, camera in pairs(group) do
camera.gameObject:SetActiveEx(false)
end
end
for _, camera in pairs(showCameras) do
camera.gameObject:SetActiveEx(true)
end
end
--区块展示
function XUiAreaWarMain:UpdateBlocks()
local canvas = self.Transform:GetComponent("Canvas")
local canvasUi3D = self.UiModelGo.transform:FindTransform("3DUiCanvas"):GetComponent("Canvas")
canvasUi3D.sortingOrder = canvas.sortingOrder + 1
self.RankPanel:Refresh()
self.BlockList3DPanel:Refresh()
--更新区块详情
if self.StageDetailBlockId then
self:OnOpenStageDetail(self.StageDetailBlockId)
end
end
--区块被点击
function XUiAreaWarMain:OnClickBlock(blockId)
if XAreaWarConfigs.CheckBlockShowType(blockId, XAreaWarConfigs.BlockShowType.WorldBoss) then
--世界Boss类型区块有独立的主UI
local asynOpenUi = asynTask(XDataCenter.AreaWarManager.OpenUiWorldBoss)
local asynPlayAnimation = asynTask(self.PlayAnimationWithMask, self)
RunAsyn(
function()
self:DisposeReqActivityDataTimer()
self:OnOpenStageDetail(blockId, true)
asynPlayAnimation("DarkEnable")
asynOpenUi(blockId)
asynWaitSecond(0) --等待UI完全重新打开之后再播放动画
self:OnCloseStageDetail(blockId)
asynPlayAnimation("DarkDisable")
self:InitReqActivityDataTimer()
end
)
elseif XAreaWarConfigs.CheckBlockShowType(blockId, XAreaWarConfigs.BlockShowType.Mystery) then
--神秘类型区块只播放剧情
local movieId = XAreaWarConfigs.GetBlockMovieId(blockId)
XDataCenter.MovieManager.PlayMovie(movieId)
else
--打开区块详情界面
local closeCb = handler(self, self.OnCloseStageDetail)
XLuaUiManager.Open("UiAreaWarStageDetail", blockId, closeCb)
self:OnOpenStageDetail(blockId)
end
end
--打开区块详情
function XUiAreaWarMain:OnOpenStageDetail(blockId, hideRankPanel)
if XTool.UObjIsNil(self.Transform) then
return
end
self.StageDetailBlockId = blockId
--相机推进
self:UpdateVirtualCameras(self.VitrulCameraDic.StageDetail)
--锁定区块
self.BlockList3DPanel:SetDetailCameraFollowBlock(blockId)
--隐藏主界面2D的UI
self.SafeAreaContentPane.gameObject:SetActiveEx(false)
if not hideRankPanel then
--更新区块排行榜, 并挂载到对应区块父节点上,然后打开
self.RankPanel:Refresh(blockId)
self.BlockList3DPanel:SetAsBlockChild(self.RankPanel.Transform, blockId)
self.RankPanel.GameObject:SetActiveEx(true)
end
self:PlayAnimationWithMask("UiDisable")
end
--关闭区块详情
function XUiAreaWarMain:OnCloseStageDetail(blockId)
if XTool.UObjIsNil(self.Transform) then
return
end
self.StageDetailBlockId = nil
--显示主界面2D的UI
self.SafeAreaContentPane.gameObject:SetActiveEx(true)
--关闭区块排行榜
self.RankPanel.GameObject:SetActiveEx(false)
--更新相机
self:UpdateVirtualCameras(self.VitrulCameraDic.Normal)
--还原相机跟随目标
self.BlockList3DPanel:SetNormalCameraFollowBlock(blockId)
--播放格子的远景动画
self.BlockList3DPanel:PlayGridFarAnim(blockId)
self:PlayAnimationWithMask("UiEnable")
end
--[[检查是否有弹窗弹出,优先级:
1.区块净化进度
2.净化等级变更
3.特攻角色解锁
4.挂机收益功能解锁
]]
function XUiAreaWarMain:CheckPopups()
if self.IsPoping then
return
end
self.IsPoping = true
local asynPopUp = asynTask(XLuaUiManager.Open)
local asynPlayAnimation = asynTask(self.PlayAnimationWithMask, self)
local asynLetsLift = asynTask(self.BlockList3DPanel.LetsLift, self.BlockList3DPanel)
local asynReqUpdate = asynTask(XDataCenter.AreaWarManager.AreaWarGetActivityDataRequest)
RunAsyn(
function()
local poped = false
--区块净化进度弹窗
if XDataCenter.AreaWarManager.CheckHasNewClearBlockId() then
asynPopUp("UiAreaWarSszbTips")
poped = true
end
--净化等级变更弹窗
if XDataCenter.AreaWarManager.CheckHasRecordPfLevel() then
asynPopUp("UiAreaWarJingHuaTips")
poped = true
end
--特攻角色解锁弹窗
if XDataCenter.AreaWarManager.CheckHasRecordSpecialRole() then
asynPopUp("UiAreaWarTegongjsTips")
poped = true
end
--挂机收益功能解锁弹窗
if XDataCenter.AreaWarManager.CheckHangUpUnlockPopUp() then
asynPopUp("UiAreaWarHangUpJs")
XDataCenter.AreaWarManager.SetHangUpUnlockPopUpCookie()
poped = true
end
--弹窗展示过了
if poped then
--请求服务端最新数据
asynReqUpdate()
--通知服务端更新历史记录
XDataCenter.AreaWarManager.AreaWarPopupRequest()
end
XLuaUiManager.SetMask(true)
--播放3D场景格子升起动画
asynLetsLift()
--更新新解锁区块的状态
self.BlockList3DPanel:RefreshNewUnlockBlocks()
--清除已经弹窗展示过的最新记录
XDataCenter.AreaWarManager.ClearNewRecord()
XLuaUiManager.SetMask(false)
self.IsPoping = nil
end
)
end