501 lines
No EOL
17 KiB
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 |