Files
Endfield-Data/LuaScripts/UI/Widgets/WirelessModeNode.lua
2025-12-02 20:37:18 +07:00

362 lines
9.3 KiB
Lua

local UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
WirelessModeNode = HL.Class('WirelessModeNode', UIWidgetBase)
local INVALID_PERCENT_VALUE = -1
WirelessModeNode.m_buildingInfo = HL.Field(HL.Userdata)
WirelessModeNode.m_wirelessModeContent = HL.Field(HL.Table)
WirelessModeNode.m_contentUpdateThread = HL.Field(HL.Thread)
WirelessModeNode.m_wirelessPercent = HL.Field(HL.Number) << 0
WirelessModeNode.m_isPaused = HL.Field(HL.Boolean) << false
WirelessModeNode.m_isBlocked = HL.Field(HL.Boolean) << false
WirelessModeNode.m_onComplete = HL.Field(HL.Function)
WirelessModeNode._OnFirstTimeInit = HL.Override() << function(self)
end
WirelessModeNode._OnEnable = HL.Override() << function(self)
self:_RestartWirelessUpdateThread()
end
WirelessModeNode._OnDisable = HL.Override() << function(self)
self:_ClearWirelessUpdateThread()
end
WirelessModeNode._OnDestroy = HL.Override() << function(self)
self:_ClearWirelessUpdateThread()
end
WirelessModeNode.InitWirelessModeNode = HL.Method(HL.Userdata, HL.Opt(HL.Function)) << function(self, buildingInfo, onComplete)
self:_FirstTimeInit()
if buildingInfo == nil then
return
end
self.m_buildingInfo = buildingInfo
self.m_onComplete = onComplete ~= nil and onComplete or function()end
self.m_wirelessModeContent = self.view.wirelessModeContent
self:_InitWirelessMode()
end
WirelessModeNode._InitWirelessMode = HL.Method() << function(self)
local isWirelessMode = self.m_buildingInfo.cacheTransport.inUse
self.view.wirelessModeToggle.isOn = isWirelessMode
self.view.wirelessModeToggle.onValueChanged:AddListener(function(isOn)
self:_ChangeWirelessMode(isOn)
end)
self.view.wirelessModeContent.gameObject:SetActiveIfNecessary(isWirelessMode)
self:_RefreshDomainInfo()
self:_RestartWirelessUpdateThread()
end
WirelessModeNode._ChangeWirelessMode = HL.Method(HL.Boolean) << function(self, isWirelessMode)
self.m_buildingInfo.sender:Message_OpCacheTransportEnable(Utils.getCurrentChapterId(), self.m_buildingInfo.cacheTransport.componentId, isWirelessMode, function()
if not NotNull(self.view.gameObject) then
return
end
self.m_buildingInfo:Update()
if self.m_buildingInfo.cacheTransport.inUse then
self:_StartContentUpdateThread()
else
self:_ClearWirelessUpdateThread()
end
self:_RefreshModeDisplayAfterChanged(self.m_buildingInfo.cacheTransport.inUse)
end)
end
WirelessModeNode._RefreshModeDisplayAfterChanged = HL.Method(HL.Boolean) << function(self, isWirelessMode)
self.view.wirelessModeContent.gameObject:SetActiveIfNecessary(isWirelessMode)
local toggleAnim = isWirelessMode and "belttoggle_right" or "belttoggle_left"
self.view.wirelessModeToggleAnimationWrapper:PlayWithTween(toggleAnim)
local contentAnim = isWirelessMode and "fac_wireless_complete_in" or "fac_wireless_complete_out"
self.view.wirelessModeContent.animationWrapper:PlayWithTween(contentAnim, function()
self.view.wirelessModeContent.animationWrapper:PlayWithTween("fac_wireless_doneloop")
end)
local iconAnim = self.m_isPaused and "facminerwireless_defalut" or "facminerwireless_loop"
self.m_wirelessModeContent.iconAnimationWrapper:PlayWithTween(iconAnim)
end
WirelessModeNode._StartContentUpdateThread = HL.Method() << function(self)
self.m_wirelessPercent = INVALID_PERCENT_VALUE
self:_UpdateWirelessModeContent(true)
self.m_contentUpdateThread = self:_StartCoroutine(function()
while true do
coroutine.step()
self:_UpdateWirelessModeContent()
end
end)
end
WirelessModeNode._RestartWirelessUpdateThread = HL.Method() << function(self)
if self.m_buildingInfo == nil then
return
end
if not self.m_buildingInfo.cacheTransport.inUse then
return
end
if self.m_contentUpdateThread ~= nil then
return
end
self:_StartContentUpdateThread()
end
WirelessModeNode._ClearWirelessUpdateThread = HL.Method() << function(self)
if self.m_contentUpdateThread ~= nil then
self.m_contentUpdateThread = self:_ClearCoroutine(self.m_contentUpdateThread)
end
end
WirelessModeNode._UpdateWirelessModeContent = HL.Method(HL.Opt(HL.Boolean)) << function(self, forceUpdate)
if self.m_isPaused and not forceUpdate then
return
end
local cacheTransport = self.m_buildingInfo.cacheTransport
if cacheTransport.inUse then
local cdTime = 0
local currentProgress, totalProgress = cacheTransport.currentProgress, cacheTransport.totalProgress
if cacheTransport.progressIncreaseMS > 0 then
cdTime = (totalProgress - currentProgress) / cacheTransport.progressIncreaseMS / 1000
end
local percent = currentProgress / totalProgress
if self.m_wirelessPercent == INVALID_PERCENT_VALUE then
self.m_wirelessPercent = percent
end
if percent < self.m_wirelessPercent then
self:_SwitchCompletedState(function()
self:_SwitchNormalState()
end)
end
self.m_wirelessPercent = percent
self:_RefreshTimeInfo(cdTime, percent)
end
end
WirelessModeNode._RefreshLineColor = HL.Method(HL.Any) << function(self, color)
self.m_wirelessModeContent.lineGroup.color = color
self.m_wirelessModeContent.timeText.color = color
self.m_wirelessModeContent.fillBG.color = color
self.m_wirelessModeContent.bgDeco.color = color
self.m_wirelessModeContent.infoTextGroup.color = color
end
WirelessModeNode._SwitchNormalState = HL.Method() << function(self)
self:_RefreshLineColor(self.config.COLOR_LINE_NORMAL)
self.m_wirelessModeContent.infoText.text = Language.LUA_FAC_MINER_WIRELESS_MODE_NORMAL
self.m_wirelessModeContent.iconAnimationWrapper:PlayWithTween("facminerwireless_loop")
end
WirelessModeNode._SwitchPausedState = HL.Method() << function(self)
self:_RefreshLineColor(self.config.COLOR_LINE_PAUSED)
self.m_wirelessModeContent.infoText.text = Language.LUA_FAC_MINER_WIRELESS_MODE_PAUSED
self.m_wirelessModeContent.iconAnimationWrapper:PlayWithTween("facminerwireless_defalut")
self.m_wirelessPercent = INVALID_PERCENT_VALUE
end
WirelessModeNode._SwitchCompletedState = HL.Method(HL.Opt(HL.Function)) << function(self, animationCallback)
if not self.m_isBlocked then
self:_RefreshLineColor(self.config.COLOR_LINE_COMPLETED)
self.m_wirelessModeContent.infoText.text = Language.LUA_FAC_MINER_WIRELESS_MODE_COMPLETED
self.m_wirelessModeContent.animationWrapper:PlayWithTween("fac_wireless_done", function()
self.m_wirelessModeContent.animationWrapper:PlayWithTween("fac_wireless_doneloop")
if animationCallback ~= nil then
animationCallback()
end
end)
end
if self.m_onComplete ~= nil then
self.m_onComplete()
end
end
WirelessModeNode._RefreshTimeInfo = HL.Method(HL.Number, HL.Number) << function(self, timeRemain, fillPercent)
if fillPercent <= 0 then
timeRemain = 0
end
local min = math.floor(timeRemain / 60)
local second = math.floor(timeRemain % 60)
self.m_wirelessModeContent.timeText.text = string.format("%02d:%02d", min, second)
self.m_wirelessModeContent.fillBG.fillAmount = fillPercent
end
WirelessModeNode._RefreshDomainInfo = HL.Method() << function(self)
self.m_wirelessModeContent.titleTxt.gameObject:SetActive(false)
local curLevelId = GameWorld.worldInfo.curLevelId
local levelSuccess, levelInfo = DataManager.levelBasicInfoTable:TryGetValue(curLevelId)
if not levelSuccess then
return
end
local domainId = levelInfo.domainName
local domainSuccess, domainData = Tables.domainDataTable:TryGetValue(domainId)
if not domainSuccess then
return
end
self.m_wirelessModeContent.titleTxt.text = domainData.storageName
self.m_wirelessModeContent.titleTxt.gameObject:SetActive(true)
end
WirelessModeNode.RefreshPausedState = HL.Method(HL.Boolean) << function(self, isPaused)
if not isPaused then
self:_SwitchNormalState()
else
self:_SwitchPausedState()
end
self.m_isPaused = isPaused
end
WirelessModeNode.RefreshBlockedState = HL.Method(HL.Boolean, HL.Opt(HL.Boolean)) << function(self, isBlocked, forceRefresh)
if isBlocked == self.m_isBlocked and not forceRefresh then
return
end
self:_RefreshLineColor(self.config.COLOR_LINE_NORMAL)
self.m_wirelessModeContent.normalNode.gameObject:SetActiveIfNecessary(not isBlocked)
self.m_wirelessModeContent.blockedNode.gameObject:SetActiveIfNecessary(isBlocked)
self.m_wirelessModeContent.leftNode.gameObject:SetActiveIfNecessary(not isBlocked)
if self.m_isBlocked ~= isBlocked then
local animName = isBlocked and "fac_wireless_blockednode_in" or "fac_wireless_blockednode_out"
self.view.wirelessModeBlockAnimationWrapper:PlayWithTween(animName)
end
self.m_isBlocked = isBlocked
end
WirelessModeNode.RefreshSwitchValidState = HL.Method(HL.Boolean) << function(self, isValid)
self.view.wirelessModeToggle.interactable = isValid
self.view.invalidIcon.gameObject:SetActive(not isValid)
end
HL.Commit(WirelessModeNode)
return WirelessModeNode