local uiCtrl = require_ex('UI/Panels/Base/UICtrl') local PANEL_ID = PanelId.ShopWeapon local PHASE_ID = PhaseId.ShopWeapon local PERMANENT_BOX_CELL_REFRESH_WAIT_TIME = 0.3 local PERMANENT_BOX_CELL_ROW_REFRESH_WAIT_TIME = 0.05 local PERMANENT_GOODS_CELL_REFRESH_WAIT_TIME = 0.05 ShopWeaponCtrl = HL.Class('ShopWeaponCtrl', uiCtrl.UICtrl) ShopWeaponCtrl.m_shopSystem = HL.Field(HL.Any) ShopWeaponCtrl.m_smallUpWeaponCache = HL.Field(HL.Forward("UIListCache")) ShopWeaponCtrl.m_permanentBoxCell = HL.Field(HL.Forward("UIListCache")) ShopWeaponCtrl.m_permanentBoxSubBoxCellDict = HL.Field(HL.Table) ShopWeaponCtrl.m_permanentBoxSubGoodsCellDict = HL.Field(HL.Table) ShopWeaponCtrl.m_permanentGoodsCell = HL.Field(HL.Forward("UIListCache")) ShopWeaponCtrl.m_firstNaviData = HL.Field(HL.Any) ShopWeaponCtrl.m_currNaviData = HL.Field(HL.Any) ShopWeaponCtrl.m_naviCellTable = HL.Field(HL.Table) ShopWeaponCtrl.m_currNaviRow = HL.Field(HL.Int) << 1 ShopWeaponCtrl.m_currNaviCol = HL.Field(HL.Int) << 1 ShopWeaponCtrl.m_haveSeenLines = HL.Field(HL.Table) ShopWeaponCtrl.s_messages = HL.StaticField(HL.Table) << { [MessageConst.ON_SHOP_REFRESH] = '_OnShopRefresh', [MessageConst.ON_SHOP_JUMP_EVENT] = '_OnShopJumpEvent', [MessageConst.ON_SHOP_GOODS_CONDITION_REFRESH] = '_OnShopRefresh', [MessageConst.ON_GACHA_POOL_INFO_CHANGED] = 'OnGachaPoolInfoChanged', [MessageConst.ON_GACHA_POOL_ROLE_DATA_CHANGED] = 'OnGachaPoolRoleDataChanged', } ShopWeaponCtrl.m_normalGoods = HL.Field(HL.Any) ShopWeaponCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg) self.m_phase = arg.phase self:_InitShortCut() self.m_shopSystem = GameInstance.player.shopSystem self.m_smallUpWeaponCache = UIUtils.genCellCache(self.view.smallUpWeaponsRoot.shopWeaponBagSmallCell) self.m_permanentBoxCell = UIUtils.genCellCache(self.view.commonWeapons.weaponCase) self.m_permanentGoodsCell = UIUtils.genCellCache(self.view.commonWeapons.shopWeaponCell) self.m_permanentBoxSubBoxCellDict = {} self.m_permanentBoxSubGoodsCellDict = {} self.m_naviCellTable = {} self.m_haveSeenLines = {} self:UpdateUpWeapon() self:UpdateTimeLimitWeapons() self:UpdatePermanentWeapon() self.view.scroll.onValueChanged:AddListener(function(data) self:_ComputeSeeGoods() local show = (self.view.scroll.normalizedPosition.y) > 0.05 if self.view.upWeaponNextPage.gameObject.activeSelf == show then return end if show then self.view.upWeaponNextPage.gameObject:SetActive(true) else self.view.upWeaponNextPage.gameObject:SetActive(false) end end) self:_CustomNaviTarget(self.m_firstNaviData) local cashShopCtrl = self.m_phase.cashShopCtrl if cashShopCtrl == nil then cashShopCtrl = self.m_phase.m_panel2Item[PanelId.CashShop].uiCtrl end self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({ self.view.inputGroup.groupId, cashShopCtrl.view.inputGroup.groupId, }) self.m_phase:HidePsStore() self:_ProcessArg(arg) end ShopWeaponCtrl.OnShow = HL.Override() << function(self) Notify(MessageConst.CASH_SHOP_SHOW_WALLET_BAR, { moneyIds = {Tables.CashShopConst.WeaponTabMoneyId}, }) if self.m_phase.m_needGameEvent then self.m_phase.m_needGameEvent = false EventLogManagerInst:GameEvent_ShopEnter( self.m_phase.m_enterButton, self.m_phase.m_enterPanel, "", CashShopConst.CashShopCategoryType.Weapon, "" ) end CashShopUtils.TryOpenSpecialGiftPopup() CashShopUtils.TryFadeSpecialGiftPopup() end ShopWeaponCtrl.OnClose = HL.Override() << function(self) self.m_permanentGoodsCell:OnClose() self.m_permanentBoxCell:OnClose() for _, boxCellCache in ipairs(self.m_permanentBoxSubBoxCellDict) do boxCellCache:OnClose() end for _, goodsCellCache in ipairs(self.m_permanentBoxSubGoodsCellDict) do goodsCellCache:OnClose() end local goodsIds = {} for _, lineNumber in ipairs(self.m_haveSeenLines) do local lineData = self.m_naviCellTable[lineNumber] if lineData then for _, data in ipairs(lineData) do local goodsId = data.goodsId if goodsId then table.insert(goodsIds, goodsId) end end end end if #goodsIds > 0 then for _, goodsId in ipairs(goodsIds) do if GameInstance.player.shopSystem:IsNewGoodsId(goodsId) then GameInstance.player.shopSystem:RecordSeeGoodsId(goodsId) end end GameInstance.player.shopSystem:SetGoodsIdSee() end end ShopWeaponCtrl.UpdateUpWeapon = HL.Method() << function(self) local _, box, goods = self.m_shopSystem:GetNowUpWeaponData() local upBoxList = {} local downBoxList = {} local tmpBoxList = {} local count = box == nil and 0 or box.Count for i = 0, count - 1 do local goodsData = box[i] local goodsId = goodsData.goodsTemplateId local _, goodsCfg = Tables.shopGoodsTable:TryGetValue(goodsId); local hasGachaCfg, weaponGachaCfg = Tables.gachaWeaponPoolTable:TryGetValue(goodsCfg.weaponGachaPoolId) local clientTopTimeId = weaponGachaCfg.clientTopTimeId local isTop = Utils.isCurTimeInTimeIdRange(clientTopTimeId) local tmpData = { goodsData = goodsData, isTop = isTop, index = weaponGachaCfg.index, sortId = weaponGachaCfg.sortId } table.insert(tmpBoxList, tmpData) end table.sort(tmpBoxList, Utils.genSortFunction({ "index", "sortId" }, false)) for idx, tmpData in ipairs(tmpBoxList) do if tmpData.isTop then table.insert(upBoxList, tmpData) else table.insert(downBoxList, tmpData) end end local singleWeaponCase = self.view.randomWeaponsCase local singleWeaponCaseCell = singleWeaponCase.shopWeaponCaseCell local doubleWeaponCase = self.view.doubleRandomWeaponsCase if #upBoxList == 0 then doubleWeaponCase.gameObject:SetActive(false) singleWeaponCase.gameObject:SetActive(true) singleWeaponCase.stayTunedNode.gameObject:SetActive(true) singleWeaponCaseCell.gameObject:SetActive(false) local data = { length = 6, cell = singleWeaponCase.inputBindingGroupNaviDecorator, naviNode = singleWeaponCase.naviNode } self.m_firstNaviData = data table.insert(self.m_naviCellTable, { data }) end if #upBoxList == 1 then local boxData = upBoxList[1].goodsData singleWeaponCase.gameObject:SetActive(true) doubleWeaponCase.gameObject:SetActive(false) singleWeaponCaseCell.gameObject:SetActive(true) singleWeaponCase.stayTunedNode.gameObject:SetActive(false) local data = { length = 6, cell = singleWeaponCase.inputBindingGroupNaviDecorator, naviNode = singleWeaponCase.naviNode, goodsId = boxData.goodsId } self.m_firstNaviData = data table.insert(self.m_naviCellTable, { data }) self:_UpdateSingleLimitedWeapon(singleWeaponCaseCell, boxData, false) local poolId = Tables.shopGoodsTable[boxData.goodsTemplateId].weaponGachaPoolId local isRealTime, closeTimeDesc= CashShopUtils.GetGachaWeaponPoolCloseTimeShowDesc(poolId) local poolTimeNode = singleWeaponCaseCell.view.poolTimeNode poolTimeNode.endTimeTxt.text = closeTimeDesc poolTimeNode.endingTxt.gameObject:SetActive(isRealTime) end if #upBoxList >= 2 then local boxData1 = upBoxList[1].goodsData local boxData2 = upBoxList[2].goodsData singleWeaponCase.gameObject:SetActive(false) doubleWeaponCase.gameObject:SetActive(true) local weaponCaseCell1 = doubleWeaponCase.shopWeaponCaseCell1 local weaponCaseCell2 = doubleWeaponCase.shopWeaponCaseCell2 local data1 = { length = 3, cell = weaponCaseCell1.view.inputBindingGroupNaviDecorator, naviNode = weaponCaseCell1.view.naviNode, goodsId = boxData1.goodsId } local data2 = { length = 3, cell = weaponCaseCell2.view.inputBindingGroupNaviDecorator, naviNode = weaponCaseCell2.view.naviNode, goodsId = boxData2.goodsId } self.m_firstNaviData = data1 table.insert(self.m_naviCellTable, { data1, data2 }) self:_UpdateSingleLimitedWeapon(weaponCaseCell1, boxData1, true) self:_UpdateSingleLimitedWeapon(weaponCaseCell2, boxData2, true) local poolId1 = Tables.shopGoodsTable[boxData1.goodsTemplateId].weaponGachaPoolId local isRealTime1, closeTimeDesc1 = CashShopUtils.GetGachaWeaponPoolCloseTimeShowDesc(poolId1) weaponCaseCell1.view.poolTimeNode.endTimeTxt:SetAndResolveTextStyle(closeTimeDesc1) weaponCaseCell1.view.poolTimeNode.endingTxt.gameObject:SetActive(isRealTime1) local poolId2 = Tables.shopGoodsTable[boxData2.goodsTemplateId].weaponGachaPoolId local isRealTime2, closeTimeDesc2 = CashShopUtils.GetGachaWeaponPoolCloseTimeShowDesc(poolId2) weaponCaseCell2.view.poolTimeNode.endTimeTxt:SetAndResolveTextStyle(closeTimeDesc2) weaponCaseCell2.view.poolTimeNode.endingTxt.gameObject:SetActive(isRealTime2) end if #downBoxList == 0 then self.view.smallUpWeaponsRoot.gameObject:SetActive(false) else self.view.smallUpWeaponsRoot.gameObject:SetActive(true) local downBoxShowCount = #downBoxList local lastIsEmpty = false if downBoxShowCount % 2 > 0 then downBoxShowCount = downBoxShowCount + 1 lastIsEmpty = true end local naviLine = {} self.m_smallUpWeaponCache:Refresh(downBoxShowCount, function(cell, index) local goodsId = nil if index == downBoxShowCount and lastIsEmpty then cell.view.activateNode.gameObject:SetActive(false) cell.view.nullNode.gameObject:SetActive(true) else cell.view.activateNode.gameObject:SetActive(true) cell.view.nullNode.gameObject:SetActive(false) local goodsData = downBoxList[index].goodsData self:_SetupViewSmallUpWeaponCell(cell, goodsData) goodsId = goodsData.goodsId end table.insert(naviLine, { length = 3, cell = cell.view.inputBindingGroupNaviDecorator, goodsId = goodsId }) if index % 2 == 0 then table.insert(self.m_naviCellTable, naviLine) naviLine = {} end end) end end ShopWeaponCtrl._getGachaTimeByGoodsData = HL.Method(HL.Any).Return(HL.Number, HL.Number) << function(self, goodsData) local goodsCfg = Tables.shopGoodsTable[goodsData.goodsTemplateId] local poolId = goodsCfg.weaponGachaPoolId local _, poolInfo = GameInstance.player.gacha.poolInfos:TryGetValue(poolId) local openTime = poolInfo.openTime local closeTime = poolInfo.closeTime return openTime, closeTime end ShopWeaponCtrl._SetupViewSmallUpWeaponCell = HL.Method(HL.Any, HL.Any) << function(self, cell, goodsData) cell:InitCashShopItem(goodsData, true) local goodsCfg = Tables.shopGoodsTable[goodsData.goodsTemplateId] local poolId = goodsCfg.weaponGachaPoolId local weaponPoolCfg = Tables.gachaWeaponPoolTable[poolId] local gachaTypeCfg = Tables.gachaWeaponPoolTypeTable[weaponPoolCfg.type] local _, poolInfo = GameInstance.player.gacha.poolInfos:TryGetValue(poolId) local showHardGuarantee = poolInfo.upGotCount <= 0 local guaranteeNode = cell.view.guaranteeTextStateLayout if showHardGuarantee then guaranteeNode.gameObject:SetActive(true) guaranteeNode.stateController:SetState("OnlyOne") local remainNum = math.ceil((gachaTypeCfg.hardGuarantee - poolInfo.hardGuaranteeProgress) / 10) guaranteeNode.guaranteeGetTxt.text = string.format("%d ", remainNum) .. Language.ui_shop_entry_weapon_shop_numbers_1 else guaranteeNode.stateController:SetState("Again") local loopRewardInfos = CashShopUtils.GetGachaWeaponLoopRewardInfo(poolId) if not loopRewardInfos then guaranteeNode.gameObject:SetActive(false) return else guaranteeNode.gameObject:SetActive(true) table.sort(loopRewardInfos, function(a, b) return a.remainNeedPullCount < b.remainNeedPullCount end) local info = loopRewardInfos[1] local name = info.name local number = info.remainNeedPullCount guaranteeNode.guaranteeGetTxt.text = string.format(Language.LUA_CASH_SHOP_SMALL_UP_WEAPON_REPEAT_GUARANTEE_TEXT, number, name) end end local isRealTime, closeTimeDesc = CashShopUtils.GetGachaWeaponPoolCloseTimeShowDesc(poolId) cell.view.poolTimeNode.endTimeTxt.text = closeTimeDesc cell.view.poolTimeNode.endingTxt.gameObject:SetActive(isRealTime) cell.view.weaponsBagNameTxt.text = weaponPoolCfg.name local icon = weaponPoolCfg.smallPoolIcon local iconFar = weaponPoolCfg.smallPoolIconFar cell.view.iconWeaponBag:LoadSprite(UIConst.UI_SPRITE_SHOP_WEAPON_BOX, icon) if string.isEmpty(iconFar) then cell.view.iconWeaponBagFar.gameObject:SetActive(false) else cell.view.iconWeaponBagFar.gameObject:SetActive(true) cell.view.iconWeaponBagFar:LoadSprite(UIConst.UI_SPRITE_SHOP_WEAPON_BOX, iconFar) end end ShopWeaponCtrl._UpdateSingleLimitedWeapon = HL.Method(HL.Any, HL.Any, HL.Boolean) << function(self, weaponCaseCell, boxData, isDoublePool) local csGachaSys = GameInstance.player.gacha local goodsCfg = Tables.shopGoodsTable[boxData.goodsTemplateId] weaponCaseCell:InitCashShopItem(boxData, true) local poolId = goodsCfg.weaponGachaPoolId local _, poolInfo = csGachaSys.poolInfos:TryGetValue(poolId) if poolInfo == nil then logger.error("卡池信息不存在!卡池id:" .. poolId) return end local weaponPoolCfg = Tables.gachaWeaponPoolTable[poolId] local gachaTypeCfg = Tables.gachaWeaponPoolTypeTable[weaponPoolCfg.type] weaponCaseCell.view.poolNameTxt.text = weaponPoolCfg.name local uiPrefabName = isDoublePool and weaponPoolCfg.doublePoolNodeUIPrefab or weaponPoolCfg.poolNodeUIPrefab if weaponCaseCell.view.uiPrefabName ~= uiPrefabName then if weaponCaseCell.view.node then GameObject.Destroy(weaponCaseCell.view.node) end local path = string.format("Assets/Beyond/DynamicAssets/Gameplay/UI/Prefabs/CashShop/Widgets/WeaponPoolNode/%s.prefab", uiPrefabName) local prefab = self.loader:LoadGameObject(path) local obj = CSUtils.CreateObject(prefab, weaponCaseCell.view.weaponPoolNodeRoot) obj.name = weaponPoolCfg.id weaponCaseCell.view.uiPrefabName = uiPrefabName weaponCaseCell.view.node = obj end local showHardGuarantee = poolInfo.upGotCount <= 0 local guaranteeNode = weaponCaseCell.view.guaranteeNode if showHardGuarantee then local upWeaponId = weaponPoolCfg.upWeaponIds[0] local weaponItemCfg = Tables.itemTable[upWeaponId] local weaponCfg = Tables.weaponBasicTable[upWeaponId] local weaponTypeIconName = UIConst.WEAPON_EXHIBIT_WEAPON_TYPE_ICON_PREFIX .. weaponCfg.weaponType:ToInt() guaranteeNode.stateController:SetState("HardGuarantee") guaranteeNode.itemIcon:InitItemIcon(upWeaponId) guaranteeNode.rewardNameTxt.text = weaponItemCfg.name guaranteeNode.weaponTypeIcon:LoadSprite(UIConst.UI_SPRITE_WEAPON_EXHIBIT, weaponTypeIconName) local remainNum = math.ceil((gachaTypeCfg.hardGuarantee - poolInfo.hardGuaranteeProgress) / 10) guaranteeNode.guaranteeTxt.text = string.format("%d ", remainNum) .. Language.ui_shop_entry_weapon_shop_numbers_1 guaranteeNode.btn.onClick:RemoveAllListeners() guaranteeNode.btn.onClick:AddListener(function() CashShopUtils.ShowWikiWeaponPreview(poolId, upWeaponId) end) else guaranteeNode.stateController:SetState("LoopReward") local loopRewardInfos = CashShopUtils.GetGachaWeaponLoopRewardInfo(poolId) if not loopRewardInfos then guaranteeNode.gameObject:SetActive(false) return else guaranteeNode.gameObject:SetActive(true) table.sort(loopRewardInfos, function(a, b) return a.remainNeedPullCount < b.remainNeedPullCount end) local info = loopRewardInfos[1] guaranteeNode.itemIcon:InitItemIcon(info.itemId) guaranteeNode.rewardNameTxt.text = info.name guaranteeNode.guaranteeTxt.text = string.format("%d ", info.remainNeedPullCount) .. Language.ui_shop_entry_weapon_shop_numbers_2 guaranteeNode.btn.onClick:RemoveAllListeners() guaranteeNode.btn.onClick:AddListener(function() logger.info("武器卡池,up武器预览或宝箱预览") if info.isWeaponItemCase then UIManager:Open(PanelId.BattlePassWeaponCase, { itemId = info.itemId, isPreview = true }) else CashShopUtils.ShowWikiWeaponPreview(poolId, info.itemId) end end) end end end ShopWeaponCtrl.UpdateTimeLimitWeapons = HL.Method() << function(self) local now = CS.Beyond.DateTimeUtils.GetCurrentTimestampBySeconds() local _, weeklyBox, weeklyGoods = self.m_shopSystem:GetWeeklyWeaponData() local _, dailyBox, dailyGoods = self.m_shopSystem:GetDailyWeaponData() local weeklyCell = self.view.timeLimitWeapons.weeklyLimitWeapons local dailyCell = self.view.timeLimitWeapons.dailyLimitWeapons local naviDataLine = { } if weeklyGoods ~= nil then local weeklyGoodsInfo = {} for _, weeklyGood in pairs(weeklyGoods) do local goodsTableData = Tables.shopGoodsTable:GetValue(weeklyGood.goodsId) local displayItem = UIUtils.getRewardFirstItem(goodsTableData.rewardId) local itemId = displayItem.id local itemData = Tables.itemTable[itemId] table.insert(weeklyGoodsInfo, { goodsData = weeklyGood, rarity = itemData.rarity }) end table.sort(weeklyGoodsInfo, Utils.genSortFunction({"rarity"}, false)) weeklyCell.shopWeaponCell.gameObject:SetActive(weeklyGoods.Count >= 1) if weeklyGoods.Count >= 1 then weeklyCell.shopWeaponCell.gameObject:SetActive(true) weeklyCell.shopWeaponCell:InitCashShopItem(weeklyGoodsInfo[1].goodsData) table.insert(naviDataLine, { length = 2, cell = weeklyCell.shopWeaponCell.view.inputBindingGroupNaviDecorator, goodsId = weeklyGoodsInfo[1].goodsData.goodsId }) end weeklyCell.shopWeaponCell02.gameObject:SetActive(weeklyGoods.Count >= 2) if weeklyGoods.Count >= 2 then weeklyCell.shopWeaponCell02.gameObject:SetActive(true) weeklyCell.shopWeaponCell02:InitCashShopItem(weeklyGoodsInfo[2].goodsData) table.insert(naviDataLine, { length = 1, cell = weeklyCell.shopWeaponCell02.view.inputBindingGroupNaviDecorator, goodsId = weeklyGoodsInfo[2].goodsData.goodsId }) end local weeklyTime = weeklyCell.timeLimitTitleText local weeklyEndTime = GameInstance.player.shopSystem:GetWeaponGoodsTimeLimit(weeklyGoods[0]) + 1 if weeklyEndTime == 0 then weeklyEndTime = weeklyGoods[0].closeTimeStamp - DateTimeUtils.GetCurrentTimestampBySeconds() + 1 end weeklyTime.text = string.format(Language.LUA_SHOP_WEAPON_WEEKLY_TIME_LIMIT, Utils.appendUTC(Utils.timestampToDateYMDHM(weeklyEndTime + now))) else weeklyCell.shopWeaponCell.gameObject:SetActive(false) weeklyCell.shopWeaponCell02.gameObject:SetActive(false) table.insert(naviDataLine, { length = 3, cell = weeklyCell.expectLayout.expectLayout, goodsId = nil }) end weeklyCell.expectLayout.gameObject:SetActive(weeklyGoods == nil) weeklyCell.timeLimitNode.gameObject:SetActive(weeklyGoods ~= nil) if dailyGoods ~= nil then GameInstance.player.shopSystem:SortGoodsList(dailyGoods) for i = 1, 3 do local goodsCell = dailyCell["shopWeaponCell0" .. i] goodsCell.gameObject:SetActive(dailyGoods.Count >= i) if dailyGoods.Count >= i then goodsCell:InitCashShopItem(dailyGoods[i - 1]) table.insert(naviDataLine, { length = 1, cell = goodsCell.view.inputBindingGroupNaviDecorator, goodsId = dailyGoods[i-1].goodsId }) end end local dailyTime = dailyCell.timeLimitTitleText local dailyEndTime = GameInstance.player.shopSystem:GetWeaponGoodsTimeLimit(dailyGoods[0]) + 1 dailyTime.text = string.format(Language.LUA_SHOP_WEAPON_DAILY_TIME_LIMIT, Utils.appendUTC(Utils.timestampToDateYMDHM(dailyEndTime + now))) else for i = 1, 3 do local goodsCell = dailyCell["shopWeaponCell0" .. i] goodsCell.gameObject:SetActive(false) end table.insert(naviDataLine, { length = 3, cell = dailyCell.expectLayout.expectLayout, goodsId = nil }) end dailyCell.expectLayout.gameObject:SetActive(dailyGoods == nil) dailyCell.timeLimitNode.gameObject:SetActive(dailyGoods ~= nil) table.insert(self.m_naviCellTable, naviDataLine) end ShopWeaponCtrl.UpdatePermanentWeapon = HL.Method() << function(self) local _, box, goods = self.m_shopSystem:GetPermanentWeaponShopData() self.m_shopSystem:SortGoodsList(box) self.m_shopSystem:SortGoodsList(goods) local boxList = self:_GetGoodsDataInfoList(box) local goodsList = self:_GetGoodsDataInfoList(goods) local rowCount = (#boxList % 3 > 0) and (math.floor(#boxList / 3) + 1) or math.floor(#boxList / 3) local useGoodsNumber = (rowCount * 3 - #boxList) * 2 if useGoodsNumber > #goodsList then useGoodsNumber = #goodsList end local function setupGoodsFunc() if #goodsList > useGoodsNumber then local naviDataLine = {} local countPerLine = self.view.commonWeapons.container.constraintCount self.m_permanentGoodsCell:GraduallyRefresh( #goodsList - useGoodsNumber, PERMANENT_GOODS_CELL_REFRESH_WAIT_TIME, function(cell, index) cell.gameObject.name = tostring(index) local trueIndex = index + useGoodsNumber cell:InitCashShopItem(goodsList[trueIndex]) table.insert(naviDataLine, { length = 1, cell = cell.view.inputBindingGroupNaviDecorator, goodsId = goodsList[trueIndex].goodsId }) if index % countPerLine == 0 or index == #goodsList - useGoodsNumber then table.insert(self.m_naviCellTable, naviDataLine) naviDataLine = {} end end) else self.m_permanentGoodsCell:Refresh(0, function(cell, index) end) end end local sharedDataList = {} self.m_permanentBoxCell:GraduallyRefresh(rowCount, PERMANENT_BOX_CELL_REFRESH_WAIT_TIME, function(cell, index) cell.gameObject.name = tostring(index) cell.transform:SetSiblingIndex(index - 1) self:_SetupPermanentBoxCell(cell, index, rowCount, useGoodsNumber, boxList, goodsList, setupGoodsFunc, sharedDataList) end) end ShopWeaponCtrl._SetupPermanentBoxCell = HL.Method(HL.Any, HL.Number, HL.Number, HL.Number, HL.Table, HL.Table, HL.Function, HL.Table) << function(self, cell, index, rowCount, useGoodsNumber, boxList, goodsList, callback, sharedDataList) local lastRowIndex = index - 1 local lastRowIsFinish = false if lastRowIndex == 0 or (sharedDataList[lastRowIndex] and sharedDataList[lastRowIndex].isFinish) then lastRowIsFinish = true end local setupFunc = function() local naviDataLine = {} local boxCellCache = nil local goodsCellCache = nil if self.m_permanentBoxSubBoxCellDict[index] then boxCellCache = self.m_permanentBoxSubBoxCellDict[index] else boxCellCache = UIUtils.genCellCache(cell.shopWeaponSuperiorCell) self.m_permanentBoxSubBoxCellDict[index] = boxCellCache end if self.m_permanentBoxSubGoodsCellDict[index] then goodsCellCache = self.m_permanentBoxSubGoodsCellDict[index] else goodsCellCache = UIUtils.genCellCache(cell.shopWeaponCell) self.m_permanentBoxSubGoodsCellDict[index] = goodsCellCache end local setupGoodsFunc = function() local rowEndCallback = function() table.insert(self.m_naviCellTable, naviDataLine) local nextRowIndex = index + 1 if sharedDataList[nextRowIndex] and sharedDataList[nextRowIndex].setupFunc then sharedDataList[nextRowIndex].setupFunc() end if index == rowCount then callback() end end if index == rowCount and useGoodsNumber > 0 then goodsCellCache:GraduallyRefresh( useGoodsNumber, PERMANENT_BOX_CELL_ROW_REFRESH_WAIT_TIME, function(goodsCell, goodsIndex) goodsCell.gameObject.name = "goodsCell" .. tostring(goodsIndex) goodsCell:InitCashShopItem(goodsList[goodsIndex]) table.insert(naviDataLine, { length = 1, cell = goodsCell.view.inputBindingGroupNaviDecorator, goodsId = goodsList[goodsIndex].goodsId }) if goodsIndex == useGoodsNumber then rowEndCallback() end end ) else goodsCellCache:Refresh(0, nil) rowEndCallback() end end local startBoxIndex = 3 * (index - 1) + 1 local endBoxIndex = (3 * index <= #boxList) and (3 * index) or #boxList boxCellCache:GraduallyRefresh( endBoxIndex - startBoxIndex + 1, PERMANENT_BOX_CELL_ROW_REFRESH_WAIT_TIME, function(boxCell, boxIndex) boxCell.gameObject.name = "boxCell" .. tostring(boxIndex) local trueIndex = startBoxIndex + boxIndex - 1 boxCell:InitCashShopItem(boxList[trueIndex]) boxCell.view.cashShopItemTag.gameObject:SetActive(false) table.insert(naviDataLine, { length = 2, cell = boxCell.view.inputBindingGroupNaviDecorator, goodsId = boxList[trueIndex].goodsId }) if boxIndex == endBoxIndex - startBoxIndex + 1 then setupGoodsFunc() end end ) end if lastRowIsFinish then setupFunc() sharedDataList[index] = { isFinish = true, setupFunc = nil, } else sharedDataList[index] = { isFinish = false, setupFunc = setupFunc } end end ShopWeaponCtrl._OnShopRefresh = HL.Method() << function(self) local isOpen, shopDetailCtrl = UIManager:IsOpen(PanelId.ShopDetail) if isOpen then shopDetailCtrl:TryClose() end self:UpdateAll() end ShopWeaponCtrl._OnShopJumpEvent = HL.Method() << function(self) self:OnClickGoods() end ShopWeaponCtrl.OnGachaPoolInfoChanged = HL.Method() << function(self) self:UpdateUpWeapon() self:UpdateTimeLimitWeapons() end ShopWeaponCtrl.OnGachaPoolRoleDataChanged = HL.Method() << function(self) self:UpdateUpWeapon() self:UpdateTimeLimitWeapons() end ShopWeaponCtrl.ChooseLimitedWeaponPool = HL.Method(HL.Any) << function(self, boxData) PhaseManager:OpenPhase(PhaseId.GachaWeaponPool, { goodsData = boxData }) end ShopWeaponCtrl.UpdateAll = HL.Method() << function(self) self.m_naviCellTable = {} self:UpdateUpWeapon() self:UpdateTimeLimitWeapons() self:UpdatePermanentWeapon() self.m_currNaviRow = math.min(self.m_currNaviRow, #self.m_naviCellTable) local currRow = self.m_naviCellTable[self.m_currNaviRow] self.m_currNaviCol = math.min(self.m_currNaviCol, #currRow) local data = currRow[self.m_currNaviCol] self:_CustomNaviTarget(data) end ShopWeaponCtrl.OnClickGoods = HL.Method(HL.Opt(HL.Table)) << function(self, arg) local goodsId = arg.goods if goodsId then local goods = Tables.shopGoodsTable[goodsId] local shopId = goods.shopId local goodsData = self.m_shopSystem:GetShopGoodsData(shopId, goodsId) if goodsData == nil then logger.error(ELogChannel.UI, "商店商品数据为空") return end local isBox = string.isEmpty(goods.rewardId) if isBox then PhaseManager:OpenPhase(PhaseId.GachaWeaponPool, {goodsData = goodsData}) else UIManager:Open(PanelId.ShopDetail, goodsData) end return end if arg.sourceId and arg.targetId then PhaseManager:OpenPhase(PhaseId.CommonMoneyExchange, {sourceId = arg.sourceId, targetId = arg.targetId}) end end ShopWeaponCtrl._ProcessArg = HL.Method(HL.Any) << function(self, arg) if arg == nil or string.isEmpty(arg.goodsId) then return end local goodsId = arg.goodsId arg.goodsId = nil local goods = Tables.shopGoodsTable[goodsId] local shopId = goods.shopId local goodsData = self.m_shopSystem:GetShopGoodsData(shopId, goodsId) if goodsData == nil then logger.error(ELogChannel.UI, "商店商品数据为空") return end local isBox = string.isEmpty(goods.rewardId) if isBox then PhaseManager:OpenPhase(PhaseId.GachaWeaponPool, {goodsData = goodsData}, nil, true) else self:_StartCoroutine(function() UIManager:Open(PanelId.ShopDetail, goodsData) end) end return end ShopWeaponCtrl._GetGoodsDataInfoList = HL.Method(HL.Userdata).Return(HL.Table) << function(self, goodsDataList) local list = {} for i = 0, goodsDataList.Count - 1 do local goodsData = goodsDataList[i] table.insert(list, goodsData) end return list end ShopWeaponCtrl._InitShortCut = HL.Method() << function(self) if not DeviceInfo.usingController then return end self:BindInputPlayerAction("cashshop_navigation_4_dir_left", function() self:_OnGoLeft() end) self:BindInputPlayerAction("cashshop_navigation_4_dir_up", function() self:_OnGoUp() end) self:BindInputPlayerAction("cashshop_navigation_4_dir_right", function() self:_OnGoRight() end) self:BindInputPlayerAction("cashshop_navigation_4_dir_down", function() self:_OnGoDown() end) end ShopWeaponCtrl._OnGoLeft = HL.Method() << function(self) if self.m_currNaviCol == 1 then return end local table = self.m_naviCellTable[self.m_currNaviRow][self.m_currNaviCol - 1] self:_CustomNaviTarget(table) self.m_currNaviCol = self.m_currNaviCol - 1 end ShopWeaponCtrl._OnGoUp = HL.Method() << function(self) if self.m_currNaviRow == 1 then return end local leftLength = self:_GetCurrLeftLength() local index, data = self:_FindCellByLeftLength(self.m_currNaviRow - 1, leftLength) if data then self:_CustomNaviTarget(data) self.m_currNaviRow = self.m_currNaviRow - 1 self.m_currNaviCol = index end end ShopWeaponCtrl._OnGoRight = HL.Method() << function(self) local currRow = self.m_naviCellTable[self.m_currNaviRow] if self.m_currNaviCol == #currRow then return end local table = currRow[self.m_currNaviCol + 1] self:_CustomNaviTarget(table) self.m_currNaviCol = self.m_currNaviCol + 1 end ShopWeaponCtrl._OnGoDown = HL.Method() << function(self) logger.info("ShopWeaponCtrl._OnGoDown") if self.m_currNaviRow == #self.m_naviCellTable then return end local leftLength = self:_GetCurrLeftLength() local index, data = self:_FindCellByLeftLength(self.m_currNaviRow + 1, leftLength) if data then self:_CustomNaviTarget(data) self.m_currNaviRow = self.m_currNaviRow + 1 self.m_currNaviCol = index end end ShopWeaponCtrl._CustomNaviTarget = HL.Method(HL.Any) << function(self, data) if data == nil then return end if self.m_currNaviData and self.m_currNaviData.naviNode and DeviceInfo.usingController then self.m_currNaviData.naviNode.gameObject:SetActive(false) end if data.cell then UIUtils.setAsNaviTarget(data.cell) end if data.naviNode and DeviceInfo.usingController then data.naviNode.gameObject:SetActive(true) end self.m_currNaviData = data end ShopWeaponCtrl._GetCurrLeftLength = HL.Method().Return(HL.Int) << function(self) local currRow = self.m_naviCellTable[self.m_currNaviRow] local leftLength = 0 for i = 1, self.m_currNaviCol - 1 do local length = currRow[i].length leftLength = leftLength + length end return leftLength end ShopWeaponCtrl._FindCellByLeftLength = HL.Method(HL.Int, HL.Int).Return(HL.Any, HL.Any) << function(self, row, leftLength) local currRow = self.m_naviCellTable[row] local sum = 0 for i = 1, #currRow do local left = sum local right = sum + currRow[i].length if leftLength >= left and leftLength < right then return i, currRow[i] end sum = right end return nil, nil end ShopWeaponCtrl._ComputeSeeGoods = HL.Method() << function(self) local viewPortRect = self.view.scroll.viewport for idx, line in ipairs(self.m_naviCellTable) do local firstCell = line[1].cell local vectorArray = CS.System.Array.CreateInstance(typeof(Vector3), 4) firstCell.gameObject:GetComponent("RectTransform"):GetWorldCorners(vectorArray) local leftUp = vectorArray[0] local leftDown = vectorArray[3] local leftUpLocalPos = viewPortRect.transform:InverseTransformPoint(leftUp) local leftDownLocalPos = viewPortRect.transform:InverseTransformPoint(leftDown) local leftUpVisible = viewPortRect.rect:Contains(leftUpLocalPos) local leftDownVisible = viewPortRect.rect:Contains(leftDownLocalPos) if leftUpVisible or leftDownVisible then if lume.find(self.m_haveSeenLines, idx) == nil then table.insert(self.m_haveSeenLines, idx) end end end end HL.Commit(ShopWeaponCtrl)