562 lines
17 KiB
Lua
562 lines
17 KiB
Lua
local MAX_COUNT = CS.XGame.Config:GetInt("ShopBuyGoodsCountLimit")
|
|
|
|
XUiGridShop = XClass(nil, "XUiGridShop")
|
|
local Application = CS.UnityEngine.Application
|
|
local Platform = Application.platform
|
|
local RuntimePlatform = CS.UnityEngine.RuntimePlatform
|
|
function XUiGridShop:Ctor(ui)
|
|
self.GameObject = ui.gameObject
|
|
self.Transform = ui.transform
|
|
XTool.InitUiObject(self)
|
|
self:InitAutoScript()
|
|
self.PanelPrice = {
|
|
self.PanelPrice1,
|
|
self.PanelPrice2,
|
|
self.PanelPrice3
|
|
}
|
|
self.Timer = nil
|
|
end
|
|
|
|
function XUiGridShop:Init(parent, rootUi, uiParams)
|
|
self.UiParams = uiParams
|
|
self.Parent = parent
|
|
self.RootUi = rootUi or parent
|
|
self.Grid = XUiGridCommon.New(self.RootUi, self.GridCommon, uiParams)
|
|
end
|
|
|
|
function XUiGridShop:OnRecycle()
|
|
self:RemoveTimer()
|
|
self:RemoveOnSaleTimer()
|
|
end
|
|
|
|
-- auto
|
|
-- Automatic generation of code, forbid to edit
|
|
function XUiGridShop:InitAutoScript()
|
|
self.SpecialSoundMap = {}
|
|
self:AutoAddListener()
|
|
end
|
|
|
|
function XUiGridShop:GetAutoKey(uiNode, eventName)
|
|
if not uiNode then
|
|
return
|
|
end
|
|
return eventName .. uiNode:GetHashCode()
|
|
end
|
|
|
|
function XUiGridShop:RegisterListener(uiNode, eventName, func)
|
|
local key = self:GetAutoKey(uiNode, eventName)
|
|
if not key then
|
|
return
|
|
end
|
|
local listener = self.AutoCreateListeners[key]
|
|
if listener ~= nil then
|
|
uiNode[eventName]:RemoveListener(listener)
|
|
end
|
|
|
|
if func ~= nil then
|
|
if type(func) ~= "function" then
|
|
XLog.Error("XUiGridShop:RegisterListener函数错误, 参数func需要是function类型, func的类型是" .. type(func))
|
|
end
|
|
|
|
listener = function(...)
|
|
XSoundManager.PlayBtnMusic(self.SpecialSoundMap[key], eventName)
|
|
func(self, ...)
|
|
end
|
|
|
|
uiNode[eventName]:AddListener(listener)
|
|
self.AutoCreateListeners[key] = listener
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:AutoAddListener()
|
|
self.AutoCreateListeners = {}
|
|
XUiHelper.RegisterClickEvent(self, self.BtnCondition, self.OnBtnConditionClick)
|
|
XUiHelper.RegisterClickEvent(self, self.BtnBuy, self.OnBtnBuyClick)
|
|
end
|
|
-- auto
|
|
function XUiGridShop:OnBtnConditionClick()
|
|
if self.ConditionDesc then
|
|
XUiManager.TipError(self.ConditionDesc)
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:GetIsCanBuy()
|
|
local currentTime = XTime.GetServerNowTimestamp()
|
|
if currentTime >= self.Data.OnSaleTime then
|
|
if self.Data.SelloutTime <= 0 then
|
|
return true
|
|
end
|
|
return currentTime <= self.Data.SelloutTime
|
|
end
|
|
return false
|
|
end
|
|
|
|
function XUiGridShop:OnBtnBuyClick()
|
|
local isCanBuy = self:GetIsCanBuy()
|
|
if not self.IsShopLock and isCanBuy then
|
|
self.Parent:UpdateBuy(
|
|
self.Data,
|
|
function()
|
|
self:RefreshHave()
|
|
self:RefreshSellOut()
|
|
self:RefreshCondition()
|
|
self:RefreshOnSales()
|
|
self:RefreshPrice()
|
|
self:RefreshBuyCount()
|
|
end
|
|
)
|
|
else
|
|
if self.ShopLockDecs and self.IsShopLock then
|
|
XUiManager.TipError(self.ShopLockDecs)
|
|
return
|
|
end
|
|
if self.ShopOnSaleLockDecs and not isCanBuy then
|
|
XUiManager.TipError(self.ShopOnSaleLockDecs)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:UpdateData(data, shopItemTextColor, shopId)
|
|
self.ShopId = shopId
|
|
self.Data = data
|
|
self.ShopItemTextColor = shopItemTextColor
|
|
self:RefreshHave()
|
|
self:RefreshSellOut()
|
|
self:RefreshCondition()
|
|
self:RefreshCommon()
|
|
self:RefreshOnSales()
|
|
self:RefreshPrice()
|
|
self:RemoveTimer()
|
|
self:RemoveOnSaleTimer()
|
|
self:RefreshBuyCount()
|
|
-- 全部隐藏,如果<开售时间显示开售时间,如果>=开售时间,显示结束时间
|
|
self:HideAllTimeGos()
|
|
-- 未到开售时间
|
|
if XTime.GetServerNowTimestamp() < self.Data.OnSaleTime then
|
|
-- 刷新销售开启时间
|
|
self:RefreshOnSaleTime(self.Data.OnSaleTime)
|
|
else
|
|
-- 刷新销售结束时间
|
|
self:RefreshTimer(self.Data.SelloutTime)
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:RefreshBuyCount()
|
|
if not self.ImgLimitLable then
|
|
return
|
|
end
|
|
|
|
if not self.TxtLimitLable then
|
|
return
|
|
end
|
|
|
|
if self.Data.BuyTimesLimit <= 0 then
|
|
if not self:ShowDiscountCanButAmount() then
|
|
self.TxtLimitLable.gameObject:SetActiveEx(false)
|
|
self.ImgLimitLable.gameObject:SetActiveEx(false)
|
|
else
|
|
self.TxtLimitLable.gameObject:SetActiveEx(true)
|
|
self.ImgLimitLable.gameObject:SetActiveEx(true)
|
|
end
|
|
else
|
|
local buynumber = self.Data.BuyTimesLimit - self.Data.TotalBuyTimes
|
|
local limitLabel = XShopConfigs.GetBuyLimitLabel(self.Data.AutoResetClockId)
|
|
local text = string.format(limitLabel, buynumber)
|
|
|
|
self.TxtLimitLable.text = text
|
|
self.TxtLimitLable.gameObject:SetActiveEx(true)
|
|
self.ImgLimitLable.gameObject:SetActiveEx(true)
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:RefreshCondition()
|
|
if not self.BtnCondition then
|
|
return
|
|
end
|
|
self.BtnCondition.gameObject:SetActiveEx(false)
|
|
self.ConditionDesc = nil
|
|
local conditionIds = self.Data.ConditionIds
|
|
if not conditionIds or #conditionIds <= 0 then
|
|
return
|
|
end
|
|
|
|
for _, id in pairs(conditionIds) do
|
|
local ret, desc = XConditionManager.CheckCondition(id)
|
|
if not ret then
|
|
self.BtnCondition.gameObject:SetActiveEx(true)
|
|
self.ImgSellOut.gameObject:SetActiveEx(false)
|
|
self.ConditionDesc = desc
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:RefreshSellOut()
|
|
if not self.ImgSellOut then
|
|
return
|
|
end
|
|
|
|
if self.Data.BuyTimesLimit <= 0 then
|
|
self.ImgSellOut.gameObject:SetActiveEx(false)
|
|
else
|
|
if self.Data.TotalBuyTimes >= self.Data.BuyTimesLimit then
|
|
self.ImgSellOut.gameObject:SetActiveEx(true)
|
|
else
|
|
self.ImgSellOut.gameObject:SetActiveEx(false)
|
|
end
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:RefreshHave()
|
|
if not self.ImgHave then
|
|
return
|
|
end
|
|
|
|
self.ImgHave.gameObject:SetActiveEx(false)
|
|
local conditionIds = self.Data.ConditionIds
|
|
if not conditionIds or #conditionIds <= 0 then
|
|
return
|
|
end
|
|
|
|
for _, id in pairs(conditionIds) do
|
|
local ret, desc = XConditionManager.CheckCondition(id)
|
|
if ret and self.Data.TotalBuyTimes < self.Data.BuyTimesLimit then
|
|
self.ImgHave.gameObject:SetActiveEx(true)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:RemoveTimer()
|
|
if self.Timer then
|
|
XScheduleManager.UnSchedule(self.Timer)
|
|
self.Timer = nil
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:RemoveOnSaleTimer()
|
|
if self.OnSaleTimer then
|
|
XScheduleManager.UnSchedule(self.OnSaleTimer)
|
|
self.OnSaleTimer = nil
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:RefreshCommon()
|
|
if self.RImgType then
|
|
self.RImgType.gameObject:SetActiveEx(false)
|
|
end
|
|
|
|
self.Grid:Refresh(self.Data.RewardGoods, nil, true)
|
|
end
|
|
|
|
function XUiGridShop:RefreshPrice()
|
|
local panelCount = #self.PanelPrice
|
|
for i = 1, panelCount do
|
|
self.PanelPrice[i].gameObject:SetActiveEx(false)
|
|
end
|
|
|
|
local index = 1
|
|
if self.Data.PayKeySuffix then
|
|
if self.PanelCountTxts and self.PanelCountTxts:Exist() then
|
|
self.PanelCountTxts.gameObject:SetActiveEx(false)
|
|
end
|
|
if self.TxtYuan and self.TxtYuan:Exist() then
|
|
self.TxtYuan.gameObject:SetActiveEx(true)
|
|
self.TxtYuan.text = self:GetPayAmount()
|
|
end
|
|
return
|
|
else
|
|
if self.PanelCountTxts and self.PanelCountTxts:Exist() then
|
|
self.PanelCountTxts.gameObject:SetActiveEx(true)
|
|
end
|
|
if self.TxtYuan and self.TxtYuan:Exist() then
|
|
self.TxtYuan.gameObject:SetActiveEx(false)
|
|
end
|
|
end
|
|
for _, count in pairs(self.Data.ConsumeList) do
|
|
if index > panelCount then
|
|
return
|
|
end
|
|
|
|
if self["TxtOldPrice" .. index] then
|
|
if self.Sales == 100 then
|
|
self["TxtOldPrice" .. index].gameObject:SetActiveEx(false)
|
|
else
|
|
self["TxtOldPrice" .. index].text = count.Count
|
|
self["TxtOldPrice" .. index].gameObject:SetActiveEx(true)
|
|
end
|
|
end
|
|
|
|
if self["RImgPrice" .. index] and self["RImgPrice" .. index]:Exist() then
|
|
local icon = XDataCenter.ItemManager.GetItemIcon(count.Id)
|
|
if icon ~= nil then
|
|
self["RImgPrice" .. index]:SetRawImage(icon)
|
|
end
|
|
end
|
|
|
|
if self["TxtNewPrice" .. index] then
|
|
local needCount = math.floor(count.Count * self.Sales / 100)
|
|
self["TxtNewPrice" .. index].text = needCount
|
|
local itemCount = XDataCenter.ItemManager.GetCount(count.Id)
|
|
if itemCount < needCount then
|
|
if not self.ShopItemTextColor then
|
|
self["TxtNewPrice" .. index].color = CS.UnityEngine.Color(1, 0, 0)
|
|
else
|
|
self["TxtNewPrice" .. index].color = XUiHelper.Hexcolor2Color(self.ShopItemTextColor.CanNotBuyColor)
|
|
end
|
|
else
|
|
if not self.ShopItemTextColor then
|
|
self["TxtNewPrice" .. index].color = CS.UnityEngine.Color(0, 0, 0)
|
|
else
|
|
self["TxtNewPrice" .. index].color = XUiHelper.Hexcolor2Color(self.ShopItemTextColor.CanBuyColor)
|
|
end
|
|
end
|
|
end
|
|
|
|
self.PanelPrice[index].gameObject:SetActiveEx(true)
|
|
index = index + 1
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:RefreshOnSales()
|
|
self.OnSales = {}
|
|
self.OnSalesLongTest = {}
|
|
XTool.LoopMap(
|
|
self.Data.OnSales,
|
|
function(k, sales)
|
|
self.OnSales[k] = sales
|
|
table.insert(self.OnSalesLongTest, sales)
|
|
end
|
|
)
|
|
|
|
self.Sales = 100
|
|
|
|
if #self.OnSalesLongTest ~= 0 then
|
|
local sortedKeys = {}
|
|
for k, _ in pairs(self.OnSales) do
|
|
table.insert(sortedKeys, k)
|
|
end
|
|
table.sort(sortedKeys)
|
|
|
|
for i = 1, #sortedKeys do
|
|
if self.Data.TotalBuyTimes >= sortedKeys[i] - 1 then
|
|
self.Sales = self.OnSales[sortedKeys[i]]
|
|
end
|
|
end
|
|
end
|
|
self:RefreshPanelSale()
|
|
end
|
|
|
|
function XUiGridShop:RefreshPanelSale()
|
|
local hideSales = false
|
|
if self.TxtSaleRate then
|
|
if self.Data.Tags == XShopManager.ShopTags.DisCount then
|
|
if self.Sales < 100 then
|
|
self.TxtSaleRate.text = CS.XTextManager.GetText("Snap", 100 - self.Sales)
|
|
else
|
|
hideSales = true
|
|
end
|
|
end
|
|
if self.Data.Tags == XShopManager.ShopTags.TimeLimit then
|
|
self.TxtSaleRate.text = CS.XTextManager.GetText("TimeLimit")
|
|
end
|
|
if self.Data.Tags == XShopManager.ShopTags.Recommend then
|
|
self.TxtSaleRate.text = CS.XTextManager.GetText("Recommend")
|
|
end
|
|
if self.Data.Tags == XShopManager.ShopTags.HotSale then
|
|
self.TxtSaleRate.text = CS.XTextManager.GetText("HotSell")
|
|
end
|
|
if self.Data.Tags == XShopManager.ShopTags.Not or hideSales then
|
|
self.TxtSaleRate.gameObject:SetActiveEx(false)
|
|
self.TxtSaleRate.gameObject.transform.parent.gameObject:SetActiveEx(false)
|
|
else
|
|
self.TxtSaleRate.gameObject:SetActiveEx(true)
|
|
self.TxtSaleRate.gameObject.transform.parent.gameObject:SetActiveEx(true)
|
|
end
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:RefreshTimer(time)
|
|
if XTool.UObjIsNil(self.ImgLeftTime) then
|
|
return
|
|
end
|
|
|
|
if XTool.UObjIsNil(self.TxtLeftTime) then
|
|
return
|
|
end
|
|
|
|
if time <= 0 then
|
|
self.TxtLeftTime.gameObject:SetActiveEx(false)
|
|
self.ImgLeftTime.gameObject:SetActiveEx(false)
|
|
return
|
|
end
|
|
|
|
self.TxtLeftTime.gameObject:SetActiveEx(true)
|
|
self.ImgLeftTime.gameObject:SetActiveEx(true)
|
|
|
|
local leftTime = XShopManager.GetLeftTime(time)
|
|
|
|
self.ShopOnSaleLockDecs = CS.XTextManager.GetText("ActivityBriefShopOnSaleLock")
|
|
if self.ImgLock then
|
|
self.ImgLock.gameObject:SetActiveEx(true)
|
|
end
|
|
local func = function()
|
|
leftTime = leftTime > 0 and leftTime or 0
|
|
local dataTime = XUiHelper.GetTime(leftTime, XUiHelper.TimeFormatType.SHOP)
|
|
if self.TxtLeftTime then
|
|
self.TxtLeftTime.text = CS.XTextManager.GetText("TimeSoldOut", dataTime)
|
|
end
|
|
if leftTime <= 0 then
|
|
self:RemoveTimer()
|
|
if self.ImgSellOut then
|
|
self.ImgSellOut.gameObject:SetActiveEx(true)
|
|
end
|
|
if self.ImgLock then
|
|
self.ImgLock.gameObject:SetActiveEx(false)
|
|
end
|
|
-- self.IsShopOnSaleLock = true
|
|
-- else
|
|
-- self.IsShopOnSaleLock = false
|
|
end
|
|
end
|
|
|
|
func()
|
|
|
|
self:RemoveTimer()
|
|
self.Timer =
|
|
XScheduleManager.ScheduleForever(
|
|
function()
|
|
leftTime = leftTime - 1
|
|
func()
|
|
end,
|
|
1000
|
|
)
|
|
end
|
|
|
|
function XUiGridShop:RefreshOnSaleTime(time)
|
|
if not self.TxtOnSaleTime then
|
|
return
|
|
end
|
|
|
|
if time <= 0 then
|
|
self.TxtOnSaleTime.gameObject:SetActiveEx(false)
|
|
if not XTool.UObjIsNil(self.ImgLeftTime) then
|
|
self.ImgLeftTime.gameObject:SetActiveEx(false)
|
|
end
|
|
return
|
|
end
|
|
if not XTool.UObjIsNil(self.ImgLeftTime) then
|
|
self.ImgLeftTime.gameObject:SetActiveEx(true)
|
|
end
|
|
self.TxtOnSaleTime.gameObject:SetActiveEx(true)
|
|
self.ShopOnSaleLockDecs = CS.XTextManager.GetText("ActivityBriefShopOnSaleLock")
|
|
|
|
local SaleTime = XShopManager.GetLeftTime(time)
|
|
|
|
local func = function()
|
|
SaleTime = SaleTime > 0 and SaleTime or 0
|
|
local dataTime = XUiHelper.GetTime(SaleTime, XUiHelper.TimeFormatType.ACTIVITY)
|
|
if self.TxtOnSaleTime then
|
|
self.TxtOnSaleTime.text = CS.XTextManager.GetText("TimeOnSale", dataTime)
|
|
end
|
|
if SaleTime <= 0 then
|
|
self:RemoveOnSaleTimer()
|
|
if self.TxtOnSaleTime then
|
|
self.TxtOnSaleTime.gameObject:SetActiveEx(false)
|
|
end
|
|
if not XTool.UObjIsNil(self.ImgLeftTime) then
|
|
self.ImgLeftTime.gameObject:SetActiveEx(false)
|
|
end
|
|
-- self.IsShopOnSaleLock = false
|
|
-- else
|
|
-- self.IsShopOnSaleLock = true
|
|
end
|
|
end
|
|
|
|
func()
|
|
|
|
self:RemoveOnSaleTimer()
|
|
self.OnSaleTimer =
|
|
XScheduleManager.ScheduleForever(
|
|
function()
|
|
SaleTime = SaleTime - 1
|
|
func()
|
|
end,
|
|
1000
|
|
)
|
|
end
|
|
|
|
function XUiGridShop:HideAllTimeGos()
|
|
if self.TxtLeftTime then
|
|
self.TxtLeftTime.gameObject:SetActiveEx(false)
|
|
end
|
|
if self.TxtOnSaleTime then
|
|
self.TxtOnSaleTime.gameObject:SetActiveEx(false)
|
|
end
|
|
end
|
|
|
|
function XUiGridShop:RefreshShowLock()
|
|
local isLock = self.ConditionDesc ~= nil
|
|
|
|
if self.ImgLock then
|
|
self.ImgLock.gameObject:SetActiveEx(isLock)
|
|
end
|
|
if self.TxtLock then
|
|
if isLock then
|
|
self.TxtLock.text = self.ConditionDesc
|
|
self.TxtLock.gameObject:SetActiveEx(true)
|
|
else
|
|
self.TxtLock.gameObject:SetActiveEx(false)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 这一段复制自 XUiShopItem:GetMaxCount()
|
|
function XUiGridShop:ShowDiscountCanButAmount()
|
|
if not self.ShopId then
|
|
return false
|
|
end
|
|
local sortedKeys = {}
|
|
for k, _ in pairs(self.OnSales) do
|
|
table.insert(sortedKeys, k)
|
|
end
|
|
table.sort(sortedKeys)
|
|
|
|
local leftSalesGoods = MAX_COUNT
|
|
|
|
for i = 1, #sortedKeys do
|
|
if self.Data.TotalBuyTimes >= sortedKeys[i] - 1 then
|
|
else
|
|
leftSalesGoods = sortedKeys[i] - self.Data.TotalBuyTimes - 1
|
|
break
|
|
end
|
|
end
|
|
|
|
local leftShopTimes = XShopManager.GetShopLeftBuyTimes(self.ShopId)
|
|
if not leftShopTimes then
|
|
leftShopTimes = MAX_COUNT
|
|
end
|
|
|
|
local leftGoodsTimes = MAX_COUNT
|
|
if self.Data.BuyTimesLimit and self.Data.BuyTimesLimit > 0 then
|
|
local buyCount = self.Data.TotalBuyTimes and self.Data.TotalBuyTimes or 0
|
|
leftGoodsTimes = self.Data.BuyTimesLimit - buyCount
|
|
end
|
|
local maxCount = math.min(leftGoodsTimes, math.min(leftShopTimes, leftSalesGoods))
|
|
if maxCount < MAX_COUNT then
|
|
local clockId = 0 --self.Data.AutoResetClockId --策划说显示"可购:"
|
|
local limitLabel = XShopConfigs.GetBuyLimitLabel(clockId)
|
|
local text = string.format(limitLabel, maxCount)
|
|
self.TxtLimitLable.text = text
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function XUiGridShop:GetPayAmount()
|
|
local key = XPayConfigs.GetProductKey(self.Data.PayKeySuffix)
|
|
|
|
local payConfig = XPayConfigs.GetPayTemplate(key)
|
|
return payConfig and payConfig.Amount or 0
|
|
end
|