Files
Endfield-Data/LuaScripts/UI/Panels/ShopRecommend/ShopRecommendCtrl.lua
2025-12-02 20:37:18 +07:00

623 lines
17 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.ShopRecommend
local tabDataPrototypeList = {
BattlePass = {
Panel = PanelId.ShopChoicenessBattlePass,
ShowPsStore = false,
isCashGoods = true,
CheckShowFunc = function()
return Utils.isSystemUnlocked(GEnums.UnlockSystemType.BPSystem) and BattlePassUtils.CheckBattlePassSeasonValid() and not BattlePassUtils.CheckPayTrackActive()
end
},
MonthlyPass = {
GetPanelIdsFunc = function()
return {
PanelId.ShopMonthlyPass,
PanelId.ShopMonthlyPass3D,
}
end,
OverrideCreatePanelFunc = function(self, tabData)
self.m_phase:CreateOrShowPhasePanelItemWrapper(PanelId.ShopMonthlyPass,
{
isRecommend = true,
goodsId = tabData.cashGoodsIds[1],
recommendId = tabData.id,
})
self.m_phase:CreateOrShowPhasePanelItemWrapper(PanelId.ShopMonthlyPass3D,
{
isDailyPopup = false,
})
end,
OverrideDestroyPanelFunc = function(self)
self.m_phase:RemovePhasePanelItemByIdWrapper(PanelId.ShopMonthlyPass)
self.m_phase:RemovePhasePanelItemByIdWrapper(PanelId.ShopMonthlyPass3D)
end,
CheckBottomFunc = function()
local canBuy = CashShopUtils.CheckCanBuyMonthlyPass()
return not canBuy
end,
ShowPsStore = true,
isCashGoods = true,
},
NewBieGift = {
Panel = PanelId.ShopChoicenessGiftBag,
CheckShowFunc = function(tabData)
local goodsIds = tabData.cashGoodsIds
local haveCanBuy = false
for _, goodsId in ipairs(goodsIds) do
local canBuy = CashShopUtils.CheckCanBuyCashShopGoods(goodsId) and
CashShopUtils.CheckCashShopGoodsIsOpen(goodsId)
if canBuy then
haveCanBuy = true
break
end
end
return haveCanBuy
end,
ShowPsStore = true,
isCashGoods = true,
},
NewBieGiftGroup = {
Panel = PanelId.ShopChoicenessGroupBag,
CheckShowFunc = function(tabData)
local goodsIds = tabData.cashGoodsIds
local haveCanBuy = false
for _, goodsId in ipairs(goodsIds) do
local canBuy = CashShopUtils.CheckCanBuyCashShopGoods(goodsId) and
CashShopUtils.CheckCashShopGoodsIsOpen(goodsId)
if canBuy then
haveCanBuy = true
break
end
end
return haveCanBuy
end,
ShowPsStore = true,
isCashGoods = true,
},
Gift = {
Panel = PanelId.ShopChoicenessGiftBag,
ShowPsStore = true,
isCashGoods = true,
},
Weapon = {
Panel = PanelId.ShopChoicenessWeapon,
CheckShowFunc = function(tabData)
local _, box = GameInstance.player.shopSystem:GetNowUpWeaponData()
if box == nil or box.Count <= 0 then
return false
end
if #tabData.cashGoodsIds <= 0 then
return false
end
local goodsId = tabData.cashGoodsIds[1]
local _, goodsCfg = Tables.shopGoodsTable:TryGetValue(goodsId)
if not goodsCfg then
logger.error("【商城推荐页-武器池推荐tab】 goods表中不存在该id" .. goodsId)
return false
end
local poolId = goodsCfg.weaponGachaPoolId
local _, poolInfo = GameInstance.player.gacha.poolInfos:TryGetValue(poolId)
if not poolInfo or not poolInfo.isOpenValid then
return false
end
for _, singleBox in pairs(box) do
if singleBox.goodsTemplateId == goodsId then
return true
end
end
return false
end,
},
GiftGroup = {
Panel = PanelId.ShopChoicenessGroupBag,
ShowPsStoreFunc = function(tabData)
for _, goodsId in ipairs(tabData.cashGoodsIds) do
local canBuy = CashShopUtils.CheckCanBuyCashShopGoods(goodsId) and
CashShopUtils.CheckCashShopGoodsIsOpen(goodsId)
if canBuy then
return true
end
end
return false
end,
isCashGoods = true,
OnNaviGoRightFunc = function(self)
local rightCtrl = self.m_phase.m_panel2Item[PanelId.ShopChoicenessGroupBag].uiCtrl
local ret = rightCtrl:OnRecommendSetNaviTarget()
return ret
end,
CheckNaviGoRightFunc = function(self)
local rightCtrl = self.m_phase.m_panel2Item[PanelId.ShopChoicenessGroupBag].uiCtrl
local ret = rightCtrl:CheckRecommendSetNaviTarget()
return ret
end,
},
}
ShopRecommendCtrl = HL.Class('ShopRecommendCtrl', uiCtrl.UICtrl)
ShopRecommendCtrl.m_tabDataList = HL.Field(HL.Table)
ShopRecommendCtrl.m_showTabDataList = HL.Field(HL.Table)
ShopRecommendCtrl.m_currTabId = HL.Field(HL.String) << ""
ShopRecommendCtrl.m_getTabCellFunc = HL.Field(HL.Function)
ShopRecommendCtrl.m_goRightGroup = HL.Field(HL.Any)
ShopRecommendCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_SDK_PRODUCT_INFO_UPDATE] = '_OnReceiveRefreshMsg',
[MessageConst.ON_CASH_SHOP_PLATFORM_DATA_REFRESH] = '_OnReceiveRefreshMsg',
[MessageConst.ON_READ_CASH_SHOP_GOODS] = '_OnReceiveRefreshMsg',
}
ShopRecommendCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_phase = arg.phase
self.m_getTabCellFunc = UIUtils.genCachedCellFunction(self.view.cashShopVerticalTabList.scrollList)
self.view.cashShopVerticalTabList.scrollList.onUpdateCell:AddListener(function(obj, index)
local cell = self.m_getTabCellFunc(obj)
local tabData = self.m_showTabDataList[LuaIndex(index)]
cell.cellNameTxt.text = tabData.Name
cell.cellNameShadownTxt.text = tabData.Name
cell.toggle.onValueChanged:RemoveAllListeners()
cell.toggle.onValueChanged:AddListener(function(isOn)
if isOn then
self:_OnTabClick(tabData)
end
end)
cell.stateController:SetState("NOIcon")
local isNew = false
if tabData.isCashGoods then
local goodsIds = { }
for _, goodsId in ipairs(tabData.cashGoodsIds) do
local canBuy = CashShopUtils.CheckCanBuyCashShopGoods(goodsId) and
CashShopUtils.CheckCashShopGoodsIsOpen(goodsId)
if canBuy then
table.insert(goodsIds, goodsId)
end
end
isNew = CashShopUtils.CheckCashShopNewCashGoodsRedDot(goodsIds)
cell.cellTagNode.tagNew.gameObject:SetActive(isNew)
end
if isNew then
return
end
local tagList = tabData.tagList
local tagRoot = cell.cellTagNode
for _, tagId in pairs(tagList) do
local tagData = Tables.CashShopGiftPackTagTable[tagId]
local style = tagData.style
local value = tagData.value
local tagCell = tagRoot[style]
if tagCell ~= nil then
tagCell.gameObject:SetActive(true)
local haveValue = not string.isEmpty(value)
local tagText = tagCell.tagText
local line = tagCell.lineImg
if tagText ~= nil then
tagText.gameObject:SetActive(haveValue)
tagText.text = value
end
if line ~= nil then
line.gameObject:SetActive(haveValue)
end
end
end
end)
self:_InitTabData()
self:_InitShortCut()
self:_RefreshShowTabData()
self:_RefreshUI()
end
ShopRecommendCtrl.OnShow = HL.Override() << function(self)
Notify(MessageConst.CASH_SHOP_SHOW_WALLET_BAR, {
moneyIds = {Tables.globalConst.originiumItemId, Tables.globalConst.diamondItemId},
})
end
ShopRecommendCtrl.OnClose = HL.Override() << function(self)
end
ShopRecommendCtrl._InitShortCut = HL.Method() << function(self)
self.m_goRightGroup = InputManagerInst:CreateGroup(self.view.inputGroup.groupId)
self:BindInputPlayerAction("cashshop_giftpack_goto_right", function()
self:_OnGoRight()
end, self.m_goRightGroup)
self:BindInputPlayerAction("cashshop_giftpack_goto_right_2", function()
self:_OnGoRight()
end, self.m_goRightGroup)
end
ShopRecommendCtrl._OnGoRight = HL.Method() << function(self)
local ret = false
local tabData = self:_GetTabDataById(self.m_currTabId)
if tabData.OnNaviGoRightFunc then
ret = tabData.OnNaviGoRightFunc(self)
end
if ret then
InputManagerInst:ToggleGroup(self.m_goRightGroup, false)
end
end
ShopRecommendCtrl._CheckCanGoRight = HL.Method().Return(HL.Boolean) << function(self)
local ret = false
local tabData = self:_GetTabDataById(self.m_currTabId)
if tabData.CheckNaviGoRightFunc then
ret = tabData.CheckNaviGoRightFunc(self)
end
return ret
end
ShopRecommendCtrl._GetTabDataById = HL.Method(HL.String).Return(HL.Table) << function(self, id)
for _, tabData in ipairs(self.m_tabDataList) do
if tabData.id == id then
return tabData
end
end
return nil
end
ShopRecommendCtrl._InitTabData = HL.Method() << function(self)
self.m_tabDataList = {}
for id, data in pairs(Tables.CashShopRecommendTable) do
local foundPrototype = tabDataPrototypeList[data.type]
if foundPrototype == nil then
logger.error("no prototype data for id: " .. id)
else
local cashGoodsIds = {}
for _, goodsId in pairs(data.cashGoodsIdList) do
table.insert(cashGoodsIds, goodsId)
end
local haveCfgTabData, cfgTabData = Tables.CashshopShopTabDataTable:TryGetValue(id)
local tagList = {}
if haveCfgTabData then
for _, tag in pairs(cfgTabData.tagList) do
table.insert(tagList, tag)
end
end
local tabData = {
id = id,
type = data.type,
Name = data.name,
cashGoodsIds = cashGoodsIds,
Priority = data.priority,
tagList = tagList,
}
for k, v in pairs(foundPrototype) do
tabData[k] = v
end
table.insert(self.m_tabDataList, tabData)
end
end
end
ShopRecommendCtrl._RefreshShowTabData = HL.Method() << function(self)
self.m_showTabDataList = {}
local topShowList = {}
local bottomShowList = {}
for _, tabData in ipairs(self.m_tabDataList) do
local showFunc = tabData.CheckShowFunc
if showFunc == nil or showFunc(tabData) == true then
local bottomFunc = tabData.CheckBottomFunc
if bottomFunc == nil or bottomFunc() == false then
table.insert(topShowList, tabData)
else
table.insert(bottomShowList, tabData)
end
else
logger.info(string.format("[ShopRecommendCtrl] id:[%s] CheckShowFunc未通过不显示", tabData.id))
end
end
table.sort(topShowList, Utils.genSortFunction({ "Priority" }, true))
table.sort(bottomShowList, Utils.genSortFunction({ "Priority" }, true))
for _, tabData in ipairs(topShowList) do
table.insert(self.m_showTabDataList, tabData)
end
for _, tabData in ipairs(bottomShowList) do
table.insert(self.m_showTabDataList, tabData)
end
local willRemoveIdx = nil
for i, tabData in ipairs(self.m_showTabDataList) do
if tabData.type == "NewBieGiftGroup" then
local found = nil
for _, foundTabData in ipairs(self.m_showTabDataList) do
if foundTabData.type == "NewBieGift" then
found = foundTabData
break
end
end
if found ~= nil then
willRemoveIdx = i
break
end
end
end
if willRemoveIdx ~= nil then
table.remove(self.m_showTabDataList, willRemoveIdx)
end
end
ShopRecommendCtrl._RefreshUI = HL.Method() << function(self)
self.view.cashShopVerticalTabList.scrollList:UpdateCount(#self.m_showTabDataList)
if string.isEmpty(self.m_currTabId) then
self:_SetTabByIndex(1)
end
end
ShopRecommendCtrl._SetTabByIndex = HL.Method(HL.Int) << function(self, index)
if #self.m_showTabDataList >= index then
local obj = self.view.cashShopVerticalTabList.scrollList:Get(CSIndex(index))
local cell = self.m_getTabCellFunc(obj)
UIUtils.setAsNaviTarget(cell.toggle)
cell.toggle:SetIsOnWithoutNotify(true)
self:_OnTabClick(self.m_showTabDataList[index])
end
end
ShopRecommendCtrl.NaviTargetCurrTab = HL.Method() << function(self)
InputManagerInst:ToggleGroup(self.m_goRightGroup, true)
local foundTabData = nil
local foundIndex = 0
for i = 1, #self.m_showTabDataList do
local tabData = self.m_showTabDataList[i]
if tabData.id == self.m_currTabId then
foundTabData = tabData
foundIndex = i
break
end
if foundTabData ~= nil then
break
end
end
if foundTabData ~= nil then
local obj = self.view.cashShopVerticalTabList.scrollList:Get(CSIndex(foundIndex))
local cell = self.m_getTabCellFunc(obj)
UIUtils.setAsNaviTarget(cell.toggle)
end
end
ShopRecommendCtrl._OnTabClick = HL.Method(HL.Table) << function(self, tabData)
if self.m_currTabId == tabData.id then
logger.info("click same tab")
return
end
local oldTabData = self:_GetTabDataById(self.m_currTabId)
if oldTabData ~= nil then
if oldTabData.OverrideDestroyPanelFunc ~= nil then
oldTabData.OverrideDestroyPanelFunc(self)
else
self.m_phase:RemovePhasePanelItemByIdWrapper(oldTabData.Panel)
end
end
if tabData.OverrideCreatePanelFunc ~= nil then
tabData.OverrideCreatePanelFunc(self, tabData)
else
self.m_phase:CreateOrShowPhasePanelItemWrapper(tabData.Panel, tabData)
end
self.m_currTabId = tabData.id
UIManager:SetTopOrder(PanelId.CashShop)
UIManager:SetTopOrder(PanelId.ShopRecommend)
self:_RefreshControllerHintPlaceHolder()
if tabData.ShowPsStoreFunc ~= nil then
local show = tabData.ShowPsStoreFunc(tabData)
if show then
self.m_phase:ShowPsStore()
else
self.m_phase:HidePsStore()
end
else
if tabData.ShowPsStore then
self.m_phase:ShowPsStore()
else
self.m_phase:HidePsStore()
end
end
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.Recommend,
tabData.id
)
else
EventLogManagerInst:GameEvent_ShopPageView(
"",
CashShopConst.CashShopCategoryType.Recommend,
tabData.id
)
end
end
ShopRecommendCtrl.GetCurrTabId = HL.Method().Return(HL.String) << function(self)
return self.m_currTabId
end
ShopRecommendCtrl.SetCurrTabId = HL.Method(HL.String) << function(self, tabId)
local foundTabData = nil
local foundIndex = 0
for i = 1, #self.m_showTabDataList do
local tabData = self.m_showTabDataList[i]
if tabData.id == tabId then
foundTabData = tabData
foundIndex = i
break
end
if foundTabData ~= nil then
break
end
end
if foundTabData ~= nil then
self:_SetTabByIndex(foundIndex)
end
end
ShopRecommendCtrl._OnReceiveRefreshMsg = HL.Method() << function(self)
logger.info("ShopRecommendCtrl: 收到msg刷新页面")
self:_InitTabData()
self:_RefreshShowTabData()
self:_RefreshUI()
end
ShopRecommendCtrl._RefreshControllerHintPlaceHolder = HL.Method() << function(self)
local args = {
self.view.inputGroup.groupId,
self.m_phase.cashShopCtrl.view.inputGroup.groupId,
}
local canGoRight = self:_CheckCanGoRight()
InputManagerInst:ToggleGroup(self.m_goRightGroup, canGoRight)
if canGoRight then
table.insert(args, self.m_goRightGroup)
end
local tabData = self:_GetTabDataById(self.m_currTabId)
if tabData.GetPanelIdsFunc then
local panelIds = tabData.GetPanelIdsFunc()
for _, panelId in ipairs(panelIds) do
table.insert(args, self.m_phase.m_panel2Item[panelId].uiCtrl.view.inputGroup.groupId)
end
else
table.insert(args, self.m_phase.m_panel2Item[tabData.Panel].uiCtrl.view.inputGroup.groupId)
end
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder(args)
end
HL.Commit(ShopRecommendCtrl)