local uiCtrl = require_ex('UI/Panels/Base/UICtrl') local PANEL_ID = PanelId.DomainItemTransferSelect local RouteStatus = GEnums.DomainTransportRouteStatusType local INIT_NUMBER_SELECTOR_CUR_VALUE = math.maxinteger local SEC_PER_HOUR = 3600 local SEC_PER_MIN = 60 local MIN_PER_HOUR = 60 local TRANSMISSION_MIN_VALUE = 1 local LOSSLESS_TRANSMISSION_INSTRUCTION_ID = "lossless_transmission_instruction" local LOSSLESS_VALUE_INSTRUCTION_ID = "lossless_value_instruction" local NORMAL_TRANSMISSION_STATE = "WarehouseTransfer" local LOSSLESS_TRANSMISSION_STATE = "NoConsumptionTransfer" local DEPOT_SLOT_NORMAL_STYLE = "ShowStorageTag" local DEPOT_SLOT_TRANSMISSION_STYLE = "HideStorageTag" DomainItemTransferSelectCtrl = HL.Class('DomainItemTransferSelectCtrl', uiCtrl.UICtrl) DomainItemTransferSelectCtrl.s_messages = HL.StaticField(HL.Table) << { [MessageConst.ON_FAC_TRANS_ROUTE_CHANGE] = '_OnNotifyRouteInfoChange', } DomainItemTransferSelectCtrl.m_targetDomain = HL.Field(HL.String) << "" DomainItemTransferSelectCtrl.m_chosenItemId = HL.Field(HL.String) << "" DomainItemTransferSelectCtrl.m_chosenItemCount = HL.Field(HL.Number) << 0 DomainItemTransferSelectCtrl.m_chosenItemCell = HL.Field(HL.Any) DomainItemTransferSelectCtrl.m_waitingToClose = HL.Field(HL.Boolean) << false DomainItemTransferSelectCtrl.m_info = HL.Field(HL.Any) DomainItemTransferSelectCtrl.m_losslessTransmission = HL.Field(HL.Boolean) << false DomainItemTransferSelectCtrl.m_maxTransmissionValue = HL.Field(HL.Number) << 0 DomainItemTransferSelectCtrl.m_losslessTransmissionUnlocked = HL.Field(HL.Boolean) << false DomainItemTransferSelectCtrl.m_allowSend = HL.Field(HL.Boolean) << false DomainItemTransferSelectCtrl.m_destinationCellCache = HL.Field(HL.Forward("UIListCache")) DomainItemTransferSelectCtrl.OnCreate = HL.Override(HL.Any) << function(self, args) self.m_info = args.info self.m_destinationCellCache = UIUtils.genCellCache(self.view.selectEndPointRoot.siteCell) self.view.btnBack.onClick:AddListener(function() self:_Close() end) self.view.detailsBtn.onClick:AddListener(function() self:_OnClickLosslessTransmissionInfoBtn() end) self.view.totalValueDetailsBtn.onClick:AddListener(function() self:_OnClickLosslessValueInstructionBtn() end) self.view.transferTabNode.onValueChanged:AddListener(function(isOn) self:_OnLosslessTransmissionToggleChanged(isOn) end) self.view.cantSwitchMaskBtn.onClick:AddListener(function() self:_OnClickCantSwitchMaskBtn() end) if DeviceInfo.usingController then self:_InitControllerAbility() end self:_InitBtn() self:_InitFromDomainInfo() self:_InitLeftSidePlatformInfo(self.m_info.toDomain) self:_InitNumberSelector() self:_InitTransmissionMode() if not self:_IsCurrentTransmitting() then self:_OpenSelectTargetRoot() else self:_OpenDepot() end self.view.depotExtraRoot.timeRemainingTxt.text = self:_GetTimeText() self:_StartCoroutine(function() while true do coroutine.wait(UIConst.FAC_COMMON_UI_UPDATE_INTERVAL) self.view.depotExtraRoot.timeRemainingTxt.text = self:_GetTimeText() end end) end DomainItemTransferSelectCtrl.OnHide = HL.Override() << function(self) if not DeviceInfo.usingController then return end self:_ManuallyStopFocusLeftNode() end DomainItemTransferSelectCtrl.OnClose = HL.Override() << function(self) if DeviceInfo.usingController then Notify(MessageConst.HIDE_COMMON_HOVER_TIP) end end DomainItemTransferSelectCtrl._OpenDepot = HL.Method() << function(self) AudioAdapter.PostEvent("Au_UI_Popup_DetailsPanel_Open") self:_ToggleLosslessTabOrTag(true) self:_SetDepotSlotStyleByLossless() LayoutRebuilder.ForceRebuildLayoutImmediate(self.view.forceRebuildTarget) self.view.leftItemSlotRoot.gameObject:SetActive(true) self.view.changeTransNode.gameObject:SetActive(true) self.view.selectEndPointRoot.gameObject:SetActive(false) self.view.selectingTargetMask.gameObject:SetActive(false) self.view.leftLineWithEffect.gameObject:SetActive(true) self.view.leftLineWithoutEffect.gameObject:SetActive(false) self.view.sliderImg.gameObject:SetActive(self:_IsCurrentTransmitting()) if self.m_losslessTransmission then self.view.leftLineWithEffect:SetState(LOSSLESS_TRANSMISSION_STATE) else self.view.leftLineWithEffect:SetState(NORMAL_TRANSMISSION_STATE) end local depotArgs = { domainId = self.m_info.fromDomain, customOnUpdateCell = function(cell, info, luaIndex) local itemInfoPack = { id = info.id } cell.item:InitItem(itemInfoPack, function() self:_OnClickItem(cell, info.id) self.view.depotExtraRoot.timeRemainingTxt.text = self:_GetTimeText() end) cell.item.view.button.onLongPress:RemoveAllListeners() cell.item.view.button.onLongPress:AddListener(function() Notify(MessageConst.SHOW_ITEM_TIPS, { itemId = info.id, transform = cell.item.gameObject.transform, onClose = function() cell.item.view.selectedBG.gameObject:SetActive(false) end, posType = UIConst.UI_TIPS_POS_TYPE.LeftMid, }) cell.item.view.selectedBG.gameObject:SetActive(true) end) cell.item.view.selectMarkNode.gameObject:SetActive(self.m_chosenItemId == info.id) local itemCount = self:_GetItemCount(info.id) cell.item.view.storageNumberText.text = UIUtils.getNumString(itemCount) local itemValue = self:_GetItemValue(info.id) cell.item.view.transferValueTxt.text = itemValue cell.item.view.storageImage.gameObject:SetActive(not self.m_losslessTransmission) if self.m_chosenItemId == info.id then self.m_chosenItemCell = cell end if DeviceInfo.usingController then cell.item.view.button.onIsNaviTargetChanged = function(isTarget, isGroupChanged, naviTargetEnabledAgain) if isTarget then self:_OnFocusTarget(cell, info, luaIndex) end end end end, customItemInfoListPostProcess = function(allItemInfoList) if allItemInfoList == nil or next(allItemInfoList) == nil then return {} end local fromDomainId = self.m_info.fromDomain local result = {} for _, info in ipairs(allItemInfoList) do local id = info.id local facSuccess, facItemData = Tables.factoryItemTable:TryGetValue(id) if facSuccess and not facItemData.itemState then if self.m_losslessTransmission then for i = 0, facItemData.losslessDomainIds.Count - 1 do if facItemData.losslessDomainIds[i] == fromDomainId then table.insert(result, info) end end else for i = 0, facItemData.transferDomainIds.Count - 1 do if facItemData.transferDomainIds[i] == fromDomainId then table.insert(result, info) end end end end end return result end, onChangeTypeFunction = function() self:_ClearSelectedItem() self:_UpdateNumber() end, showHistory = true, disableDrag = true, } self.view.depot:InitDepot(GEnums.ItemValuableDepotType.Factory, function(itemId, cell) self:_OnClickItem(cell, itemId) end, depotArgs) self:_RefreshLeftSideItem() self:_RefreshBtnAndText() self:_UpdateNumber() if DeviceInfo.usingController then self:Notify(MessageConst.CLOSE_CONTROLLER_SMALL_MENU, self.view.leftNode.groupId) InputManagerInst:ToggleGroup(self.view.leftNode.groupId, false) InputManagerInst:ToggleBinding(self.m_unFocusLeftBindId, false) self.view.controllerFocusHintNode.gameObject:SetActive(true) self.view.leftItemSlotRootInputBindingGroupMonoTarget.enabled = false self.view.transferTabNodeInputBindingGroupMonoTarget.enabled = false self.view.noConsumptionTransferDetails.enabled = false self.view.selectEndPointRootInputBindingGroupMonoTarget.enabled = false self.view.changeTransNode.enabled = false InputManagerInst:ToggleBinding(self.m_focusLeftBindId, true) end end DomainItemTransferSelectCtrl._TryGetCell = HL.Method(HL.String).Return(HL.Any) << function(self, itemId) local depot = self.view.depot local depotContent = depot.view.depotContent local depotCellIndex = depotContent:GetItemIndex(itemId) local cell = depotContent:GetCell(depotCellIndex) return cell end DomainItemTransferSelectCtrl._RefreshLeftSideItem = HL.Method() << function(self) local view = self.view.leftItemSlotRoot if not self:_IsCurrentTransmitting() and string.isEmpty(self.m_chosenItemId) then view.itemSlotCenterTriangle.gameObject:SetActive(false) view.itemCanceled.gameObject:SetActive(false) view.itemTarget.gameObject:SetActive(false) view.itemEmpty.gameObject:SetActive(true) return elseif not self:_IsCurrentTransmitting() and not string.isEmpty(self.m_chosenItemId) then view.itemSlotCenterTriangle.gameObject:SetActive(true) view.itemCanceled.gameObject:SetActive(false) view.itemTarget.gameObject:SetActive(true) view.itemEmpty.gameObject:SetActive(false) local itemDataPack = { id = self.m_chosenItemId, count = self.m_chosenItemCount, } view.itemTarget:InitItem(itemDataPack, true) view.itemTarget:SetExtraInfo({ isSideTips = DeviceInfo.usingController }) return elseif self:_IsCurrentTransmitting() and not self:_IsItemModified() then view.itemSlotCenterTriangle.gameObject:SetActive(false) view.itemCanceled.gameObject:SetActive(false) view.itemTarget.gameObject:SetActive(true) view.itemEmpty.gameObject:SetActive(false) local itemDataPack = { id = self.m_info.itemId, count = self.m_info.itemNumMax, } view.itemTarget:InitItem(itemDataPack, true) view.itemTarget:SetExtraInfo({ isSideTips = DeviceInfo.usingController }) return elseif self:_IsCurrentTransmitting() and self:_IsItemModified() then view.itemSlotCenterTriangle.gameObject:SetActive(true) view.itemCanceled.gameObject:SetActive(true) view.itemTarget.gameObject:SetActive(true) view.itemEmpty.gameObject:SetActive(false) local itemCanceledPack = { id = self.m_info.itemId, count = self.m_info.itemNumMax, } view.itemCanceled:InitItem(itemCanceledPack, true) view.itemCanceled:SetExtraInfo({ isSideTips = DeviceInfo.usingController }) local itemTargetPack = { id = self.m_chosenItemId, count = self.m_chosenItemCount, } view.itemTarget:InitItem(itemTargetPack, true) view.animationNode:Play("domainItemtransferselect_leftitemslot_changein") return end end DomainItemTransferSelectCtrl._ClearSelectedItem = HL.Method() << function(self) self:_OnClickItem(nil, "") end DomainItemTransferSelectCtrl._OnClickItem = HL.Method(HL.Any, HL.String) << function(self, itemCell, itemId) if self:_IsCurrentTransmitting() and itemId == self.m_chosenItemId then return end if self.m_chosenItemCell ~= nil then local view = self.m_chosenItemCell.view if view ~= nil then local toggle = view.item.view.selectMarkNode if toggle ~= nil then toggle.gameObject:SetActive(false) end end self.m_chosenItemCell = nil end if string.isEmpty(itemId) or not self:_IsCurrentTransmitting() and itemId == self.m_chosenItemId then self:_ClearChosenItem() return end if itemId ~= self.m_chosenItemId and not string.isEmpty(itemId) then self.m_chosenItemCell = itemCell self.m_chosenItemId = itemId local targetCount = self:_GetCurrentNeedAssignCount() self:_ChangeCount(targetCount) self.m_chosenItemCell.view.item.view.selectMarkNode.gameObject:SetActive(true) end self:_RefreshBtnAndText() self:_RefreshLeftSideItem() self:_UpdateNumber() self:_UpdateNumberSelector() self:_UpdateTransmissionValue() end DomainItemTransferSelectCtrl._ClearChosenItem = HL.Method() << function(self) self.m_chosenItemId = self.m_info.itemId self:_ChangeCount(self.m_info.itemNumMax) if self:_IsCurrentTransmitting() then local toggleCell = self:_TryGetCell(self.m_info.itemId) self.m_chosenItemCell = toggleCell if self.m_chosenItemCell ~= nil then self.m_chosenItemCell.view.item.view.selectMarkNode.gameObject:SetActive(true) end end self:_RefreshBtnAndText() self:_RefreshLeftSideItem() self:_UpdateNumber() self:_UpdateTransmissionValue() end DomainItemTransferSelectCtrl._GetCurrentNeedAssignCount = HL.Method().Return(HL.Number) << function(self) if self:_IsCurrentTransmitting() then return self.view.depotExtraRoot.numberSelector.curNumber end if self.m_chosenItemCount ~= 0 then return self.m_chosenItemCount end return INIT_NUMBER_SELECTOR_CUR_VALUE end DomainItemTransferSelectCtrl._RefreshBtnAndText = HL.Method() << function(self) local itemModified = self:_IsItemModified() local blockOrRetry = self.m_info.status == RouteStatus.blocked or self.m_info.status == RouteStatus.retry local isFocusItemEqualChosen = self:_IsFocusItemEqualChosen() self.view.startTransBtn.gameObject:SetActive(self.m_allowSend and itemModified and isFocusItemEqualChosen) self.view.transmittingFakeBtn.gameObject:SetActive(self.m_allowSend and self:_IsCurrentTransmitting() and not blockOrRetry and (not itemModified or not isFocusItemEqualChosen)) self.view.transPausedFakeBtn.gameObject:SetActive(self.m_allowSend and blockOrRetry and (not itemModified or not isFocusItemEqualChosen)) self.view.cancelSelectBtn.gameObject:SetActive(self.m_allowSend and self:_IsCurrentTransmitting() and itemModified) self.view.transLocked.gameObject:SetActive(not self.m_allowSend) local depotExtra = self.view.depotExtraRoot local hasNoChosenItem = string.isEmpty(self.m_chosenItemId) self.view.depot.view.bottomNode.gameObject:SetActive(hasNoChosenItem or not isFocusItemEqualChosen) self.view.depot.view.sortNode.gameObject:SetActive(hasNoChosenItem or not isFocusItemEqualChosen) depotExtra.selectItemInDepotRoot.gameObject:SetActive(hasNoChosenItem or not isFocusItemEqualChosen) if hasNoChosenItem or not isFocusItemEqualChosen then depotExtra.timeRemainingRoot.gameObject:SetActive(false) else depotExtra.timeRemainingRoot.gameObject:SetActive(not blockOrRetry or itemModified) end depotExtra.numberSelector.gameObject:SetActive(not hasNoChosenItem and isFocusItemEqualChosen) self.view.depot.view.sortNode.gameObject:SetActive(hasNoChosenItem or not isFocusItemEqualChosen) end DomainItemTransferSelectCtrl._Close = HL.Method() << function(self) self:PlayAnimationOutAndClose() if DeviceInfo.usingController then self:Notify(MessageConst.HIDE_COMMON_HOVER_TIP, {noAnimation = true}) self:Notify(MessageConst.CLOSE_CONTROLLER_SMALL_MENU, self.view.leftNode.groupId) InputManagerInst:ToggleGroup(self.view.leftNode.groupId, false) InputManagerInst:ToggleBinding(self.m_unFocusLeftBindId, false) end end DomainItemTransferSelectCtrl._InitBtn = HL.Method() << function(self) self.view.changeTargetBtn.onClick:AddListener(function() self:_OpenSelectTargetRoot(true) end) self.view.stopTransBtn.onClick:AddListener(function() self:Notify(MessageConst.SHOW_POP_UP, { content = Language.LUA_FAC_TRANS_CONFIRM_RESET, onConfirm = function() self:_DoResetRoute() end, onCancel = function() self:_ClearSelectedItem() self:_UpdateNumber() end }) end) self.view.changeTargetBtn.gameObject:SetActive(not self:_IsCurrentTransmitting()) self.view.stopTransBtn.gameObject:SetActive(self:_IsCurrentTransmitting()) self.view.cancelSelectBtn.onClick:AddListener(function() self:_ClearSelectedItem() end) if self:_IsCurrentTransmitting() then self.view.startTransBtnText.text = Language.LUA_FAC_TRANS_MODIFY_BTN_TEXT self.view.startTransBtn.onClick:AddListener(function() self:Notify(MessageConst.SHOW_POP_UP, { content = self.m_info.lossless and Language.LUA_FAC_TRANS_CONFIRM_MODIFY_LOSSLESS or Language.LUA_FAC_TRANS_CONFIRM_MODIFY, onConfirm = function() self:_DoChangeRoute() end, onCancel = function() self:_ClearSelectedItem() self:_UpdateNumber() end }) end) else self.view.startTransBtnText.text = Language.LUA_FAC_TRANS_START_BTN_TEXT self.view.startTransBtn.onClick:AddListener(function() self:_DoChangeRoute() end) end end DomainItemTransferSelectCtrl._OpenSelectTargetRoot = HL.Method(HL.Opt(HL.Boolean)) << function(self, clickBtn) self:_ToggleLosslessTabOrTag(false) self.view.selectingTargetMask.gameObject:SetActive(true) self.view.leftItemSlotRoot.gameObject:SetActive(false) self.view.changeTransNode.gameObject:SetActive(false) self.view.selectEndPointRoot.gameObject:SetActive(true) self.view.leftLineWithEffect.gameObject:SetActive(false) self.view.leftLineWithoutEffect.gameObject:SetActive(true) self:_InitLeftSidePlatformInfo("") local domainList = {} for _, domainInfo in pairs(Tables.domainDataTable) do local domainId = domainInfo.domainId local notSelf = domainId ~= self.m_info.fromDomain local valid = Tables.factoryDomainItemTransmissionTable:ContainsKey(domainId) if notSelf and valid then table.insert(domainList, domainInfo) end end table.sort(domainList, Utils.genSortFunction({ "sortId" }, true)) self.m_destinationCellCache:Refresh(#domainList, function(cell, index) local domainData = domainList[index] local domainName = domainData.domainName local domainId = domainData.domainId cell.text.text = domainName cell.icon:LoadSprite(UIConst.UI_SPRITE_FAC_TRANS, UIConst.FAC_TRANS_DOMAIN_ICONS[domainId]) cell.button.onClick:AddListener(function() self:_OnSelectTargetDomain(domainId) end) end) if clickBtn == true then AudioAdapter.PostEvent("Au_UI_Popup_DetailsPanel_Close") self.animationWrapper:Play("domainItemtransferselect_panel_select_in") end if DeviceInfo.usingController then self.view.controllerFocusHintNode.gameObject:SetActive(false) self:Notify(MessageConst.CLOSE_CONTROLLER_SMALL_MENU, self.view.leftNode.groupId) InputManagerInst:ToggleGroup(self.view.leftNode.groupId, true) InputManagerInst:ToggleBinding(self.m_unFocusLeftBindId, false) self.view.transferTabNodeInputBindingGroupMonoTarget.enabled = true self.view.noConsumptionTransferDetails.enabled = true self.view.selectEndPointRootInputBindingGroupMonoTarget.enabled = true self.view.changeTransNode.enabled = true InputManagerInst:ToggleBinding(self.m_focusLeftBindId, false) self:_SetFocusTargetByIndex(1) end end DomainItemTransferSelectCtrl._UpdateNumber = HL.Method() << function(self) local view = self.view.leftItemSlotRoot local isFocusItemEqualChosen = self:_IsFocusItemEqualChosen() if not self:_IsItemModified() then local showNotEnoughItem = self.m_info.itemNum ~= self.m_info.itemNumMax local subCondition = not self.m_losslessTransmission and isFocusItemEqualChosen self.view.notEnoughItemText.text = tostring(self.m_info.itemNum) self.view.notEnoughItemRoot.gameObject:SetActive(showNotEnoughItem and subCondition) if self:_IsCurrentTransmitting() then local itemTargetPack = { id = self.m_chosenItemId, count = self.m_chosenItemCount, } view.itemTarget:InitItem(itemTargetPack, true) view.itemTarget:SetExtraInfo({ isSideTips = DeviceInfo.usingController }) end elseif string.isEmpty(self.m_chosenItemId) then self.view.notEnoughItemRoot.gameObject:SetActive(false) else local itemTargetPack = { id = self.m_chosenItemId, count = self.m_chosenItemCount, } view.itemTarget:InitItem(itemTargetPack, true) view.itemTarget:SetExtraInfo({ isSideTips = DeviceInfo.usingController }) local depotCount = self:_GetItemCount(self.m_chosenItemId) local subCondition = not self.m_losslessTransmission and isFocusItemEqualChosen self.view.notEnoughItemRoot.gameObject:SetActive(depotCount < self.m_chosenItemCount and subCondition) self.view.notEnoughItemText.text = tostring(depotCount) end end DomainItemTransferSelectCtrl._GetItemCount = HL.Method(HL.String).Return(HL.Number) << function(self, itemId) local factoryDepot = GameInstance.player.inventory.factoryDepot local depotInChapter = factoryDepot:GetOrFallback(Utils.getCurrentScope()) local actualDepot = depotInChapter[ScopeUtil.ChapterIdStr2Int(self.m_info.fromDomain)] local count = actualDepot:GetCount(itemId) return count end DomainItemTransferSelectCtrl._GetItemValue = HL.Method(HL.String).Return(HL.Number) << function(self, itemId) local factoryItemCfg = Tables.factoryItemTable[itemId] return factoryItemCfg.value end DomainItemTransferSelectCtrl._InitLeftSidePlatformInfo = HL.Method(HL.String) << function(self, targetDomainId) local fromDomainId = self.m_info.fromDomain local domainInfo = Tables.domainDataTable[fromDomainId] self.view.platformFrom.destinationTxt.text = domainInfo.domainName self.view.platformFrom.domainLevelTxt.text = GameInstance.player.domainDevelopmentSystem:GetDomainDevelopmentLv(fromDomainId) self.view.platformFrom.domainIconImg:LoadSprite(UIConst.UI_SPRITE_FAC_TRANS, UIConst.FAC_TRANS_DOMAIN_ICONS[fromDomainId]) local toDomainId toDomainId = string.isEmpty(targetDomainId) and self.m_info.toDomain or targetDomainId local hasToDomain = not string.isEmpty(toDomainId) self.view.platformTo.domainLevelTxt.gameObject:SetActive(hasToDomain) self.view.platformTo.destinationTxt.gameObject:SetActive(hasToDomain) self.view.platformTo.domainLevelNode.gameObject:SetActive(hasToDomain) self.view.platformTo.domainIconImg.gameObject:SetActive(hasToDomain) if hasToDomain then self.view.platformTo.destinationTxt.text = Tables.domainDataTable[toDomainId].domainName self.view.platformTo.domainLevelTxt.text = GameInstance.player.domainDevelopmentSystem:GetDomainDevelopmentLv(toDomainId) self.view.platformTo.domainIconImg:LoadSprite(UIConst.UI_SPRITE_FAC_TRANS, UIConst.FAC_TRANS_DOMAIN_ICONS[toDomainId]) end end DomainItemTransferSelectCtrl._IsCurrentTransmitting = HL.Method().Return(HL.Boolean) << function(self) return self.m_info.status ~= RouteStatus.idle end DomainItemTransferSelectCtrl._GetDefaultNumber = HL.Method().Return(HL.Number) << function(self) if self:_IsCurrentTransmitting() then return self.m_info.itemNumMax end return INIT_NUMBER_SELECTOR_CUR_VALUE end DomainItemTransferSelectCtrl._IsItemModified = HL.Method().Return(HL.Boolean) << function(self) return self.m_chosenItemId ~= self.m_info.itemId or self.m_chosenItemCount ~= self.m_info.itemNumMax end DomainItemTransferSelectCtrl._GiveUpItemSelect = HL.Method() << function(self) if self:_IsCurrentTransmitting() then self.m_chosenItemId = self.m_info.itemId self:_ChangeCount(self.m_info.itemNumMax) self.m_chosenItemCount = 0 return end self.m_chosenItemId = "" self.m_chosenItemCount = 0 end DomainItemTransferSelectCtrl._DoChangeRoute = HL.Method() << function(self) local fromDomain = self.m_info.fromDomain local toDomain = self.m_targetDomain local index = self.m_info.index local lossless = self.m_losslessTransmission local itemId = self.m_chosenItemId local itemCount = self.m_chosenItemCount GameInstance.player.remoteFactory:SendReqSetHubTransRoute(fromDomain, toDomain, index, lossless, itemId, itemCount) self.m_waitingToClose = true end DomainItemTransferSelectCtrl._ChangeCount = HL.Method(HL.Number) << function(self, count) self.m_chosenItemCount = count self.view.depotExtraRoot.numberSelector:_Refresh(count) end DomainItemTransferSelectCtrl._DoResetRoute = HL.Method() << function(self) local routeInfo = self.m_info GameInstance.player.remoteFactory:SendReqResetHubTransRoute(routeInfo.fromDomain, routeInfo.index) self.m_waitingToClose = true end DomainItemTransferSelectCtrl._OnSelectTargetDomain = HL.Method(HL.String) << function(self, domainId) local hasChangedMode = self.m_losslessTransmission ~= self.view.transferTabNode.isOn if hasChangedMode then self:_ClearChosenItem() self.view.depot.view.depotContent.view.itemList:UpdateCount(0) end self.m_losslessTransmission = self.view.transferTabNode.isOn self:_UpdateTransmissionTag() self.animationWrapper:Play("domainItemtransferselect_panel_select_out", function() end) self:_InitLeftSidePlatformInfo(domainId) self.m_targetDomain = domainId self:_OpenDepot() end DomainItemTransferSelectCtrl._OnNotifyRouteInfoChange = HL.Method() << function(self) if self.m_waitingToClose then self:_Close() end end DomainItemTransferSelectCtrl._GetTimeText = HL.Method().Return(HL.String) << function(self) local curTime = DateTimeUtils.GetCurrentTimestampBySeconds() local lastTryTime = self.m_info.timeStamp - self.m_info.progress local curProgress = curTime - lastTryTime local needTime = Tables.factoryConst.domainTransportIntervalTime local curNeedTimeSec = needTime - curProgress if not self:_IsCurrentTransmitting() or self:_IsItemModified() then curNeedTimeSec = needTime end while curNeedTimeSec < 0 do local reverse = -curNeedTimeSec local times = reverse // needTime if reverse % needTime > 0 then times = times + 1 end curNeedTimeSec = curNeedTimeSec + needTime * times end local curNeedHour = curNeedTimeSec // SEC_PER_HOUR local restSec = curNeedTimeSec % SEC_PER_HOUR local curNeedMin = restSec // SEC_PER_MIN restSec = restSec % SEC_PER_MIN if restSec % SEC_PER_MIN > 0 then curNeedMin = curNeedMin + 1 end if curNeedMin >= MIN_PER_HOUR then curNeedMin = curNeedMin - 60 curNeedHour = curNeedHour + 1 end local hourText = "" if curNeedHour > 0 then hourText = string.format(Language.LUA_TIME_HOUR, curNeedHour) end local minuteText = "" if curNeedMin > 0 then minuteText = string.format(Language.LUA_TIME_MIN, curNeedMin) end local text = hourText .. minuteText return text end DomainItemTransferSelectCtrl._OnClickLosslessTransmissionInfoBtn = HL.Method() << function(self) UIManager:Open(PanelId.InstructionBook, LOSSLESS_TRANSMISSION_INSTRUCTION_ID) end DomainItemTransferSelectCtrl._OnClickLosslessValueInstructionBtn = HL.Method() << function(self) UIManager:Open(PanelId.InstructionBook, LOSSLESS_VALUE_INSTRUCTION_ID) end DomainItemTransferSelectCtrl._OnClickCantSwitchMaskBtn = HL.Method() << function(self) local fromDomainId = self.m_info.fromDomain local domainCfg = Tables.domainDataTable[fromDomainId] local domainTransmissionCfg = Tables.factoryDomainItemTransmissionTable[fromDomainId] local unlockLosslessLevel = domainTransmissionCfg.unlockLosslessLevel self:Notify(MessageConst.SHOW_TOAST, string.format(Language.LUA_DOMAIN_ITEM_TRANSMISSION_CANT_SWITCH_MODE, domainCfg.domainName, unlockLosslessLevel)) end DomainItemTransferSelectCtrl._ToggleLosslessTabOrTag = HL.Method(HL.Boolean) << function(self, isTag) self.view.transferTabNode.gameObject:SetActive(not isTag) self.view.transferTagNode.gameObject:SetActive(isTag) end DomainItemTransferSelectCtrl._OnLosslessTransmissionToggleChanged = HL.Method(HL.Boolean) << function(self, isOn) self:_UpdateLosslessTabView(isOn) end DomainItemTransferSelectCtrl._SetDepotSlotStyleByLossless = HL.Method() << function(self) local state = self.m_losslessTransmission and DEPOT_SLOT_TRANSMISSION_STYLE or DEPOT_SLOT_NORMAL_STYLE self.view.depotNode:SetState(state) end DomainItemTransferSelectCtrl._InitNumberSelector = HL.Method() << function(self) local maxValue = INIT_NUMBER_SELECTOR_CUR_VALUE if not string.isEmpty(self.m_chosenItemId) then local factoryItemCfg = Tables.factoryItemTable[self.m_chosenItemId] maxValue = math.floor(self.m_maxTransmissionValue / factoryItemCfg.value) end self.view.depotExtraRoot.numberSelector:InitNumberSelector(self:_GetDefaultNumber(), TRANSMISSION_MIN_VALUE, maxValue, function() if not string.isEmpty(self.m_chosenItemId) then self.m_chosenItemCount = self.view.depotExtraRoot.numberSelector.curNumber else self.m_chosenItemCount = 0 end self:_UpdateNumber() self:_RefreshBtnAndText() self:_UpdateTransmissionValue() end) end DomainItemTransferSelectCtrl._UpdateNumberSelector = HL.Method() << function(self) if string.isEmpty(self.m_chosenItemId) then return end local factoryItemCfg = Tables.factoryItemTable[self.m_chosenItemId] local minValue = TRANSMISSION_MIN_VALUE local maxValue = math.floor(self.m_maxTransmissionValue / factoryItemCfg.value) local curValue = math.max(self.view.depotExtraRoot.numberSelector.curNumber, maxValue) self.view.depotExtraRoot.numberSelector:RefreshNumber(curValue, minValue, maxValue) end DomainItemTransferSelectCtrl._UpdateTransmissionValue = HL.Method() << function(self) local curTransmissionValue = 0 if not string.isEmpty(self.m_chosenItemId) and self:_IsFocusItemEqualChosen() then local selectItemFacCfg = Tables.factoryItemTable[self.m_chosenItemId] curTransmissionValue = selectItemFacCfg.value * self.m_chosenItemCount end self.view.totalValueTxt.text = string.format("%d/%d", curTransmissionValue, self.m_maxTransmissionValue) end DomainItemTransferSelectCtrl._InitFromDomainInfo = HL.Method() << function(self) local fromDomainId = self.m_info.fromDomain local allowSend = GameInstance.player.remoteFactory:FacDomainTransAllowSend(fromDomainId) local allowLosslessSend = GameInstance.player.remoteFactory:FacDomainTransAllowLosslessSend(fromDomainId) local fromDomainLv = GameInstance.player.domainDevelopmentSystem:GetDomainDevelopmentLv(fromDomainId) local fromDomainTransCfg = Tables.factoryDomainItemTransmissionTable[fromDomainId] local refLevel if allowSend then if not fromDomainTransCfg.levelToCapacity:ContainsKey(fromDomainLv) then logger.error("当前达到的地区发展等级与HUB跨区域传输升级表中无法匹配,请检查") refLevel = #fromDomainTransCfg.levelToCapacity else refLevel = fromDomainLv end else refLevel = fromDomainTransCfg.unlockLevel end self.m_maxTransmissionValue = fromDomainTransCfg.levelToCapacity[refLevel] self.m_losslessTransmissionUnlocked = allowLosslessSend self.m_allowSend = allowSend if self.m_info.status ~= RouteStatus.idle then self.m_chosenItemId = self.m_info.itemId self.m_chosenItemCount = self.m_info.itemNumMax self.m_targetDomain = self.m_info.toDomain self.m_losslessTransmission = self.m_info.lossless end if not self.m_allowSend then local domainCfg = Tables.domainDataTable[fromDomainId] local versionSupport = fromDomainTransCfg.unlockLevel <= domainCfg.domainDevelopmentLevel.Count self.view.promptTxt.text = versionSupport and string.format(Language.LUA_DOMAIN_ITEM_TRANSMISSION_CANT_SEND, domainCfg.domainName, fromDomainTransCfg.unlockLevel) or string.format(Language.LUA_FAC_TRANS_CUR_VERSION_NOT_ALLOW_SEND, domainCfg.domainName) end end DomainItemTransferSelectCtrl._InitTransmissionMode = HL.Method() << function(self) self.m_losslessTransmission = self.m_info.lossless self.view.transferTabNode:SetIsOnWithoutNotify(self.m_losslessTransmission) self.view.cantSwitchMaskBtn.gameObject:SetActive(not self.m_losslessTransmissionUnlocked) self.view.transferTabNode.interactable = self.m_losslessTransmissionUnlocked self:_UpdateLosslessTabView(self.m_losslessTransmission) self:_UpdateTransmissionTag() end DomainItemTransferSelectCtrl._UpdateLosslessTabView = HL.Method(HL.Boolean) << function(self, losslessTransmission) if losslessTransmission then self.view.noConsumptionTransferTab:SetState("SelectState") self.view.warehouseTransferTab:SetState("UnselectState") else self.view.warehouseTransferTab:SetState("SelectState") self.view.noConsumptionTransferTab:SetState(self.m_losslessTransmissionUnlocked and "UnlockState" or "LockState") end end DomainItemTransferSelectCtrl._UpdateTransmissionTag = HL.Method() << function(self) self.view.warehouseTransferNode.gameObject:SetActive(not self.m_losslessTransmission) self.view.noConsumptionTransferNode.gameObject:SetActive(self.m_losslessTransmission) end DomainItemTransferSelectCtrl.m_focusLeftBindId = HL.Field(HL.Number) << -1 DomainItemTransferSelectCtrl.m_unFocusLeftBindId = HL.Field(HL.Number) << -1 DomainItemTransferSelectCtrl.m_destinationFocusLuaIndex = HL.Field(HL.Number) << 1 DomainItemTransferSelectCtrl.m_focusItemId = HL.Field(HL.String) << "" DomainItemTransferSelectCtrl._InitControllerAbility = HL.Method() << function(self) self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({ self.view.inputGroup.groupId }) self.m_focusLeftBindId = InputManagerInst:CreateBindingByActionId("domain_trans_select_focus_left", function() self:Notify(MessageConst.SHOW_AS_CONTROLLER_SMALL_MENU, { panelId = PANEL_ID, isGroup = true, id = self.view.leftNode.groupId, hintPlaceholder = self.view.controllerHintPlaceholder, rectTransform = self.view.controllerFocusHintNode, useNormalFrame = true, noHighlight = true, }) InputManagerInst:ToggleGroup(self.view.leftNode.groupId, true) InputManagerInst:ToggleBinding(self.m_unFocusLeftBindId, true) self.view.controllerFocusHintNode.gameObject:SetActive(false) local hasItemFocus = self.view.leftItemSlotRoot.itemCanceled.gameObject.activeInHierarchy or self.view.leftItemSlotRoot.itemTarget.gameObject.activeInHierarchy self.view.leftItemSlotRootInputBindingGroupMonoTarget.enabled = hasItemFocus self.view.transferTabNodeInputBindingGroupMonoTarget.enabled = true self.view.noConsumptionTransferDetails.enabled = true self.view.selectEndPointRootInputBindingGroupMonoTarget.enabled = true self.view.changeTransNode.enabled = true Notify(MessageConst.HIDE_COMMON_HOVER_TIP) end, self.view.inputGroup.groupId) self.m_unFocusLeftBindId = InputManagerInst:CreateBindingByActionId("common_back", function() self:_ManuallyStopFocusLeftNode() end, self.view.leftNode.groupId) local depotItemList = self.view.depot.view.depotContent.view.itemList depotItemList.onGraduallyShowFinish:AddListener(function() self:_InitDepotItemFocus() end) depotItemList.onSelectedCell:AddListener(function(go, csIndex) self:_OnSelectedCell(go, csIndex) end) end DomainItemTransferSelectCtrl._ManuallyStopFocusLeftNode = HL.Method() << function(self) self:Notify(MessageConst.CLOSE_CONTROLLER_SMALL_MENU, self.view.leftNode.groupId) InputManagerInst:ToggleGroup(self.view.leftNode.groupId, false) InputManagerInst:ToggleBinding(self.m_unFocusLeftBindId, false) self.view.controllerFocusHintNode.gameObject:SetActive(true) self.view.leftItemSlotRootInputBindingGroupMonoTarget.enabled = false self.view.transferTabNodeInputBindingGroupMonoTarget.enabled = false self.view.noConsumptionTransferDetails.enabled = false self.view.selectEndPointRootInputBindingGroupMonoTarget.enabled = false self.view.changeTransNode.enabled = false end DomainItemTransferSelectCtrl._SetFocusTargetByIndex = HL.Method(HL.Number) << function(self, index) self.m_destinationFocusLuaIndex = index local firstCell = self.m_destinationCellCache:Get(index) InputManagerInst.controllerNaviManager:SetTarget(firstCell.siteCell) end DomainItemTransferSelectCtrl._InitDepotItemFocus = HL.Method() << function(self) local focusLuaIndexIndex = 1 local itemList = self.view.depot.view.depotContent.m_itemInfoList for luaIndex, item in ipairs(itemList) do if item.id == self.m_chosenItemId then focusLuaIndexIndex = luaIndex end end self.view.depot.view.depotContent.view.itemList:ScrollToIndex(CSIndex(focusLuaIndexIndex), true) local itemSlot = self.view.depot.view.depotContent.m_getCell(focusLuaIndexIndex) if itemSlot then InputManagerInst.controllerNaviManager:SetTarget(itemSlot.view.item.view.button) self.m_focusItemId = itemList[focusLuaIndexIndex].id else InputManagerInst.controllerNaviManager:SetTarget(nil) self.m_focusItemId = "" end self:_UpdateNumber() self:_RefreshBtnAndText() self:_UpdateTransmissionValue() end DomainItemTransferSelectCtrl._OnFocusTarget = HL.Method(HL.Forward("ItemSlot"), HL.Table, HL.Number) << function(self, cell, info, luaIndex) self.m_focusItemId = info.id InputManagerInst:SetBindingText(cell.item.view.button.hoverConfirmBindingId, Language["key_hint_domain_trans_select_item"]) if string.isEmpty(self.m_chosenItemId) then return end self:_UpdateNumber() self:_RefreshBtnAndText() self:_UpdateTransmissionValue() end DomainItemTransferSelectCtrl._IsFocusItemEqualChosen = HL.Method().Return(HL.Boolean) << function(self) if DeviceInfo.usingController then return self.m_focusItemId == self.m_chosenItemId else return true end end HL.Commit(DomainItemTransferSelectCtrl)