PGRData/Script/matrix/xui/xuipurchase/XUiPurchaseCoatingLB.lua
2024-09-01 22:49:41 +02:00

429 lines
No EOL
16 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 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.SellHaveList = {}--已拥有
self.SellingList = {}--在上架中
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--下架了
--不显示
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)
elseif XDataCenter.PurchaseManager.IsLBHave(v) then--已拥有
table.insert(self.SellHaveList,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.SellHaveList) then
table.sort(self.SellHaveList, XUiPurchaseCoatingLB.SortByPriority)
for _,v in pairs(self.SellHaveList) do
table.insert(self.ListData, v)
end
end
end
function XUiPurchaseCoatingLB.SortByPriority(a,b)
if a.Priority < b.Priority then
return true
elseif a.Priority > b.Priority then
return false
elseif a.Priority == b.Priority then
return a.Id < b.Id
end
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 = XDataCenter.PurchaseManager.IsLBHave(data)
if data.BuyLimitTimes and data.BuyLimitTimes > 0 and data.BuyTimes == data.BuyLimitTimes then
buyData.IsHave = true
else
buyData.IsHave = XRewardManager.CheckRewardGoodsListIsOwnWithAll(data.RewardGoodsList)
end
buyData.ItemCount = math.modf(data.ConvertSwitch * 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
-- v1.31折价礼包拥有一部分之后ConvertSwitch会小于ConsumeCount
buyData.IsConvert = data.ConvertSwitch < data.ConsumeCount
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 0
end
if self.CurData.TimeToShelve > 0 and self.CurData.TimeToShelve > XTime.GetServerNowTimestamp() then --没有上架
XUiManager.TipText("PurchaseBuyNotSet")
return 0
end
if self.CurData.TimeToUnShelve > 0 and self.CurData.TimeToUnShelve < XTime.GetServerNowTimestamp() then --下架了
XUiManager.TipText("PurchaseSettOff")
return 0
end
if self.CurData.TimeToInvalid > 0 and self.CurData.TimeToInvalid < XTime.GetServerNowTimestamp() then --失效了
XUiManager.TipText("PurchaseSettOff")
return 0
end
if self.CurData.ConsumeCount > 0 and self.CurData.ConvertSwitch <= 0 then -- 礼包内容全部拥有
XUiManager.TipText("PurchaseRewardAllHaveErrorTips")
return 0
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)
if XUiHelper.CanBuyInOtherPlatformHongKa(consumeCount) then
return 2
end
local tips = XUiHelper.GetCountNotEnoughTips(self.CurData.ConsumeId)
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 0
end
return 1
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