Files
Endfield-Data/LuaScripts/Common/Core/UIWorldFreezeManager.lua
2026-01-31 21:42:01 +07:00

196 lines
5.0 KiB
Lua

local panelConfig = require_ex("UI/Panels/PanelConfig").config
UIWorldFreezeManager = HL.Class('UIWorldFreezeManager')
do
UIWorldFreezeManager.m_timeScaleHandle = HL.Field(HL.Number) << -1
UIWorldFreezeManager.m_activePanelCount = HL.Field(HL.Number) << 0
UIWorldFreezeManager.m_pauseGameModePanelCount = HL.Field(HL.Number) << 0
UIWorldFreezeManager.m_activePanels = HL.Field(HL.Table)
UIWorldFreezeManager.m_pauseGameModePanels = HL.Field(HL.Table)
end
do
UIWorldFreezeManager.UIWorldFreezeManager = HL.Constructor() << function(self)
self.m_activePanels = {}
self.m_pauseGameModePanels = {}
self:_RegisterMessages()
end
UIWorldFreezeManager.IsUIWorldFreeze = HL.Method().Return(HL.Boolean) << function(self)
return self.m_timeScaleHandle ~= -1
end
end
do
UIWorldFreezeManager._RegisterMessages = HL.Method() << function(self)
Register(MessageConst.ON_BEFORE_UI_PANEL_OPEN, function(name)
self:_OnPanelActivate(name)
end)
Register(MessageConst.ON_UI_PANEL_CLOSED, function(name)
self:_OnPanelDeActivate(name)
end)
Register(MessageConst.ON_UI_PANEL_SHOW, function(name)
self:_OnPanelActivate(name)
end)
Register(MessageConst.ON_UI_PANEL_HIDE, function(name)
self:_OnPanelDeActivate(name)
end)
end
UIWorldFreezeManager._OnPanelActivate = HL.Method(HL.String) << function(self, panelName)
local panelCfg = panelConfig[panelName]
if not panelCfg or not panelCfg.freezeWorld then
return
end
if not self.m_activePanels[panelName] then
self.m_activePanels[panelName] = true
self.m_activePanelCount = self.m_activePanelCount + 1
if self.m_activePanelCount == 1 then
self:_FreezeWorld(true)
end
end
if panelCfg.dontPauseGameMode then
return
end
if not self.m_pauseGameModePanels[panelName] then
self.m_pauseGameModePanels[panelName] = true
self.m_pauseGameModePanelCount = self.m_pauseGameModePanelCount + 1
if self.m_pauseGameModePanelCount == 1 then
self:_PauseGameMode(true)
end
end
end
UIWorldFreezeManager._OnPanelDeActivate = HL.Method(HL.String) << function(self, panelName)
if self.m_timeScaleHandle == -1 then
return
end
local panelCfg = panelConfig[panelName]
if not panelCfg or not panelCfg.freezeWorld then
return
end
if self.m_activePanels[panelName] then
self.m_activePanels[panelName] = nil
self.m_activePanelCount = self.m_activePanelCount - 1
end
if self.m_activePanelCount == 0 then
self:_FreezeWorld(false)
end
if panelCfg.dontPauseGameMode then
return
end
if self.m_pauseGameModePanels[panelName] then
self.m_pauseGameModePanels[panelName] = nil
self.m_pauseGameModePanelCount = self.m_pauseGameModePanelCount - 1
end
if self.m_pauseGameModePanelCount == 0 then
self:_PauseGameMode(false)
end
end
UIWorldFreezeManager._FreezeWorld = HL.Method(HL.Boolean) << function(self, isFrozen)
if isFrozen then
self.m_timeScaleHandle = TimeManagerInst:StartChangeTimeScale(0, CS.Beyond.TimeManager.ChangeTimeScaleReason.UIPanel)
AudioAdapter.PostEvent("au_global_contr_fullscreen_menu_pause")
if UIManager.uiCamera.cullingMask == UIConst.LAYERS.Nothing then
UIManager:OnToggleUiAction({ true })
logger.important(CS.Beyond.EnableLogType.DevOnly,
"[UIWorldFreezeManager] freeze world when uiCamera culling mask is nothing")
end
else
if self.m_timeScaleHandle ~= -1 then
TimeManagerInst:StopChangeTimeScale(self.m_timeScaleHandle)
self.m_timeScaleHandle = -1
AudioAdapter.PostEvent("au_global_contr_fullscreen_menu_resume")
end
end
if GameWorld.isInited then
GameWorld.cutsceneManager:PauseTimelineByUI(isFrozen)
GameWorld.levelSeqManager:PauseTimelineByUI(isFrozen)
GameWorld.dialogTimelineManager:PauseTimelineByUI(isFrozen)
end
end
UIWorldFreezeManager._PauseGameMode = HL.Method(HL.Boolean) << function(self, isPaused)
if not GameWorld.isInited then
return
end
if isPaused then
GameWorld.worldInfo:TryPauseSubGame(GEnums.GameTimeFreezeReason.UI)
else
GameWorld.worldInfo:TryResumeSubGame(GEnums.GameTimeFreezeReason.UI)
end
end
end
HL.Commit(UIWorldFreezeManager)
return UIWorldFreezeManager