Files
StellaSora_DataLua/lua/gamecore/data/popupmanager.lua
T
SL1900 dcc2c4a2a9 Update - 1.11.0.113
EN: 1.11.0.113
CN: 1.11.0.114
JP: 1.11.0.118
KR: 1.11.0.118
2026-06-02 16:00:00 +09:00

200 lines
5.5 KiB
Lua

local PopUpManager = {}
local ClientManager = CS.ClientManager.Instance
local LocalData = require("GameCore.Data.LocalData")
local RapidJson = require("rapidjson")
local ModuleManager = require("GameCore.Module.ModuleManager")
local popUpPanelConfig = {}
local _tbPopUpQueue = {}
local _tbPopUpCache = {}
local _popUpCallback
local _bInPopUpQueue = false
local _bInterruptPopUp = false
local _tbSpecifyPopUp = {}
local _tempPopUpMapData = {}
local _interruptPopUpIndex = 0
function PopUpManager.Init()
local foreachPopupSeq = function(mapData)
local data = {
nPanelId = mapData.PanelId,
nSortId = mapData.SortId,
bLocalSave = mapData.bLocalSave
}
popUpPanelConfig[mapData.Type] = data
end
ForEachTableLine(ConfigTable.Get("PopUpSequence"), foreachPopupSeq)
end
function PopUpManager.InitLoginQueue()
local sTime = LocalData.GetPlayerLocalData("LoginPanelTime")
local nTime = tonumber(sTime) or 0
local nNextTime = ClientManager:GetNextRefreshTime(ClientManager.serverTimeStamp)
if nTime < nNextTime then
_tbPopUpQueue = {}
PopUpManager.SaveLocalData()
else
local sJson = LocalData.GetPlayerLocalData("LoginPanelQueue")
local tb = decodeJson(sJson)
if type(tb) == "table" then
_tbPopUpQueue = tb
end
end
end
function PopUpManager.SaveLocalData()
local nNextTime = ClientManager:GetNextRefreshTime(ClientManager.serverTimeStamp)
local tbLocalSave = {}
for _, v in ipairs(_tbPopUpQueue) do
local mapConfig = popUpPanelConfig[v.nType]
if mapConfig and mapConfig.bLocalSave then
table.insert(tbLocalSave, v)
end
end
LocalData.SetPlayerLocalData("LoginPanelQueue", RapidJson.encode(tbLocalSave))
LocalData.SetPlayerLocalData("LoginPanelTime", tostring(nNextTime))
end
function PopUpManager.StartShowPopUp(callback)
_popUpCallback = callback
_bInPopUpQueue = true
PopUpManager.PopUpDeQueue()
end
function PopUpManager.PopUpEnQueue(nType, mapData)
if EditorSettings and EditorSettings.bSkipPopup then
return
end
local bAdded = false
for nIndex, mapPopUp in ipairs(_tbPopUpQueue) do
if mapPopUp.nType == nType then
_tbPopUpQueue[nIndex].mapData = mapData
bAdded = true
break
end
end
if not bAdded then
table.insert(_tbPopUpQueue, {nType = nType, mapData = mapData})
end
table.sort(_tbPopUpQueue, function(a, b)
local nSortA = popUpPanelConfig[a.nType].nSortId or 999
local nSortB = popUpPanelConfig[b.nType].nSortId or 999
return nSortA < nSortB
end)
if nType == GameEnum.PopUpSeqType.MonthlyCard and PlayerData.Mall:CheckOrderProcess() then
return
end
EventManager.Hit("MainViewCheckOpenPanel")
end
function PopUpManager.PopUpDeQueue()
local exitPopUpQueue = function()
if _popUpCallback ~= nil then
_popUpCallback()
end
_tbPopUpCache = {}
_bInPopUpQueue = false
_bInterruptPopUp = false
_interruptPopUpIndex = 0
EventManager.Hit("Event_MainViewPopUpEnd")
end
if #_tbPopUpQueue == 0 and not _bInterruptPopUp and _interruptPopUpIndex == 0 then
exitPopUpQueue()
return
end
if not _bInterruptPopUp and _interruptPopUpIndex == 0 then
_tempPopUpMapData = table.remove(_tbPopUpQueue, 1)
else
local mapData = _tempPopUpMapData.mapData
for i = 1, _interruptPopUpIndex do
table.remove(mapData, 1)
end
if #mapData == 0 then
exitPopUpQueue()
return
else
_tempPopUpMapData.mapData = mapData
end
end
_bInterruptPopUp = false
_interruptPopUpIndex = 0
local mapNext = _tempPopUpMapData
_tbPopUpCache[mapNext.nType] = true
local callback = function(funcCall)
PopUpManager.PopUpDeQueue()
if nil ~= funcCall then
funcCall()
end
end
local mapConfig = popUpPanelConfig[mapNext.nType]
if mapConfig ~= nil then
if mapNext.nType == GameEnum.PopUpSeqType.MessageBox then
local msg = {
nType = AllEnum.MessageBox.Alert,
sContent = mapNext.mapData,
callbackConfirm = callback
}
EventManager.Hit(EventId.OpenMessageBox, msg)
else
local mapData = {}
if mapNext.nType == GameEnum.PopUpSeqType.ActivityFaceAnnounce then
for k, v in pairs(mapNext.mapData) do
table.insert(mapData, v)
end
else
mapData = mapNext.mapData
end
EventManager.Hit(EventId.OpenPanel, mapConfig.nPanelId, mapData, callback)
end
if mapConfig.bLocalSave then
PopUpManager.SaveLocalData()
end
end
end
function PopUpManager.InterruptPopUp(index)
_bInterruptPopUp = true
_interruptPopUpIndex = index
end
function PopUpManager.ResetInterruptPopUp()
_bInterruptPopUp = false
_interruptPopUpIndex = 0
_tbPopUpCache = {}
_bInPopUpQueue = false
end
function PopUpManager.OpenPopUpPanelByType(nType, callback)
local nRemoveIdx = 0
for nIdx, data in ipairs(_tbPopUpQueue) do
if data.nType == nType then
nRemoveIdx = nIdx
break
end
end
if nRemoveIdx ~= 0 then
local mapNext = table.remove(_tbPopUpQueue, nRemoveIdx)
local mapConfig = popUpPanelConfig[mapNext.nType]
if mapConfig ~= nil then
EventManager.Hit(EventId.OpenPanel, mapConfig.nPanelId, mapNext.mapData, callback)
if mapConfig.bLocalSave then
PopUpManager.SaveLocalData()
end
end
elseif callback ~= nil then
callback()
end
end
function PopUpManager.OpenPopUpPanel(tbType, callback)
local bInPopUp = PopUpManager.CheckInPopUpQueue()
if bInPopUp then
return
end
_tbSpecifyPopUp = tbType
local function popUp()
if #_tbSpecifyPopUp == 0 then
if callback ~= nil then
callback()
end
return
end
local nType = table.remove(_tbSpecifyPopUp, 1)
PopUpManager.OpenPopUpPanelByType(nType, popUp)
end
popUp()
end
function PopUpManager.CheckInPopUpQueue()
return _bInPopUpQueue and not _bInterruptPopUp
end
return PopUpManager