PGRData/Script/matrix/xui/xuionlineboss/XUiOnlineBoss.lua

501 lines
No EOL
17 KiB
Lua

local XUiGridOnlineBossTask = require("XUi/XUiOnlineBoss/XUiGridOnlineBossTask")
local XUiOnlineBoss = XLuaUiManager.Register(XLuaUi, "UiOnlineBoss")
local XUiPanelRoleModel = require("XUi/XUiCharacter/XUiPanelRoleModel")
local UiState = {
Enter = 1,
Match = 2,
Info = 3,
NewBoss = 4,
}
local TaskCount = 3
function XUiOnlineBoss:OnAwake()
local root = self.UiModelGo.transform
self.SceneCase = root:FindTransform("SceneCase")
self.PanelModel = root:FindTransform("PanelModel")
self.UiCamFarMain = root:FindTransform("UiCamFarMain") or root:FindTransform("UiCamFarMainActivity")
self.UiCamFarPanelMatch = root:FindTransform("UiCamFarPanelMatch") or root:FindTransform("UiCamFarPanelMatchActivity")
self.UiCamFarBossInfo = root:FindTransform("UiCamFarBossInfo") or root:FindTransform("UiCamFarBossInfoActivity")
self.UiCamNearMain = root:FindTransform("UiCamNearMain") or root:FindTransform("UiCamNearMainActivity")
self.UiCamNearPanelMatch = root:FindTransform("UiCamNearPanelMatch") or root:FindTransform("UiCamNearPanelMatchActivity")
self.UiCamNearBossInfo = root:FindTransform("UiCamNearBossInfo") or root:FindTransform("UiCamNearBossInfoActivity")
self.UiCamNearFirst = root:FindTransform("UiCamNearFirstActivity")
self.ImgEffectHuanren = root:FindTransform("ImgEffectHuanren")
-- self.TextTypewriter = self.TxtAutoInvade:GetComponent("TextTypewriter")
self.TaskList = {}
end
function XUiOnlineBoss:OnStart(selectIdx, isFirst)
self.ScenePool = {}
self.AssetPanel = XUiPanelAsset.New(self, self.PanelAsset, XDataCenter.ItemManager.ItemId.ActionPoint, XDataCenter.ItemManager.ItemId.Coin)
self.MatchPanel = XUiPanelMatch.New(self.PanelMatch, self)
self.BossInfoPanel = XUiPanelBossInfo.New(self.PanelBossInfo)
self.UiState = isFirst and UiState.NewBoss or UiState.Enter
self.GameObjectGroup = {
[UiState.Enter] = {
self.PanelEnter.gameObject,
self.UiCamFarMain.gameObject,
self.UiCamNearMain.gameObject,
},
[UiState.Match] = {
self.PanelMatch.gameObject,
self.UiCamFarPanelMatch.gameObject,
self.UiCamNearPanelMatch.gameObject,
},
[UiState.Info] = {
self.PanelBossInfo.gameObject,
self.UiCamFarBossInfo.gameObject,
self.UiCamNearBossInfo.gameObject,
},
}
if self.Name == "UiOnlineBossActivity" then
self.GameObjectGroup[UiState.NewBoss] = {
self.PanelEnter.gameObject,
self.UiCamFarMain.gameObject,
self.UiCamNearFirst.gameObject,
}
end
self.TabList = {
self.BtnTog0,
self.BtnTog1,
self.BtnTog2,
self.BtnTog3,
self.BtnTog4,
}
self.DifficultMap = {
XDataCenter.FubenBossOnlineManager.OnlineBossDifficultLevel.SIMPLE,
XDataCenter.FubenBossOnlineManager.OnlineBossDifficultLevel.NORMAL,
XDataCenter.FubenBossOnlineManager.OnlineBossDifficultLevel.HARD,
XDataCenter.FubenBossOnlineManager.OnlineBossDifficultLevel.HELL,
XDataCenter.FubenBossOnlineManager.OnlineBossDifficultLevel.NightMare,
}
self:SetDifficult(self.DifficultMap[1])
self.TabPanel:Init(self.TabList, handler(self, self.OnSelectTab), 1)
if XDataCenter.FubenBossOnlineManager.CheckOnlineBossUnlock(self.DifficultMap[1]) then
self.TabPanel:SelectIndex(selectIdx or 1)
end
self.DefaultIndex = selectIdx
self.IsOnStart = true
self.CurAnimator = nil
self:InitModel()
self:InitPanelInvade()
self:SwitchState(self.UiState)
self:StartTimer()
self:RegisterClickEvent(self.BtnStart, self.OnBtnStartClick)
self:RegisterClickEvent(self.BtnBack, self.OnBtnBackClick)
self:RegisterClickEvent(self.BtnMainUi, self.OnBtnMainUiClick)
self:RegisterClickEvent(self.BtnInvade, self.OnBtnInvadeClick)
XEventManager.AddEventListener(XEventId.EVENT_ROOM_CANCEL_MATCH, self.OnCancelMatch, self)
XEventManager.AddEventListener(XEventId.EVENT_ROOM_ENTER_ROOM, self.EnterRoom, self)
XEventManager.AddEventListener(XEventId.EVENT_ONLINEBOSS_UPDATE, self.OnBossUpdate, self)
XEventManager.AddEventListener(XEventId.EVENT_ONLINEBOSS_REFRESH, self.OnBossRefresh, self)
end
function XUiOnlineBoss:OnEnable()
XDataCenter.FubenBossOnlineManager.RefreshBossData()
self:RefreshBtnList()
if self.CurAnimator and self.SectionTemplate then
self.CurAnimator:Play(self.SectionTemplate.Animation)
end
self:RefreshPassNumInfo()
if self.UiState == UiState.Match then
self.MatchPanel:Refresh()
self.PanelMatchEnable:PlayTimelineAnimation()
elseif self.UiState == UiState.NewBoss then
self.PanelTip.gameObject:SetActive(true)
CS.XAudioManager.PlaySound(1105)
self.TipEnable:PlayTimelineAnimation(function()
if not self.GameObject or not self.GameObject:Exist() then
return
end
CS.XAudioManager.PlaySound(1106)
self:SwitchState(UiState.Enter)
self.EnterFirst:PlayTimelineAnimation()
self.PanelTip.gameObject:SetActive(true)
XScheduleManager.ScheduleOnce(function()
if not self.GameObject or not self.GameObject:Exist() then
return
end
CS.XAudioManager.PlaySound(1107)
end, 1500)
end)
elseif self.UiState == UiState.Enter then
if self.Name == "UiOnlineBossActivity" then
-- CS.XAudioManager.PlaySound(1107)
self.EnterEnable:PlayTimelineAnimation()
end
end
end
function XUiOnlineBoss:OnDestroy()
self:StopTimer()
XEventManager.RemoveEventListener(XEventId.EVENT_ROOM_CANCEL_MATCH, self.OnCancelMatch, self)
XEventManager.RemoveEventListener(XEventId.EVENT_ROOM_ENTER_ROOM, self.EnterRoom, self)
XEventManager.RemoveEventListener(XEventId.EVENT_ONLINEBOSS_UPDATE, self.OnBossUpdate, self)
XEventManager.RemoveEventListener(XEventId.EVENT_ONLINEBOSS_REFRESH, self.OnBossRefresh, self)
end
function XUiOnlineBoss:OnNotify(evt, ...)
if evt == CS.XEventId.EVENT_UI_ALLOWOPERATE then
if self.NeedClose then
self:Close()
end
end
end
function XUiOnlineBoss:OnGetEvents()
return { CS.XEventId.EVENT_UI_ALLOWOPERATE }
end
function XUiOnlineBoss:UseLastTemplate()
return XDataCenter.FubenBossOnlineManager.GetIsActivity() and not XDataCenter.FubenBossOnlineManager.CheckIsInvade()
end
function XUiOnlineBoss:InitPanelInvade()
if self:UseLastTemplate() then
self.PanelInvade.gameObject:SetActive(true)
else
self.PanelInvade.gameObject:SetActive(false)
end
end
function XUiOnlineBoss:OnSelectTab(index)
local diff = self.DifficultMap[index]
if XDataCenter.FubenBossOnlineManager.CheckOnlineBossUnlock(diff, true) and self.CurDifficult ~= diff then
self:SetDifficult(diff)
self:RefreshModel()
self:RefreshName()
self:RefreshRisk()
self:PlayAnimation("QieHuan")
end
end
--刷新通关次数以及进度
function XUiOnlineBoss:RefreshPassNumInfo()
--获取所有任务数据
local allOnlineTask = XDataCenter.TaskManager.GetBossOnlineTaskListData()
for i = 1, #allOnlineTask do
local currentProxy = self.TaskList[i]
if not currentProxy then
currentProxy = XUiGridOnlineBossTask.New(self["PanelScrollBar" .. i], self)
self.TaskList[i] = currentProxy
end
currentProxy:Refresh(allOnlineTask[i], allOnlineTask[i - 1])
end
end
function XUiOnlineBoss:RefreshName()
local stageCfg = XDataCenter.FubenManager.GetStageCfg(self.StageId)
self.TxtName.text = stageCfg.Name
end
function XUiOnlineBoss:OnUpdateRefreshTime()
local curTime = XTime.GetServerNowTimestamp()
local nextTime = XDataCenter.FubenBossOnlineManager.GetOnlineBossUpdateTime()
if not self.GameObject or not self.GameObject:Exist() then
self:StopTimer()
return
end
local remainTime = nextTime - curTime
if remainTime > 0 then
self.TxtTime.text = XUiHelper.GetTime(remainTime, XUiHelper.TimeFormatType.ONLINE_BOSS)
else
self.TxtTime.text = "00:00"
self:StopTimer()
self:OnTimeOut()
end
end
function XUiOnlineBoss:StartTimer()
if self.Timers then
self:StopTimer()
end
self:OnUpdateRefreshTime()
self.Timers = XScheduleManager.ScheduleForever(function() self:OnUpdateRefreshTime() end, XScheduleManager.SECOND)
end
function XUiOnlineBoss:StopTimer()
if self.Timers then
XScheduleManager.UnSchedule(self.Timers)
self.Timers = nil
end
if self.ShowCharAnimation then
CS.XScheduleManager.UnSchedule(self.ShowCharAnimation)
self.ShowCharAnimation = nil
end
end
function XUiOnlineBoss:RefreshRisk()
if self.Name == "UiOnlineBossActivity" then
local bossData = XDataCenter.FubenBossOnlineManager.GetActOnlineBossSectionForDiff(self.CurDifficult)
local riskTemplate = XFubenBossOnlineConfig.GetRiskTemplate(bossData.KillCount)
self.TxtRisk.text = riskTemplate.Name
self.TxtKill.text = CS.XTextManager.GetText("BossOnlineKillCount", bossData.KillCount)
local color = XUiHelper.Hexcolor2Color(riskTemplate.Color)
self.TxtRisk.color = color
self.TxtKill.color = color
self.PanelRisk.gameObject:SetActive(true)
else
self.PanelRisk.gameObject:SetActive(false)
end
end
function XUiOnlineBoss:OnBtnStartClick()
if not XDataCenter.FubenBossOnlineManager.CheckOnlineBossUnlock(self.CurDifficult, true) then
return
end
local bossData = XDataCenter.FubenBossOnlineManager.GetActOnlineBossSectionForDiff(self.CurDifficult)
self:OnEnterMatch(bossData.BossId)
end
function XUiOnlineBoss:OnBtnBackClick()
if self.UiState == UiState.Enter then
self:Close()
elseif self.UiState == UiState.Match then
if XDataCenter.RoomManager.Matching then
local title = CS.XTextManager.GetText("TipTitle")
local cancelMatchMsg = CS.XTextManager.GetText("OnlineInstanceCancelMatch")
XUiManager.DialogTip(title, cancelMatchMsg, XUiManager.DialogType.Normal, nil, function()
XDataCenter.RoomManager.CancelMatch(function()
self:SwitchState(UiState.Enter)
end)
end)
else
self:SwitchState(UiState.Enter)
end
elseif self.UiState == UiState.Info then
self:SwitchState(UiState.Match)
self.PanelMatchEnable:PlayTimelineAnimation()
end
end
function XUiOnlineBoss:OnBtnMainUiClick()
XLuaUiManager.RunMain()
end
function XUiOnlineBoss:OnBtnInvadeClick()
if not self:UseLastTemplate() or self.IsPlayInvade then
return
end
CS.XAudioManager.PlaySound(1104)
XDataCenter.FubenBossOnlineManager.RecordInvade()
self.InvadeEffect.gameObject:SetActive(true)
local effectUrl = CS.XGame.ClientConfig:GetString("BossOnlineInvadeEffectUrl")
local effect = self.InvadeEffect.gameObject:LoadUiEffect(effectUrl)
local obj = { Transform = effect.transform }
XTool.InitUiObject(obj)
self.InvadeBeginEffect = obj.BeginEffect
self.InvadeEndEffect = obj.EndEffect
self.InvadeBeginEffect:PlayTimelineAnimation()
XScheduleManager.ScheduleOnce(function()
if not self.GameObject or not self.GameObject:Exist() then
return
end
self:PlayTxtAutoInvade()
end, CS.XGame.ClientConfig:GetInt("BossOnlineInvadeDelay"))
self.IsPlayInvade = true
end
function XUiOnlineBoss:OnBossUpdate()
self:RefreshModel()
self:RefreshName()
self:RefreshRisk()
self:StartTimer()
self:RefreshBtnList()
end
function XUiOnlineBoss:OnBossRefresh()
self:OnTimeOut()
end
function XUiOnlineBoss:OnTimeOut()
if XDataCenter.RoomManager.Matching then
XDataCenter.RoomManager.CancelMatch()
XLuaUiManager.Remove("UiOnLineMatching")
end
if XLuaUiManager.IsUiShow("UiDialog") then
XLuaUiManager.Close("UiDialog")
end
if XDataCenter.FubenBossOnlineManager.TryPopOverTips() then
self:Close()
else
self:Close()
self.NeedClose = true
end
end
function XUiOnlineBoss:SwitchState(state)
XLog.Debug("XUiOnlineBoss:SwitchState " .. state)
self.UiState = state
for _, v in pairs(self.GameObjectGroup) do
for _, go in pairs(v) do
go:SetActive(false)
end
end
for _, go in pairs(self.GameObjectGroup[state]) do
go:SetActive(true)
end
end
function XUiOnlineBoss:OnShowBossInfo(section)
self:SwitchState(UiState.Info)
self.BossInfoPanel:SetData(section)
self.PanelBossInfoEnable:PlayTimelineAnimation()
end
function XUiOnlineBoss:OnEnterMatch(sectionId)
self:SwitchState(UiState.Match)
local sectionCfg = XDataCenter.FubenBossOnlineManager.GetActOnlineBossSectionById(sectionId)
if sectionCfg then
self.MatchPanel:Refresh(sectionCfg)
self.PanelMatchEnable:PlayTimelineAnimation()
end
end
function XUiOnlineBoss:OnCancelMatch()
self.MatchPanel:OnCancelMatch()
end
function XUiOnlineBoss:EnterRoom()
self.MatchPanel:ResetState()
end
--初始化模型
function XUiOnlineBoss:InitModel()
self.RoleModelPanel = XUiPanelRoleModel.New(self.PanelModel, self.Name, nil, true)
self:RefreshModel()
end
--怪物模型&场景
function XUiOnlineBoss:RefreshModel()
local bossData = XDataCenter.FubenBossOnlineManager.GetActOnlineBossSectionForDiff(self.CurDifficult)
if bossData then
local sectionTemplate = XDataCenter.FubenBossOnlineManager.GetActOnlineBossSectionById(bossData.BossId, self:UseLastTemplate())
if sectionTemplate then
self.SectionTemplate = sectionTemplate
if self.Name == "UiOnlineBossActivity" then
self:LoadScene(self.SectionTemplate.Scene)
end
self:LoadModel(self.SectionTemplate.ModelId)
end
end
end
function XUiOnlineBoss:RefreshBtnList()
for k, v in pairs(self.TabList) do
local diff = self.DifficultMap[k]
if XDataCenter.FubenBossOnlineManager.CheckOnlineBossUnlock(diff) then
if v.ButtonState == CS.UiButtonState.Disable then
v.ButtonState = CS.UiButtonState.Normal
end
else
v.ButtonState = CS.UiButtonState.Disable
end
end
end
function XUiOnlineBoss:PlayTxtAutoInvade()
local count = CS.XGame.ClientConfig:GetInt("BossOnlineInvadeDescCount")
local desc = {}
for i = 1, count do
desc[i] = CS.XTextManager.GetText("BossOnlineInvade" .. i)
end
local delay = 0
local interval = CS.XGame.ClientConfig:GetInt("BossOnlineInvadeInterval")
local wait = CS.XGame.ClientConfig:GetInt("BossOnlineInvadeWait")
for _, v in ipairs(desc) do
local str = v
local chartab = string.CharsConvertToCharTab(str)
local length = #chartab
XScheduleManager.ScheduleOnce(function()
if not self.GameObject or not self.GameObject:Exist() then
return
end
self.ShowCharAnimation = XUiHelper.ShowCharByTypeAnimation(_self.TxtAutoInvade, str, interval)
end, delay)
delay = delay + length * interval + wait
end
XScheduleManager.ScheduleOnce(function()
if not self.GameObject or not self.GameObject:Exist() then
return
end
local defaultIdx = self.DefaultIndex or 1
self.TxtAutoInvade.gameObject:SetActive(false)
self.InvadeEndEffect:PlayTimelineAnimation(function()
XLuaUiManager.PopThenOpen("UiOnlineBossActivity", defaultIdx, true)
end)
self.DefaultIndex = nil
end, delay)
end
function XUiOnlineBoss:SetDifficult(difficult)
self.CurDifficult = difficult
local bossData = XDataCenter.FubenBossOnlineManager.GetActOnlineBossSectionForDiff(self.CurDifficult)
local sectionCfg = XDataCenter.FubenBossOnlineManager.GetActOnlineBossSectionById(bossData.BossId, self:UseLastTemplate())
self.StageId = sectionCfg.StageId
end
--加载模型
function XUiOnlineBoss:LoadModel(modelId)
if not self.RoleModelPanel then
return
end
self.ImgEffectHuanren.gameObject:SetActive(false)
self.ImgEffectHuanren.gameObject:SetActive(true)
self.RoleModelPanel:SetDefaultAnimation(self.SectionTemplate.Animation)
self.RoleModelPanel:UpdateBossModel(modelId, XModelManager.MODEL_UINAME.XUiOnlineBoss, nil, function(model)
local animator = model:GetComponent("Animator")
if animator then
self.CurAnimator = animator
end
end)
self.PanelModel.gameObject:SetActive(false)
self.PanelModel.gameObject:SetActive(true)
end
--加载场景
function XUiOnlineBoss:LoadScene(sceneUrl)
local scene = self.ScenePool[sceneUrl]
if not scene then
scene = XModelManager.LoadSceneModel(sceneUrl, self.SceneCase, self.Name)
self.ScenePool[sceneUrl] = scene
end
if self.CurScene then
self.CurScene.gameObject:SetActive(false)
end
scene.gameObject:SetActive(true)
self.CurScene = scene
end
--加载特效
function XUiOnlineBoss:LoadEffect()
end
return XUiOnlineBoss