485 lines
12 KiB
Lua
485 lines
12 KiB
Lua
local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
|
|
local PANEL_ID = PanelId.FacLiquidCleaner
|
|
|
|
local InfoState = {
|
|
None = "None",
|
|
Processing = "Processing",
|
|
Finished = "Finished",
|
|
Empty = "Empty",
|
|
Paused = "Paused",
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl = HL.Class('FacLiquidCleanerCtrl', uiCtrl.UICtrl)
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_buildingInfo = HL.Field(CS.Beyond.Gameplay.RemoteFactory.BuildingUIInfo_FluidConsume)
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_updateThread = HL.Field(HL.Thread)
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_progressInitThread = HL.Field(HL.Thread)
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_progressUpdateThread = HL.Field(HL.Thread)
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_needRefreshProgress = HL.Field(HL.Boolean) << false
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_sewageItemData = HL.Field(HL.Table)
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_validLiquidIds = HL.Field(HL.Table)
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_infoState = HL.Field(HL.String) << ""
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_lastValidItemId = HL.Field(HL.String) << ""
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_isItemDirty = HL.Field(HL.Boolean) << false
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_isPipeBlocked = HL.Field(HL.Boolean) << false
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl.s_messages = HL.StaticField(HL.Table) << {
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
|
|
self.m_buildingInfo = arg.uiInfo
|
|
self.m_sewageItemData = {}
|
|
self:_InitCleanerStaticData()
|
|
|
|
self.view.inventoryArea:InitInventoryArea({
|
|
customOnUpdateCell = function(cell, itemBundle)
|
|
self:_RefreshInventoryItemCell(cell, itemBundle)
|
|
end,
|
|
customSetActionMenuArgs = function(actionMenuArgs)
|
|
actionMenuArgs.cacheRepo = self.view.facCacheRepository
|
|
end,
|
|
onStateChange = function(state)
|
|
self:_RefreshNaviGroupSwitcherInfos()
|
|
self:_RefreshChangeState(state)
|
|
end,
|
|
isFluidOnlyMachine = true,
|
|
})
|
|
|
|
self.view.facCacheRepository:InitFacCacheRepository({
|
|
cache = self.m_buildingInfo.fluidCache,
|
|
isInCache = true,
|
|
isFluidCache = true,
|
|
cacheIndex = 1,
|
|
slotCount = 1,
|
|
fakeFormulaDataList = FactoryUtils.getBuildingCrafts(self.m_buildingInfo.buildingId)
|
|
})
|
|
|
|
self.view.facCachePipe:InitFacCachePipe(self.m_buildingInfo, {
|
|
useSinglePipe = true,
|
|
stateRefreshCallback = function(pipeInfo)
|
|
self:_OnPipeStateChanged(pipeInfo)
|
|
end
|
|
})
|
|
|
|
self.view.buildingCommon:InitBuildingCommon(self.m_buildingInfo, {
|
|
onStateChanged = function(state)
|
|
self:_RefreshCleanerTargetFormula()
|
|
if state == GEnums.FacBuildingState.Idle then
|
|
self:_ClearCleanerItemData()
|
|
end
|
|
end
|
|
})
|
|
|
|
self:_InitFacMachineCrafterController()
|
|
self.view.facCacheRepository.view.repoNaviGroup:NaviToThisGroup()
|
|
|
|
GameInstance.remoteFactoryManager:RegisterInterestedUnitId(self.m_buildingInfo.nodeId)
|
|
|
|
self:_InitCleanerFormulaNode()
|
|
self:_InitCleanerProgressInitThread()
|
|
self:_InitCleanerUpdateThread()
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl.OnClose = HL.Override() << function(self)
|
|
GameInstance.remoteFactoryManager:UnregisterInterestedUnitId(self.m_buildingInfo.nodeId)
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._InitCleanerStaticData = HL.Method() << function(self)
|
|
self.m_validLiquidIds = {}
|
|
local success, tableData = Tables.factoryFluidConsumeTable:TryGetValue(self.m_buildingInfo.buildingId)
|
|
if not success then
|
|
return
|
|
end
|
|
|
|
for index = 0, tableData.liquidable.Count - 1 do
|
|
self.m_validLiquidIds[tableData.liquidable[index]] = true
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._InitCleanerUpdateThread = HL.Method() << function(self)
|
|
self:_UpdateAndRefreshAll()
|
|
self.m_updateThread = self:_StartCoroutine(function()
|
|
while true do
|
|
self:_UpdateAndRefreshAll()
|
|
coroutine.wait(UIConst.FAC_COMMON_UI_UPDATE_INTERVAL)
|
|
end
|
|
end)
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._UpdateAndRefreshAll = HL.Method() << function(self)
|
|
self:_UpdateCleanerCacheItemData()
|
|
self:_RefreshCleanerInfo()
|
|
if self.m_isItemDirty then
|
|
self:_RefreshCleanerTargetFormula()
|
|
self:_RefreshCleanerProgressNode()
|
|
self:_RefreshCleanerTipsVisibleState()
|
|
self.m_isItemDirty = false
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._UpdateCleanerCacheItemData = HL.Method() << function(self)
|
|
local consumeItemId = self.m_buildingInfo.consumeItemId
|
|
if not consumeItemId then
|
|
return
|
|
end
|
|
self.m_sewageItemData.id = consumeItemId
|
|
self.m_sewageItemData.count = 0
|
|
local getResult, cnt = self.m_buildingInfo.fluidCache.items:TryGetValue(self.m_sewageItemData.id)
|
|
if getResult then
|
|
self.m_sewageItemData.count = cnt
|
|
end
|
|
if self.m_lastValidItemId ~= self.m_sewageItemData.id then
|
|
self.m_isItemDirty = true
|
|
end
|
|
self.m_lastValidItemId = self.m_sewageItemData.id
|
|
end
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._OnPipeStateChanged = HL.Method(HL.Table) << function(self, pipeInfo)
|
|
if pipeInfo == nil then
|
|
return
|
|
end
|
|
|
|
self.m_isPipeBlocked = pipeInfo.isBlock
|
|
self:_RefreshCleanerTipsVisibleState()
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._RefreshCleanerTipsVisibleState = HL.Method() << function(self)
|
|
local cacheItemId = self:_GetCleanerCacheItemData()
|
|
local needShowTips = self.m_isPipeBlocked and string.isEmpty(self.m_buildingInfo.consumeItemId) and not self.m_validLiquidIds[cacheItemId]
|
|
UIUtils.PlayAnimationAndToggleActive(self.view.tipsTextNode.animationWrapper, needShowTips)
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._ClearCleanerItemData = HL.Method() << function(self)
|
|
self.m_lastValidItemId = ""
|
|
self.m_sewageItemData = {
|
|
id = "",
|
|
count = 0,
|
|
}
|
|
self.m_isItemDirty = true
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._GetCleanerCacheItemData = HL.Method().Return(HL.String, HL.Number) << function(self)
|
|
for itemId, itemCount in pairs(self.m_buildingInfo.fluidCache.items) do
|
|
return itemId, itemCount
|
|
end
|
|
return "", 0
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._RefreshCleanerInfo = HL.Method() << function(self)
|
|
local state = InfoState.None
|
|
if string.isEmpty(self.m_sewageItemData.id) then
|
|
local cacheItemId, cacheItemCount = self:_GetCleanerCacheItemData()
|
|
|
|
local isValidItem = self.m_validLiquidIds[cacheItemId]
|
|
if isValidItem then
|
|
state = cacheItemCount > 0 and InfoState.Paused or InfoState.Empty
|
|
else
|
|
state = InfoState.Paused
|
|
end
|
|
else
|
|
if self.m_sewageItemData.count == 0 then
|
|
state = InfoState.Finished
|
|
else
|
|
state = self.view.buildingCommon.lastState == GEnums.FacBuildingState.Normal and
|
|
InfoState.Processing or
|
|
InfoState.Paused
|
|
end
|
|
end
|
|
if state == self.m_infoState then
|
|
return
|
|
end
|
|
|
|
self.view.infoController:SetState(state)
|
|
self.m_infoState = state
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._InitCleanerFormulaNode = HL.Method() << function(self)
|
|
self.view.formulaNode:InitFormulaNode(self.m_buildingInfo)
|
|
self:_RefreshCleanerTargetFormula()
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._RefreshCleanerTargetFormula = HL.Method() << function(self)
|
|
local targetCraftInfo = FactoryUtils.getBuildingProcessingCraft(self.m_buildingInfo)
|
|
if self.view.buildingCommon.lastState ~= GEnums.FacBuildingState.Normal then
|
|
targetCraftInfo = nil
|
|
end
|
|
self.view.formulaNode:RefreshDisplayFormula(targetCraftInfo)
|
|
self.view.facCacheRepository:UpdateRepositoryFormula(targetCraftInfo ~= nil and targetCraftInfo.craftId or "")
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._InitCleanerProgressInitThread = HL.Method() << function(self)
|
|
self:_UpdateCleanerProgressInitializedState()
|
|
self.m_progressInitThread = self:_StartCoroutine(function()
|
|
while true do
|
|
coroutine.step()
|
|
self:_UpdateCleanerProgressInitializedState()
|
|
end
|
|
end)
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._InitCleanerProgressUpdateThread = HL.Method() << function(self)
|
|
self:_RefreshCleanerProgress()
|
|
self.m_progressUpdateThread = self:_StartCoroutine(function()
|
|
while true do
|
|
coroutine.step()
|
|
self:_RefreshCleanerProgress()
|
|
end
|
|
end)
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._UpdateCleanerProgressInitializedState = HL.Method() << function(self)
|
|
if self.m_buildingInfo.fluidConsume.progressIncrPerMS == 0 then
|
|
|
|
|
|
self.view.facProgressNode:InitFacProgressNode(0, 0)
|
|
return
|
|
end
|
|
|
|
self:_RefreshCleanerProgressNode()
|
|
|
|
self:_InitCleanerProgressUpdateThread()
|
|
self.m_progressInitThread = self:_ClearCoroutine(self.m_progressInitThread)
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._RefreshCleanerProgressNode = HL.Method() << function(self)
|
|
if string.isEmpty(self.m_lastValidItemId) or self.m_buildingInfo.fluidConsume.progressIncrPerMS == 0 then
|
|
self:_StopCleanerProgressRefresh()
|
|
else
|
|
local totalProgress = self.m_buildingInfo.totalProgress
|
|
local time = totalProgress / (self.m_buildingInfo.fluidConsume.progressIncrPerMS * 1000)
|
|
self.view.facProgressNode:InitFacProgressNode(time, totalProgress)
|
|
self.m_needRefreshProgress = true
|
|
end
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._RefreshCleanerProgress = HL.Method() << function(self)
|
|
if not self.m_needRefreshProgress then
|
|
return
|
|
end
|
|
|
|
self.view.facProgressNode:UpdateProgress(self.m_buildingInfo.fluidConsume.currentProgress)
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._StopCleanerProgressRefresh = HL.Method() << function(self)
|
|
self.view.facProgressNode:InitFacProgressNode(0, 0)
|
|
self.m_needRefreshProgress = false
|
|
end
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._RefreshChangeState = HL.Method(HL.Userdata) << function(self, state)
|
|
local stateText
|
|
if state == GEnums.FacBuildingState.NoPower then
|
|
stateText = Language.LUA_FAC_CRAFTER_STATE_NOPOWER_TIPS
|
|
elseif state == GEnums.FacBuildingState.NotInPowerNet then
|
|
stateText = Language.LUA_FAC_CRAFTER_STATE_NOTINPOWERNET_TIPS
|
|
elseif state == GEnums.FacBuildingState.Closed then
|
|
stateText = Language.LUA_FAC_CRAFTER_STATE_CLOSE_TIPS
|
|
end
|
|
|
|
self.view.facProgressNode.gameObject:SetActiveIfNecessary(stateText == nil)
|
|
|
|
if stateText == nil then
|
|
self.view.facStateNode.animationWrapper:PlayOutAnimation(function()
|
|
self.view.facStateNode.gameObject:SetActiveIfNecessary(false)
|
|
end)
|
|
else
|
|
self.view.facStateNode.gameObject:SetActiveIfNecessary(true)
|
|
self.view.facStateNode.stateTxt.text = stateText
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._RefreshInventoryItemCell = HL.Method(HL.Userdata, HL.Any) << function(self, cell, itemBundle)
|
|
if cell == nil or itemBundle == nil then
|
|
return
|
|
end
|
|
|
|
|
|
local itemId = itemBundle.id
|
|
local isEmptyBottle = Tables.emptyBottleTable:ContainsKey(itemId)
|
|
local isFullBottle = Tables.fullBottleTable:ContainsKey(itemId)
|
|
local isBottle = isEmptyBottle or isFullBottle
|
|
local isEmpty = string.isEmpty(itemBundle.id)
|
|
local needMask = not isBottle and not isEmpty
|
|
if isFullBottle then
|
|
local fullBottleData = Tables.fullBottleTable[itemId]
|
|
local liquidItemId = fullBottleData.liquidId
|
|
needMask = needMask or not self.m_validLiquidIds[liquidItemId]
|
|
end
|
|
cell.view.forbiddenMask.gameObject:SetActiveIfNecessary(needMask)
|
|
cell.view.dragItem.enabled = not needMask and not isEmpty
|
|
cell.view.dropItem.enabled = not needMask
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl.m_naviGroupSwitcher = HL.Field(HL.Forward('NaviGroupSwitcher'))
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._InitFacMachineCrafterController = HL.Method() << function(self)
|
|
local NaviGroupSwitcher = require_ex("Common/Utils/UI/NaviGroupSwitcher").NaviGroupSwitcher
|
|
self.m_naviGroupSwitcher = NaviGroupSwitcher(self.view.inputGroup.groupId, nil, true)
|
|
|
|
self:_RefreshNaviGroupSwitcherInfos()
|
|
end
|
|
|
|
|
|
|
|
FacLiquidCleanerCtrl._RefreshNaviGroupSwitcherInfos = HL.Method() << function(self)
|
|
if self.m_naviGroupSwitcher == nil then
|
|
return
|
|
end
|
|
|
|
local naviGroupInfos = {
|
|
{
|
|
naviGroup = self.view.facCacheRepository.view.repoNaviGroup,
|
|
text = Language.LUA_INV_NAVI_SWITCH_TO_MACHINE
|
|
}
|
|
}
|
|
self.view.inventoryArea:AddNaviGroupSwitchInfo(naviGroupInfos)
|
|
self.m_naviGroupSwitcher:ChangeGroupInfos(naviGroupInfos)
|
|
end
|
|
|
|
|
|
|
|
HL.Commit(FacLiquidCleanerCtrl)
|