196 lines
5.0 KiB
Lua
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
|