ro-webgl/Assets/Lua/UI/UIRuneShop/UIRuneShopView.lua

1327 lines
42 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 UIRuneShopView = require("UIRuneShop/UIRuneShopView_Generate")
local FirstBuyBgIconPath = 'ShopIcons/txt_club_first'
local ExtraBuyBgIconPath = 'ShopIcons/txt_club_free_extra_cn'
local RuneShopRewardsPath = 'UIRuneShop/RewardsBoxItem'
local lastClickLogTime
local lastClickNum
--[[
月卡
type = Enum.RuneShopType.MonthCard
礼包
type = Enum.RuneShopType.Gifts
subtype = Enum.RuneShopSubType.Daily
subtype = Enum.RuneShopSubType.Week
subtype = Enum.RuneShopSubType.Month
金币
type = Enum.RuneShopType.Gifts
subtype = Enum.RuneShopSubType.Gold
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIRuneShop,
{ shopType= , shopSubType= })
]]
--region 生命周期
function UIRuneShopView:OnAwake(data)
self.controller = require("UIRuneShop/UIRuneShopCtr"):new()
self.controller:Init(self)
self.controller:SetData(data)
end
function UIRuneShopView:FillContent(data, uiBase)
self.uiBase = uiBase
local gameObject = self.uiBase:GetRoot()
if gameObject ~= nil then
self.gameObject = gameObject
self.transform = gameObject.transform
end
self:InitGenerate(self.transform, data)
self:Init()
end
function UIRuneShopView:AddEventListener()
ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name, UIEventNames.COIN_CHANGED, self, self.RefreshCoinView)
ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name, UIEventNames.DIAMOND_CHANGED, self,
self.RefreshGoldView)
ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name, UIEventNames.VIP_LV_CHANGED, self, self
.RefreshVipView)
ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name, UIEventNames.RUNE_SHOP_DATA_CHANGED, self,
self.OnRuneShopDataChanged)
ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name, UIEventNames.RUNE_SHOP_REWARDS_DATA_CHANGED, self,
self.RefreshShopView)
ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name, UIEventNames.UI_CLOSEED_TASK_PAGE, self,
self.OnCloseTask)
ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name, UIEventNames.UI_TASK_JUMP, self, self.OnCloseAirShip)
ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name, UIEventNames.RED_POINT_MGR_NOTICE, self,
self.OnRPNotify)
end
function UIRuneShopView:RemoveEventListener()
ManagerContainer.LuaEventMgr:Unregister(self.uiData.name)
end
function UIRuneShopView:AddUIEventListener()
self.uiBase:AddButtonUniqueEventListener(self.btnBack.button, self, self.OnClickCloseBtn)
self.uiBase:AddButtonUniqueEventListener(self.btnVIP.button, self, self.OnClickVipBtn)
end
function UIRuneShopView:Init()
self.controller:InitData()
self.itemStart = true
lastClickLogTime = nil
lastClickNum = nil
self.giftsBox.scrollView.loopGridView:InitGridView(0, function(loopGridView, itemIdx, row, column)
return self:GetItemByRowColumnGifts(loopGridView, itemIdx, row, column)
end, nil, nil)
--self:Init_loopview_limited()
self:RefreshShopView(true)
self:InitToggle()
end
function UIRuneShopView:OnHide()
end
function UIRuneShopView:OnShow(data)
if data then
self.controller:SetData(data)
self.controller:InitData()
end
self:RefreshShopView(true)
--
end
function UIRuneShopView:OnClose()
end
function UIRuneShopView:OnDispose()
self:DisposeRefreshTimer()
self.giftsBox.scrollView.loopGridView:Dispose()
self.limitedBox.scrollView.loopGridView:Dispose()
if self.rewardsBoxItem then
self.rewardsBoxItemLua.scrollView.loopGridView:Dispose()
end
if self.seqId then
ManagerContainer.ResMgr:UnloadAssetBySeqId(self.seqId)
self.seqId = nil
end
if self.rewardsBoxItem then
ManagerContainer.ResMgr:RecycleGO(Constants.UIPath, RuneShopRewardsPath, self.rewardsBoxItem.gameObject)
self.rewardsBoxItem = nil
self.isInited = false
end
lastClickLogTime = nil
lastClickNum = nil
self.controller:OnDispose()
end
--endregion 生命周期
--region 事件订阅
function UIRuneShopView:RefreshCoinView()
self.coin.number.text.text = CommonUtil.FormatNumber(self.controller:GetOwnResCountByItemId(Enum.ItemType.Coin))
end
function UIRuneShopView:RefreshGoldView()
self.gold.number.text.text = CommonUtil.FormatNumber(self.controller:GetOwnResCountByItemId(Enum.ItemType.Diamond))
end
function UIRuneShopView:RefreshVipView()
local curVipLv = self.controller:GetCurVipLv()
local vipCfg = ManagerContainer.CfgMgr:GetVipCfgById(curVipLv)
self.vipIcon.image.sprite = nil
self.vipIcon.image.enabled = false
self.vipFrame.image.sprite = nil
self.vipFrame.image.enabled = false
if not vipCfg then
self.vipNameTxt.text.text = ''
return
end
CommonUtil.LoadIcon(self, vipCfg.BigIcon, function(sprite)
if sprite then
self.vipIcon.image.sprite = sprite
self.vipIcon.image.enabled = true
end
end)
CommonUtil.LoadIcon(self, vipCfg.BigFrame, function(sprite)
if sprite then
self.vipFrame.image.sprite = sprite
self.vipFrame.image.enabled = true
end
end)
self.vipNameTxt.text.text = string.formatbykey(vipCfg.Name)
end
function UIRuneShopView:OnRuneShopDataChanged(runeShopType, runeShopSubType)
if runeShopType ~= self.controller:GetShopType() then return end
local curRuneShopSubType = self.controller:GetShopSubType()
if curRuneShopSubType and runeShopSubType ~= curRuneShopSubType then return end
self.controller:RefreshCurShopData()
self:RefreshShopView()
end
function UIRuneShopView:RefreshShopView(resetPos)
self:StopAndClearRefreshTimer()
local shopType = self.controller:GetShopType()
self.monthBox:SetActive(false)
self.giftsBox:SetActive(false)
self.limitedBox:SetActive(false)
self.rewardsBox:SetActive(false)
self.rewardsExpBox:SetActive(false)
LogWarning('shopType' .. tostring(shopType))
if shopType == Enum.RuneShopType.MonthCard then
self.monthBox:SetActive(true)
self:RefreshMonthCardView()
self.textBox.text.text = string.formatbykey('DscClub01')
elseif shopType == Enum.RuneShopType.Gifts then
self.giftsBox:SetActive(true)
self:RefreshGiftsView(resetPos)
self.textBox.text.text = string.formatbykey('DscClub02')
elseif shopType == Enum.RuneShopType.LimitTime then
self.limitedBox:SetActive(true)
self:RefreshLimitedView(resetPos)
self.textBox.text.text = string.formatbykey('DscClub03')
elseif shopType == Enum.RuneShopType.Rewards then
self.rewardsBox:SetActive(true)
self.rewardsExpBox:SetActive(true)
if self.rewardsBoxItem then
self:RefreshRewardsView()
else
self.seqId = ManagerContainer.ResMgr:LuaLoadAssets(Enum.ResourceType.GameObject, Constants.UIPath,
{ RuneShopRewardsPath }, self, self.AsyncLoadRewards)
end
self.textBox.text.text = string.formatbykey('DscClub04')
end
end
function UIRuneShopView:OnCloseTask()
ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_EXPLORE_INFO_REQ)
end
function UIRuneShopView:OnCloseAirShip()
ManagerContainer.LuaUIMgr:Close(Enum.UIPageName.UIRuneShop)
end
function UIRuneShopView:OnRPNotify(rpType)
if rpType ~= Enum.RPNotifyType.RuneShopLimitGift then
return
end
if Enum.RuneShopType.LimitTime ~= self.controller:GetShopType() then return end
local curRuneShopSubType = self.controller:GetShopSubType()
if curRuneShopSubType and nil ~= curRuneShopSubType then return end
self:RefreshShopView()
end
--endregion 事件订阅
--region 按钮绑定
function UIRuneShopView:OnClickCloseBtn()
ManagerContainer.LuaUIMgr:OpenSourceUI(self)
end
function UIRuneShopView:OnClickVipBtn()
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIVip)
end
--endregion 按钮绑定
function UIRuneShopView:InitToggle()
self.bottomToggleData = {}
self.bottomToggleList = {
[1] = self.bottomTabBar.tabMonthCard,
[2] = self.bottomTabBar.tabGift,
[3] = self.bottomTabBar.tabCoin,
}
self.giftToggleData = {}
self.giftToggleList = {
[1] = self.giftTabBar.tabGiftDaily,
[2] = self.giftTabBar.tabGiftWeekly,
[3] = self.giftTabBar.tabGiftMonthly,
}
-- 根据当前shopType设置底部标签页默认选中索引
local shopType = self.controller:GetShopType()
local shopSubType = self.controller:GetShopSubType()
-- 根据当前shopSubType设置礼包标签页默认选中索引
local giftDefaultIndex = 1
if shopSubType == Enum.RuneShopSubType.Week then
giftDefaultIndex = 2 -- 周礼包
elseif shopSubType == Enum.RuneShopSubType.Month then
giftDefaultIndex = 3 -- 月礼包
end
CommonUtil.CreateToggleMouduleOnlyBtns(self,
self.giftToggleData, self.giftTabBar.toggleGroup, giftDefaultIndex,
self.OnClickGiftTab, self)
local bottomDefaultIndex = 1
if shopType == Enum.RuneShopType.Gifts then
if shopSubType == Enum.RuneShopSubType.Gold then
bottomDefaultIndex = 3 -- 金币
else
bottomDefaultIndex = 2 -- 礼包
end
end
CommonUtil.CreateToggleMouduleOnlyBtns(self,
self.bottomToggleData, self.bottomTabBar.toggleGroup, bottomDefaultIndex,
self.OnClickBottomTab, self)
end
--[[
Enum.RuneShopType.MonthCard
Enum.RuneShopType.Gifts
Enum.RuneShopType.LimitTime
Enum.RuneShopType.Rewards
Enum.RuneShopSubType.Daily
Enum.RuneShopSubType.Week
Enum.RuneShopSubType.Month
Enum.RuneShopSubType.Gold
]]
function UIRuneShopView:OnClickBottomTab(index)
local type = 1
local subtype = 1
local title = ""
if index == 1 then --月卡
title = "月卡"
type = Enum.RuneShopType.MonthCard
elseif index == 2 then --礼包
title = "礼包"
type = Enum.RuneShopType.Gifts
subtype = Enum.RuneShopSubType.Daily
self.giftTabBar:SetActive(true)
elseif index == 3 then --金币
title = "金币"
type = Enum.RuneShopType.Gifts
subtype = Enum.RuneShopSubType.Gold
self.giftTabBar:SetActive(false)
end
self.text_title.text.text = title
self.controller:ChangeShopType(type)
self:RefreshShopView(true)
if type ~= Enum.RuneShopType.MonthCard then
self.controller:ChangeShopSubType(subtype)
self:RefreshGiftsView(true)
end
end
function UIRuneShopView:OnClickGiftTab(index)
local type = 1
if index == 1 then --日礼包
type = Enum.RuneShopSubType.Daily
elseif index == 2 then --周礼包
type = Enum.RuneShopSubType.Week
elseif index == 3 then --月礼包
type = Enum.RuneShopSubType.Month
end
self.controller:ChangeShopSubType(type)
self:RefreshGiftsView(true)
end
--region 月卡
function UIRuneShopView:RefreshMonthCardView()
self:RefreshOneMonthCardView(self.monthCard1, 1)
self:RefreshOneMonthCardView(self.monthCard2, 2)
end
function UIRuneShopView:OnClickMonthCardPrice(button, params)
local id = params[0]
local errorCodeKey = self.controller:SendPay(id)
if not errorCodeKey then
ManagerContainer.LuaUIMgr:ErrorNoticeDisplay(errorCodeKey)
end
end
function UIRuneShopView:RefreshOneMonthCardView(itemLua, idx)
local showGoodsDatas = self.controller:GetShowGoodsDatas()
if not showGoodsDatas then
itemLua:SetActive(false)
return
end
local showGoodsData = showGoodsDatas[idx]
if not showGoodsData then
itemLua:SetActive(false)
return
end
itemLua:SetActive(true)
local cfgData = showGoodsData:GetCfgData()
local buyRewards = cfgData.BuyReward
if buyRewards then
local buyReward = buyRewards[1]
if buyReward then
self:RefreshCurrenyItem(itemLua.buyReward1, buyReward[1], buyReward[2], true)
else
self:RefreshCurrenyItem(itemLua.buyReward1)
end
buyReward = buyRewards[2]
if buyReward then
self:RefreshCurrenyItem(itemLua.buyReward2, buyReward[1], buyReward[2], true)
else
self:RefreshCurrenyItem(itemLua.buyReward2)
end
else
self:RefreshCurrenyItem(itemLua.buyReward1)
self:RefreshCurrenyItem(itemLua.buyReward2)
end
local dayRewards = cfgData.DayReward
if dayRewards then
local dayReward = dayRewards[1]
if dayReward then
self:RefreshCurrenyItem(itemLua.dailyReward, dayReward[1], dayReward[2], true)
else
self:RefreshCurrenyItem(itemLua.dailyReward)
end
else
self:RefreshCurrenyItem(itemLua.dailyReward)
end
local totalRewards = cfgData.TotalReward
if totalRewards then
local totalReward = totalRewards[1]
if totalReward then
self:RefreshCurrenyItem(itemLua.totalReward, totalReward[1], totalReward[2], true)
else
self:RefreshCurrenyItem(itemLua.totalReward)
end
else
self:RefreshCurrenyItem(itemLua.totalReward)
end
local price = showGoodsData:GetPrice()
if price <= 0 then
itemLua.presentPrice.number.text.text = string.formatbykey('Free')
else
itemLua.presentPrice.number.text.text = tostring(price)
end
local timerStr, outTime = showGoodsData:CalculateLimitTime()
if not outTime then
self:StartRefreshTimer(itemLua, showGoodsData)
itemLua.textDsc.text.text = string.formatbykey('DscClubMonth2', timerStr)
itemLua.active:SetActive(true)
itemLua.unActive:SetActive(false)
else
self:StopRefreshTimer(itemLua)
local mdec = cfgData.Monthdec
if mdec then
itemLua.textDsc.text.text = string.formatbykey(cfgData.Monthdec)
else
itemLua.textDsc.text.text = ""
end
itemLua.active:SetActive(false)
itemLua.unActive:SetActive(true)
end
self.uiBase:AddButtonUniqueEventListener(itemLua.presentPrice.button, self, self.OnClickMonthCardPrice,
showGoodsData:GetId())
end
function UIRuneShopView:RefreshCurrenyItem(itemLua, itemCfgId, itemNum, ignoreIcon)
if not itemCfgId or not itemNum then
itemLua:SetActive(false)
return
end
itemLua.number.text.text = CommonUtil.FormatNumber(itemNum)
itemLua:SetActive(true)
if ignoreIcon then return end
itemLua.icon.image.sprite = nil
itemLua.icon.image.enabled = false
local itemCfgData = ManagerContainer.CfgMgr:GetItemById(itemCfgId)
if itemCfgData then
CommonUtil.LoadIcon(self, itemCfgData.MiniIcon, function(sprite)
if sprite then
itemLua.icon.image.sprite = sprite
itemLua.icon.image.enabled = true
end
end)
end
end
--endregion 月卡
--region 礼包
function UIRuneShopView:OnClickGiftItem(button, params)
local id = params[0]
local runeShopType = self.controller:GetShopType()
local runeShopSubType = self.controller:GetShopSubType()
if runeShopType == Enum.RuneShopType.Gifts then
if runeShopSubType == Enum.RuneShopSubType.Gold then
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIRuneShopGoldBuyTips, { runeShopType, runeShopSubType, id })
return
end
end
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIRuneShopBuyTips, { runeShopType, runeShopSubType, id })
end
function UIRuneShopView:OnClickGiftPrice(button, params)
-- 直接发起支付
local id = params[0]
local errorCodeKey = self.controller:SendPay(id)
if not errorCodeKey then
ManagerContainer.LuaUIMgr:ErrorNoticeDisplay(errorCodeKey)
end
end
function UIRuneShopView:RefreshGiftsView(resetPos)
local shopSubType = self.controller:GetShopSubType()
local endTime = self.controller:GetRemainTime()
if endTime then
self:StartRefreshTimer(self, true)
if endTime < 0 then endTime = 0 end
self.timeBox:SetActive(true)
self.timeBox.textTime.text.text = string.formatbykey('RuneShopRefreshTime',
DateTimeUtil.convertSeconds2TimeStr1(endTime, true, true, false))
else
self:StopRefreshTimer(self)
self.timeBox:SetActive(false)
end
local showGoodsDatas = self.controller:GetShowGoodsDatas()
local length = (showGoodsDatas and #showGoodsDatas or 0)
if resetPos then
self.giftsBox.scrollView.loopGridView:RefreshListByIndex(length, 0)
else
self.giftsBox.scrollView.loopGridView:RefreshListByIndex(length)
end
end
function UIRuneShopView:GetItemByRowColumnGifts(loopGridView, itemIdx, row, column)
local data = self.controller:GetShowGoodsDataByIdx(itemIdx + 1)
if not data then return nil end
local item = loopGridView:NewListViewItem('RuneShopGoodsItem')
local itemLua = CommonUtil.BindGridViewItem2Lua(self, 'RuneShopGoodsItem', item.gameObject)
if itemLua then
itemLua.itemIcon.image.sprite = nil
itemLua.itemIcon.image.enabled = false
local cfgData = data.cfgData
if cfgData then
CommonUtil.LoadIcon(self, cfgData.Pic, function(sprite)
if sprite then
itemLua.itemIcon.image.sprite = sprite
itemLua.itemIcon.image.enabled = true
end
end, itemLua, 'ItemIcon')
itemLua.itemName.text.text = string.formatbykey(cfgData.Name)
if cfgData.FirstBuyReward and #cfgData.FirstBuyReward > 0 and data:IsFirstBuy() then
itemLua.discount:SetActive(true)
itemLua.discount.text.text.text = string.formatbykey('LabelFirst')
self:RefreshGiftsItem(itemLua, FirstBuyBgIconPath, cfgData.FirstBuyPic, cfgData.Reward)
elseif cfgData.ExtraBuyReward and #cfgData.ExtraBuyReward > 0 then
itemLua.discount:SetActive(true)
itemLua.discount.text.text.text = string.formatbykey('LabelExtra')
self:RefreshGiftsItem(itemLua, ExtraBuyBgIconPath, cfgData.ExtraBuyPic, cfgData.Reward)
else
itemLua.discount:SetActive(false)
self:RefreshGiftsItem(itemLua, nil, nil, cfgData.Reward)
end
else
itemLua.discount:SetActive(false)
itemLua.itemName.text.text = ''
itemLua.specialReward:SetActive(false)
itemLua.goodsItems:SetActive(false)
end
local remainBuyNum = data:GetRemainBuyNum()
if remainBuyNum >= 0 then
itemLua.purchaseLimit:SetActive(true)
itemLua.purchaseLimit.text.text = string.formatbykey('RuneShopLimitBuy', tostring(remainBuyNum))
else
itemLua.purchaseLimit:SetActive(false)
end
local price = data:GetPrice()
if price <= 0 then
itemLua.presentPrice.number.text.text = string.formatbykey('Free')
else
itemLua.presentPrice.number.text.text = tostring(price)
end
if data:IsSoldout() then
itemLua.soldout:SetActive(true)
itemLua.button.onClick:RemoveAllListeners()
itemLua.presentPrice.button.onClick:RemoveAllListeners()
else
itemLua.soldout:SetActive(false)
self.uiBase:AddButtonUniqueEventListener(itemLua.button, self, self.OnClickGiftItem, data:GetId())
self.uiBase:AddButtonUniqueEventListener(itemLua.presentPrice.button, self, self.OnClickGiftPrice,
data:GetId())
end
end
return item
end
function UIRuneShopView:RefreshGiftsItem(itemLua, bgPic, numPic, rewards)
if numPic and numPic ~= '' then
itemLua.specialReward.bg.image.sprite = nil
itemLua.specialReward.bg.image.enabled = false
CommonUtil.LoadIcon(self, bgPic, function(sprite)
if sprite then
itemLua.specialReward.bg.image.sprite = sprite
itemLua.specialReward.bg.image.enabled = true
end
end, itemLua, 'SpecialRewardBgIcon')
itemLua.specialReward.num.image.sprite = nil
itemLua.specialReward.num.image.enabled = false
CommonUtil.LoadIcon(self, numPic, function(sprite)
if sprite then
itemLua.specialReward.num.image.sprite = sprite
itemLua.specialReward.num.image.enabled = true
end
end, itemLua, 'SpecialRewardNumIcon')
itemLua.specialReward:SetActive(true)
itemLua.goodsItems:SetActive(false)
else
itemLua.specialReward:SetActive(false)
if rewards then
itemLua.goodsItems:SetActive(true)
local reward = rewards[1]
if reward then
itemLua.iconSmallItem1:SetActive(true)
CommonUtil.UpdateItemPrefab(self, itemLua.iconSmallItem1, { cfgId = reward[1], num = reward[2] },
Enum.ItemIEnterType.Bag)
else
itemLua.iconSmallItem1:SetActive(false)
end
reward = rewards[2]
if reward then
itemLua.iconSmallItem2:SetActive(true)
CommonUtil.UpdateItemPrefab(self, itemLua.iconSmallItem2, { cfgId = reward[1], num = reward[2] },
Enum.ItemIEnterType.Bag)
else
itemLua.iconSmallItem2:SetActive(false)
end
reward = rewards[3]
if reward then
itemLua.iconSmallItem3:SetActive(true)
CommonUtil.UpdateItemPrefab(self, itemLua.iconSmallItem3, { cfgId = reward[1], num = reward[2] },
Enum.ItemIEnterType.Bag)
else
itemLua.iconSmallItem3:SetActive(false)
end
else
itemLua.goodsItems:SetActive(false)
end
end
end
--endregion 礼包
--region 限时奖励limitedbox
function UIRuneShopView:Init_loopview_limited()
self.limitedBox.scrollView.loopGridView:InitGridView(0, function(loopGridView, itemIdx, row, column)
return self:GetItemByRowColumnLimited(loopGridView, itemIdx, row, column)
end, nil, nil)
end
function UIRuneShopView:GetItemByRowColumnLimited(loopGridView, itemIdx, row, column)
local data = self.controller:GetShowGoodsDataByIdx(itemIdx + 1)
if not data then return nil end
local item = loopGridView:NewListViewItem('RuneShopLimitedItem')
local itemLua = CommonUtil.BindGridViewItem2Lua(self, 'RuneShopLimitedItem', item.gameObject)
if itemLua then
itemLua.itemIcon.image.sprite = nil
itemLua.itemIcon.image.enabled = false
local cfgData = data.cfgData
if cfgData then
CommonUtil.LoadIcon(self, cfgData.Banner, function(sprite)
if sprite then
itemLua.itemIcon.image.sprite = sprite
itemLua.itemIcon.image.enabled = true
end
end, itemLua, 'ItemIcon')
end
if data:HasEndTime() then
local timerStr = data:CalculateLimitTime()
itemLua.timerLab.text.text.text = string.formatbykey('RuneShopLimitTime', timerStr)
itemLua.timerLab:SetActive(true)
self:StartRefreshTimer(itemLua, data)
else
self:StopRefreshTimer(itemLua)
itemLua.timerLab:SetActive(false)
end
local price = data:GetPrice()
if price <= 0 then
itemLua.presentPrice.number.text.text = string.formatbykey('Free')
else
itemLua.presentPrice.number.text.text = tostring(price)
end
if data:IsSoldout() then
itemLua.soldout:SetActive(true)
itemLua.button.onClick:RemoveAllListeners()
itemLua.presentPrice.button.onClick:RemoveAllListeners()
else
itemLua.soldout:SetActive(false)
self.uiBase:AddButtonUniqueEventListener(itemLua.button, self, self.OnClickLimitedItem, data:GetId(), itemIdx)
self.uiBase:AddButtonUniqueEventListener(itemLua.presentPrice.button, self, self.OnClickLimitedPrice,
data:GetId(), itemIdx)
end
itemLua.redPoint:SetActive(ManagerContainer.RedPointMgr.RSLimitGiftRPCtr:GetRedPointStatusById(data:GetId()))
end
return item
end
function UIRuneShopView:OnClickLimitedItem(button, params)
local id = params[0]
local itemIdx = params[1]
local runeShopType = self.controller:GetShopType()
local runeShopSubType = self.controller:GetShopSubType()
if runeShopType == Enum.RuneShopType.Gifts then
if runeShopSubType == Enum.RuneShopSubType.Gold then
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIRuneShopGoldBuyTips, { runeShopType, runeShopSubType, id })
return
end
end
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIRuneShopBuyTips, { runeShopType, runeShopSubType, id })
ManagerContainer.RedPointMgr.RSLimitGiftRPCtr:CancelRedPointStatusById(id)
self.limitedBox.scrollView.loopGridView:RefreshItemByItemIndex(itemIdx)
end
function UIRuneShopView:OnClickLimitedPrice(button, params)
-- 直接发起支付
local id = params[0]
local itemIdx = params[1]
local errorCodeKey = self.controller:SendPay(id)
if not errorCodeKey then
ManagerContainer.LuaUIMgr:ErrorNoticeDisplay(errorCodeKey)
end
ManagerContainer.RedPointMgr.RSLimitGiftRPCtr:CancelRedPointStatusById(id)
self.limitedBox.scrollView.loopGridView:RefreshItemByItemIndex(itemIdx)
end
function UIRuneShopView:RefreshLimitedView(resetPos)
local showGoodsDatas = self.controller:GetShowGoodsDatas()
LogWarning('showGoodsDatas' .. Inspect(showGoodsDatas))
local length = (showGoodsDatas and #showGoodsDatas or 0)
if resetPos then
self.limitedBox.scrollView.loopGridView:RefreshListByIndex(length, 0)
else
self.limitedBox.scrollView.loopGridView:RefreshListByIndex(length)
end
end
--endregion 限时奖励limitedbox
--region 探索
function UIRuneShopView:RefreshRewardsView()
LogWarning('RefreshRewardsView' .. Inspect(self.rewardsBoxItemLua))
if not self.rewardsBoxItemLua then return end
if ManagerContainer.DataMgr.RuneShopDataMgr.isRewardsDataDirty then
--self.rewardsBoxItemLua:SetActive(false)
--return
end
self.rewardsBoxItemLua:SetActive(true)
self.rewardsBaseData = self.controller:GetRewardsBaseData()
local showGoodsDatas = self.rewardsBaseData:GetShowRewardsData()
local curLv = self.rewardsBaseData:GetShowRewardsCurLv()
local curExp = self.rewardsBaseData:GetShowRewardsCurExp()
local curCfg = self.rewardsBaseData:GetRewardsCurRoundCfg()
if not curCfg then
--self.rewardsBoxItemLua:SetActive(false)
--return
end
self.isShowAirShip = false
local length = (showGoodsDatas and #showGoodsDatas or 0)
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.RuneShopRewards, false)
--页面下方关于当前等级的信息展示
local nextlv = curLv + 1
if nextlv > length then
nextlv = length
end
if curLv == length then
self.rewardsmax:SetActive(true)
self.numexp.text.text = tostring(curExp) .. '/' .. tostring(curCfg.ExpCost)
self.expSlider.slider.value = curExp / curCfg.ExpCost
else
self.rewardsmax:SetActive(false)
self.curLvData = self.controller:GetShowRewardsDataByIdx(nextlv)
self.numexp.text.text = tostring(curExp) .. '/' .. tostring(self.curLvData.cfgData.Exp)
self.expSlider.slider.value = curExp / self.curLvData.cfgData.Exp
end
self.rewardslv.text.text = tostring(curLv)
self.rewardsBoxItemLua.btnBuyMore.num.text.text = tostring(curCfg.MissonExpUp) .. '%'
self.expUpBlue.num.text.text = tostring(curCfg.MissonExpUp) .. '%'
--根据等级经验 刷新小游艇
local newLv = length - curLv
--因为多一个开始节点和结束最终奖励节点,所以+2
self.rewardsBoxItemLua.scrollView.loopGridView:RecycleAllItem()
if self.isInited then
self.rewardsBoxItemLua.scrollView.loopGridView:RefreshListByIndex(length + 2)
else
self.rewardsBoxItemLua.scrollView.loopGridView:RefreshListByIndex(length + 2, newLv)
end
self.rewardsBoxItemLua.scrollView.loopGridView.mOnBeginDragAction = function(gridView)
self:RefreshBigRewardsFloatTips(gridView)
end
self.rewardsBoxItemLua.scrollView.loopGridView.mOnDragingAction = function(gridView)
self:RefreshBigRewardsFloatTips(gridView)
end
self.rewardsBoxItemLua.scrollView.loopGridView.mOnEndDragAction = function(gridView)
self:RefreshBigRewardsFloatTips(gridView)
end
self.isInited = true
local isCash = self.rewardsBaseData:GetRewardsIsCash()
if isCash == 1 then
self.rewardsBoxItemLua.btnBuyMore:SetActive(false)
self.rewardsBoxItemLua.labelUnLocked:SetActive(true)
self.expUpBlue:SetActive(true)
else
self.rewardsBoxItemLua.btnBuyMore:SetActive(true)
self.rewardsBoxItemLua.labelUnLocked:SetActive(false)
self.expUpBlue:SetActive(false)
end
local endTime = self.rewardsBaseData:RefreshRewaradsRemainTime()
if endTime then
self:StartRefreshTimer(self.rewardsBoxItemLua, true)
if endTime < 0 then endTime = 0 end
self:RefreshBigRewardsFloatTips(nil)
self.rewardsBoxItemLua.timeBox:SetActive(true)
self.rewardsBoxItemLua.timeBox.textTime.text.text = string.formatbykey('AirshipTime',
DateTimeUtil.convertSeconds2TimeStr1(endTime, true, true, false))
else
self:StopRefreshTimer(self.rewardsBoxItemLua)
self.rewardsBoxItemLua.timeBox:SetActive(false)
end
end
function UIRuneShopView:AsyncLoadRewards()
AW.async(function()
if not self.rewardsBoxItem then
self.rewardsBoxItem = AW.await(ManagerContainer.ResMgr:LuaGetGoFromPoolAsync(Constants.UIPath,
RuneShopRewardsPath))
if self.rewardsBoxItem then
self.rewardsBoxItemLua = CommonUtil.BindGridViewItem2LuaStatic("RewardsBoxItem",
self.rewardsBoxItem.gameObject)
self.rewardsBoxItemLua.transform:SetParent(self.rewardsBox.transform)
self.rewardsBoxItemLua.transform.localPosition = Vector3.zero
self.rewardsBoxItemLua.transform.localRotation = Quaternion.identity
self.rewardsBoxItemLua.transform.localScale = Vector3.one
self.rectTrans = self.rewardsBoxItemLua.rectTransform
self.rectTrans.offsetMax = Vector2(0, 0)
self.rectTrans.offsetMin = Vector2(0, 0)
self.rectTrans.anchoredPosition3D = Vector3.zero
self.rectTrans.anchoredPosition = Vector2(0, 0)
self.uiBase:AddButtonUniqueEventListener(self.rewardsBoxItemLua.btnPlayRule.button, self,
self.OnClickPlayRuleBtn)
self.uiBase:AddButtonUniqueEventListener(self.rewardsBoxItemLua.btnBuyMore.button, self,
self.OnClickBuyAdvancedRewardsBtn)
self.uiBase:AddButtonUniqueEventListener(self.btnTaskExp.button, self, self.OnClickTaskExpBtn)
self.rewardsBoxItemLua.scrollView.loopGridView:InitGridView(0,
function(loopGridView, itemIdx, row, column)
return self:GetItemByRowColumnRewards(loopGridView, itemIdx, row, column)
end, nil, nil)
self:RefreshRewardsView()
end
end
end)
end
function UIRuneShopView:OnClickPlayRuleBtn()
local rule
rule = "AirshipText"
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIPlayRule, { 'PlayExplainTitle', rule })
end
function UIRuneShopView:GetItemByRowColumnRewards(loopGridView, itemIdx, row, column)
--通用等级奖励
local item
if itemIdx == 0 then
item = loopGridView:NewListViewItem('CloudTop')
local itemEndLua = CommonUtil.BindGridViewItem2Lua(self, 'CloudTop', item.gameObject)
self:UpdateRewardsItem(itemEndLua, itemIdx, data, true)
else
item = loopGridView:NewListViewItem('RuneShopRewardsItem')
local itemLua = CommonUtil.BindGridViewItem2Lua(self, 'RuneShopRewardsItem', item.gameObject)
local data
local showGoodsDatas = self.controller:GetShowRewardsData()
local length = (showGoodsDatas and #showGoodsDatas or 0)
if itemIdx - 1 < length then
data = self.controller:GetShowRewardsDataByIdx(length - (itemIdx - 1))
end
self:UpdateRewardsItem(itemLua, length - (itemIdx - 1), data)
end
return item
end
function UIRuneShopView:OnClickBuyAdvancedRewardsBtn()
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIRewardsBuyTips, { runeShopType, nil, 0 })
end
function UIRuneShopView:OnClickGetAdvancedRewardBtn()
if self.rewardsBaseData:GetMaxRewardsNum() > 0 then
ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_EXPLORE_EXTRA_REWARD_REQ)
end
end
function UIRuneShopView:OnClickTaskExpBtn()
ManagerContainer.DataMgr.TaskDataNew:OpenTaskPanel();
end
--大奖标签跳转
function UIRuneShopView:JumpToTarget(button, params)
local data = clone(params[0])
self.rewardsBoxItemLua.scrollView.loopGridView:RefreshListByIndex(#self.controller:GetShowRewardsData() + 2,
data.targetid)
self:RefreshBigRewardsFloatTips()
end
--设置悬赏单个对象
function UIRuneShopView:UpdateRewardsItem(itemLua, idx, data, isEnd)
local curExp = self.rewardsBaseData:GetShowRewardsCurExp()
local curLv = self.rewardsBaseData:GetShowRewardsCurLv()
--最终奖励宝箱
if isEnd then
self.uiBase:AddButtonUniqueEventListener(itemLua.btnBuyMore.button, self, self.OnClickGetAdvancedRewardBtn)
local costExp = ManagerContainer.CfgMgr:GetRuneShopExploreCfgByRound(self.rewardsBaseData
:GetShowRewardsRoundData()).ExpCost
if self.rewardsBaseData:GetMaxRewardsNum() > 0 then
itemLua.chestAnim.animator:Play('Open')
itemLua.redPoint:SetActive(true)
itemLua.btnBuyMore.num.text.text = tostring(self.rewardsBaseData:GetMaxRewardsNum())
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.RuneShopRewards,
true)
else
itemLua.chestAnim.animator:Play('Close')
itemLua.redPoint:SetActive(false)
--self.uiBase:(itemLua.btnBuyMore.button, self, self.OnClickGetAdvancedRewardBtn)
end
if self.rewardsBaseData:GetRewardsIsMax() then
itemLua.airShip:SetActive(true)
itemLua.levelSlider.slider.value = 1
else
if curLv == #self.rewardsBaseData:GetShowRewardsData() then
itemLua.airShip:SetActive(true)
itemLua.levelSlider.slider.value = curExp / costExp
else
itemLua.airShip:SetActive(false)
end
end
itemLua.dsc.text.text.text = string.formatbykey("DscRewardsMax", tostring(costExp), '1')
--通用item
else
--0级开始
if idx == 0 then
itemLua.startItem:SetActive(true)
itemLua.rewardsBox2:SetActive(false)
itemLua.levelBox2:SetActive(false)
if curLv == 0 and curExp / self.curLvData.cfgData.Exp < 0.15 then
itemLua.startItem.airShip:SetActive(true)
else
itemLua.startItem.airShip:SetActive(false)
end
--常规等级
else
CommonUtil.UpdateItemPrefab(self, itemLua, data, Enum.ItemIEnterType.Bag, self, nil)
--self.tempItemLua = itemLua
itemLua.numlv.text.text = idx
itemLua.startItem:SetActive(false)
itemLua.rewardsBox2:SetActive(true)
itemLua.levelBox2:SetActive(true)
itemLua.rewardsBox2.bgyellow:SetActive(false)
if data.cfgData.RewardSign > 0 then
itemLua.rewardsBox2.bgyellow:SetActive(true)
end
if data.isReward then
--0为 默认状态
if data.isReward == 0 then
itemLua.rewardsLeft.arrived:SetActive(false)
itemLua.rewardsLeft.received:SetActive(false)
--1为已领取
elseif data.isReward == 1 then
itemLua.rewardsLeft.arrived:SetActive(false)
itemLua.rewardsLeft.received:SetActive(true)
--可领取
elseif data.isReward == 2 then
itemLua.rewardsLeft.arrived:SetActive(true)
itemLua.rewardsLeft.received:SetActive(false)
end
else
itemLua.rewardsLeft.arrived:SetActive(false)
itemLua.rewardsLeft.received:SetActive(false)
end
if data.isCashReward and self.rewardsBaseData:GetRewardsIsCash() == 1 then
--0为 默认状态
if data.isCashReward == 0 then
itemLua.rewardsRight.arrived:SetActive(false)
itemLua.rewardsRight.received:SetActive(false)
--1为已领取
elseif data.isCashReward == 1 then
itemLua.rewardsRight.arrived:SetActive(false)
itemLua.rewardsRight.received:SetActive(true)
--可领取
elseif data.isCashReward == 2 then
itemLua.rewardsRight.arrived:SetActive(true)
itemLua.rewardsRight.received:SetActive(false)
end
else
itemLua.rewardsRight.arrived:SetActive(false)
itemLua.rewardsRight.received:SetActive(false)
end
itemLua.activity:SetActive(false)
--直接根据等级判断,小于当前等级的直接拉满,大于当前等级的则为空
if curLv + 1 > idx then
itemLua.levelSlider.slider.value = 1
itemLua.activity:SetActive(true)
elseif curLv < idx + 1 then
itemLua.levelSlider.slider.value = 0
end
--左侧经验条slider因遮挡问题只有经验超出10%,小飞机才会飞到下一级
if curLv == #self.rewardsBaseData:GetShowRewardsData() then
itemLua.airShip:SetActive(false)
else
if curLv + 1 == idx and curExp / self.curLvData.cfgData.Exp > 0.15 then
itemLua.airShip:SetActive(true)
--LogError('aaacc'..curExp.."aac"..self.curLvData.cfgData.Exp)
itemLua.levelSlider.slider.value = curExp / self.curLvData.cfgData.Exp
self.isShowAirShip = true
else
if curLv == idx and not self.isShowAirShip then
itemLua.airShip:SetActive(true)
--itemLua.levelSlider.slider.value = self.controller:GetShowRewardsCurExp()/self.curLvData.cfgData.Exp
else
itemLua.airShip:SetActive(false)
end
end
end
end
end
end
function UIRuneShopView:RefreshBigRewardsFloatTips(gridView)
--通过content高度计算当前处于哪个位置
local py = self.rewardsBoxItemLua.scrollView.content.transform.localPosition.y
local mid = #self.rewardsBaseData:GetShowRewardsData() - self:Toint(py / 240)
--下方的大奖小图标
local minid = self.controller:GetShowReardsNearMinCashReward(mid - 3)
if minid then
self.rewardsBoxItemLua.btnGotoDown:SetActive(true)
local logicData = {}
local rdata = self.controller:GetShowRewardsDataByIdx(minid)
if rdata.cfgData.RewardSign == 1 then
logicData = {
cfgId = rdata.cfgData.Reward[1][1],
num = rdata.cfgData.Reward[1][2],
targetid = #self
.controller:GetShowRewardsData() - minid
}
elseif rdata.cfgData.RewardSign == 2 then
logicData = {
cfgId = rdata.cfgData.CashReward[1][1],
num = rdata.cfgData.CashReward[1][2],
targetid = #self
.controller:GetShowRewardsData() - minid
}
end
CommonUtil.UpdateItemPrefab(self, self.rewardsBoxItemLua.btnGotoDown.iconSmallItem, logicData,
Enum.ItemIEnterType.Bag, self, self.JumpToTarget)
else
self.rewardsBoxItemLua.btnGotoDown:SetActive(false)
end
--上方的大奖小图标
local maxid = self.controller:GetShowReardsNearMaxCashReward(mid + 3)
if maxid then
self.rewardsBoxItemLua.btnGotoUp:SetActive(true)
local logicData = {}
local rdata = self.controller:GetShowRewardsDataByIdx(maxid)
if rdata.cfgData.RewardSign == 1 then
logicData = {
cfgId = rdata.cfgData.Reward[1][1],
num = rdata.cfgData.Reward[1][2],
targetid = #self
.controller:GetShowRewardsData() - maxid
}
elseif rdata.cfgData.RewardSign == 2 then
logicData = {
cfgId = rdata.cfgData.CashReward[1][1],
num = rdata.cfgData.CashReward[1][2],
targetid = #self
.controller:GetShowRewardsData() - maxid
}
end
CommonUtil.UpdateItemPrefab(self, self.rewardsBoxItemLua.btnGotoUp.iconSmallItem, logicData,
Enum.ItemIEnterType.Bag, self, self.JumpToTarget)
else
self.rewardsBoxItemLua.btnGotoUp:SetActive(false)
end
end
function UIRuneShopView:Toint(n)
local s = tostring(n)
local i, j = s:find('%.')
if i then
return tonumber(s:sub(1, i - 1))
else
return n
end
end
--endregion 探索
--region timer
function UIRuneShopView:StartRefreshTimer(itemLua, goodsData)
local timer = self.refreshTimer
if not timer then
timer = Timer.New(slot(self.RefreshTimer, self), 1, -1)
self.refreshTimer = timer
end
local updateItemMap = timer.updateItemMap
if not updateItemMap then
updateItemMap = {}
timer.updateItemMap = updateItemMap
end
updateItemMap[itemLua] = goodsData
if not timer.running then
timer:Start()
end
end
function UIRuneShopView:StopRefreshTimer(itemLua)
local timer = self.refreshTimer
if timer then
local updateItemMap = timer.updateItemMap
if updateItemMap then
updateItemMap[itemLua] = nil
end
if not updateItemMap or table_is_empty(updateItemMap) then
timer:Stop()
end
end
end
function UIRuneShopView:StopAndClearRefreshTimer()
if self.refreshTimer then
self.refreshTimer:Stop()
self.refreshTimer.time = 1
self.refreshTimer.duration = 1
self.refreshTimer.updateItemMap = nil
end
end
function UIRuneShopView:DisposeRefreshTimer()
self:StopAndClearRefreshTimer()
self.refreshTimer = nil
end
function UIRuneShopView:RefreshTimer()
local timer = self.refreshTimer
if not timer then return end
local updateItemMap = timer.updateItemMap
if not updateItemMap or table_is_empty(updateItemMap) then
timer:Stop()
return
end
local minRemainTime = nil
local runeShopType = self.controller:GetShopType()
if self.controller.isAirShip then
local endTime = self.controller:GetRewardsRemainTime()
if endTime then
if endTime < 0 then
endTime = 0
end
if endTime <= 0 then
timer.updateItemMap = nil
if self.controller:ChangeShopType(Enum.RuneShopType.MonthCard) then
self:RefreshShopView(true)
end
if ManagerContainer.LuaUIMgr:HasOpenPage(Enum.UIPageName.UIRewardsBuyTips) then
ManagerContainer.LuaUIMgr:ClosePage(Enum.UIPageName.UIRewardsBuyTips)
end
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE,
Enum.RPNotifyType.RuneShopRewards, false)
ManagerContainer.CfgMgr.RuneShopExploreRewardCfg = nil
ManagerContainer.CfgMgr.RuneShopRoundMap = nil
self.rewardsToggle:SetActive(false)
end
self.rewardsBoxItemLua.timeBox:SetActive(true)
self.rewardsBoxItemLua.timeBox.textTime.text.text = string.formatbykey('AirshipTime',
DateTimeUtil.convertSeconds2TimeStr1(endTime, true, true, false))
else
self.rewardsBoxItemLua.timeBox:SetActive(false)
timer.updateItemMap = nil
end
if endTime and endTime > 0 then
if not minRemainTime or minRemainTime > endTime then
minRemainTime = endTime
end
end
return
end
if runeShopType == Enum.RuneShopType.MonthCard then
for itemLua, goodsData in pairs(updateItemMap) do
local timerStr, outTime, remainTime = goodsData:CalculateLimitTime()
if not outTime then
itemLua.textDsc.text.text = string.formatbykey('DscClubMonth2', timerStr)
itemLua.active:SetActive(true)
itemLua.unActive:SetActive(false)
else
updateItemMap[itemLua] = nil
itemLua.textDsc.text.text = string.formatbykey('DscClubMonth1')
itemLua.active:SetActive(false)
itemLua.unActive:SetActive(true)
end
if remainTime and remainTime > 0 then
if not minRemainTime or minRemainTime > remainTime then
minRemainTime = remainTime
end
end
end
if minRemainTime and minRemainTime > 0 then
minRemainTime = 1
end
elseif runeShopType == Enum.RuneShopType.Gifts then
local endTime = self.controller:GetRemainTime()
if endTime then
if endTime < 0 then endTime = 0 end
if endTime <= 0 then
timer.updateItemMap = nil
end
self.timeBox:SetActive(true)
self.timeBox.textTime.text.text = string.formatbykey('RuneShopRefreshTime',
DateTimeUtil.convertSeconds2TimeStr1(endTime, true, true, false))
else
self.timeBox:SetActive(false)
timer.updateItemMap = nil
end
if endTime and endTime > 0 then
if not minRemainTime or minRemainTime > endTime then
minRemainTime = endTime
end
end
elseif runeShopType == Enum.RuneShopType.LimitTime then
for itemLua, goodsData in pairs(updateItemMap) do
if goodsData:HasEndTime() then
local timerStr, outTime, remainTime = goodsData:CalculateLimitTime()
if outTime then
updateItemMap[itemLua] = nil
end
itemLua.timerLab.text.text.text = string.formatbykey('RuneShopLimitTime', timerStr)
itemLua.timerLab:SetActive(true)
if remainTime and remainTime > 0 then
if not minRemainTime or minRemainTime > remainTime then
minRemainTime = remainTime
end
end
else
updateItemMap[itemLua] = nil
itemLua.timerLab:SetActive(false)
end
if minRemainTime and minRemainTime > 0 then
minRemainTime = 1
end
end
end
if not minRemainTime or minRemainTime <= 0 then
self:StopRefreshTimer()
else
-- 降低刷新频率
if self.refreshTimer then
local validTime = nil
if minRemainTime >= 86400 then
validTime = minRemainTime % 3600
if validTime == 0 then validTime = 3600 end
elseif minRemainTime >= 3600 then
validTime = minRemainTime % 60
if validTime == 0 then validTime = 60 end
else
validTime = 1
end
if validTime then
self.refreshTimer.duration = validTime
else
self:StopRefreshTimer()
end
end
end
end
--endregion timer
return UIRuneShopView