forked from endernon/PGRData
576 lines
No EOL
16 KiB
Lua
576 lines
No EOL
16 KiB
Lua
|
||
|
||
--服务端工作状态
|
||
local ServerWorkState = {
|
||
Normal = 0,
|
||
WaitForStorage = 1,
|
||
WaitForConsume = 2,
|
||
}
|
||
|
||
|
||
---@class XRestaurantWorkBench : XDataEntityBase 工作台基类
|
||
---@field protected _Id number 下标,或者Id
|
||
---@field protected _ProductId number 产品Id
|
||
---@field protected _CharacterId number 员工Id
|
||
---@field protected _AreaType number 区域类型
|
||
---@field protected _State XRestaurantConfigs.WorkState 工作状态
|
||
---@field protected _UpdateTime number 扣除材料时间
|
||
---@field protected _SimulationSecond number 模拟时长
|
||
---@field protected _Progress number 当前进度
|
||
---@field protected _CountDown number 倒计时
|
||
---@field protected _Tolerances number 工作误差,由于员工升级等造成
|
||
---@field protected _IsConsume boolean 是否已经消耗原材料
|
||
local XRestaurantWorkBench = XClass(XDataEntityBase, "XRestaurantWorkBench")
|
||
|
||
local default = {
|
||
_Id = 0,
|
||
_ProductId = 0,
|
||
_CharacterId = 0,
|
||
_AreaType = XRestaurantConfigs.AreaType.IngredientArea,
|
||
_State = XRestaurantConfigs.WorkState.Free,
|
||
_UpdateTime = 0,
|
||
_SimulationSecond = 0,
|
||
_Progress = 0,
|
||
_CountDown = 0,
|
||
_Tolerances = 0,
|
||
_IsConsume = false,
|
||
}
|
||
|
||
function XRestaurantWorkBench:Ctor(id)
|
||
self:Init(default, id)
|
||
end
|
||
|
||
function XRestaurantWorkBench:InitData(id)
|
||
self:SetProperty("_Id", id)
|
||
end
|
||
|
||
function XRestaurantWorkBench:OnNotify(notifyData)
|
||
local productId, characterId, state = notifyData.ProductId, notifyData.CharacterId, notifyData.State
|
||
if XTool.IsNumberValid(productId) then
|
||
self:AddProduct(productId)
|
||
else
|
||
self:DelProduct()
|
||
end
|
||
|
||
if XTool.IsNumberValid(characterId) then
|
||
self:AddStaff(characterId)
|
||
else
|
||
self:DelStaff()
|
||
end
|
||
|
||
local updateTime = notifyData.UpdateTime
|
||
self:UpdateTimeAndConsume(updateTime, state)
|
||
end
|
||
|
||
function XRestaurantWorkBench:OnWorking()
|
||
if self:IsFree() then
|
||
return
|
||
end
|
||
if self:IsWorking() then
|
||
return
|
||
end
|
||
|
||
local character = self:GetCharacter()
|
||
character:ReWork()
|
||
self:ChangeStateAndMarkSort(XRestaurantConfigs.WorkState.Working)
|
||
end
|
||
|
||
function XRestaurantWorkBench:OnPause()
|
||
if self:IsFree() then
|
||
return
|
||
end
|
||
if self:IsPause() then
|
||
return
|
||
end
|
||
|
||
local character = self:GetCharacter()
|
||
character:Pause()
|
||
self:ChangeStateAndMarkSort(XRestaurantConfigs.WorkState.Pause)
|
||
end
|
||
|
||
function XRestaurantWorkBench:OnFree()
|
||
if self._State == XRestaurantConfigs.WorkState.Free then
|
||
return
|
||
end
|
||
self:ChangeStateAndMarkSort(XRestaurantConfigs.WorkState.Free)
|
||
end
|
||
|
||
function XRestaurantWorkBench:UpdateCountDown(produceNeedTime)
|
||
local totalTime = self._SimulationSecond + self._Tolerances
|
||
local countDown = math.max(0, produceNeedTime - totalTime)
|
||
local progress = math.min(1, totalTime / produceNeedTime)
|
||
self:SetProperty("_CountDown", countDown)
|
||
self:SetProperty("_Progress", progress)
|
||
end
|
||
|
||
--- 更新扣除材料时间
|
||
---@param updateTime number
|
||
---@param state number 服务器状态
|
||
---@return void
|
||
--------------------------
|
||
function XRestaurantWorkBench:UpdateTimeAndConsume(updateTime, state)
|
||
if updateTime <= 0 or not (XTool.IsNumberValid(self._CharacterId)
|
||
and XTool.IsNumberValid(self._ProductId)) then
|
||
self:SetProperty("_UpdateTime", 0)
|
||
self:SetProperty("_SimulationSecond", 0)
|
||
self:SetProperty("_IsConsume", false)
|
||
return
|
||
end
|
||
|
||
local produceNeedTime = self:GetProduceSingleTime()
|
||
self:SetProperty("_UpdateTime", updateTime)
|
||
local now = XTime.GetServerNowTimestamp()
|
||
local subTime = math.max(0, now - updateTime)
|
||
|
||
if state == ServerWorkState.WaitForConsume then --等待材料满足
|
||
self:SetProperty("_SimulationSecond", 0)
|
||
self:SetProperty("_IsConsume", false)
|
||
elseif state == ServerWorkState.Normal then --正常工作状态
|
||
self:SetProperty("_IsConsume", true)
|
||
self:SetProperty("_SimulationSecond", math.min(subTime, produceNeedTime))
|
||
elseif state == ServerWorkState.WaitForStorage then --等待库存消耗
|
||
self:SetProperty("_IsConsume", true)
|
||
self:SetProperty("_SimulationSecond", math.min(subTime, produceNeedTime - 1))
|
||
end
|
||
end
|
||
|
||
--- 产品排序
|
||
---@return XRestaurantProduct[] 排序后的产品
|
||
--------------------------
|
||
function XRestaurantWorkBench:SortProduct()
|
||
return {}
|
||
end
|
||
|
||
--- 开始工作, 此接口由服务端更新数据后调用
|
||
--------------------------
|
||
function XRestaurantWorkBench:TryWorking()
|
||
if self:IsFree() then
|
||
return false
|
||
end
|
||
|
||
if self._IsConsume then
|
||
self:OnWorking()
|
||
else
|
||
self:OnPause()
|
||
self:SetProperty("_IsConsume", false)
|
||
end
|
||
local character = self:GetCharacter()
|
||
if character:IsWorking()
|
||
and character:GetProperty("_WorkBenchId") ~= self._Id then
|
||
return false
|
||
end
|
||
character:Produce(self._Id, self._AreaType)
|
||
self:Simulation(0)
|
||
return true
|
||
end
|
||
|
||
--- 工作台添加员工
|
||
---@param characterId number 员工id
|
||
---@return void
|
||
--------------------------
|
||
function XRestaurantWorkBench:AddStaff(characterId)
|
||
characterId = characterId or 0
|
||
self:SetProperty("_CharacterId", characterId)
|
||
end
|
||
|
||
--- 工作台添加产品
|
||
---@param productId number 产品Id
|
||
---@return void
|
||
--------------------------
|
||
function XRestaurantWorkBench:AddProduct(productId)
|
||
productId = productId or 0
|
||
self:SetProperty("_ProductId", productId)
|
||
end
|
||
|
||
--- 移除员工
|
||
---@return void
|
||
--------------------------
|
||
function XRestaurantWorkBench:DelStaff()
|
||
local characterId = self._CharacterId
|
||
self:SetProperty("_CharacterId", 0)
|
||
self:SetProperty("_Progress", 0)
|
||
self:SetProperty("_IsConsume", false)
|
||
|
||
if XTool.IsNumberValid(characterId) then
|
||
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
||
local staff = viewModel:GetStaffViewModel(characterId)
|
||
staff:Stop()
|
||
end
|
||
self:OnFree()
|
||
end
|
||
|
||
--- 移除产品
|
||
---@return void
|
||
--------------------------
|
||
function XRestaurantWorkBench:DelProduct()
|
||
local characterId = self._CharacterId
|
||
self:SetProperty("_ProductId", 0)
|
||
self:SetProperty("_Progress", 0)
|
||
self:SetProperty("_IsConsume", false)
|
||
|
||
if XTool.IsNumberValid(characterId) then
|
||
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
||
local staff = viewModel:GetStaffViewModel(characterId)
|
||
staff:Pause()
|
||
end
|
||
self:OnFree()
|
||
end
|
||
|
||
--- 手动停止工作
|
||
--------------------------
|
||
function XRestaurantWorkBench:Stop()
|
||
self:DelProduct()
|
||
self:DelStaff()
|
||
end
|
||
|
||
--- 产品图标
|
||
---@return string
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetProductIcon()
|
||
end
|
||
|
||
--- 工作台上的产品是否已满
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurantWorkBench:IsFull()
|
||
if not XTool.IsNumberValid(self._ProductId) then
|
||
return false
|
||
end
|
||
local product = self:GetProduct()
|
||
return product and product:IsFull() or false
|
||
end
|
||
|
||
--- 材料不足
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurantWorkBench:IsInsufficient()
|
||
return false
|
||
end
|
||
|
||
--- 工作台是否运行
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurantWorkBench:IsRunning()
|
||
return self:IsWorking() or self:IsPause()
|
||
end
|
||
|
||
--- 是否暂停
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurantWorkBench:IsPause()
|
||
return self._State == XRestaurantConfigs.WorkState.Pause
|
||
end
|
||
|
||
--- 是否工作中
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurantWorkBench:IsWorking()
|
||
return self._State == XRestaurantConfigs.WorkState.Working
|
||
end
|
||
|
||
--- 是否空闲
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurantWorkBench:IsFree()
|
||
return not XTool.IsNumberValid(self._CharacterId) or not XTool.IsNumberValid(self._ProductId)
|
||
end
|
||
|
||
--- 员工名
|
||
---@return string
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetStaffName()
|
||
if not XTool.IsNumberValid(self._CharacterId) then
|
||
return ""
|
||
end
|
||
local character = self:GetCharacter()
|
||
return character:GetName()
|
||
end
|
||
|
||
--- 产品数
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetProductCount()
|
||
if not XTool.IsNumberValid(self._ProductId) then
|
||
return ""
|
||
end
|
||
local product = self:GetProduct()
|
||
return product and product:GetProperty("_Count") or 0
|
||
end
|
||
|
||
--- 产品名
|
||
---@return
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetProductName()
|
||
if not XTool.IsNumberValid(self._ProductId) then
|
||
return ""
|
||
end
|
||
local product = self:GetProduct()
|
||
return product and product:GetProperty("_Name") or "nil"
|
||
end
|
||
|
||
--- 预先扣除材料
|
||
--------------------------
|
||
function XRestaurantWorkBench:PreviewConsume(count)
|
||
if self._IsConsume then
|
||
return
|
||
end
|
||
self:SetProperty("_IsConsume", true)
|
||
end
|
||
|
||
--- 生产单个需要的时间(s)
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetBaseProduceSpeed()
|
||
return 0
|
||
end
|
||
|
||
--- 获取生产力
|
||
---@param timeUnit number 生产单位时间,默认为小时
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetProductiveness(timeUnit)
|
||
timeUnit = timeUnit or XRestaurantConfigs.TimeUnit.Hour
|
||
if self:IsFree() then
|
||
return 0
|
||
end
|
||
local produceNeedTime = self:GetProduceSingleTime()
|
||
if produceNeedTime == 0 then
|
||
return timeUnit
|
||
end
|
||
return XRestaurantConfigs.GetAroundValue(timeUnit / produceNeedTime, XRestaurantConfigs.Digital.One)
|
||
end
|
||
|
||
--- 消耗力
|
||
---@param productId number 产品Id
|
||
---@param timeUnit number 生产单位时间,默认为小时
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetConsumption(productId, timeUnit)
|
||
return 0
|
||
end
|
||
|
||
--- 生产单个所需时间(S)
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetProduceSingleTime()
|
||
return 0
|
||
end
|
||
|
||
--- 模拟生产
|
||
---@param workSecond number 模拟间隔
|
||
--------------------------
|
||
function XRestaurantWorkBench:Simulation(workSecond)
|
||
if not self:IsRunning() then
|
||
return
|
||
end
|
||
|
||
-- 未消耗材料
|
||
if not self._IsConsume then
|
||
--材料不足
|
||
if self:IsInsufficient() then
|
||
self:OnPause()
|
||
--设置工作时间为0
|
||
return
|
||
end
|
||
self:OnWorking()
|
||
self:PreviewConsume(1)
|
||
--消耗材料,开始模拟计时
|
||
self:SetProperty("_SimulationSecond", 0)
|
||
end
|
||
|
||
local simulationTime = self._SimulationSecond
|
||
if self._Tolerances > 0 then
|
||
simulationTime = simulationTime + self._Tolerances
|
||
self:SetProperty("_Tolerances", 0)
|
||
end
|
||
local produceNeedTime = self:GetProduceSingleTime()
|
||
local subTime = produceNeedTime - simulationTime
|
||
--正常跑到倒计时最后一秒 或者 角色升级增加模拟时间
|
||
if ((subTime >= 0 and subTime <= 1) or subTime > produceNeedTime)
|
||
and self:IsFull() then
|
||
--结算时,如果库存满了,会暂停在最后一秒
|
||
self:SetProperty("_SimulationSecond", produceNeedTime - 1)
|
||
self:UpdateCountDown(produceNeedTime)
|
||
self:OnPause()
|
||
return
|
||
else
|
||
--由暂停转为工作,这时的暂停为满的最后一秒
|
||
if self:IsPause() then
|
||
self:SetProperty("_SimulationSecond", produceNeedTime - 1)
|
||
end
|
||
self:OnWorking()
|
||
end
|
||
|
||
-- workSecond 可能的值为 0,1
|
||
simulationTime = simulationTime + workSecond
|
||
local count = math.floor(simulationTime / produceNeedTime)
|
||
if count > 0 then
|
||
self:EndOfRound(simulationTime - (count * produceNeedTime))
|
||
else
|
||
self:SetProperty("_SimulationSecond", simulationTime)
|
||
end
|
||
self:UpdateCountDown(produceNeedTime)
|
||
end
|
||
|
||
--- 工作进度
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetWorkProgress()
|
||
return self._Progress
|
||
end
|
||
|
||
--- 倒计时
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetCountDown()
|
||
return self._CountDown
|
||
end
|
||
|
||
--- 工作台角色
|
||
---@return XRestaurantStaff
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetCharacter()
|
||
local characterId = self._CharacterId
|
||
if not XTool.IsNumberValid(characterId) then
|
||
return
|
||
end
|
||
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
||
return viewModel:GetStaffViewModel(characterId)
|
||
end
|
||
|
||
function XRestaurantWorkBench:GetBuff()
|
||
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
||
return viewModel:GetAreaBuff(self._AreaType)
|
||
end
|
||
|
||
--- 工作台产品
|
||
---@return XRestaurantProduct
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetProduct()
|
||
local productId = self._ProductId
|
||
if not XTool.IsNumberValid(productId) then
|
||
return
|
||
end
|
||
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
||
return viewModel:GetProduct(self._AreaType, productId)
|
||
end
|
||
|
||
--- 工作一个轮回结束
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurantWorkBench:EndOfRound(tolerances)
|
||
self:SetProperty("_Tolerances", tolerances)
|
||
self:SetProperty("_IsConsume", false)
|
||
self:SetProperty("_UpdateTime", XTime.GetServerNowTimestamp())
|
||
self:SetProperty("_SimulationSecond", 0)
|
||
end
|
||
|
||
--- 获取加速提示与加速道具提示
|
||
---@return string, table
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetAccelerateContentAndItemData(accelerateTime)
|
||
end
|
||
|
||
--- 材料不足提示
|
||
---@return string, string
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetInsufficientTitleAndContent()
|
||
end
|
||
|
||
--- 库存满提示
|
||
---@return string, string
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetFullTitleAndContent()
|
||
local title = XRestaurantConfigs.GetClientConfig("StorageFullTip", 3)
|
||
local content = XRestaurantConfigs.GetClientConfig("StorageFullTip", 4)
|
||
local productName = self:GetProductName()
|
||
content = XUiHelper.ReplaceTextNewLine(string.format(content, productName, productName))
|
||
return title, content
|
||
end
|
||
|
||
--- 终止工作 提示标题,提示文案
|
||
---@return string, string
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetStopTipTitleAndContent()
|
||
return "", ""
|
||
end
|
||
|
||
--- 工作台优先级
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetWorkPriority()
|
||
return 0
|
||
end
|
||
|
||
--- 检查能否加速
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurantWorkBench:CheckCanAccelerate()
|
||
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
||
--使用达到上限
|
||
if viewModel:IsAccelerateUpperLimit() then
|
||
return false
|
||
end
|
||
--道具不够
|
||
if viewModel:GetAccelerateCount() <= 0 then
|
||
return false
|
||
end
|
||
--未工作
|
||
if not self:IsWorking() then
|
||
return false
|
||
end
|
||
--仓库满或材料不足
|
||
if self:IsFull() or self:IsInsufficient() then
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
|
||
function XRestaurantWorkBench:ToString()
|
||
return XRestaurantConfigs.GetCameraAuxiliaryAreaName(self._AreaType) .. ", Index:" ..self._Id
|
||
end
|
||
|
||
function XRestaurantWorkBench:ChangeStateAndMarkSort(state)
|
||
self:SetProperty("_State", state)
|
||
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
||
viewModel:MarkNewSort(self._AreaType)
|
||
end
|
||
|
||
--- 当前工作台是否拥有Buff
|
||
---@return boolean
|
||
--------------------------
|
||
function XRestaurantWorkBench:CheckHasBuff()
|
||
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
||
local buff = viewModel:GetAreaBuff(self._AreaType)
|
||
if not buff then
|
||
return false
|
||
end
|
||
return buff:CheckBenchEffect(self._AreaType, self._CharacterId, self._ProductId)
|
||
end
|
||
|
||
function XRestaurantWorkBench:GetAddition()
|
||
if self:IsFree() then
|
||
return 0
|
||
end
|
||
local character = self:GetCharacter()
|
||
--技能加成
|
||
local addition = character:GetSkillAddition(self._AreaType, self._ProductId)
|
||
|
||
return addition + self:GetBuffAddition()
|
||
end
|
||
|
||
--- 获取buff加成,仅用于区域Buff
|
||
---@return number
|
||
--------------------------
|
||
function XRestaurantWorkBench:GetBuffAddition()
|
||
if self:IsFree() then
|
||
return 0
|
||
end
|
||
local buff = self:GetBuff()
|
||
if not buff then
|
||
return 0
|
||
end
|
||
return buff:GetEffectAddition(self._AreaType, self._CharacterId, self._ProductId)
|
||
end
|
||
|
||
return XRestaurantWorkBench |