local uiCtrl = require_ex('UI/Panels/Base/UICtrl') local PANEL_ID = PanelId.CommonTaskTrackCountdown local Component = { Countdown = 1, Counting = 2, } CommonTaskTrackCountdownCtrl = HL.Class('CommonTaskTrackCountdownCtrl', uiCtrl.UICtrl) CommonTaskTrackCountdownCtrl.m_countDownTickId = HL.Field(HL.Number) << -1 CommonTaskTrackCountdownCtrl.m_isCountdownPause = HL.Field(HL.Boolean) << false CommonTaskTrackCountdownCtrl.m_countingTickId = HL.Field(HL.Number) << -1 CommonTaskTrackCountdownCtrl.m_isCountingPause = HL.Field(HL.Boolean) << false CommonTaskTrackCountdownCtrl.m_originalAnchoredPos = HL.Field(Vector2) CommonTaskTrackCountdownCtrl.s_messages = HL.StaticField(HL.Table) << { [MessageConst.ON_COMMON_TASK_COUNTDOWN_SWITCH_ON] = "OnCommonTaskCountdownSwitchOn", [MessageConst.ON_CLOSE_COMMON_TASK_COUNTDOWN] = "OnCloseCommonTaskCountdown", [MessageConst.ON_COMMON_TASK_COUNTING_SWITCH_ON] = "OnCommonTaskCountingSwitchOn", [MessageConst.ON_FINISH_COMMON_TASK_COUNTING] = "OnFinishCommonTaskCounting", } CommonTaskTrackCountdownCtrl.OnShowCommonTaskCountdown = HL.StaticMethod(HL.Any) << function(args) local ctrl = CommonTaskTrackCountdownCtrl.AutoOpen(PANEL_ID, args, true) ctrl:ShowCountdown(args) end CommonTaskTrackCountdownCtrl.OnStartCommonTaskCounting = HL.StaticMethod() << function(args) local ctrl = CommonTaskTrackCountdownCtrl.AutoOpen(PANEL_ID, args, true) ctrl:StartCounting(args) end CommonTaskTrackCountdownCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg) self.m_originalAnchoredPos = self.view.main.anchoredPosition end CommonTaskTrackCountdownCtrl.OnClose = HL.Override() << function(self) if self.m_countDownTickId > 0 then self.m_countDownTickId = LuaUpdate:Remove(self.m_countDownTickId) end if self.m_countingTickId > 0 then self.m_countingTickId = LuaUpdate:Remove(self.m_countingTickId) end end CommonTaskTrackCountdownCtrl._ToggleComponentOn = HL.Method(HL.Number) << function(self, component) self.view.countdown.gameObject:SetActiveIfNecessary(component == Component.Countdown) self.view.counting.gameObject:SetActiveIfNecessary(component == Component.Counting) end CommonTaskTrackCountdownCtrl._IsWorldFreeze = HL.Method().Return(HL.Boolean) << function(self) local isOpen, ctrl = UIManager:IsOpen(PanelId.CommonPopUp) return UIWorldFreezeManager:IsUIWorldFreeze() or isOpen and ctrl.m_timeScaleHandler > 0 end CommonTaskTrackCountdownCtrl.ShowCountdown = HL.Method(HL.Any) << function(self, arg) self:_ToggleComponentOn(Component.Countdown) local countdownDurationMilli, expireTimestampMilli, cb = unpack(arg) local countdownDuration = countdownDurationMilli / 1000 local curTimestamp = DateTimeUtils.GetCurrentTimestampBySeconds() local expireTimestamp = expireTimestampMilli and expireTimestampMilli / 1000 or curTimestamp + countdownDuration local curLeftTime = expireTimestamp - curTimestamp self.view.countdown.countDownTxt.text = UIUtils.getLeftTimeToSecond(curLeftTime) self.view.countdown.fill.fillAmount = curLeftTime / countdownDuration local isInAlert = false self.view.countdownStateCtrl:SetState("Normal") self.m_countDownTickId = LuaUpdate:Add("Tick", function(deltaTime) if self.m_isCountdownPause then expireTimestamp = expireTimestamp + deltaTime return end if self:_IsWorldFreeze() then expireTimestamp = expireTimestamp + deltaTime return end local curTs = DateTimeUtils.GetCurrentTimestampBySeconds() local leftTime = math.max(expireTimestamp - curTs, 0) local countdownNode = self.view.countdown countdownNode.countDownTxt.text = UIUtils.getLeftTimeToSecond(leftTime) countdownNode.fill.fillAmount = leftTime / countdownDuration if not isInAlert and leftTime <= self.view.config.COUNTDOWN_ALERT_TIME_THRESHOLD then isInAlert = true self.view.countdownStateCtrl:SetState("Alert") self.view.animationWrapper:Play("tasktrackcountdown_loop") AudioAdapter.PostEvent("Au_UI_Toast_DungeonNormalTick") end if expireTimestamp - curTs <= 0 then if cb then cb() end self.m_countDownTickId = LuaUpdate:Remove(self.m_countDownTickId) self:PlayAnimationOut(UIConst.PANEL_PLAY_ANIMATION_OUT_COMPLETE_ACTION_TYPE.Close) end end) end CommonTaskTrackCountdownCtrl.StartCounting = HL.Method(HL.Any) << function(self, arg) self:_ToggleComponentOn(Component.Counting) arg = arg or { DateTimeUtils.GetCurrentTimestampByMilliseconds() } local startCountingTimestampMilli = unpack(arg) local curCounting = (DateTimeUtils.GetCurrentTimestampByMilliseconds() - startCountingTimestampMilli) / 1000 self.view.counting.countingTxt.text = UIUtils.getLeftTimeToSecond(curCounting) local tickInterval = 0 self.m_countDownTickId = LuaUpdate:Add("Tick", function(deltaTime) if self.m_isCountingPause then return end if self:_IsWorldFreeze() then return end tickInterval = tickInterval + deltaTime if tickInterval < UIConst.COMMON_UI_TIME_UPDATE_INTERVAL then return end tickInterval = 0 curCounting = curCounting + UIConst.COMMON_UI_TIME_UPDATE_INTERVAL self.view.counting.countingTxt.text = UIUtils.getLeftTimeToSecond(curCounting) end) end CommonTaskTrackCountdownCtrl.OnCloseCommonTaskCountdown = HL.Method() << function(self) self:Close() end CommonTaskTrackCountdownCtrl.OnFinishCommonTaskCounting = HL.Method() << function(self) self:Close() end CommonTaskTrackCountdownCtrl.OnCommonTaskCountdownSwitchOn = HL.Method(HL.Any) << function(self, arg) local isOn = unpack(arg) self.m_isCountdownPause = not isOn end CommonTaskTrackCountdownCtrl.OnCommonTaskCountingSwitchOn = HL.Method(HL.Any) << function(self, arg) local isOn = unpack(arg) self.m_isCountingPause = not isOn end CommonTaskTrackCountdownCtrl.OnAddHeadBar = HL.Method(HL.Table) << function(self, args) local succ, ctrl = UIManager:IsOpen(PanelId.BattleBossInfo) if not succ then return end local targetAbilitySystem = unpack(args) if targetAbilitySystem and targetAbilitySystem.showBigHeadBar then if targetAbilitySystem.alive then self:_StartCoroutine(function() coroutine.step() local active, pos = ctrl:GetFollowPointPosition() if active then DOTween.To(function() return self.view.main.position end, function(value) self.view.main.position = value end, pos, self.view.config.COUNTDOWN_TWEEN_TO_TARGET_DURATION) end end) else DOTween.To(function() return self.view.main.anchoredPosition end, function(value) self.view.main.anchoredPosition = value end, self.m_originalAnchoredPos, self.view.config.COUNTDOWN_TWEEN_TO_TARGET_DURATION) end end end CommonTaskTrackCountdownCtrl.OnRemoveHeadBar = HL.Method(HL.Table) << function(self, args) local targetAbilitySystem = unpack(args) if targetAbilitySystem and targetAbilitySystem.showBigHeadBar then DOTween.To(function() return self.view.main.anchoredPosition end, function(value) self.view.main.anchoredPosition = value end, self.m_originalAnchoredPos, self.view.config.COUNTDOWN_TWEEN_TO_TARGET_DURATION) end end HL.Commit(CommonTaskTrackCountdownCtrl)