PGRData/Script/matrix/xui/xuipurchase/XUiPurchaseCoatingLB.lua

413 lines
16 KiB
Lua
Raw Normal View History

local XUiPurchaseCoatingLB = XClass(nil, "XUiPurchaseCoatingLB")
local Next = _G.next
local CSXTextManagerGetText = CS.XTextManager.GetText
local XUiPurchaseCoatingLBListItem = require("XUi/XUiPurchase/XUiPurchaseCoatingLBListItem")
local CurrentSchedule = nil
function XUiPurchaseCoatingLB:Ctor(ui,uiRoot, callBack)
self.CurState = false
self.GameObject = ui.gameObject
self.Transform = ui.transform
self.CallBack = callBack
self.UiRoot = uiRoot
self.TimeFuns = {}
self.TimeSaveFuns = {}
XTool.InitUiObject(self)
self.ListData = {}
self.IsCheckOpenAddTimeTips = false
self.TipsTemplateContentList = {}
self.OpenBuyTipsList = {}
self:Init()
end
-- 先分类后排序
function XUiPurchaseCoatingLB:OnSortFun(data)
self.SellOutList = {}--买完了
self.SellingList = {}--在上架中
self.SellOffList = {}--下架了
self.SellWaitList = {}--待上架中
self.ListData = {}
local nowTime = XTime.GetServerNowTimestamp()
for _,v in pairs(data)do
if v and not v.IsSelloutHide then
if v.TimeToUnShelve > 0 and v.TimeToUnShelve <= nowTime then--下架了
table.insert(self.SellOffList,v)
elseif v.TimeToShelve > 0 and v.TimeToShelve > nowTime then--待上架中
table.insert(self.SellWaitList,v)
elseif v.BuyTimes > 0 and v.BuyLimitTimes > 0 and v.BuyTimes >= v.BuyLimitTimes then--买完了
table.insert(self.SellOutList,v)
else --在上架中,还能买。
table.insert(self.SellingList,v)
end
end
end
--在上架中,还能买。
if Next(self.SellingList) then
table.sort(self.SellingList, XUiPurchaseCoatingLB.SortByPriority)
for _,v in pairs(self.SellingList) do
table.insert(self.ListData, v)
end
end
--待上架中
if Next(self.SellWaitList) then
table.sort(self.SellWaitList, XUiPurchaseCoatingLB.SortByPriority)
for _,v in pairs(self.SellWaitList) do
table.insert(self.ListData, v)
end
end
--买完了
if Next(self.SellOutList) then
table.sort(self.SellOutList, XUiPurchaseCoatingLB.SortByPriority)
for _,v in pairs(self.SellOutList) do
table.insert(self.ListData, v)
end
end
--下架了
if Next(self.SellOffList) then
table.sort(self.SellOffList, XUiPurchaseCoatingLB.SortByPriority)
for _,v in pairs(self.SellOffList) do
table.insert(self.ListData, v)
end
end
end
function XUiPurchaseCoatingLB.SortByPriority(a,b)
return a.Priority < b.Priority
end
function XUiPurchaseCoatingLB:StartLBTimer()
if self.IsStart then
return
end
self.IsStart = true
CurrentSchedule = XScheduleManager.ScheduleForever(function() self:UpdateLBTimer()end, 1000)
end
function XUiPurchaseCoatingLB:UpdateLBTimer()
if Next(self.TimeFuns) then
for _,timerFun in pairs(self.TimeFuns)do
if timerFun then
timerFun()
end
end
return
end
self:DestroyTimer()
end
function XUiPurchaseCoatingLB:RemoveTimerFun(id)
self.TimeFuns[id] = nil
end
function XUiPurchaseCoatingLB:RecoverTimerFun(id)
self.TimeFuns[id] = self.TimeSaveFuns[id]
if self.TimeFuns[id] then
self.TimeFuns[id](true)
end
self.TimeSaveFuns[id] = nil
end
function XUiPurchaseCoatingLB:RegisterTimerFun(id,fun,isSave)
if not isSave then
self.TimeFuns[id] = fun
return
end
self.TimeSaveFuns[id] = self.TimeFuns[id]
self.TimeFuns[id] = fun
end
-- 更新数据
function XUiPurchaseCoatingLB:OnRefresh(uiType)
local data = XDataCenter.PurchaseManager.GetDatasByUiType(uiType)
if not data then
return
end
self.CurUiType = uiType
self.GameObject:SetActive(true)
if Next(data) ~= nil then
self:OnSortFun(data)
end
self.TimeFuns = {}
self.TimeSaveFuns = {}
self.DynamicTable:SetDataSource(self.ListData)
self.DynamicTable:ReloadDataASync(1)
self:StartLBTimer()
end
function XUiPurchaseCoatingLB:OnUpdate(rewardList)
if self.IsCheckOpenAddTimeTips then
self:CheckAddTimeTips(rewardList)
self.IsCheckOpenAddTimeTips = false
end
if self.CurUiType then
self:OnRefresh(self.CurUiType)
end
end
function XUiPurchaseCoatingLB:HidePanel()
self:DestroyTimer()
self.GameObject:SetActive(false)
end
function XUiPurchaseCoatingLB:ShowPanel()
self.GameObject:SetActive(true)
end
function XUiPurchaseCoatingLB:DestroyTimer()
if CurrentSchedule then
self.IsStart = false
XScheduleManager.UnSchedule(CurrentSchedule)
CurrentSchedule = nil
end
end
function XUiPurchaseCoatingLB:Init()
self:InitList()
self.CheckBuyFun = function(count, disCountCouponIndex) return self:CheckBuy(count, disCountCouponIndex) end
self.BeforeBuyReqFun = function(successCb) self:CheckIsOpenBuyTips(successCb) end
self.UpdateCb = function(rewardList) self:OnUpdate(rewardList) end
end
function XUiPurchaseCoatingLB:InitList()
self.DynamicTable = XDynamicTableNormal.New(self.Transform)
self.DynamicTable:SetProxy(XUiPurchaseCoatingLBListItem)
self.DynamicTable:SetDelegate(self)
end
-- [监听动态列表事件]
function XUiPurchaseCoatingLB:OnDynamicTableEvent(event, index, grid)
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then
grid:Init(self.UiRoot,self)
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
local data = self.ListData[index]
grid:OnRefresh(data)
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then
local data = self.ListData[index]
if not data then
return
end
XDataCenter.PurchaseManager.RemoveNotInTimeDiscountCoupon(data) -- 移除未到时间的打折券
self.CurData = data
self:OpenUiView(data)
CS.XAudioManager.PlaySound(1011)
end
end
function XUiPurchaseCoatingLB:OpenUiView(data)
local templateId, isWeaponFashion = self:CheckSingleFashion(data)
if templateId then
local disCountValue = XDataCenter.PurchaseManager.GetLBDiscountValue(data)
local buyData = {}
-- 全部拥有才算购买过该礼包
buyData.IsHave = XRewardManager.CheckRewardGoodsListIsOwnWithAll(data.RewardGoodsList)
buyData.ItemIcon = XDataCenter.ItemManager.GetItemIcon(data.ConsumeId)
buyData.ItemCount = math.modf(data.ConsumeCount * disCountValue)
buyData.BuyCallBack = function() self:FashionDetailBuyCB() end
buyData.FashionLabel = data.FashionLabel
-- v1.28-采购优化-赠品队列过滤涂装
local graftRewartdIds = {}
for index, item in ipairs(data.RewardGoodsList) do
if index ~= 1 then
table.insert(graftRewartdIds, item)
end
end
buyData.GiftRewardId = #graftRewartdIds > 0 and graftRewartdIds or nil
XLuaUiManager.Open("UiFashionDetail", templateId, isWeaponFashion, buyData)
else
XLuaUiManager.Open("UiPurchaseBuyTips", data, self.CheckBuyFun, self.UpdateCb, self.BeforeBuyReqFun, XPurchaseConfigs.GetLBUiTypesList())
end
end
-- v1.28-采购优化-检测是否礼包内是否第一件物品为时装
function XUiPurchaseCoatingLB:CheckSingleFashion(data)
local good = data.RewardGoodsList[1]
if good.RewardType == XRewardManager.XRewardType.Fashion then
return good.TemplateId, false
elseif good.RewardType == XRewardManager.XRewardType.WeaponFashion then
return good.TemplateId, true
elseif XDataCenter.ItemManager.IsWeaponFashion(good.TemplateId) then
local templateId = XDataCenter.ItemManager.GetWeaponFashionId(good.TemplateId)
return templateId, true
end
return false
end
function XUiPurchaseCoatingLB:FashionDetailBuyCB()
if self:CheckBuy() then
if self.CurData and self.CurData.Id then
XDataCenter.PurchaseManager.PurchaseRequest(self.CurData.Id, self.UpdateCb, 1, nil, XPurchaseConfigs.GetLBUiTypesList())
end
end
end
function XUiPurchaseCoatingLB:CheckBuy(count, disCountCouponIndex)
count = count or 1
disCountCouponIndex = disCountCouponIndex or 0
if self.CurData.BuyLimitTimes > 0 and self.CurData.BuyTimes == self.CurData.BuyLimitTimes then --卖完了,不管。
XUiManager.TipText("PurchaseLiSellOut")
return false
end
if self.CurData.TimeToShelve > 0 and self.CurData.TimeToShelve > XTime.GetServerNowTimestamp() then --没有上架
XUiManager.TipText("PurchaseBuyNotSet")
return false
end
if self.CurData.TimeToUnShelve > 0 and self.CurData.TimeToUnShelve < XTime.GetServerNowTimestamp() then --下架了
XUiManager.TipText("PurchaseSettOff")
return false
end
if self.CurData.TimeToInvalid > 0 and self.CurData.TimeToInvalid < XTime.GetServerNowTimestamp() then --失效了
XUiManager.TipText("PurchaseSettOff")
return false
end
if self.CurData.ConsumeCount > 0 and self.CurData.ConvertSwitch <= 0 then -- 礼包内容全部拥有
XUiManager.TipText("PurchaseRewardAllHaveErrorTips")
return false
end
local consumeCount = self.CurData.ConsumeCount
if disCountCouponIndex and disCountCouponIndex ~= 0 then
local disCountValue = XDataCenter.PurchaseManager.GetLBCouponDiscountValue(self.CurData, disCountCouponIndex)
consumeCount = math.floor(disCountValue * consumeCount)
else
if self.CurData.ConvertSwitch and consumeCount > self.CurData.ConvertSwitch then -- 已经被服务器计算了抵扣和折扣后的钱
consumeCount = self.CurData.ConvertSwitch
end
if XPurchaseConfigs.GetTagType(self.CurData.Tag) == XPurchaseConfigs.PurchaseTagType.Discount then -- 计算打折后的钱(普通打折或者选择了打折券)
local disCountValue = XDataCenter.PurchaseManager.GetLBDiscountValue(self.CurData)
consumeCount = math.floor(disCountValue * consumeCount)
end
end
if consumeCount > 0 and consumeCount > XDataCenter.ItemManager.GetCount(self.CurData.ConsumeId) then --钱不够
local name = XDataCenter.ItemManager.GetItemName(self.CurData.ConsumeId) or ""
local tips = CSXTextManagerGetText("PurchaseBuyKaCountTips", name)
XUiManager.TipMsg(tips,XUiManager.UiTipType.Wrong)
if self.CurData.ConsumeId == XDataCenter.ItemManager.ItemId.PaidGem then
self.CallBack(XPurchaseConfigs.TabsConfig.HK)
elseif self.CurData.ConsumeId == XDataCenter.ItemManager.ItemId.HongKa then
self.CallBack(XPurchaseConfigs.TabsConfig.Pay)
end
return false
end
return true
end
function XUiPurchaseCoatingLB:CheckIsOpenBuyTips(successCb)
if self.CurData.ConvertSwitch and self.CurData.ConsumeCount > self.CurData.ConvertSwitch then -- 礼包被计算拥有物品折扣价后,拥有物品不会下发,所以无需二次提示转化碎片
if successCb then successCb() end
return
end
local rewardGoodsList = self.CurData.RewardGoodsList
if not rewardGoodsList then
if successCb then successCb() end
return
end
for _, v in pairs(rewardGoodsList) do
if XRewardManager.IsRewardWeaponFashion(v.RewardType, v.TemplateId) then
local isHave, ownRewardIsLimitTime, rewardIsLimitTime, leftTime = XRewardManager.CheckRewardOwn(v.RewardType, v.TemplateId)
if isHave then
if not ownRewardIsLimitTime or not rewardIsLimitTime then
local tipContent = {}
tipContent["title"] = CSXTextManagerGetText("WeaponFashionConverseTitle")
if ownRewardIsLimitTime and not rewardIsLimitTime then --自己拥有的武器涂装是限时的去买永久的
local timeText = XUiHelper.GetTime(leftTime, XUiHelper.TimeFormatType.ACTIVITY)
tipContent["content"] = #rewardGoodsList > 1 and CSXTextManagerGetText("OwnLimitBuyForeverWeaponFashionGiftConverseText", timeText) or CSXTextManagerGetText("OwnLimitBuyForeverWeaponFashionConverseText", timeText)
elseif not ownRewardIsLimitTime and rewardIsLimitTime then --自己拥有的武器涂装是永久的去买限时的
tipContent["content"] = CSXTextManagerGetText("OwnForeverBuyLimitWeaponFashionConverseText")
elseif not ownRewardIsLimitTime and not rewardIsLimitTime then --自己拥有的武器涂装是永久的去买永久的
tipContent["content"] = CSXTextManagerGetText("OwnForeverBuyForeverWeaponFashionConverseText")
end
table.insert(self.OpenBuyTipsList, tipContent)
else
--自己拥有的武器涂装是限时的去买限时的
self.IsCheckOpenAddTimeTips = true
end
end
elseif XRewardManager.IsRewardFashion(v.RewardType, v.TemplateId) and XRewardManager.CheckRewardOwn(v.RewardType, v.TemplateId) then
local tipContent = {}
tipContent["title"] = CSXTextManagerGetText("PurchaseFashionRepeatTipsTitle")
tipContent["content"] = CSXTextManagerGetText("PurchaseFashionRepeatTipsContent")
table.insert(self.OpenBuyTipsList, tipContent)
end
end
if #self.OpenBuyTipsList > 0 then
self:OpenBuyTips(successCb)
return
end
if successCb then successCb() end
end
function XUiPurchaseCoatingLB:OpenBuyTips(successCb)
if #self.OpenBuyTipsList > 0 then
local tipContent = table.remove(self.OpenBuyTipsList, 1)
local sureCallback = function ()
if #self.OpenBuyTipsList > 0 then
self:OpenBuyTips()
else
if successCb then successCb() end
end
end
local closeCallback = function()
self.OpenBuyTipsList = {}
end
XUiManager.DialogTip(tipContent["title"], tipContent["content"], XUiManager.DialogType.Normal, closeCallback, sureCallback)
end
end
function XUiPurchaseCoatingLB:CheckAddTimeTips(rewardList)
if not rewardList then return end
local descStr
for _, v in pairs(rewardList) do
if XRewardManager.IsRewardWeaponFashion(v.RewardType, v.TemplateId)then
descStr = self:GetRewardWeaponFashionDescStr(v.TemplateId)
if descStr then
table.insert(self.TipsTemplateContentList, descStr)
end
end
end
self:OpenAddTimeTips()
end
function XUiPurchaseCoatingLB:GetRewardWeaponFashionDescStr(templateId)
local weaponFashionId = XDataCenter.ItemManager.GetWeaponFashionId(templateId)
local weaponFashion = XDataCenter.WeaponFashionManager.GetWeaponFashion(weaponFashionId)
local time = XDataCenter.ItemManager.GetWeaponFashionAddTime(templateId)
if weaponFashion and weaponFashion:IsTimeLimit() and time then
--此时提示叠加时长信息
local addTime = XUiHelper.GetTime(time, XUiHelper.TimeFormatType.DEFAULT)
local weaponFashionName = XDataCenter.WeaponFashionManager.GetWeaponFashionName(weaponFashionId)
return CSXTextManagerGetText("WeaponFashionLimitGetAlreadyHaveLimit", weaponFashionName, addTime)
end
end
function XUiPurchaseCoatingLB:OpenAddTimeTips()
if #self.TipsTemplateContentList > 0 then
local content = table.remove(self.TipsTemplateContentList)
XUiManager.TipMsg(content, nil, function() self:OpenAddTimeTips() end)
end
end
return XUiPurchaseCoatingLB