1320 lines
No EOL
40 KiB
Lua
1320 lines
No EOL
40 KiB
Lua
|
||
local XRestaurantStaff = require("XModule/XRestaurant/XRestaurantStaff")
|
||
local XIngredient = require("XModule/XRestaurant/XProduct/XIngredient")
|
||
local XFood = require("XModule/XRestaurant/XProduct/XFood")
|
||
local XCashier = require("XModule/XRestaurant/XProduct/XCashier")
|
||
|
||
local XCookingWorkBench = require("XModule/XRestaurant/XWorkBench/XCookingWorkBench")
|
||
local XIngredientWorkBench = require("XModule/XRestaurant/XWorkBench/XIngredientWorkBench")
|
||
local XSalesWorkBench = require("XModule/XRestaurant/XWorkBench/XSalesWorkBench")
|
||
local XRestaurantOrder = require("XModule/XRestaurant/XRestaurantOrder")
|
||
local XRestaurantBuff = require("XModule/XRestaurant/XBuff/XRestaurantBuff")
|
||
|
||
local SimulationTimer
|
||
local SimulationDelay = XScheduleManager.SECOND
|
||
local LastSimulationTime = 0
|
||
|
||
local LuaMemoryLimit = 500 * 1024 --进入餐厅增加500M后会GC一次
|
||
|
||
---@class XRestaurant : XDataEntityBase 战双厨房玩法活动数据对象
|
||
---@field private _Id number 活动Id
|
||
---@field private _Level number 餐厅等级
|
||
---@field private _IsLevelUp boolean 餐厅是否升级
|
||
---@field private _CookingWorkBenches XCookingWorkBench[] 已解锁烹饪台
|
||
---@field private _IngredientWorkBenches XIngredientWorkBench[] 已解备菜台
|
||
---@field private _SalesWorkBenches XSalesWorkBench[] 已解锁售卖台
|
||
---@field private _StaffMap table<number, XRestaurantStaff> 员工列表
|
||
---@field private _FoodMap table<number, XFood> 食物列表
|
||
---@field private _IngredientMap table<number, XIngredient> 食材列表
|
||
---@field private _Cashier XCashier 收银台
|
||
---@field private _OfflineBill number 离线账单
|
||
---@field private _OfflineBillUpdateTime number 上次离开餐厅时间
|
||
---@field private _CurDay number 活动开放天数
|
||
---@field private _AccelerateUseTimes number 当天加速道具使用次数
|
||
---@field private _IsGetSignReward boolean 是否领取签到奖励
|
||
---@field private _EventLevelConditionChange number 升级所需条件改变事件
|
||
---@field private _UnlockIngredient table<number, boolean> 已解锁食材
|
||
---@field private _UnlockFood table<number, boolean> 已解锁食物
|
||
---@field private _EnterRoomMemory number 进入餐厅时的Lua内存
|
||
---@field private _OrderInfo XRestaurantOrder 订单数据
|
||
---@field private _BuffMap table<number, XRestaurantBuff> 已经解锁Buff
|
||
---@field private _AreaTypeBuff table<number, XRestaurantBuff> 每个区域对应的BuffId
|
||
---@field private _AreaSortMark table<number, boolean> 每个区域工作台排序标记
|
||
local XRestaurant = XClass(XDataEntityBase, "XRestaurant")
|
||
|
||
local default = {
|
||
_Id = 0, --活动Id,
|
||
_Level = 0,
|
||
_IsLevelUp = false,
|
||
_CookingWorkBenches = {},
|
||
_IngredientWorkBenches = {},
|
||
_SalesWorkBenches = {},
|
||
_StaffMap = {},
|
||
_FoodMap = {},
|
||
_IngredientMap = {},
|
||
_Cashier = nil,
|
||
_UnlockIngredient = {},
|
||
_UnlockFood = {},
|
||
_OfflineBill = 0,
|
||
_OfflineBillUpdateTime = 0,
|
||
_CurDay = 0,
|
||
_AccelerateUseTimes = 0,
|
||
_IsGetSignReward = false,
|
||
_EventLevelConditionChange = 0,
|
||
_OrderInfo = nil,
|
||
_AreaTypeBuff = {},
|
||
_BuffMap = {},
|
||
_AreaSortMark = {},
|
||
_BuffRedPointMarkCount = 0,
|
||
_MenuRedPointMarkCount = 0,
|
||
|
||
_EnterRoomMemory = 0,
|
||
_UiMainSorting = -1,
|
||
}
|
||
|
||
function XRestaurant:Ctor(id)
|
||
self:Init(default, id)
|
||
end
|
||
|
||
--- 初始化持久数据
|
||
---@private
|
||
---@param id number 活动Id
|
||
---@return nil
|
||
--------------------------
|
||
function XRestaurant:InitData(id)
|
||
self:SetProperty("_Id", id)
|
||
self:_InitStaffList()
|
||
self:_InitProductList()
|
||
self._Cashier = XCashier.New()
|
||
end
|
||
|
||
--- 获取商店Id
|
||
---@return number 商店Id
|
||
--------------------------
|
||
function XRestaurant:GetShopId()
|
||
return XRestaurantConfigs.GetShopId(self._Id)
|
||
end
|
||
|
||
--- 活动名
|
||
---@return string 活动名
|
||
--------------------------
|
||
function XRestaurant:GetActivityName()
|
||
return XRestaurantConfigs.GetActivityName(self._Id)
|
||
end
|
||
|
||
--- 获取结束时间
|
||
---@return number 结束时间
|
||
--------------------------
|
||
function XRestaurant:GetBusinessEndTime()
|
||
return XRestaurantConfigs.GetActivityEndTime(self._Id)
|
||
end
|
||
|
||
--- 获取开始时间
|
||
---@return number 开始时间
|
||
--------------------------
|
||
function XRestaurant:GetBusinessStartTime()
|
||
return XRestaurantConfigs.GetActivityStartTime(self._Id)
|
||
end
|
||
|
||
function XRestaurant:GetShopStartTime()
|
||
return XRestaurantConfigs.GetShopStartTime(self._Id)
|
||
end
|
||
|
||
function XRestaurant:GetShopEndTime()
|
||
return XRestaurantConfigs.GetShopEndTime(self._Id)
|
||
end
|
||
|
||
--- 获取任务组列表
|
||
---@return number[] 任务组Id列表
|
||
--------------------------
|
||
function XRestaurant:GetTimeLimitTaskIds()
|
||
return XRestaurantConfigs.GetTimeLimitTaskIds(self._Id)
|
||
end
|
||
|
||
-- 食谱任务
|
||
function XRestaurant:GetRecipeTaskId()
|
||
return XRestaurantConfigs.GetRecipeTaskId(self._Id)
|
||
end
|
||
|
||
--- 活动是否开启
|
||
---@return boolean 是否开启
|
||
--------------------------
|
||
function XRestaurant:IsOpen()
|
||
if not XTool.IsNumberValid(self._Id) then
|
||
return false
|
||
end
|
||
|
||
return self:IsInBusiness() or self:IsShopOpen()
|
||
end
|
||
|
||
--- 餐厅是否营业中
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurant:IsInBusiness()
|
||
return XRestaurantConfigs.CheckActivityInTime(self._Id)
|
||
end
|
||
|
||
--- 商店是否开放中
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurant:IsShopOpen()
|
||
return XRestaurantConfigs.CheckShopInTime(self._Id)
|
||
end
|
||
|
||
--- 活动账单结算时间
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:GetOfflineBillTime()
|
||
return XRestaurantConfigs.GetActivityOfflineBillTime(self._Id)
|
||
end
|
||
|
||
--- 是否展示离线账单
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurant:IsShowOfflineBill()
|
||
if self:IsFirstEnterRoom() then
|
||
return false
|
||
end
|
||
local nowTime = XTime.GetServerNowTimestamp()
|
||
local billTime = self:GetOfflineBillTime()
|
||
if nowTime - self._OfflineBillUpdateTime < billTime then
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
|
||
--- 首次进入餐厅
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurant:IsFirstEnterRoom()
|
||
return not XTool.IsNumberValid(self._OfflineBillUpdateTime)
|
||
end
|
||
|
||
function XRestaurant:GetAccelerateUseLimit()
|
||
return XRestaurantConfigs.GetActivityAccelerateUseLimit(self._Id)
|
||
end
|
||
|
||
function XRestaurant:GetAccelerateTime()
|
||
return XRestaurantConfigs.GetActivityAccelerateTime(self._Id)
|
||
end
|
||
|
||
function XRestaurant:GetAccelerateCount()
|
||
return XDataCenter.ItemManager.GetCount(XRestaurantConfigs.ItemId.RestaurantAccelerate)
|
||
end
|
||
|
||
function XRestaurant:IsAccelerateUpperLimit()
|
||
return self._AccelerateUseTimes >= self:GetAccelerateUseLimit()
|
||
end
|
||
|
||
function XRestaurant:GetUrgentTime()
|
||
return XRestaurantConfigs.GetActivityUrgentTime(self._Id)
|
||
end
|
||
|
||
--- 餐厅升级
|
||
---@param level number 升级后的等级
|
||
---@return void
|
||
--------------------------
|
||
function XRestaurant:LevelUp(level)
|
||
level = math.max(XRestaurantConfigs.LevelRange.Min, level)
|
||
local oldLevel = self._Level
|
||
if level == oldLevel then
|
||
return
|
||
end
|
||
|
||
self:SetProperty("_Level", level)
|
||
self._UnlockIngredient = XRestaurantConfigs.GetUnlockProduct(level, XRestaurantConfigs.GetUnlockIngredient)
|
||
self._UnlockFood = XRestaurantConfigs.GetUnlockProduct(level, XRestaurantConfigs.GetUnlockFood)
|
||
self:_InitWorkBench()
|
||
|
||
-- 先更新食材
|
||
for _, ingredient in pairs(self._IngredientMap) do
|
||
ingredient:OnRestaurantLevelUp(level)
|
||
end
|
||
-- 再更新食物
|
||
for _, food in pairs(self._FoodMap) do
|
||
food:OnRestaurantLevelUp(level)
|
||
end
|
||
|
||
self._Cashier:OnRestaurantLevelUp(level)
|
||
|
||
if oldLevel ~= 0 and level > oldLevel then
|
||
self:SetProperty("_IsLevelUp", true)
|
||
end
|
||
end
|
||
|
||
--全部工作台停止工作
|
||
function XRestaurant:StopAll()
|
||
for _, bench in pairs(self._IngredientWorkBenches) do
|
||
bench:Stop()
|
||
end
|
||
|
||
for _, bench in pairs(self._CookingWorkBenches) do
|
||
bench:Stop()
|
||
end
|
||
|
||
for _, bench in pairs(self._SalesWorkBenches) do
|
||
bench:Stop()
|
||
end
|
||
end
|
||
|
||
--- 更新员工信息
|
||
---@param staffList Server.XRestaurantCharacter[] 员工信息
|
||
---@return void
|
||
--------------------------
|
||
function XRestaurant:UpdateStaffInfo(staffList)
|
||
for _, info in ipairs(staffList or {}) do
|
||
local charId = info.CharacterId
|
||
local staff = self._StaffMap[charId]
|
||
if not staff then
|
||
XLog.Warning("XRestaurant:UpdateStaffInfo: not found staff!!! staff Id = " .. tostring(charId))
|
||
goto continue
|
||
end
|
||
staff:UpdateInfo(true, info.CharacterLv)
|
||
::continue::
|
||
end
|
||
end
|
||
|
||
--- 更新仓库
|
||
---@param storageInfo Server.XRestaurantStorage
|
||
---@return void
|
||
--------------------------
|
||
function XRestaurant:UpdateStorageInfo(storageInfo)
|
||
if not storageInfo then
|
||
return
|
||
end
|
||
|
||
for _, info in ipairs(storageInfo or {}) do
|
||
local areaType = info.SectionType
|
||
local id = info.ProductId
|
||
if XRestaurantConfigs.CheckIsIngredientArea(areaType) then
|
||
local ingredient = self._IngredientMap[id]
|
||
if not ingredient then
|
||
ingredient = XIngredient.New(id)
|
||
self._IngredientMap[id] = ingredient
|
||
end
|
||
ingredient:SetProperty("_Count", info.Count)
|
||
elseif XRestaurantConfigs.CheckIsFoodArea(areaType) then
|
||
local food = self._FoodMap[id]
|
||
if not food then
|
||
food = XFood.New(id)
|
||
self._FoodMap[id] = food
|
||
end
|
||
food:SetProperty("_Count", info.Count)
|
||
elseif XRestaurantConfigs.CheckIsSaleArea(areaType) then
|
||
self._Cashier:SetProperty("_Count", info.Count)
|
||
end
|
||
end
|
||
end
|
||
|
||
--- 更新工作台状态
|
||
---@param sectionInfos Server.XRestaurantSection[]
|
||
---@return void
|
||
--------------------------
|
||
function XRestaurant:UpdateWorkBench(sectionInfos)
|
||
if not sectionInfos then
|
||
return
|
||
end
|
||
for _, info in ipairs(sectionInfos or {}) do
|
||
local areaType = info.SectionType
|
||
local index = info.Index
|
||
local list = self._AreaMap2Benches[areaType]
|
||
if not XTool.IsTableEmpty(list) then
|
||
local bench = list[index]
|
||
bench:OnNotify(info)
|
||
end
|
||
end
|
||
end
|
||
|
||
--- 更新结算
|
||
---@param offlineBill number 离线账单
|
||
---@param offlineBillUpdateTime number 上次离开餐厅时间
|
||
--------------------------
|
||
function XRestaurant:UpdateSettle(offlineBill, offlineBillUpdateTime)
|
||
self:SetProperty("_OfflineBill", offlineBill)
|
||
self:SetProperty("_OfflineBillUpdateTime", offlineBillUpdateTime)
|
||
end
|
||
|
||
--- 更新热销
|
||
---@param currentDay number 当前活动天数
|
||
---@return void
|
||
--------------------------
|
||
function XRestaurant:UpdateHotSale(currentDay)
|
||
self:SetProperty("_CurDay", currentDay or 1)
|
||
for _, food in pairs(self._FoodMap or {}) do
|
||
food:UpdateHotSale(false, 0)
|
||
end
|
||
local list = XRestaurantConfigs.GetHotSaleDataList(self._CurDay)
|
||
for _, info in pairs(list or {}) do
|
||
local id = info.Id
|
||
if XTool.IsNumberValid(id) then
|
||
local food = self._FoodMap[id]
|
||
food:UpdateHotSale(true, info.Addition)
|
||
end
|
||
end
|
||
end
|
||
|
||
function XRestaurant:UpdateSignData(isGetSignReward, signActivityId)
|
||
self:SetProperty("_IsGetSignReward", isGetSignReward)
|
||
if XTool.IsNumberValid(signActivityId) then
|
||
self:SetProperty("_SignActivityId", signActivityId)
|
||
end
|
||
end
|
||
|
||
function XRestaurant:UpdateOrderInfo(orderActivityId, orderInfos)
|
||
if not self._OrderInfo or self._OrderInfo:GetId() ~= orderActivityId then
|
||
self._OrderInfo = XRestaurantOrder.New(self._Id)
|
||
end
|
||
self._OrderInfo:UpdateData(orderInfos)
|
||
end
|
||
|
||
function XRestaurant:UpdateBuff(areaTypeBuffInfo, unlockBuffs, defaultBuffs)
|
||
local map = {}
|
||
for _, info in ipairs(areaTypeBuffInfo) do
|
||
map[info.SectionType] = info.BuffId
|
||
end
|
||
--TODO CodeMoon, 不知道这里需不需要
|
||
for _, id in ipairs(defaultBuffs) do
|
||
local sectionType = XRestaurantConfigs.GetBuffAreaType(id)
|
||
if not map[sectionType] then
|
||
map[sectionType] = id
|
||
end
|
||
end
|
||
self:SetProperty("_AreaTypeBuff", map)
|
||
|
||
unlockBuffs = appendArray(unlockBuffs, defaultBuffs)
|
||
for _, id in ipairs(unlockBuffs) do
|
||
local buff = self._BuffMap[id]
|
||
if not buff then
|
||
buff = XRestaurantBuff.New(id)
|
||
self._BuffMap[id] = buff
|
||
end
|
||
buff:Unlock()
|
||
end
|
||
end
|
||
|
||
function XRestaurant:OnNotify(notifyData)
|
||
self:SetProperty("_AccelerateUseTimes", notifyData.AccelerateUseTimes)
|
||
--初始化/更新 员工数据
|
||
self:UpdateStaffInfo(notifyData.CharacterList)
|
||
--初始化/更新 产品信息
|
||
self:UpdateStorageInfo(notifyData.StorageInfos)
|
||
--更新餐厅等级
|
||
self:LevelUp(notifyData.RestaurantLv)
|
||
--更新Buff信息
|
||
self:UpdateBuff(notifyData.SectionBuffInfos, notifyData.UnlockSectionBuffs, notifyData.DefaultBuffs)
|
||
--更新订单信息
|
||
self:UpdateOrderInfo(notifyData.OrderActivityId, notifyData.OrderInfos)
|
||
--更新热销
|
||
self:UpdateHotSale(notifyData.CurDay)
|
||
--更新工作台信息
|
||
self:UpdateWorkBench(notifyData.SectionInfos)
|
||
--更新结算
|
||
self:UpdateSettle(notifyData.OfflineBill, notifyData.LastSettleTime)
|
||
--更新签到信息
|
||
self:UpdateSignData(notifyData.IsGetSignReward, notifyData.SignActivityId)
|
||
end
|
||
|
||
function XRestaurant:UpdateLuaMemory()
|
||
local memory = CS.XLuaEngine.Env.Memroy
|
||
self:SetProperty("_EnterRoomMemory", memory)
|
||
end
|
||
|
||
--region ------------------getter and setter start-------------------
|
||
|
||
--- 获取所有产品,包括数量为0以及未解锁
|
||
---@param areaType number
|
||
---@return XRestaurantProduct[]
|
||
--------------------------
|
||
function XRestaurant:GetAllProductList(areaType)
|
||
local map = {}
|
||
if XRestaurantConfigs.CheckIsIngredientArea(areaType) then
|
||
map = self._IngredientMap
|
||
else
|
||
map = self._FoodMap
|
||
end
|
||
local list = {}
|
||
for _, product in pairs(map or {}) do
|
||
if product then
|
||
table.insert(list, product)
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
--- 获取所有存货数量大于0产品
|
||
---@param areaType number
|
||
---@return XRestaurantProduct[]
|
||
--------------------------
|
||
function XRestaurant:GetNotZeroProductList(areaType)
|
||
local map = {}
|
||
if XRestaurantConfigs.CheckIsIngredientArea(areaType) then
|
||
map = self._IngredientMap
|
||
else
|
||
map = self._FoodMap
|
||
end
|
||
local list = {}
|
||
for _, product in pairs(map or {}) do
|
||
if product and product:GetProperty("_Count") > 0 then
|
||
table.insert(list, product)
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
--- 获取所有已解锁产品列表
|
||
---@param areaType number
|
||
---@return XRestaurantProduct[]
|
||
--------------------------
|
||
function XRestaurant:GetUnlockProductList(areaType)
|
||
local map = {}
|
||
if XRestaurantConfigs.CheckIsIngredientArea(areaType) then
|
||
map = self._IngredientMap
|
||
else
|
||
map = self._FoodMap
|
||
end
|
||
local list = {}
|
||
for _, product in pairs(map or {}) do
|
||
if product and product:IsUnlock() then
|
||
table.insert(list, product)
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
--- 已解锁产品个数
|
||
---@param areaType number
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:GetUnlockProductCount(areaType)
|
||
local count = 0
|
||
local map = {}
|
||
if XRestaurantConfigs.CheckIsIngredientArea(areaType) then
|
||
map = self._IngredientMap
|
||
else
|
||
map = self._FoodMap
|
||
end
|
||
for _, product in pairs(map or {}) do
|
||
if product and product:IsUnlock() then
|
||
count = count + 1
|
||
end
|
||
end
|
||
|
||
return count
|
||
end
|
||
|
||
--- 仓库产品列表
|
||
---@param areaType number
|
||
---@return XRestaurantProduct[]
|
||
--------------------------
|
||
function XRestaurant:GetSortStorageProductList(areaType)
|
||
local list = self:GetUnlockProductList(areaType)
|
||
if XTool.IsTableEmpty(list) then
|
||
return list
|
||
end
|
||
local isSortByQuality = not XRestaurantConfigs.CheckIsIngredientArea(areaType)
|
||
table.sort(list, function(a, b)
|
||
if isSortByQuality then
|
||
local qualityA = a:GetProperty("_Quality")
|
||
local qualityB = b:GetProperty("_Quality")
|
||
if qualityA ~= qualityB then
|
||
return qualityA > qualityB
|
||
end
|
||
end
|
||
return a:GetProperty("_Id") < b:GetProperty("_Id")
|
||
end)
|
||
|
||
return list
|
||
end
|
||
|
||
--- 获取产品
|
||
---@param areaType number
|
||
---@param id number
|
||
---@return XRestaurantProduct
|
||
--------------------------
|
||
function XRestaurant:GetProduct(areaType, id)
|
||
local map = {}
|
||
if XRestaurantConfigs.CheckIsIngredientArea(areaType) then
|
||
map = self._IngredientMap
|
||
else
|
||
map = self._FoodMap
|
||
end
|
||
local product = map[id]
|
||
if not product then
|
||
XLog.Error("XRestaurant:GetProduct: not found product area type = "
|
||
.. tostring(areaType) .. " Id = " .. tostring(id))
|
||
return {}
|
||
end
|
||
return product
|
||
end
|
||
|
||
--- 获取已解锁留言信息
|
||
---@return XRestaurantOrderInfo[]
|
||
--------------------------
|
||
function XRestaurant:GetUnlockOrderInfoList()
|
||
if not self._OrderInfo then
|
||
return {}
|
||
end
|
||
return self._OrderInfo:GetUnlockInfoList()
|
||
end
|
||
|
||
--- 员工列表
|
||
---@return XRestaurantStaff[]
|
||
--------------------------
|
||
function XRestaurant:GetStaffList(areaType)
|
||
local list = {}
|
||
for _, staff in pairs(self._StaffMap or {}) do
|
||
if areaType == 0 or staff:IsAdditionByAreaTypeWithMaxLevel(areaType) then
|
||
table.insert(list, staff)
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
--- 已招募员工
|
||
---@return XRestaurantStaff[]
|
||
function XRestaurant:GetRecruitStaffList()
|
||
---@type XRestaurantStaff[]
|
||
local list = {}
|
||
for _, staff in pairs(self._StaffMap or {}) do
|
||
local recruit = staff:GetProperty("_IsRecruit")
|
||
if recruit then
|
||
table.insert(list, staff)
|
||
end
|
||
end
|
||
|
||
return list
|
||
end
|
||
|
||
--- 空闲员工
|
||
---@return XRestaurantStaff[]
|
||
--------------------------
|
||
function XRestaurant:GetFreeStaffList()
|
||
local list = {}
|
||
for _, staff in pairs(self._StaffMap or {}) do
|
||
if staff:GetProperty("_IsRecruit") and not staff:IsWorking() then
|
||
table.insert(list, staff)
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
--- 空闲人数
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:GetFreeStaffCount()
|
||
local count = 0
|
||
for _, staff in pairs(self._StaffMap or {}) do
|
||
if staff:GetProperty("_IsRecruit") and not staff:IsWorking() then
|
||
count = count + 1
|
||
end
|
||
end
|
||
return count
|
||
end
|
||
|
||
--- 在工作台上的人数
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:GetOnBenchStaffCount()
|
||
local count = 0
|
||
for _, staff in pairs(self._StaffMap or {}) do
|
||
if staff:GetProperty("_IsRecruit") and not staff:IsFree() then
|
||
count = count + 1
|
||
end
|
||
end
|
||
return count
|
||
end
|
||
|
||
--- 获取大于等级当前等级的员工
|
||
---@param level number
|
||
---@return XRestaurantStaff[]
|
||
--------------------------
|
||
function XRestaurant:GetStaffListByMinLevel(level)
|
||
---@type XRestaurantStaff[]
|
||
local list = {}
|
||
|
||
for _, staff in pairs(self._StaffMap or {}) do
|
||
local recruit = staff:GetProperty("_IsRecruit")
|
||
local lv = staff:GetProperty("_Level")
|
||
if recruit and lv >= level then
|
||
table.insert(list, staff)
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
--- 已招募员工并排序
|
||
---@return XRestaurantStaff[]
|
||
function XRestaurant:GetSortRecruitStaffList(areaType, productId)
|
||
---@type XRestaurantStaff[]
|
||
local list = self:GetRecruitStaffList()
|
||
|
||
local buff = self:GetAreaBuff(areaType)
|
||
table.sort(list, function(a, b)
|
||
local isWorkingA = not a:IsFree()
|
||
local isWorkingB = not b:IsFree()
|
||
if isWorkingA ~= isWorkingB then
|
||
return isWorkingB
|
||
end
|
||
|
||
local idA = a:GetProperty("_Id")
|
||
local idB = b:GetProperty("_Id")
|
||
|
||
local buffAdditionA = buff and buff:GetEffectAddition(areaType, a:GetProperty("_Id"), productId) or 0
|
||
local buffAdditionB = buff and buff:GetEffectAddition(areaType, b:GetProperty("_Id"), productId) or 0
|
||
|
||
local additionA = a:GetSkillAddition(areaType, productId)
|
||
local additionB = b:GetSkillAddition(areaType, productId)
|
||
|
||
local totalA = buffAdditionA + additionA
|
||
local totalB = buffAdditionB + additionB
|
||
|
||
if totalA ~= totalB then
|
||
return totalA > totalB
|
||
end
|
||
|
||
if additionA ~= additionB then
|
||
return additionA > additionB
|
||
end
|
||
|
||
if buffAdditionA ~= buffAdditionB then
|
||
return buffAdditionA > buffAdditionB
|
||
end
|
||
|
||
local levelA = a:GetProperty("_Level")
|
||
local levelB = b:GetProperty("_Level")
|
||
if levelA ~= levelB then
|
||
return levelA > levelB
|
||
end
|
||
|
||
return idA < idB
|
||
end)
|
||
return list
|
||
end
|
||
|
||
--- 员工视图数据
|
||
---@param characterId number 员工Id
|
||
---@return XRestaurantStaff
|
||
--------------------------
|
||
function XRestaurant:GetStaffViewModel(characterId)
|
||
local staff = self._StaffMap[characterId]
|
||
if not staff then
|
||
XLog.Error("XRestaurant:UpdateStaffInfo: not found staff!!! staff Id = " .. tostring(characterId))
|
||
return {}
|
||
end
|
||
return staff
|
||
end
|
||
|
||
--- 获取当前区域正在工作的员工列表
|
||
---@param areaType number
|
||
---@return XRestaurantStaff[]
|
||
--------------------------
|
||
function XRestaurant:GetWorkingStaff(areaType)
|
||
local map
|
||
if XRestaurantConfigs.CheckIsIngredientArea(areaType) then
|
||
map = self._IngredientWorkBenches
|
||
elseif XRestaurantConfigs.CheckIsFoodArea(areaType) then
|
||
map = self._CookingWorkBenches
|
||
elseif XRestaurantConfigs.CheckIsSaleArea(areaType) then
|
||
map = self._SalesWorkBenches
|
||
end
|
||
if not map then
|
||
return {}
|
||
end
|
||
local list = {}
|
||
for _, bench in pairs(map) do
|
||
if not bench:IsFree() then
|
||
table.insert(list, bench:GetCharacter())
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
--- 获取工作台视图数据
|
||
---@param areaType number
|
||
---@param index number
|
||
---@return XRestaurantWorkBench
|
||
--------------------------
|
||
function XRestaurant:GetWorkBenchViewModel(areaType, index, ignoreTip)
|
||
local list = self._AreaMap2Benches[areaType]
|
||
if not list then
|
||
XLog.Error("XRestaurant:GetWorkBenchViewModel: not found work bench area type = " .. tostring(areaType))
|
||
return {}
|
||
end
|
||
local bench = list[index]
|
||
if not bench and not ignoreTip then
|
||
XLog.Error("XRestaurant:GetWorkBenchViewModel: not found work bench area type = "
|
||
.. tostring(areaType) .. " Index = " .. tostring(index))
|
||
return {}
|
||
end
|
||
return bench
|
||
end
|
||
|
||
function XRestaurant:GetUnlockWorkBenchList(areaType)
|
||
return self._AreaMap2Benches[areaType]
|
||
end
|
||
|
||
function XRestaurant:CheckFoodUnlock(id)
|
||
return self._UnlockFood[id] and true or false
|
||
end
|
||
|
||
function XRestaurant:CheckIngredientUnlock(id)
|
||
return self._UnlockIngredient[id] and true or false
|
||
end
|
||
|
||
function XRestaurant:IsUrgentProduct(areaType, id)
|
||
if not XRestaurantConfigs.CheckIsIngredientArea(areaType) then
|
||
return false
|
||
end
|
||
|
||
local produceSpeed = self:GetProduceTotalSpeed(areaType, id)
|
||
local consumeSpeed = self:GetConsumeTotalSpeed(areaType, id)
|
||
--未生产,未消耗
|
||
if produceSpeed == 0 and consumeSpeed == 0 then
|
||
return false
|
||
end
|
||
--生产速度大于等于消耗速度
|
||
if produceSpeed >= consumeSpeed then
|
||
return false
|
||
end
|
||
local urgentTime = self:GetUrgentTime()
|
||
local product = self:GetProduct(areaType, id)
|
||
local count = product:GetProperty("_Count")
|
||
local second = (count / (consumeSpeed - produceSpeed)) * 3600
|
||
|
||
return second <= urgentTime
|
||
end
|
||
|
||
--- 获取产品的生产总速
|
||
---@param areaType number 产品类型
|
||
---@param productId number
|
||
---@param timeUnit number
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:GetProduceTotalSpeed(areaType, productId, timeUnit)
|
||
if not XTool.IsNumberValid(productId) then
|
||
return 0
|
||
end
|
||
timeUnit = timeUnit or XRestaurantConfigs.TimeUnit.Hour
|
||
|
||
if XRestaurantConfigs.CheckIsIngredientArea(areaType) then
|
||
return self:_GetIngredientProduceTotalSpeed(productId, timeUnit)
|
||
elseif XRestaurantConfigs.CheckIsFoodArea(areaType) then
|
||
return self:_GetFoodProduceTotalSpeed(productId, timeUnit)
|
||
elseif XRestaurantConfigs.CheckIsSaleArea(areaType) then
|
||
return self:_GetSaleProduceTotalSpeed(productId, timeUnit)
|
||
end
|
||
return 0
|
||
end
|
||
|
||
--- 获取产品的消耗总体速度
|
||
---@param areaType number 产品类型
|
||
---@param productId number
|
||
---@param timeUnit number
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:GetConsumeTotalSpeed(areaType, productId, timeUnit)
|
||
if not XTool.IsNumberValid(productId) then
|
||
return 0
|
||
end
|
||
timeUnit = timeUnit or XRestaurantConfigs.TimeUnit.Hour
|
||
if XRestaurantConfigs.CheckIsIngredientArea(areaType) then
|
||
return self:_GetIngredientConsumeTotalSpeed(productId, timeUnit)
|
||
elseif XRestaurantConfigs.CheckIsFoodArea(areaType) then
|
||
return self:_GetFoodConsumeTotalSpeed(productId, timeUnit)
|
||
elseif XRestaurantConfigs.CheckIsSaleArea(areaType) then
|
||
return self:_GetSaleConsumeTotalSpeed(productId, timeUnit)
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function XRestaurant:GetWorkBenchPreviewTip(areaType, productId, timeUnit)
|
||
local produce = self:GetProduceTotalSpeed(areaType, productId, timeUnit)
|
||
local consume = self:GetConsumeTotalSpeed(areaType, productId, timeUnit)
|
||
if produce == 0 and consume == 0 then
|
||
return true, ""
|
||
end
|
||
local product = self:GetProduct(areaType, productId)
|
||
local subSpeed = produce - consume
|
||
local freeCount = subSpeed > 0 and product:GetFreeCapacity() or product:GetProperty("_Count")
|
||
if XRestaurantConfigs.CheckIsIngredientArea(areaType) then
|
||
return subSpeed > 0, XRestaurantConfigs.GetIngredientStoragePreviewTip(produce, consume, freeCount)
|
||
elseif XRestaurantConfigs.CheckIsFoodArea(areaType) then
|
||
--消耗完毕或者满仓速度
|
||
local stop = freeCount / math.abs(produce - consume)
|
||
if not product then
|
||
return stop
|
||
end
|
||
local list = product:GetProperty("_Ingredients") or {}
|
||
local cStop = stop
|
||
for _, consume in pairs(list) do
|
||
local ingredientId = consume:GetId()
|
||
local ingredient = self:GetProduct(XRestaurantConfigs.AreaType.IngredientArea, ingredientId)
|
||
local cSpeed = ingredient:GetProperty("_Count") / self:_GetIngredientConsumeTotalSpeed(ingredientId, timeUnit)
|
||
cStop = math.min(cStop, cSpeed)
|
||
end
|
||
local increase = subSpeed > 0 and stop <= cStop
|
||
local isZero = cStop <= XRestaurantConfigs.Inaccurate and math.abs(subSpeed) <= XRestaurantConfigs.Inaccurate
|
||
return increase, XRestaurantConfigs.GetCookStoragePreviewTip(increase, stop > cStop, isZero, cStop)
|
||
|
||
elseif XRestaurantConfigs.CheckIsSaleArea(areaType) then
|
||
local price = self:GetCashierTotalPrice(timeUnit)
|
||
freeCount = self._Cashier:GetFreeCapacity()
|
||
--收银台满
|
||
local fullTime = freeCount / price
|
||
--售卖完毕
|
||
local consumeTime = product:GetProperty("_Count") / consume
|
||
|
||
return fullTime < consumeTime, XRestaurantConfigs.GetSaleStoragePreviewTip(fullTime, consumeTime)
|
||
end
|
||
end
|
||
|
||
--- 收银台总收益
|
||
---@param timeUnit number 单位时间,默认小时
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:GetCashierTotalPrice(timeUnit)
|
||
local price = 0
|
||
|
||
for _, bench in pairs(self._SalesWorkBenches or {}) do
|
||
local state = bench:GetProperty("_State")
|
||
if state == XRestaurantConfigs.WorkState.Free then
|
||
goto continue
|
||
end
|
||
price = price + bench:GetFoodFinalPrice(timeUnit)
|
||
::continue::
|
||
end
|
||
return math.ceil(price)
|
||
end
|
||
|
||
--- 获取签到开始时间
|
||
---@return number|nil
|
||
--------------------------
|
||
function XRestaurant:GetSignActivityStartTime()
|
||
return XRestaurantConfigs.GetSignActivityStartTime(self._Id)
|
||
end
|
||
|
||
--- 获取签到结束时间
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:GetSignActivityEndTime()
|
||
return XRestaurantConfigs.GetSignActivityEndTime(self._Id)
|
||
end
|
||
|
||
--- 判断是否在签到时间内
|
||
---@param defaultOpen boolean
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurant:CheckSignActivityInTime(defaultOpen)
|
||
return XRestaurantConfigs.CheckSignActivityInTime(self._Id, defaultOpen)
|
||
end
|
||
|
||
--- 获取签到活动名称
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:GetSignActivityName()
|
||
return XRestaurantConfigs.GetSignActivityName(self._Id)
|
||
end
|
||
|
||
--- 获取今天是否能进行签到
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurant:GetIsGetSignReward()
|
||
return self._IsGetSignReward
|
||
end
|
||
|
||
--- 获取第X天签到的npcId
|
||
---@return number
|
||
function XRestaurant:GetSignCurDay()
|
||
if not self:CheckSignActivityInTime(false) then
|
||
return 0
|
||
end
|
||
local day = XTime.GetDayCountUntilTime(XRestaurantConfigs.GetSignActivityStartTime(self._Id), true)
|
||
return day + 1
|
||
end
|
||
|
||
--- 获取第X天签到的奖励
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:GetSignActivityRewardId()
|
||
return XRestaurantConfigs.GetSignActivityRewardId(self._Id, self:GetSignCurDay())
|
||
end
|
||
|
||
--- 获取第X天签到的npc立绘Url
|
||
---@return string
|
||
--------------------------
|
||
function XRestaurant:GetSignActivityNpcImgUrl()
|
||
return XRestaurantConfigs.GetSignActivityNpcImgUrl(self._Id, self:GetSignCurDay())
|
||
end
|
||
|
||
--- 获取第X天签到的奖励
|
||
---@return string
|
||
--------------------------
|
||
function XRestaurant:GetSignActivitySignDesc()
|
||
return XUiHelper.ConvertLineBreakSymbol(XRestaurantConfigs.GetSignActivitySignDesc(self._Id, self:GetSignCurDay()))
|
||
end
|
||
|
||
--- 获取第X天签到的回复文本
|
||
---@return string
|
||
--------------------------
|
||
function XRestaurant:GetSignActivityReplyBtnDesc()
|
||
return XRestaurantConfigs.GetSignActivityReplyBtnDesc(self._Id, self:GetSignCurDay())
|
||
end
|
||
|
||
--- 获取当前订单信息
|
||
---@return XRestaurantOrderInfo
|
||
--------------------------
|
||
function XRestaurant:GetTodayOrderInfo()
|
||
if not self._OrderInfo then
|
||
return
|
||
end
|
||
return self._OrderInfo:GetTodayOrderInfo()
|
||
end
|
||
|
||
function XRestaurant:CheckOrderFinish()
|
||
local orderInfo = self:GetTodayOrderInfo()
|
||
if not orderInfo then
|
||
return false
|
||
end
|
||
local infos = XRestaurantConfigs.GetOrderFoodInfos(orderInfo:GetId())
|
||
local finish = true
|
||
for _, info in ipairs(infos) do
|
||
local food = self:GetProduct(XRestaurantConfigs.AreaType.FoodArea, info.Id)
|
||
local hasCount = food and food:GetProperty("_Count") or 0
|
||
if hasCount < info.Count then
|
||
finish = false
|
||
break
|
||
end
|
||
end
|
||
return finish
|
||
end
|
||
|
||
function XRestaurant:GetOrderActivityId()
|
||
if not self._OrderInfo then
|
||
return 0
|
||
end
|
||
return self._OrderInfo:GetId()
|
||
end
|
||
|
||
function XRestaurant:GetBuff(buffId)
|
||
local buff = self._BuffMap[buffId]
|
||
if not buff then
|
||
buff = XRestaurantBuff.New(buffId)
|
||
self._BuffMap[buffId] = buff
|
||
end
|
||
return buff
|
||
end
|
||
|
||
function XRestaurant:GetAreaBuffId(areaType)
|
||
if not areaType then
|
||
return
|
||
end
|
||
return self._AreaTypeBuff[areaType]
|
||
end
|
||
|
||
function XRestaurant:GetAreaBuff(areaType)
|
||
local buffId = self:GetAreaBuffId(areaType)
|
||
if not XTool.IsNumberValid(buffId) then
|
||
return
|
||
end
|
||
return self:GetBuff(buffId)
|
||
end
|
||
|
||
function XRestaurant:SetAreaBuffId(areaType, buffId)
|
||
local map = self._AreaTypeBuff
|
||
map[areaType] = buffId
|
||
self:SetProperty("_AreaTypeBuff", map)
|
||
end
|
||
|
||
function XRestaurant:CheckAreaBuffUnlock(areaType)
|
||
local minLevel = XRestaurantConfigs.GetAreaBuffUnlockMinLevel(areaType)
|
||
return self._Level >= minLevel
|
||
end
|
||
|
||
--endregion------------------getter and setter finish------------------
|
||
|
||
--region ------------------private start-------------------
|
||
|
||
---@private
|
||
function XRestaurant:_InitStaffList()
|
||
local characters = XRestaurantConfigs.GetCharacters()
|
||
local staffMap = {}
|
||
for id, _ in pairs(characters or {}) do
|
||
---@type XRestaurantStaff
|
||
local staff = XRestaurantStaff.New(id)
|
||
staff:UpdateInfo(XRestaurantConfigs.IsFreeCharacter(id), 1)
|
||
staffMap[id] = staff
|
||
end
|
||
self:SetProperty("_StaffMap", staffMap)
|
||
end
|
||
|
||
function XRestaurant:_InitProductList()
|
||
local ingredients = XRestaurantConfigs.GetIngredients()
|
||
|
||
local ingredientMap = {}
|
||
for id, _ in pairs(ingredients or {}) do
|
||
local ingredient = XIngredient.New(id)
|
||
ingredientMap[id] = ingredient
|
||
end
|
||
|
||
local foods = XRestaurantConfigs.GetFoods()
|
||
local foodMap = {}
|
||
for id, _ in pairs(foods or {}) do
|
||
local food = XFood.New(id)
|
||
foodMap[id] = food
|
||
end
|
||
|
||
self:SetProperty("_IngredientMap", ingredientMap)
|
||
self:SetProperty("_FoodMap", foodMap)
|
||
end
|
||
|
||
function XRestaurant:_InitWorkBench()
|
||
local level = self._Level
|
||
|
||
local ingredientCount = XRestaurantConfigs.GetIngredientCounterNum(level)
|
||
local foodCount = XRestaurantConfigs.GetFoodCounterNum(level)
|
||
local saleCount = XRestaurantConfigs.GetSaleCounterNum(level)
|
||
|
||
local initBench = function(count, class, list)
|
||
for i = 1, count do
|
||
local bench = list[i] or class.New(i)
|
||
list[i] = bench
|
||
end
|
||
end
|
||
|
||
initBench(ingredientCount, XIngredientWorkBench, self._IngredientWorkBenches)
|
||
initBench(foodCount, XCookingWorkBench, self._CookingWorkBenches)
|
||
initBench(saleCount, XSalesWorkBench, self._SalesWorkBenches)
|
||
|
||
---@type table<number, XRestaurantWorkBench[]>
|
||
self._AreaMap2Benches = {
|
||
[XRestaurantConfigs.AreaType.IngredientArea] = self._IngredientWorkBenches,
|
||
[XRestaurantConfigs.AreaType.FoodArea] = self._CookingWorkBenches,
|
||
[XRestaurantConfigs.AreaType.SaleArea] = self._SalesWorkBenches,
|
||
}
|
||
end
|
||
|
||
--- 材料生产速度
|
||
---@param productId number 材料Id
|
||
---@param timeUnit number 单位时间
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:_GetIngredientProduceTotalSpeed(productId, timeUnit)
|
||
local speed = 0
|
||
--生产无需原材料
|
||
for _, bench in pairs(self._IngredientWorkBenches) do
|
||
--空闲状态
|
||
if bench:IsFree() then
|
||
goto continue
|
||
end
|
||
|
||
--未生产目标物品
|
||
if bench:GetProperty("_ProductId") ~= productId then
|
||
goto continue
|
||
end
|
||
|
||
speed = speed + bench:GetProductiveness(timeUnit)
|
||
|
||
::continue::
|
||
end
|
||
|
||
return speed
|
||
end
|
||
|
||
--- 材料消耗速度
|
||
---@param productId number 材料Id
|
||
---@param timeUnit number 单位时间
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:_GetIngredientConsumeTotalSpeed(productId, timeUnit)
|
||
local speed = 0
|
||
for _, bench in pairs(self._CookingWorkBenches) do
|
||
--空闲状态
|
||
if bench:IsFree() then
|
||
goto continue
|
||
end
|
||
speed = speed + bench:GetConsumption(productId, timeUnit)
|
||
|
||
::continue::
|
||
end
|
||
|
||
return speed
|
||
end
|
||
|
||
--- 食物生产速度
|
||
---@param productId number 材料Id
|
||
---@param timeUnit number 单位时间
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurant:_GetFoodProduceTotalSpeed(productId, timeUnit)
|
||
local speed = 0
|
||
for _, bench in pairs(self._CookingWorkBenches) do
|
||
--空闲状态
|
||
if bench:IsFree() then
|
||
goto continue
|
||
end
|
||
|
||
--未生产目标物品
|
||
if bench:GetProperty("_ProductId") ~= productId then
|
||
goto continue
|
||
end
|
||
speed = speed + bench:GetProductiveness(timeUnit)
|
||
|
||
::continue::
|
||
end
|
||
return speed
|
||
end
|
||
|
||
function XRestaurant:_GetFoodConsumeTotalSpeed(productId, timeUnit)
|
||
local speed = 0
|
||
for _, bench in pairs(self._SalesWorkBenches) do
|
||
--空闲状态
|
||
if bench:IsFree() then
|
||
goto continue
|
||
end
|
||
|
||
speed = speed + bench:GetConsumption(productId, timeUnit)
|
||
::continue::
|
||
end
|
||
|
||
return speed
|
||
end
|
||
|
||
function XRestaurant:_GetSaleProduceTotalSpeed(productId, timeUnit)
|
||
return 0
|
||
end
|
||
|
||
function XRestaurant:_GetSaleConsumeTotalSpeed(productId, timeUnit)
|
||
return self:_GetFoodConsumeTotalSpeed(productId, timeUnit)
|
||
end
|
||
|
||
--endregion------------------private finish------------------
|
||
|
||
--region ------------------simulation start-------------------
|
||
|
||
function XRestaurant:StartSimulation()
|
||
if not SimulationTimer then
|
||
LastSimulationTime = XTime.GetServerNowTimestamp()
|
||
SimulationTimer = XScheduleManager.ScheduleForever(function()
|
||
self:Simulation()
|
||
end, XScheduleManager.SECOND, SimulationDelay)
|
||
end
|
||
end
|
||
|
||
function XRestaurant:StopSimulation()
|
||
if SimulationTimer then
|
||
XScheduleManager.UnSchedule(SimulationTimer)
|
||
SimulationTimer = nil
|
||
end
|
||
end
|
||
|
||
function XRestaurant:Simulation()
|
||
--每秒执行一次
|
||
local now = XTime.GetServerNowTimestamp()
|
||
local second = now - LastSimulationTime
|
||
|
||
local room = XDataCenter.RestaurantManager.GetRoom()
|
||
if room then
|
||
room:Simulation(now)
|
||
end
|
||
|
||
local sort = self:SortSimulationWorkBench(self._IngredientWorkBenches, XRestaurantConfigs.AreaType.IngredientArea)
|
||
for _, ingredient in pairs(sort) do
|
||
ingredient:Simulation(second)
|
||
end
|
||
|
||
sort = self:SortSimulationWorkBench(self._CookingWorkBenches, XRestaurantConfigs.AreaType.FoodArea)
|
||
for _, food in pairs(sort) do
|
||
food:Simulation(second)
|
||
end
|
||
|
||
sort = self:SortSimulationWorkBench(self._SalesWorkBenches, XRestaurantConfigs.AreaType.SaleArea)
|
||
for _, sale in pairs(sort) do
|
||
sale:Simulation(second)
|
||
end
|
||
|
||
--避免长时间待着场景内,内存炸了
|
||
if CS.XLuaEngine.Env.Memroy - self._EnterRoomMemory > LuaMemoryLimit then
|
||
LuaGC()
|
||
self:UpdateLuaMemory()
|
||
end
|
||
|
||
LastSimulationTime = now
|
||
end
|
||
|
||
---@param benchList XRestaurantWorkBench[]
|
||
function XRestaurant:SortSimulationWorkBench(benchList, areaType)
|
||
if XTool.IsTableEmpty(benchList) then
|
||
return {}
|
||
end
|
||
if not self:CheckNewSort(areaType) then
|
||
return benchList
|
||
end
|
||
local tmpList = {}
|
||
for _, bench in pairs(benchList) do
|
||
if bench:IsRunning() then
|
||
table.insert(tmpList, bench)
|
||
end
|
||
end
|
||
table.sort(tmpList, function(a, b)
|
||
local runningA = a:IsRunning()
|
||
local runningB = b:IsRunning()
|
||
if runningA ~= runningB then
|
||
return runningA
|
||
end
|
||
local priorityA = a:GetWorkPriority()
|
||
local priorityB = b:GetWorkPriority()
|
||
if priorityA ~= priorityB then
|
||
return priorityA < priorityB
|
||
end
|
||
|
||
local updateTimeA = a:GetProperty("_UpdateTime")
|
||
local updateTimeB = b:GetProperty("_UpdateTime")
|
||
|
||
if updateTimeA ~= updateTimeB then
|
||
return updateTimeA < updateTimeB
|
||
end
|
||
|
||
return a:GetProperty("_Id") < b:GetProperty("_Id")
|
||
end)
|
||
|
||
return tmpList
|
||
end
|
||
|
||
--- 检查当前趋于工作台是否需要重新排序
|
||
---@param areaType number 区域类型
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurant:CheckNewSort(areaType)
|
||
local value = self._AreaSortMark[areaType]
|
||
return not value
|
||
end
|
||
|
||
--- 标记当前区域需要排序
|
||
---@param areaType number 区域类型
|
||
---@return void
|
||
--------------------------
|
||
function XRestaurant:MarkNewSort(areaType)
|
||
self._AreaSortMark[areaType] = true
|
||
end
|
||
|
||
--endregion------------------Simulation finish------------------
|
||
|
||
function XRestaurant:NotifyLevelConditionEventChange()
|
||
self:SetProperty("_EventLevelConditionChange", self._EventLevelConditionChange + 1)
|
||
end
|
||
|
||
function XRestaurant:NotifyBuffRedPointChange()
|
||
self:SetProperty("_BuffRedPointMarkCount", self._BuffRedPointMarkCount + 1)
|
||
end
|
||
|
||
function XRestaurant:NotifyMenuRedPointChange()
|
||
self:SetProperty("_MenuRedPointMarkCount", self._MenuRedPointMarkCount + 1)
|
||
end
|
||
|
||
function XRestaurant:OnActivityEnd()
|
||
for key, value in pairs(default) do
|
||
self[key] = value
|
||
end
|
||
end
|
||
|
||
return XRestaurant |