Files
StellaSora_DataLua/lua/game/ui/play_icecreamtruck/play/customerqueuectrl.lua
T
SL1900 8c4bd41668 Update - 1.13.0.124
EN: 1.13.0.124
CN: 1.13.0.124
JP: 1.13.0.128
KR: 1.13.0.130
2026-07-21 12:30:00 +09:00

208 lines
6.4 KiB
Lua

local CustomerQueueCtrl = class("CustomerQueueCtrl", BaseCtrl)
local IceCreamUtils = require("Game.UI.Play_IceCreamTruck.Play.IceCreamUtils")
local IceCreamTruckGameCtrl = require("Game.UI.Play_IceCreamTruck.Play.IceCreamTruckGameCtrl")
local enumQueueType = IceCreamUtils.EnumQueueType
CustomerQueueCtrl._mapNodeConfig = {
Customers = {
sCtrlName = "Game.UI.Play_IceCreamTruck.Play.CustomersCtrl"
},
obj_Point = {nCount = 4}
}
CustomerQueueCtrl._mapEventConfig = {
Event_FirstCustomerLeave = "Event_FirstCustomerLeave",
Event_FirstCustomerStartLeaving = "Event_FirstCustomerStartLeaving",
Event_StartBusiness = "Event_StartBusiness"
}
function CustomerQueueCtrl:Awake()
local param = self:GetPanelParam()
if type(param) == "table" then
self.nActId = param[1]
self.nLevelId = param[2]
end
self.nPendingCount = 0
self.tbQueuePoints = {}
self.MaxQueueLine = 4
self.LevelData = ConfigTable.GetData("ActivityIceCreamLevel", self.nLevelId)
end
function CustomerQueueCtrl:OnEnable()
if self.LevelData == nil then
printError("LevelData是空的")
end
self._bOpened = false
end
function CustomerQueueCtrl:Event_StartBusiness()
if self._bOpened then
return
end
self:StartOpen()
end
function CustomerQueueCtrl:StartOpen()
self._bOpened = true
EventManager.Hit("Event_InitCharPool", self.LevelData)
EventManager.Hit("Event_InitBuffPool", self.LevelData)
self:InitQueuePoints()
self._mapNode.Customers:Init()
local fInitInterval = 1.5
for i = 1, self.MaxQueueLine do
self:CreatWaitCustomers((i - 1) * fInitInterval)
end
end
function CustomerQueueCtrl:CreatWaitCustomers(nDelay)
local nMax = self.LevelData.CustomerCount
if nMax and 0 < nMax and nMax <= self._mapNode.Customers:GetAllCustomerCount() then
return
end
self.nPendingCount = self.nPendingCount + 1
self:TryFillQueuePoints(nDelay or 0)
end
function CustomerQueueCtrl:InitQueuePoints()
for i, point in ipairs(self._mapNode.obj_Point) do
local rectTransform = point.gameObject:GetComponent("RectTransform")
if i == 1 then
self.tbQueuePoints[i] = {
Point = rectTransform,
bIsFree = true,
enumQueueTyp = enumQueueType.InMake,
currentCustomerId = nil
}
else
self.tbQueuePoints[i] = {
Point = rectTransform,
bIsFree = true,
enumQueueTyp = enumQueueType.InQueue,
currentCustomerId = nil
}
end
end
end
function CustomerQueueCtrl:TryFillQueuePoints(nDelay)
local maxNum = self.LevelData.CustomerCount < 0 and self.MaxQueueLine or math.min(self.MaxQueueLine, self.LevelData.CustomerCount)
for i = 1, maxNum do
if self.tbQueuePoints[i].bIsFree and 0 < self.nPendingCount then
self.nPendingCount = self.nPendingCount - 1
local customerId = self._mapNode.Customers:GetCustomerNew(self.LevelData)
if customerId then
self.tbQueuePoints[i].currentCustomerId = customerId
self.tbQueuePoints[i].bIsFree = false
EventManager.Hit("Event_CustomerTeleportTo", customerId, self:GetSpawnPoint())
self:CustomerMove(self.tbQueuePoints[i], nDelay)
end
end
end
end
function CustomerQueueCtrl:CompactQueue()
local nDelay = 0
local fInterval = 0.4
for i = 1, #self.tbQueuePoints - 1 do
local currentPoint = self.tbQueuePoints[i]
local nextPoint = self.tbQueuePoints[i + 1]
if currentPoint.bIsFree and not nextPoint.bIsFree then
local customerId = nextPoint.currentCustomerId
currentPoint.bIsFree = false
currentPoint.currentCustomerId = customerId
nextPoint.bIsFree = true
nextPoint.currentCustomerId = nil
self:CustomerMove(currentPoint, nDelay)
nDelay = nDelay + fInterval
end
end
end
function CustomerQueueCtrl:Event_FirstCustomerLeave(customerId, bSucceed)
EventManager.Hit("Event_CustomerLeaveQueue", customerId, bSucceed)
local nIdx
for i = 1, self.MaxQueueLine do
if not self.tbQueuePoints[i].bIsFree and self.tbQueuePoints[i].currentCustomerId == customerId then
nIdx = i
break
end
end
if nIdx == nil then
printLog("[IceCream] FirstCustomerLeave: 找不到 id=" .. tostring(customerId) .. " 的队列槽位(可能已处理)")
return
end
if nIdx ~= 1 then
end
self._bPendingCompact = customerId
end
function CustomerQueueCtrl:Event_FirstCustomerStartLeaving(customerId)
if self._bPendingCompact == nil then
return
end
if self._bPendingCompact ~= customerId then
printLog(string.format("[IceCream] StartLeaving id 不匹配: pending=%s incoming=%s", tostring(self._bPendingCompact), tostring(customerId)))
return
end
self._bPendingCompact = nil
self.tbQueuePoints[1].currentCustomerId = nil
self.tbQueuePoints[1].bIsFree = true
self:CompactQueue()
self:CreatWaitCustomers()
end
function CustomerQueueCtrl:CustomerMove(QueuePoints, nDelay)
local nGen = IceCreamTruckGameCtrl.GetRestartGen()
local nExpectId = QueuePoints.currentCustomerId
if nExpectId == nil then
return
end
if 0 < nDelay then
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForSeconds(nDelay))
if nGen ~= IceCreamTruckGameCtrl.GetRestartGen() then
return
end
if QueuePoints.currentCustomerId ~= nExpectId then
return
end
EventManager.Hit("Event_CustomerMoveTo", QueuePoints)
end
cs_coroutine.start(wait)
else
cs_coroutine.start(function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
if nGen ~= IceCreamTruckGameCtrl.GetRestartGen() then
return
end
if QueuePoints.currentCustomerId ~= nExpectId then
return
end
EventManager.Hit("Event_CustomerMoveTo", QueuePoints)
end)
end
end
function CustomerQueueCtrl:ClearQueue()
self.nPendingCount = 0
if self.tbQueuePoints ~= nil then
self.tbQueuePoints = {}
end
self._bPendingCompact = nil
self._bOpened = false
end
function CustomerQueueCtrl:GetSpawnPoint()
return self.tbQueuePoints[self.MaxQueueLine].Point
end
function CustomerQueueCtrl:GetServingCustomer()
local slot = self.tbQueuePoints and self.tbQueuePoints[1]
if slot == nil or slot.bIsFree or slot.currentCustomerId == nil then
return nil
end
if self._mapNode.Customers == nil then
return nil
end
return self._mapNode.Customers:GetCustomerById(slot.currentCustomerId)
end
function CustomerQueueCtrl:Restart()
if self._mapNode.Customers and self._mapNode.Customers.Restart then
self._mapNode.Customers:Restart()
end
self.nPendingCount = 0
self.tbQueuePoints = {}
self._bPendingCompact = nil
self.LevelData = ConfigTable.GetData("ActivityIceCreamLevel", self.nLevelId)
if self.LevelData == nil then
printError("[IceCream] CustomerQueueCtrl:Restart LevelData 为空")
return
end
self._bOpened = false
end
return CustomerQueueCtrl