PGRData/Script/matrix/xui/xuiareawar/XUiAreaWarMain.lua
2024-09-01 22:49:41 +02:00

980 lines
No EOL
32 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.

---@class XUiAreaWarMain : XLuaUi
---@field Canvas UnityEngine.Canvas
---@field Canvas3D UnityEngine.Canvas
---@field DragMove XDragMove
---@field BlockAreas XAreaWarBlockArea[]
---@field PlateAreas XAreaWarPlateArea[]
---@field IdleAnims XAreaWarAnimArea[]
---@field FarFraming Cinemachine.CinemachineFramingTransposer
---@field NearFraming Cinemachine.CinemachineFramingTransposer
---@field UnlockAnim XAreaWarAnimArea
---@field AllGrids UnityEngine.Transform[]
local XUiAreaWarMain = XLuaUiManager.Register(XLuaUi, "UiAreaWarMain")
local AUTO_REQ_ACTIVITY_DATA_INTERVAL = 2 * 60 * 1000 --界面打开后自动请求最新活动数据时间间隔(ms)
local CameraType = {
Normal = 1,
Detail = 2,
}
local CsMathFClamp = CS.UnityEngine.Mathf.Clamp
function XUiAreaWarMain:OnAwake()
self:InitUi()
self:InitCb()
end
function XUiAreaWarMain:OnStart()
self:InitView()
end
function XUiAreaWarMain:OnEnable()
self.Super.OnEnable(self)
self:UpdateView()
--事件注册
XEventManager.AddEventListener(XEventId.EVENT_CHAT_RECEIVE_WORLD_MSG, self.UpdateChatMsg, self)
XEventManager.AddEventListener(XEventId.EVENT_GUILD_RECEIVE_CHAT, self.UpdateChatMsg, self)
XEventManager.AddEventListener(XEventId.EVENT_CHAT_RECEIVE_MENTOR_MSG, self.UpdateChatMsg, self)
XEventManager.AddEventListener(XEventId.EVENT_CHAT_CLOSE, self.OnChatClose, self)
if self.UnlockAnim and self.UnlockAnim:IsPause() then
self.UnlockAnim:Resume()
end
end
function XUiAreaWarMain:OnDisable()
--事件移除
XEventManager.RemoveEventListener(XEventId.EVENT_CHAT_RECEIVE_WORLD_MSG, self.UpdateChatMsg, self)
XEventManager.RemoveEventListener(XEventId.EVENT_GUILD_RECEIVE_CHAT, self.UpdateChatMsg, self)
XEventManager.RemoveEventListener(XEventId.EVENT_CHAT_RECEIVE_MENTOR_MSG, self.UpdateChatMsg, self)
XEventManager.RemoveEventListener(XEventId.EVENT_CHAT_CLOSE, self.OnChatClose, self)
if self.UnlockAnim and self.UnlockAnim.IsPlaying then
self.UnlockAnim:Pause()
end
end
function XUiAreaWarMain:OnDestroy()
self:StopActivityDataTimer()
self.BlockList3DPanel:OnDispose()
self.DragMove:DelZoomBehaviour(self.ZoomHandler)
--释放红点
XRedPointManager.RemoveRedPointEvent(self.ProfitRedPoint)
XRedPointManager.RemoveRedPointEvent(self.TaskRedPoint)
--XRedPointManager.RemoveRedPointEvent(self.ShopRedPoint)
XRedPointManager.RemoveRedPointEvent(self.BuffRedPoint)
XRedPointManager.RemoveRedPointEvent(self.RoleRedPoint)
--清除记录
XDataCenter.AreaWarManager.SaveLastWarLogTabIndex(1)
if self.PlateTimer then
XScheduleManager.UnSchedule(self.PlateTimer)
self.PlateTimer = nil
end
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,
XEventId.EVENT_AREA_WAR_FOCUS_BLOCK,
CS.XEventId.EVENT_UI_DESTROY,
}
end
function XUiAreaWarMain:OnNotify(evt, ...)
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:UpdateRepeatChallenge()
self:UpdateSpecialRole()
self:UpdateProgress()
--self:UpdateBlocks()
self:UpdatePlate()
self:CheckPopups()
elseif evt == XEventId.EVENT_AREA_WAR_SELF_BLOCK_PURIFICATION_CHANGE then
--self:UpdateBlocks()
self:UpdatePlate()
elseif evt == XEventId.EVENT_AREA_WAR_PURIFICATION_LEVEL_CHANGE then
self:UpdatePurificationLevel()
self:CheckPopups()
elseif evt == XEventId.EVENT_AREA_WAR_ACTIVITY_END then
XDataCenter.AreaWarManager.OnActivityEnd()
elseif evt == XEventId.EVENT_AREA_WAR_FOCUS_BLOCK then --引导行为树需要
if self.BlockList3DPanel then
local args = {...}
self.BlockList3DPanel:FocusTargetBlock(tonumber(args[1]))
end
elseif evt == CS.XEventId.EVENT_UI_DESTROY then
self:OnUiDestroy(...)
end
end
function XUiAreaWarMain:InitUi()
--文本初始化
self.RepeatChallengeCountDown = XAreaWarConfigs.GetEndTimeTip(1)
--设置层级
self.Canvas = self.Transform:GetComponent("Canvas")
self.Canvas3D = self.UiModelGo.transform:FindTransform("3DUiCanvas"):GetComponent("Canvas")
--3D场景
local root = self.UiModelGo.transform
local panelRank = root:FindTransform("PanelRank")
local stageList = root:FindTransform("PanelStageList")
local dynamic = self.UiSceneInfo.Transform:FindTransform("GroupDynamic")
---@type UnityEngine.GameObject
local prefab = dynamic:LoadPrefab(XAreaWarConfigs.GetPrefabPath())
local regionRoot = prefab.transform:Find("RegionRoot")
local blockAreas = regionRoot.gameObject:GetComponentsInChildren(typeof(CS.XAreaWarBlockArea))
local gridRoot = prefab.transform:Find("GridRoot")
local grids = {}
for i = 0, gridRoot.transform.childCount - 1 do
local trans = gridRoot.transform:GetChild(i)
table.insert(grids, trans)
end
self.AllGrids = grids
self.BlockAreas = blockAreas
self.PlateAreas = regionRoot.gameObject:GetComponentsInChildren(typeof(CS.XAreaWarPlateArea))
self.UnlockAnim = regionRoot.gameObject:GetComponent(typeof(CS.XAreaWarAnimArea))
if not self.UnlockAnim then
self.UnlockAnim = regionRoot.gameObject:AddComponent(typeof(CS.XAreaWarAnimArea))
end
local type, duration, offsetY, maxDistance = XAreaWarConfigs.GetUnlockAnimationInfo()
self.UnlockAnim:InitAnimation(type, duration, offsetY, maxDistance)
self.UnlockAnimBlockCache = {}
self.PlateOffsetY, self.PlateDuration = XAreaWarConfigs.GetPlateLiftUpInfo()
--取消呼吸动画
--local anims = regionRoot.gameObject:GetComponentsInChildren(typeof(CS.XAreaWarAnimArea))
--
--self.IdleAnims = {}
--type, duration, offsetY = XAreaWarConfigs.GetIdleAnimationInfo()
--for i = 0, anims.Length - 1 do
-- local area = anims[i]
-- local plate = area.transform:GetComponent(typeof(CS.XAreaWarPlateArea))
-- if plate then
-- area:InitAnimation(type, duration, offsetY)
-- table.insert(self.IdleAnims, {
-- Anim = area,
-- Plate = plate
-- })
-- end
--end
---@type XDragMove
local dragMove = stageList.transform:GetComponent("XDragMove")
self.ZoomHandler = handler(self, self.OnCameraZoom)
dragMove:AddZoomBehaviour(self.ZoomHandler)
dragMove.ZoomSpeed = XAreaWarConfigs.GetCameraZoomSpeed()
self.DragMove = dragMove
--虚拟相机
self.VirtualCameraMap = {
--普通状态
Normal = {
Type = CameraType.Normal,
Camera = {
root:FindTransform("UiCamFarMain1"):GetComponent("CinemachineVirtualCamera"),
root:FindTransform("UiCamNearMain1"):GetComponent("CinemachineVirtualCamera")
}
},
--关卡详情
StageDetail = {
Type = CameraType.Detail,
Camera = {
root:FindTransform("UiCamFarMain2"):GetComponent("CinemachineVirtualCamera"),
root:FindTransform("UiCamNearMain2"):GetComponent("CinemachineVirtualCamera")
}
}
}
self.FarFraming = self.VirtualCameraMap.Normal.Camera[1]:GetCinemachineComponent(
CS.Cinemachine.CinemachineCore.Stage.Body, typeof(CS.Cinemachine.CinemachineFramingTransposer))
self.NearFraming = self.VirtualCameraMap.Normal.Camera[2]:GetCinemachineComponent(
CS.Cinemachine.CinemachineCore.Stage.Body, typeof(CS.Cinemachine.CinemachineFramingTransposer))
self.MinDistance, self.MaxDistance = XAreaWarConfigs.GetCameraMinAndMaxDistance()
-- y = kx + b
self.FactorK = 1 / (self.MinDistance - self.MaxDistance)
self.ConstantB = (-1 * self.MaxDistance) / (self.MinDistance - self.MaxDistance)
self.SmallDisRatio = XAreaWarConfigs.GetCameraSmallDisRatio()
---@type XUiPanelAreaWarMainRank3D
self.RankPanel = require("XUi/XUiAreaWar/XUiPanelAreaWarMainRank3D").New(panelRank)
self.RankPanel:Hide()
local cameraData = {
NearCamera = self.UiModel.UiNearCamera,
FarCamera = self.UiModel.UiFarCamera,
NormalVirtual = self.VirtualCameraMap.Normal.Camera,
DetailVirtual = self.VirtualCameraMap.StageDetail.Camera,
}
---@type XUiPanelAreaWarMainBlockList3D
self.BlockList3DPanel = require("XUi/XUiAreaWar/XUiPanelAreaWarMainBlockList3D").New(stageList,
cameraData, blockAreas, handler(self, self.OnClickBlock), handler(self, self.IsNormalCamera))
self.ChatOpen = XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.SocialChat)
self.IsPlayMovie = XDataCenter.AreaWarManager.IsPlayMovieOnEnter()
self:UpdateVirtualCamera(self.VirtualCameraMap.Normal)
end
function XUiAreaWarMain:InitCb()
self:BindHelpBtn(self.BtnHelp, "AreaWarMain")
self:BindExitBtns()
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
self.BtnChat.CallBack = function()
self:OnClickBtnChat()
end
self.BtnRank.CallBack = function()
self:OnClickBtnRank()
end
self.ScaleSlider.onValueChanged:AddListener(function(value)
self:OnCameraZoomBySlider(value)
end)
self.OnCheckShopCb = function(result)
self.BtnShop:ShowReddot(result)
end
--self.OnUnlockAnimEndCb = handler(self, self.OnBlockUnlockAnimEnd)
self.OnPlayUnlockAnim = handler(self, self.PlayBlockUnlock)
self.OnPlayPlateAnim = handler(self, self.OnRefreshPlate)
end
--region ------------------界面更新 start-------------------
function XUiAreaWarMain:InitView()
XDataCenter.AreaWarManager.MarkNewChapterOpen()
self.ScaleSlider.value = self:CalSliderPercent(self.NearFraming.m_CameraDistance)
XUiHelper.NewPanelActivityAsset({
XDataCenter.ItemManager.ItemId.AreaWarCoin,
XDataCenter.ItemManager.ItemId.AreaWarActionPoint
}, self.PanelSpecialTool,nil,nil,{
XDataCenter.ItemManager.ItemId.AreaWarActionPoint
})
self.TxtTitle.text = XDataCenter.AreaWarManager.GetActivityName()
local endTime = XDataCenter.AreaWarManager.GetEndTime()
self.EndTime = endTime
local timeOfNow = XTime.GetServerNowTimestamp()
self.TxtTime.text = XUiHelper.GetTime(self.EndTime - timeOfNow, XUiHelper.TimeFormatType.ACTIVITY)
self:SetAutoCloseInfo(endTime, handler(self, self.OnCheckActivity))
--红点
self.ProfitRedPoint = XRedPointManager.AddRedPointEvent(self.BtnProfit, self.OnCheckProfitRedPoint, self,
{ XRedPointConditions.Types.XRedPointConditionAreaWarHangUpReward }, nil, false)
self.TaskRedPoint = XRedPointManager.AddRedPointEvent(self.BtnTask, self.OnCheckTaskRedPoint, self,
{ XRedPointConditions.Types.XRedPointConditionAreaWarTask }, nil, false)
--self.ShopRedPoint = XRedPointManager.AddRedPointEvent(self.BtnShop, self.OnCheckShopRedPoint, self,
-- { XRedPointConditions.Types.XRedPointConditionAreaWarCanBuy }, nil, false)
self.BuffRedPoint = XRedPointManager.AddRedPointEvent(self.BtnBuff, self.OnCheckBuffRedPoint, self,
{ XRedPointConditions.Types.XRedPointConditionAreaWarPluginToUnlock }, nil, false)
self.RoleRedPoint = XRedPointManager.AddRedPointEvent(self.BtnRole, self.OnCheckRoleRedPoint, self,
{ XRedPointConditions.Types.XRedPointConditionAreaWarSpecialRoleReward }, nil, false)
self.BtnBuff:SetNameByGroup(1, "/" .. #XAreaWarConfigs.GetAllPluginIds())
self:StartActivityDataTimer()
end
function XUiAreaWarMain:UpdateView()
self:UpdateChatMsg(XDataCenter.ChatManager.GetLatestChatData())
self:UpdateRepeatChallenge()
self:UpdateProgress()
self:UpdateSpecialRole()
self:UpdateHangUp()
self:UpdateTask()
self:UpdateShop()
self:UpdatePlate()
self:UpdatePurificationLevel()
self:CheckPopups()
end
--板块
function XUiAreaWarMain:UpdatePlate()
self:UpdateBlocks()
if not self.PlateTimer then
self.PlayPlates = {}
for i = 0, self.PlateAreas.Length - 1 do
local area = self.PlateAreas[i]
local unlock = XDataCenter.AreaWarManager.IsPlateUnlock(area.Id)
--剧情会打断动画
if unlock and XDataCenter.AreaWarManager.CheckIsPlayPlateAnim(area.Id) and not self.IsPlayMovie then
area:MoveOffsetY(self.PlateOffsetY)
area:InitCurrentPosition()
area:SetAreaVisible(true)
self.PlayPlates[i] = area
else
area:SetAreaVisible(unlock)
end
end
self:PlayPlateLiftAnim()
self.IsPlayMovie = false
end
end
--鞭尸期(重复挑战)
function XUiAreaWarMain:UpdateRepeatChallenge()
local isRepeatChallenge = XDataCenter.AreaWarManager.IsRepeatChallengeTime()
if self.IsRepeatChallenge ~= isRepeatChallenge then
self.IsRepeatChallenge = isRepeatChallenge
self.IsAllChapterOpen = XDataCenter.AreaWarManager.IsAllChapterOpen()
end
self.PanelRepeat.gameObject:SetActiveEx(self.IsRepeatChallenge)
if not isRepeatChallenge then
self.ChapterStartTime = nil
return
elseif self.IsAllChapterOpen then --全开放 & 鞭尸期 无需倒计时
self.ChapterStartTime = XDataCenter.AreaWarManager.GetEndTime()
else
local chapterId = XDataCenter.AreaWarManager.GetFirstNotOpenChapterId()
local timeId = XAreaWarConfigs.GetChapterTimeId(chapterId)
self.ChapterStartTime = XFunctionManager.GetStartTimeByTimeId(timeId)
--倒计时
local remainder = math.max(0, self.ChapterStartTime - XTime.GetServerNowTimestamp())
self.TxtRepeatTime.text = string.format(self.RepeatChallengeCountDown, XUiHelper.GetTime(remainder, XUiHelper.TimeFormatType.SHOP_REFRESH))
end
self.TxtRepeat.gameObject:SetActiveEx(true)
self.TxtRepeatTime.gameObject:SetActiveEx(self.ChapterStartTime ~= nil)
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
self:OnCheckWarLogRedPoint()
end
--挂机收益
function XUiAreaWarMain:UpdateHangUp()
if not XDataCenter.AreaWarManager.IsHangUpUnlock() then
self.BtnProfit:SetDisable(true)
return
end
self.BtnProfit:SetDisable(false)
XRedPointManager.Check(self.ProfitRedPoint)
end
--任务目标
function XUiAreaWarMain:UpdateTask()
local text = XDataCenter.AreaWarManager.GetNextTaskProgressTip()
if not string.IsNilOrEmpty(text) then
self.BtnTask:SetNameByGroup(0, text)
self.BtnTask:SetDisable(false)
else
self.BtnTask:SetDisable(true)
end
XRedPointManager.Check(self.TaskRedPoint)
end
--商店
function XUiAreaWarMain:UpdateShop()
XDataCenter.AreaWarManager.CheckShopRedPoint(self.OnCheckShopCb)
end
--净化加成
function XUiAreaWarMain:UpdatePurificationLevel()
local unlock = XDataCenter.AreaWarManager.GetPluginUnlockCount()
self.BtnBuff:SetNameByGroup(0, unlock)
if not XDataCenter.AreaWarManager.IsPurificationLevelUnlock() then
self.BtnBuff:SetDisable(true)
return
end
self.BtnBuff:SetDisable(false)
XRedPointManager.Check(self.BuffRedPoint)
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.Check(self.RoleRedPoint)
end
--区块展示
function XUiAreaWarMain:UpdateBlocks()
self.Canvas3D.sortingOrder = self.Canvas.sortingOrder + 1
self.RankPanel:Refresh()
self.BlockList3DPanel:Refresh(self.IsRepeatChallenge)
--更新区块详情
if XTool.IsNumberValid(self.StageDetailBlockId) then
self:OnOpenStageDetail(self.StageDetailBlockId)
end
end
--打脸弹窗
function XUiAreaWarMain:CheckPopups()
if self.Popping then
return
end
self.Popping = true
--打脸优先级
-- 1.区块净化进度
-- 2.净化等级变更
-- 3.特攻角色解锁
-- 4.挂机收益功能解锁
-- 5.活动奖励弹窗
local asyncOpenUi = asynTask(XLuaUiManager.Open)
local asyncRequest = asynTask(XDataCenter.AreaWarManager.AreaWarGetActivityDataRequest)
--local asynLetsLift = asynTask(self.BlockList3DPanel.LetsLift, self.BlockList3DPanel)
local asyncPlayUnlock = asynTask(self.OnPlayUnlockAnim)
local playId, ids = XDataCenter.AreaWarManager.GetNotPlayUnlockAnimBlockIds()
local isGuide = XDataCenter.AreaWarManager.IsMainUiGuideFinish()
RunAsyn(function()
local popped = false
--区块净化进度弹窗
if XDataCenter.AreaWarManager.CheckHasNewClearBlockId() and isGuide then
asyncOpenUi("UiAreaWarSszbTips")
popped = true
end
--净化等级变更弹窗
if XDataCenter.AreaWarManager.CheckHasRecordPfLevel() and isGuide then
asyncOpenUi("UiAreaWarJingHuaTips")
popped = true
end
--特攻角色解锁弹窗
if XDataCenter.AreaWarManager.CheckHasRecordSpecialRole() and isGuide then
asyncOpenUi("UiAreaWarTegongjsTips")
popped = true
end
--挂机收益功能解锁弹窗
if XDataCenter.AreaWarManager.CheckHangUpUnlockPopUp() and isGuide then
asyncOpenUi("UiAreaWarHangUpJs")
XDataCenter.AreaWarManager.SetHangUpUnlockPopUpCookie()
popped = true
end
if XDataCenter.AreaWarManager.CheckNeedPopReward() and isGuide then
asyncOpenUi("UiAreaWarGift")
XDataCenter.AreaWarManager.MarkPopReward()
end
if popped then
asyncRequest()
--通知服务端更新历史记录
XDataCenter.AreaWarManager.AreaWarPopupRequest()
end
--如果正在播放上升动画,则不播解锁动画
if XTool.IsNumberValid(playId) and not self.PlateTimer then
XLuaUiManager.SetMask(true)
--播放格子解锁动画
asyncPlayUnlock(playId)
--标记
for _, blockId in ipairs(ids) do
XDataCenter.AreaWarManager.MarkPlayUnlockAnimBlockId(blockId)
end
XLuaUiManager.SetMask(false)
end
--更新新解锁区块的状态
self.BlockList3DPanel:RefreshNewUnlockBlocks()
--清除已经弹窗展示过的最新记录
XDataCenter.AreaWarManager.ClearNewRecord()
self.Popping = nil
end)
end
--虚拟相机更新
function XUiAreaWarMain:UpdateVirtualCamera(showGroup)
for _, group in pairs(self.VirtualCameraMap) do
for _, camera in pairs(group.Camera) do
camera.gameObject:SetActiveEx(false)
end
end
showGroup = showGroup or {}
for _, camera in pairs(showGroup.Camera) do
camera.gameObject:SetActiveEx(true)
end
self.CameraType = showGroup.Type
end
function XUiAreaWarMain:IsNormalCamera()
return self.CameraType == CameraType.Normal
end
--- 聊天更新
---@param chatData XChatData
--------------------------
function XUiAreaWarMain:UpdateChatMsg(chatData)
self.BtnChat:SetNameByGroup(0, "")
if not chatData then
return
end
if not self.ChatOpen then
return
end
local name = XDataCenter.SocialManager.GetPlayerRemark(chatData.SenderId, chatData.NickName)
local content
if chatData.MsgType == ChatMsgType.Emoji then
content = string.format("%s:%s", name, XUiHelper.GetText("EmojiText"))
elseif chatData.MsgType == ChatMsgType.System and chatData.ChannelType == ChatChannelType.Guild then
content = string.format("%s%s", XUiHelper.GetText("GuildChannelTypeAll"), chatData.Content)
else
content = string.format("%s:%s", name, chatData.Content)
end
self.BtnChat:SetNameByGroup(0, content)
end
function XUiAreaWarMain:PlayBlockUnlock(blockId, cb)
if not self.UnlockAnim then
return
end
if self.UnlockAnim.IsPlaying then
--self.UnlockAnimBlockCache[blockId] = blockId
return
end
self.BlockList3DPanel:FocusTargetBlock(blockId)
self.BlockList3DPanel:RefreshLineState(false)
self:_UpdateSafeAreaState(false)
self.UnlockAnim:Play(self.BlockList3DPanel:GetBlockWorldPoint(blockId), self.AllGrids, function()
self:_UpdateSafeAreaState(true)
self.BlockList3DPanel:RefreshLineState(self:IsNormalCamera())
self.BlockList3DPanel:ResetLinePosition()
if cb then cb() end
--self:OnBlockUnlockAnimEnd()
end)
end
--function XUiAreaWarMain:OnBlockUnlockAnimEnd()
-- self.BlockList3DPanel:RefreshLineState(true)
-- if XTool.IsTableEmpty(self.UnlockAnimBlockCache) then
-- return
-- end
-- local blockId
-- for id in pairs(self.UnlockAnimBlockCache) do
-- blockId = id
-- break
-- end
-- self.UnlockAnimBlockCache[blockId] = nil
--
-- XScheduleManager.ScheduleOnce(function()
-- self:PlayBlockUnlock(blockId)
-- end, 200)
--
--end
--endregion------------------界面更新 finish------------------
--region ------------------UI事件 start-------------------
function XUiAreaWarMain:OnClickBtnProgress()
XDataCenter.AreaWarManager.RequestWarLog(function()
XLuaUiManager.Open("UiAreaWarLogbuch")
end)
end
function XUiAreaWarMain:OnClickBtnProfit()
XDataCenter.AreaWarManager.OpenUiHangUp()
end
function XUiAreaWarMain:OnClickBtnTask()
XLuaUiManager.Open("UiAreaWarTask")
end
function XUiAreaWarMain:OnClickBtnShop()
XDataCenter.AreaWarManager.OpenUiShop()
self.BtnShop:ShowReddot(false)
end
function XUiAreaWarMain:OnClickBtnBuff()
XDataCenter.AreaWarManager.OpenUiPurificationLevel()
end
function XUiAreaWarMain:OnClickBtnRole()
XDataCenter.AreaWarManager.OpenUiSpecialRole()
end
function XUiAreaWarMain:OnClickBtnLocation()
local nextFightBlockId = XDataCenter.AreaWarManager.GetNextFightingBlockId(self.NextFightingBlockId)
if not XTool.IsNumberValid(nextFightBlockId) then
XUiManager.TipText("AreaWarNoBlockFighting")
return
end
self.NextFightingBlockId = nextFightBlockId
self.BlockList3DPanel:FocusTargetBlock(self.NextFightingBlockId)
end
function XUiAreaWarMain:OnClickBtnChat()
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.SocialChat) then
return
end
self:_UpdateSafeAreaState(false)
XDataCenter.AreaWarManager.OpenUiChat()
end
function XUiAreaWarMain:OnClickBtnRank()
XLuaUiManager.Open("UiAreaWarInformation")
end
--打开关卡详情
function XUiAreaWarMain:OnOpenStageDetail(blockId, hideRankPanel)
if XTool.UObjIsNil(self.Transform) then
return
end
self.StageDetailBlockId = blockId
--相机推进
self:UpdateVirtualCamera(self.VirtualCameraMap.StageDetail)
--锁定区块
self.BlockList3DPanel:FocusBlockDetail(blockId)
if not hideRankPanel then
--更新区块排行榜, 并挂载到对应区块父节点上,然后打开
self.RankPanel:Refresh(blockId)
self.BlockList3DPanel:SetAsBlockChild(self.RankPanel.Transform, blockId)
self.RankPanel:Show()
end
--隐藏2DUI
self:_UpdateSafeAreaState(false)
end
--关闭关卡详情
function XUiAreaWarMain:OnCloseStageDetail(blockId)
if XTool.UObjIsNil(self.Transform) then
return
end
self.StageDetailBlockId = nil
--关闭区块排行榜
self.RankPanel:Hide()
--相机恢复
self:UpdateVirtualCamera(self.VirtualCameraMap.Normal)
--还原相机跟随目标
self.BlockList3DPanel:FocusTargetBlock(blockId)
--播放格子的远景动画
self.BlockList3DPanel:PlayGridFarAnim(blockId)
--显示2DUI
self:_UpdateSafeAreaState(true)
end
--区域被点击
function XUiAreaWarMain:OnClickBlock(blockId)
if self.UnlockAnim and self.UnlockAnim.IsPlaying then
return
end
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:StopActivityDataTimer()
self:OnOpenStageDetail(blockId, true)
asynPlayAnimation("DarkEnable")
asynOpenUi(blockId)
asynWaitSecond(0) --等待UI完全重新打开之后再播放动画
self:OnCloseStageDetail(blockId)
asynPlayAnimation("DarkDisable")
self:StartActivityDataTimer()
end
)
elseif XAreaWarConfigs.CheckBlockShowType(blockId, XAreaWarConfigs.BlockShowType.Mystery) then
--神秘类型区块只播放剧情
local movieId = XAreaWarConfigs.GetBlockMovieId(blockId)
XDataCenter.MovieManager.PlayMovie(movieId)
else
--打开区块详情界面
XLuaUiManager.Open("UiAreaWarStageDetail", blockId, self.IsRepeatChallenge, handler(self, self.OnCloseStageDetail))
self:OnOpenStageDetail(blockId)
end
end
--缩放回调 -(双指 + 鼠标)
function XUiAreaWarMain:OnCameraZoom(value)
if self.UnlockAnim and self.UnlockAnim.IsPlaying then
return
end
if not self:IsNormalCamera() then
return
end
value = CsMathFClamp(self.NearFraming.m_CameraDistance - value, self.MinDistance, self.MaxDistance)
self.ScaleSlider.value = self:CalSliderPercent(value)
end
--缩放回调 - UI滑动
function XUiAreaWarMain:OnCameraZoomBySlider(value)
self.BlockList3DPanel:PlayScaleAnim(value <= self.SmallDisRatio)
if self.UnlockAnim and self.UnlockAnim.IsPlaying then
return
end
if not self:IsNormalCamera() then
return
end
value = (self.MaxDistance - self.MinDistance) * (1 - value) + self.MinDistance
self.NearFraming.m_CameraDistance = value
self.FarFraming.m_CameraDistance = value
end
--计算Slider的值 value [min,max]
function XUiAreaWarMain:CalSliderPercent(value)
return CS.UnityEngine.Mathf.Clamp01(self.FactorK * value + self.ConstantB)
end
--聊天界面关闭
function XUiAreaWarMain:OnChatClose()
self:_UpdateSafeAreaState(true)
end
--刷新主界面UI状态
function XUiAreaWarMain:_UpdateSafeAreaState(state)
self.SafeAreaContentPane.gameObject:SetActiveEx(state)
local animName = state and "UiEnable" or "UiDisable"
self:PlayAnimationWithMask(animName)
end
function XUiAreaWarMain:PlayPlateLiftAnim(finishCb)
if self.PlateTimer then
return
end
local newFinish = function()
self:StopPlateLiftAnim()
if finishCb then finishCb() end
end
self.BlockList3DPanel:RefreshLineState(false)
self.PlateTimer = XUiHelper.Tween(self.PlateDuration, self.OnPlayPlateAnim, newFinish)
end
function XUiAreaWarMain:StopPlateLiftAnim()
if not self.PlateTimer then
return
end
self:OnStopPlateLiftAnim()
XScheduleManager.UnSchedule(self.PlateTimer)
self.PlateTimer = nil
local playId, ids = XDataCenter.AreaWarManager.GetNotPlayUnlockAnimBlockIds()
if XTool.IsNumberValid(playId) then
local asyncPlayUnlock = asynTask(self.OnPlayUnlockAnim)
RunAsyn(function()
asynWaitSecond(0.3)
XLuaUiManager.SetMask(true)
--播放格子解锁动画
asyncPlayUnlock(playId)
--标记
for _, blockId in ipairs(ids) do
XDataCenter.AreaWarManager.MarkPlayUnlockAnimBlockId(blockId)
end
XLuaUiManager.SetMask(false)
end)
end
end
function XUiAreaWarMain:OnRefreshPlate(time)
if XTool.IsTableEmpty(self.PlayPlates) then
self:StopPlateLiftAnim()
return
end
for _, plate in pairs(self.PlayPlates) do
plate:RevertPosition(time)
end
end
function XUiAreaWarMain:OnStopPlateLiftAnim()
for _, plate in pairs(self.PlayPlates) do
plate:RevertPosition(1)
XDataCenter.AreaWarManager.MarkPlayPlateAnim(plate.Id)
end
self.PlayPlates = {}
self.BlockList3DPanel:RefreshLineState(self:IsNormalCamera())
self.BlockList3DPanel:ResetLinePosition()
end
function XUiAreaWarMain:OnUiDestroy(ui)
if not XDataCenter.AreaWarManager.IsFirstOpenHelp() then
return
end
if not ui or not ui.UiData then
return
end
local uiName = ui.UiData.UiName
if uiName == "UiHelp" then
self:CheckPopups()
XDataCenter.AreaWarManager.MarkFirstOpenHelp()
elseif uiName == "UiAreaWarLogbuch" then
self:OnCheckWarLogRedPoint()
end
end
--endregion------------------UI事件 finish------------------
--region ------------------定时器 start-------------------
--检查活动是否结束,每秒执行一次
function XUiAreaWarMain:OnCheckActivity(isClose)
if isClose then
XDataCenter.AreaWarManager.OnActivityEnd()
return
end
local timeOfNow = XTime.GetServerNowTimestamp()
self.TxtTime.text = XUiHelper.GetTime(self.EndTime - timeOfNow, XUiHelper.TimeFormatType.ACTIVITY)
if self.IsRepeatChallenge and self.ChapterStartTime then
--倒计时
local remainder = math.max(0, self.ChapterStartTime - timeOfNow)
self.TxtRepeatTime.text = string.format(self.RepeatChallengeCountDown, XUiHelper.GetTime(remainder, XUiHelper.TimeFormatType.SHOP_REFRESH))
if remainder <= 0 then
self:UpdateRepeatChallenge()
end
end
end
function XUiAreaWarMain:StartActivityDataTimer()
if self.ActivityDataTimer then
return
end
self.ActivityDataTimer = XScheduleManager.ScheduleForever(function()
XDataCenter.AreaWarManager.AreaWarGetActivityDataRequest()
end, AUTO_REQ_ACTIVITY_DATA_INTERVAL)
end
function XUiAreaWarMain:StopActivityDataTimer()
if not XTool.IsNumberValid(self.ActivityDataTimer) then
return
end
XScheduleManager.UnSchedule(self.ActivityDataTimer)
self.ActivityDataTimer = nil
end
--endregion------------------定时器 finish------------------
--region ------------------红点检查 start-------------------
function XUiAreaWarMain:OnCheckProfitRedPoint(count)
self.BtnProfit:ShowReddot(count >= 0)
end
function XUiAreaWarMain:OnCheckTaskRedPoint(count)
self.BtnTask:ShowReddot(count >= 0)
end
function XUiAreaWarMain:OnCheckShopRedPoint(count)
self.BtnShop:ShowReddot(count >= 0)
end
function XUiAreaWarMain:OnCheckBuffRedPoint(count)
self.BtnBuff:ShowReddot(count >= 0)
end
function XUiAreaWarMain:OnCheckRoleRedPoint(count)
self.BtnRole:ShowReddot(count >= 0)
end
function XUiAreaWarMain:OnCheckWarLogRedPoint()
XDataCenter.AreaWarManager.RequestWarLog(function()
local hasNew = XDataCenter.AreaWarManager.CheckIsNewUnlockArticle()
if self.BtnProgress then
self.BtnProgress:ShowReddot(hasNew)
end
end)
end
--endregion------------------红点检查 finish------------------