Files
Endfield-Data/LuaScripts/LuaSystem/CommonTaskTrackSystem.lua
2025-12-02 20:37:18 +07:00

340 lines
7.6 KiB
Lua

local LuaSystemBase = require_ex('LuaSystem/LuaSystemBase')
CommonTaskTrackSystem = HL.Class('CommonTaskTrackSystem', LuaSystemBase.LuaSystemBase)
CommonTaskTrackSystem.m_pendingRequests = HL.Field(HL.Table)
CommonTaskTrackSystem.configs = HL.Field(HL.Table)
CommonTaskTrackSystem.m_nextRequestId = HL.Field(HL.Number) << 1
CommonTaskTrackSystem.m_isShowing = HL.Field(HL.Boolean) << false
CommonTaskTrackSystem.m_tryStartPanelTimerId = HL.Field(HL.Number) << -1
CommonTaskTrackSystem.CommonTaskTrackSystem = HL.Constructor() << function(self)
self:_InitConfigs()
self.m_pendingRequests = {}
self:RegisterMessage(MessageConst.ON_ONE_COMMON_TASK_PANEL_FINISH, function(type)
self:OnOneCommonTaskPanelFinish(type)
end)
self:RegisterMessage(MessageConst.ON_PHASE_LEVEL_ON_TOP, function()
self:_TryAddStartPanelTimer()
end)
self:RegisterMessage(MessageConst.ON_PHASE_LEVEL_NOT_ON_TOP, function()
self:Interrupt()
end)
self:RegisterMessage(MessageConst.ALL_MAIN_HUD_ACTION_FINISH, function()
self:_TryAddStartPanelTimer()
end)
self:RegisterMessage(MessageConst.ON_ENTER_DUNGEON, function()
self:_ForceClearRequest()
end)
self:RegisterMessage(MessageConst.ON_LEAVE_DUNGEON, function()
self:_ForceClearRequest()
end)
self:RegisterMessage(MessageConst.ON_SUB_GAME_RESET, function()
self:_ForceClearRequest()
end)
end
CommonTaskTrackSystem.OnInit = HL.Override() << function(self)
end
CommonTaskTrackSystem._InitConfigs = HL.Method() << function(self)
self.configs = {
DungeonInfo = {
needWait = true,
order = 1,
},
ForceClearTrackHud = {
needWait = false,
order = 1,
forceClear = true,
},
TrackHud = {
needWait = false,
order = 1,
},
TrackHudShowEndEffect = {
needWait = true,
order = 1,
},
TrackStartToast = {
needWait = true,
order = 1,
},
TrackStartCountdown = {
needWait = false,
order = 1,
},
TrackEndToast = {
needWait = false,
order = 1,
},
TrackEndToastNW = {
needWait = true,
order = 1,
},
DungeonSettlement = {
needWait = false,
order = 1,
},
DeathInfo = {
needWait = false,
order = 100,
},
BlackboxDiff = {
needWait = false,
order = 100,
},
}
for k, v in pairs(self.configs) do
v.name = k
end
end
CommonTaskTrackSystem.AddRequest = HL.Method(HL.String, HL.Function, HL.Opt(HL.Function))
<< function(self, type, action, interruptAction)
local requestId = self.m_nextRequestId
self.m_nextRequestId = self.m_nextRequestId + 1
local cfg = self.configs[type]
if cfg.forceClear then
for _, request in ipairs(self.m_pendingRequests) do
if request.interruptAction then
request.interruptAction()
end
end
self.m_pendingRequests = {}
self.m_isShowing = false
end
local request = {
id = requestId,
type = type,
action = action,
order = cfg.order,
noRemoveRequests = cfg.noRemoveRequests,
interruptAction = interruptAction,
}
table.insert(self.m_pendingRequests, request)
table.sort(self.m_pendingRequests, Utils.genSortFunction({ "order", "id" }, true))
self:_TryAddStartPanelTimer()
end
CommonTaskTrackSystem._TryAddStartPanelTimer = HL.Method() << function(self)
if self.m_isShowing or self.m_pendingRequests[1] == nil then
logger.info("CommonTaskTrackSystem._TryAddStartPanelTimer Skipped")
return
end
if self.m_tryStartPanelTimerId > 0 then
logger.info("CommonTaskTrackSystem._TryAddStartPanelTimer Duplicated")
return
end
logger.info("CommonTaskTrackSystem._TryAddStartPanelTimer Succ")
self.m_tryStartPanelTimerId = self:_StartTimer(0, function()
self:_TryStartPanel()
end)
end
CommonTaskTrackSystem._TryStartPanel = HL.Method() << function(self)
logger.info("CommonTaskTrackSystem._TryStartPanel")
self.m_tryStartPanelTimerId = -1
local hasPhaseLevel = PhaseManager:IsOpen(PhaseId.Level)
if not hasPhaseLevel then
logger.info("CommonTaskTrackSystem._TryStartPanel fail, no phase level")
return
end
local topPhase = PhaseManager:GetTopPhaseId()
if topPhase ~= PhaseId.Level then
logger.info("CommonTaskTrackSystem._TryStartPanel fail, not on phaseLevel")
return
end
if LuaSystemManager.mainHudActionQueue.m_isShowing then
logger.info("CommonTaskTrackSystem._TryStartPanel fail, mainHudActionQueue is showing")
return
end
self.m_isShowing = true
self:_StartFirstRequest()
end
CommonTaskTrackSystem._StartFirstRequest = HL.Method() << function(self)
local request = self.m_pendingRequests[1]
request.order = 0
local cfg = self.configs[request.type]
logger.info("CommonTaskTrackSystem._StartFirstRequest", request.type, request)
request.action()
if not cfg.needWait then
self:OnOneCommonTaskPanelFinish(request.type)
end
end
CommonTaskTrackSystem._ForceClearRequest = HL.Method() << function(self)
self.m_pendingRequests = {}
self.m_isShowing = false
if self.m_tryStartPanelTimerId > 0 then
self:_ClearTimer(self.m_tryStartPanelTimerId)
end
end
CommonTaskTrackSystem.OnOneCommonTaskPanelFinish = HL.Method(HL.String) << function(self, type)
logger.info("CommonTaskTrackSystem.OnOneCommonTaskPanelFinish", type)
if not self.m_isShowing then
logger.error("OnOneCommonTaskPanelFinish: Not isShowing", type)
return
end
local request = self.m_pendingRequests[1]
if request.type ~= type then
logger.error("OnOneCommonTaskPanelFinish: Type Not Match", type, request)
return
end
table.remove(self.m_pendingRequests, 1)
Notify(MessageConst.ON_ONE_COMMON_TASK_REQUEST_FINISH)
if self.m_pendingRequests[1] then
self:_StartFirstRequest()
else
self.m_isShowing = false
logger.info("CommonTaskTrackSystem showing finished")
end
end
CommonTaskTrackSystem.Interrupt = HL.Method() << function(self)
self.m_tryStartPanelTimerId = self:_ClearTimer(self.m_tryStartPanelTimerId)
if not self.m_isShowing then
return
end
logger.info("CommonTaskTrackSystem.Interrupt")
self.m_isShowing = false
local request = self.m_pendingRequests[1]
if request.interruptAction then
request.interruptAction()
end
if not request.noRemoveRequests then
table.remove(self.m_pendingRequests, 1)
end
end
CommonTaskTrackSystem.NeedPendingManiHudToast = HL.Method().Return(HL.Boolean) << function(self)
if self.m_pendingRequests[1] == nil then
return false
end
if self.m_pendingRequests[1].type == "TrackEndToastNW" then
return false
end
return true
end
CommonTaskTrackSystem.HasRequest = HL.Method().Return(HL.Boolean) << function(self)
return self.m_pendingRequests[1] ~= nil and self.configs[self.m_pendingRequests[1].type].needWait == true
end
HL.Commit(CommonTaskTrackSystem)
return CommonTaskTrackSystem