c1_lua/lua/app/userdata/shop/shop_data.lua
2023-09-12 10:35:46 +08:00

1049 lines
34 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 ShopData = class("ShopData", BaseData)
function ShopData:ctor()
self.data.isDirty = false
end
function ShopData:initBase()
self:initActChapterStoreData()
self:initCrossDay()
end
function ShopData:clear()
DataManager:unregisterCrossDayFunc("ShopData")
end
function ShopData:setDirty()
self.data.isDirty = not self.data.isDirty
end
function ShopData:initCrossDay()
DataManager:registerCrossDayFunc("ShopData", function()
self:resetRunesGift()
self:resetMallDaily()
self:resetCommonDailyGemAdCount()
self:resetCommonDailyCoinAdCount()
self:setDirty()
end)
end
-- 通用礼包部分 **********************************************************************************************
-- 初始化购买的礼包
function ShopData:initActGift(act)
if EDITOR_MODE then
Logger.logHighlight("初始化 initActGift")
Logger.printTable(act)
end
act = act or {}
local gifts = act.gifts or {}
-- 转为map结构
for _, gift in ipairs(gifts) do
local giftType = gift.act_type
local giftId = gift.id
if not self.giftMap then
self.giftMap = {}
end
if not self.giftMap[giftType] then
self.giftMap[giftType] = {}
end
self.giftMap[giftType][giftId] = gift
end
self:initFirstRecharge()
self:setDirty()
end
function ShopData:getActGiftConfig()
return ConfigManager:getConfig("act_gift")
end
-- 获取通用礼包配置的所有该类型的礼包
function ShopData:getGiftsByType(giftType)
local gifts = {}
for id, data in pairs(self:getActGiftConfig()) do
if data.type == giftType then
gifts[id] = data
end
end
return gifts
end
-- 已购买的礼包
function ShopData:getActGiftMap()
return self.giftMap
end
function ShopData:getActGiftMapByType(actType)
return self.giftMap and self.giftMap[actType]
end
function ShopData:getActGiftDetailData(actType, actId)
if self.giftMap then
if self.giftMap[actType] then
return self.giftMap[actType][actId]
end
end
return nil
end
-- 获得一个礼包的已购次数
function ShopData:getGiftBoughtNum(actType, actId)
local data = self:getActGiftDetailData(actType, actId)
if data then
return data.buy_count
end
return 0
end
-- 重置一个礼包购买次数
function ShopData:resetGiftBoughtNum(actType, actId)
local data = self:getActGiftDetailData(actType, actId)
if data then
data.buy_count = 0
end
end
-- 获取通用礼包剩余可购买次数
function ShopData:getGiftRemainBuyNum(actId)
local bought = self:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, actId)
return self:getActGiftConfig()[actId].limit - bought
end
-- 礼包购买成功更新
function ShopData:updateGiftInfo(gift)
local giftType = gift.act_type
local giftId = gift.id
if not self.giftMap then
self.giftMap = {}
end
if not self.giftMap[giftType] then
self.giftMap[giftType] = {}
end
self.giftMap[giftType][giftId] = gift
if giftType == PayManager.PURCHARSE_TYPE.ACT_GIFT then
local cfgName = PayManager.PURCHARSE_TYPE_CONFIG[giftType]
if cfgName then
local cfg = ConfigManager:getConfig(cfgName)
if cfg and cfg[giftId] then
if cfg[giftId].type == PayManager.PURCHARSE_ACT_TYPE.GROWTH_FUND then
DataManager.GrowthFundData:onBoughtFund(giftId)
elseif cfg[giftId].type == PayManager.PURCHARSE_ACT_TYPE.ARENA_GIFT then
DataManager.ArenaData:onBoughtGift(giftId)
elseif cfg[giftId].type == PayManager.PURCHARSE_ACT_TYPE.WEAPON_GIFT or cfg[giftId].type == PayManager.PURCHARSE_ACT_TYPE.ARMOR_GIFT then
self:onGiftBuySuccess(cfg[giftId].type)
elseif cfg[giftId].type == PayManager.PURCHARSE_ACT_TYPE.WEAPON_UPGRADE_GIFT or cfg[giftId].type == PayManager.PURCHARSE_ACT_TYPE.ARMOR_UPGRADE_GIFT then
DataManager.EquipData:onBuyGiftSuccess(giftId)
elseif cfg[giftId].type == PayManager.PURCHARSE_ACT_TYPE.ACT_SUMMER then
DataManager.ActivityData:onBuyBountyGrade(giftId)
end
end
end
elseif giftType == PayManager.PURCHARSE_TYPE.GROW_UP_GIFT_NEW then
self:onUpGiftBuySuccess()
end
self:setDirty()
end
-- 标记一个礼包需要弹出 在条件允许时会弹出
function ShopData:markPopUpGift(actType, actId)
if not self.needPopUpGift then
self.needPopUpGift = {}
end
if not self.needPopUpGift[actType] then
self.needPopUpGift[actType] = {}
end
-- 如果已经有了 不作处理
for _, id in ipairs(self.needPopUpGift[actType]) do
if id == actId then
return
end
end
table.insert(self.needPopUpGift[actType], actId)
table.sort(self.needPopUpGift[actType])
end
function ShopData:removePopUpGift(actType, actId)
if self.needPopUpGift then
if self.needPopUpGift[actType] then
for index, id in ipairs(self.needPopUpGift[actType]) do
if id == actId then
table.remove(self.needPopUpGift[actType], index)
break
end
end
end
end
end
-- 获取待处理弹出礼包结构 {type:[id1,id2,...]}
function ShopData:getPopUpGift()
return self.needPopUpGift
end
function ShopData:getPopUpGiftByType(actType)
return self.needPopUpGift and self.needPopUpGift[actType]
end
function ShopData:checkHasPopUpGift(actType, actId)
local gifts = self:getPopUpGiftByType(actType)
if gifts and #gifts > 0 then
for _, giftId in ipairs(gifts) do
if (giftId == actId) then
return true
end
end
end
return false
end
-- 获取下一个需要弹出的同类型礼包数据,特别的,如果是主界面部分则多个不同类型的也要考虑进去
function ShopData:getNextPopGiftData(actType, actId)
if GConst.ShopConst.MAIN_UI_POP_TYPE[actType] then
-- 优先找自己类型的,如果是act类则需要找同类型的
local popUpGift = self:getPopUpGiftByType(actType)
if popUpGift and #popUpGift > 0 then
if actType == PayManager.PURCHARSE_TYPE.ACT_GIFT then
for _, nextActId in ipairs(popUpGift) do
if self:getActGiftConfig()[nextActId].type == self:getActGiftConfig()[actId].type then
return actType, nextActId
end
end
else
for _, nextActId in ipairs(popUpGift) do
return actType, nextActId
end
end
end
-- 按顺序找其他类型的
if actType ~= PayManager.PURCHARSE_TYPE.ACT_GIFT then
local popUpGift = self:getPopUpGiftByType(PayManager.PURCHARSE_TYPE.ACT_GIFT)
if popUpGift and #popUpGift > 0 then
for _, nextActId in ipairs(popUpGift) do
-- 新手礼包
if self:getActGiftConfig()[nextActId].type == PayManager.PURCHARSE_ACT_TYPE.BEGINNER_GIFT then
return PayManager.PURCHARSE_TYPE.ACT_GIFT, nextActId
end
-- 助力礼包
if self:getActGiftConfig()[nextActId].type == PayManager.PURCHARSE_ACT_TYPE.LEVEL_UP_GIFT then
return PayManager.PURCHARSE_TYPE.ACT_GIFT, nextActId
end
end
end
end
if actType ~= PayManager.PURCHARSE_TYPE.CHAPTER_GIFT then
local popUpGift = self:getPopUpGiftByType(PayManager.PURCHARSE_TYPE.CHAPTER_GIFT)
if popUpGift and #popUpGift > 0 then
for _, nextActId in ipairs(popUpGift) do
return PayManager.PURCHARSE_TYPE.CHAPTER_GIFT, nextActId
end
end
end
else -- 直接返回同类型的即可
local popUpGift = self:getPopUpGiftByType(actType)
if popUpGift and #popUpGift > 0 then
for _, nextActId in ipairs(popUpGift) do
return actType, nextActId
end
end
end
return nil
end
-- 通用礼包结束 ----------------------------------------------------------------------------------------------
-- 每日特惠部分 **********************************************************************************************
function ShopData:getMallDailyConfig()
return ConfigManager:getConfig("mall_daily")
end
-- 初始化每日特惠
function ShopData:initMallDaily(mallDaily)
-- if EDITOR_MODE then
-- Logger.logHighlight("初始化 initMallDaily")
-- Logger.printTable(mallDaily)
-- end
mallDaily = mallDaily or {}
self.mallDailyAdResetCount = mallDaily.ad_reset_Count or 0
self.mallDailyDiamondResetCount = mallDaily.diamond_reset_Count or 0
self.mallDailyGoods = mallDaily.goods or {} -- {id,good_index,bought}
self:markMallDailyDirty(false)
self:setDirty()
end
-- 购买成功后更新数据
function ShopData:updateMallDailyGoods(info)
local goods = self:getMallDailyGoods()
for _, data in ipairs(goods) do
if data.id == info.id and data.good_index == info.good_index then
data.bought = info.bought
break
end
end
self:setDirty()
end
-- 每日特惠跨天重置
function ShopData:resetMallDaily()
self.mallDailyAdResetCount = 0
self.mallDailyDiamondResetCount = 0
self:markMallDailyDirty(true) -- 标记需要重新请求数据,在界面/下次打开界面时请求
end
function ShopData:getMallDailyDirty()
return self.data.mallDailyDirty
end
function ShopData:markMallDailyDirty(isDirty)
self.data.mallDailyDirty = isDirty
end
function ShopData:getMallDailyAdResetCount()
return self.mallDailyAdResetCount
end
function ShopData:addMallDailyAdResetCount()
self.mallDailyAdResetCount = self.mallDailyAdResetCount + 1
end
function ShopData:getMallDailyAdLeftCount()
return 1 - self.mallDailyAdResetCount -- 目前无配置表
end
function ShopData:getMallDailyDiamondResetCount()
return self.mallDailyDiamondResetCount
end
function ShopData:addMallDailyDiamondResetCount()
self.mallDailyDiamondResetCount = self.mallDailyDiamondResetCount + 1
end
function ShopData:getMallDailyDiamondLeftCount()
return 1 - self.mallDailyDiamondResetCount -- 目前无配置表
end
function ShopData:getMallDailyGoods()
return self.mallDailyGoods
end
function ShopData:getMallDailyDiamondResetCost()
return 30 -- 目前无配置表
end
-- 每日特惠 广告商品最大购买次数
function ShopData:getMallDailyFirstItemAdMaxCount()
return 1 -- 目前无配置表
end
-- 每日特惠 常规商品最大购买次数
function ShopData:getMallDailyGoodsLimitCount()
return 1 -- 目前无配置表
end
-- 每日特惠 是否开启
function ShopData:getMallDailyIsOpen()
return ModuleManager:getIsOpen()
end
-- 根据商品id获取本日的随机商品数据
function ShopData:getMallDailyRewardAndCost(id)
local cfg = self:getMallDailyConfig()
local index
for _, info in ipairs(self:getMallDailyGoods()) do
if info.id == id then
index = info.good_index
break
end
end
if index then
return cfg[id].good[index], cfg[id].cost and cfg[id].cost[index]
end
end
-- 每日特惠结束 ----------------------------------------------------------------------------------------------
-- 常驻金币礼包 **********************************************************************************************
function ShopData:getMallGoldConfig()
return ConfigManager:getConfig("mall_gold")
end
function ShopData:initCommonDailyGoldGift(ad_count)
-- if EDITOR_MODE then
-- Logger.logHighlight("初始化 initCommonDailyGoldGift")
-- Logger.printTable(ad_count)
-- end
ad_count = ad_count or {}
self.commonDailyGoldBuyCount = ad_count[1] or 0 -- 已购的金币广告礼包次数
self:setDirty()
end
function ShopData:getCommonDailyCoinAdBuyCount()
return self.commonDailyGoldBuyCount
end
function ShopData:resetCommonDailyCoinAdCount()
self.commonDailyGoldBuyCount = 0
end
-- 根据时间得到当前挂机金币奖励
function ShopData:getCommonDailyCoinNum(id)
local cfgInfo = self:getMallGoldConfig()[id]
if cfgInfo then
return cfgInfo.gold.num
end
end
function ShopData:getCommonDailyCoinDataById(id)
local cfgInfo = self:getMallGoldConfig()[id]
if cfgInfo then
return cfgInfo.gold.num, cfgInfo.cost
end
end
-- 常驻金币礼包结束 ----------------------------------------------------------------------------------------------
-- 常驻钻石礼包 **********************************************************************************************
function ShopData:resetCommonDailyGemAdCount()
local gift = self:getActGiftDetailData(PayManager.PURCHARSE_TYPE.MALL_TREASURE, 1)
if gift then
gift.buy_count = 0
end
end
function ShopData:getMallTreasureConfig()
return ConfigManager:getConfig("mall_treasure") -- 审核模式会去读另一张表,在config_manager中处理的
end
-- 常驻钻石礼包结束 ----------------------------------------------------------------------------------------------
-- 章节礼包 act_chapter_store **********************************************************************************************
function ShopData:initActChapterStoreData()
if not self.actChapterStoreMap then
self.actChapterStoreId2ChapterIdMap = {}
self.actChapterStoreChapterId2IdMap = {}
local cfg = self:getActChapterStoreConfig()
for id, cfgInfo in pairs(cfg) do
self.actChapterStoreId2ChapterIdMap[id] = cfgInfo.chapter
self.actChapterStoreChapterId2IdMap[cfgInfo.chapter] = id
end
end
end
function ShopData:getActChapterStoreConfig()
return ConfigManager:getConfig("act_chapter_store")
end
-- 特定章节礼包是否已购买
function ShopData:getActChapterStoreHasBuy(chapterId)
-- 章节礼包的id-chapterId相互对应map
local actId = self.actChapterStoreChapterId2IdMap[chapterId]
if self:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.CHAPTER_GIFT, actId) == 0 then
return false
else
return true
end
end
-- 根据当前章节,获取可购买的id数组
function ShopData:getActChapterStoreCanBuyActIds()
local list = {}
local curChapterId = DataManager.ChapterData:getMaxChapterId()
for id = 1, curChapterId do
if not self:getActChapterStoreHasBuy(id) then
table.insert(list, self.actChapterStoreChapterId2IdMap[id])
end
end
return list
end
function ShopData:markPopUpGiftForActChapterStore(chapterId)
local actId = self.actChapterStoreChapterId2IdMap[chapterId]
self:markPopUpGift(PayManager.PURCHARSE_TYPE.CHAPTER_GIFT, actId)
end
-- 章节礼包结束 ----------------------------------------------------------------------------------------------
-- 新手礼包 **********************************************************************************************
function ShopData:getIsBeginnerGiftOpen()
return ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.BEGINNER_GIFT, true)
end
function ShopData:markPopUpGiftForBeginnerGift()
self:markPopUpGift(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ShopConst.BEGINNER_GIFT_ID)
end
function ShopData:getBeginnerGiftHasBuy()
if self:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ShopConst.BEGINNER_GIFT_ID) == 0 then
return false
else
return true
end
end
-- 新手礼包侧边栏展示时间
function ShopData:getBeginnerGiftSideBarDurationTime()
return 3 * 24 * 3600 -- 目前无配置表
end
-- 已开启 未购买 且 在开服的3天内
function ShopData:getBeginnerGiftShowSideBar()
return self:getIsBeginnerGiftOpen() and not self:getBeginnerGiftHasBuy() and self:getBeginnerGiftSideBarRemainTime() > 0
end
-- 展示在侧边栏的剩余时间
function ShopData:getBeginnerGiftSideBarRemainTime()
local createTime = DataManager.PlayerData:getCreateTime() // 1000
local durationTime = self:getBeginnerGiftSideBarDurationTime()
return createTime + durationTime - Time:getServerTime()
end
-- 新手礼包结束 ----------------------------------------------------------------------------------------------
-- 助力与金币礼包(act_gift) **********************************************************************************************
-- 初始化助力与金币礼包
function ShopData:initLevelUpGift(levelUpGift)
-- if EDITOR_MODE then
-- Logger.logHighlight("初始化 助力与金币礼包")
-- Logger.printTable(levelUpGift)
-- end
levelUpGift = levelUpGift or {}
self.levelUpGifts = levelUpGift.gifts or {} -- [{trigger_level,current_level_up_gift,trigger_at}]
-- 金币礼包部分会一直保留
self:initCoinGift(levelUpGift.gold_gift_id, levelUpGift.gold_gift_trigger_at)
self.data.currentPayAmount = levelUpGift.current_pay_amount or 0 -- 已经计算过降档的付费数额
self:setDirty()
end
function ShopData:initCoinGift(id, triggerTime)
-- if EDITOR_MODE then
-- Logger.logHighlight("初始化 金币礼包 -- id:%s time:%s", id, triggerTime)
-- end
self.coinGiftId = id or 0 -- 金币礼包触发id
self.coinGiftTriggerTime = triggerTime or 0 -- 金币礼包触发时间
self:setDirty()
end
function ShopData:getPayAmount()
return self.data.currentPayAmount
end
function ShopData:addPayment(rechargeId)
local cfg = ConfigManager:getConfig("recharge")[rechargeId]
self.data.currentPayAmount = self.data.currentPayAmount + cfg.price
end
function ShopData:getLevelUpGift()
return self.levelUpGifts
end
function ShopData:onTriggerLevelUpGift(gift)
table.insert(self.levelUpGifts, gift)
-- 标记弹窗
self:markPopUpGift(PayManager.PURCHARSE_TYPE.ACT_GIFT, gift.current_level_up_gift)
end
function ShopData:removeLevelUpGift(actId)
for index, gift in ipairs(self.levelUpGifts) do
if gift.current_level_up_gift == actId then
table.remove(self.levelUpGifts, index)
break
end
end
end
-- 获得可购买的助力礼包Ids
function ShopData:getLevelUpGiftActIds()
local list = {}
for index, gift in ipairs(self.levelUpGifts) do
-- 剔除已购的助力礼包 这个礼包只会有一次
if self:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, gift.current_level_up_gift) == 0 then
table.insert(list, gift.current_level_up_gift)
end
end
table.sort(list)
return list
end
-- 获得当前金币礼包的id
function ShopData:getCoinGiftId()
return self.coinGiftId
end
-- 获得金币礼包的触发时间
function ShopData:getCoinGiftTriggerTime()
return self.coinGiftTriggerTime // 1000
end
-- 获得当前可购买的金币礼包id,需要未购买且时间满足
function ShopData:getValidCoinGiftId()
local actId = self:getCoinGiftId()
if actId > 0 then
local cfgInfo = self:getActGiftConfig()[actId]
local triggerTime = self:getCoinGiftTriggerTime()
local remainTime = triggerTime + (cfgInfo.limit_time or 0) * 3600 - Time:getServerTime()
if remainTime > 0 then
-- 查看最近一次购买时间
local actGiftDetailData = self:getActGiftDetailData(PayManager.PURCHARSE_TYPE.ACT_GIFT, actId)
if actGiftDetailData then
local latestBuyTime = actGiftDetailData.latest_buy_at // 1000
if latestBuyTime <= 0 then
return actId
else
-- 目前规则上有CD 所以如果购买时间在CD范围内则该礼包无效
local limitTime = (self:getActGiftConfig()[actId].limit_time or 0) * 3600
if Time:getServerTime() > latestBuyTime + limitTime then
return actId
end
end
else -- 没有买过,这个肯定可以购买
return actId
end
end
end
return nil
end
-- 获取金币礼包付款条件cfgInfo数组 从小到大
function ShopData:_getCoinGiftPayConditionList()
if not self.coinGiftPayConditionList then
self.coinGiftPayConditionList = {}
for id, cfgInfo in pairs(self:getActGiftConfig()) do
if cfgInfo.type == PayManager.PURCHARSE_ACT_TYPE.COIN_GIFT then
local tmpCfgInfo = clone(cfgInfo)
tmpCfgInfo.id = id
table.insert(self.coinGiftPayConditionList, tmpCfgInfo)
end
end
table.sort(self.coinGiftPayConditionList, function (a, b)
return a.pay_condition[1] < b.pay_condition[1]
end)
end
return self.coinGiftPayConditionList
end
-- 根据当前付费和金币礼包数据 判断并返回合法的金币礼包触发id
function ShopData:checkAndGetCoinGiftTriggerId()
local triggerId
local canTrigger = true
local curActId = self:getCoinGiftId()
if curActId > 0 then
local cfgInfo = self:getActGiftConfig()[curActId]
local cdTime = (cfgInfo.cd or 0) * 3600
local curTriggerTime = self:getCoinGiftTriggerTime()
-- 是否还在已触发限时内
if Time:getServerTime() < curTriggerTime + cdTime then
canTrigger = false
end
end
if canTrigger then
-- 从表中找出符合付费金额的actId
local payAmount = self:getPayAmount()
local payConditionList = self:_getCoinGiftPayConditionList()
for index, info in ipairs(payConditionList) do
local p1 = info.pay_condition[1]
local p2 = info.pay_condition[2]
if p1 <= payAmount and payAmount < p2 then
triggerId = info.id
break
end
end
-- 超出上限
if not triggerId then
local count = #payConditionList
triggerId = payConditionList[count].id
end
end
return triggerId
end
function ShopData:onTriggerCoinGift(actId)
self:initCoinGift(actId, Time:getServerTime() * 1000)
-- 标记弹窗
self:markPopUpGift(PayManager.PURCHARSE_TYPE.ACT_GIFT, actId)
end
-- 助力礼包结束 ----------------------------------------------------------------------------------------------
-- 成长礼包 **********************************************************************************************
function ShopData:getActGrowUpGiftConfig()
return ConfigManager:getConfig("act_growup_gift_new")
end
-- 初始化成长礼包
function ShopData:initGrowUpGift(growUpGift)
if EDITOR_MODE then
Logger.logHighlight("初始化成长礼包 growUpGift -- now_ts:%s", Time:getServerTime())
Logger.printTable(growUpGift)
end
self.growUpGift = growUpGift
if self:hasGrowUpGift() then
self:markPopUpGiftForGrowUpGift(self.growUpGift.current_grow_up_id)
end
self:setDirty()
end
-- 当前是否有成长礼包
function ShopData:hasGrowUpGift()
return self.growUpGift ~= nil and self:getGrowUpGiftRemainTime() > 0
end
-- 获取当前成长礼包
function ShopData:getGrowUpGift()
if not self:hasGrowUpGift() then
return nil
end
return self.growUpGift
end
-- 获取成长礼包倒计时
function ShopData:getGrowUpGiftRemainTime()
if not self.growUpGift then
return -1
end
return (self.growUpGift.trigger_end_at // 1000) - Time:getServerTime()
end
function ShopData:markPopUpGiftForGrowUpGift(actId)
self:markPopUpGift(PayManager.PURCHARSE_TYPE.GROW_UP_GIFT_NEW, actId)
end
-- 成长礼包购买成功
function ShopData:onUpGiftBuySuccess()
self.growUpGift.trigger_end_at = -1
self:setDirty()
end
-- 成长礼包结束 ----------------------------------------------------------------------------------------------
-- 首充(作废) **********************************************************************************************
function ShopData:getIsFirstRechargeOpen()
return false -- ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.FIRST_RECHARGE, true)
end
-- 用于标记是否弹窗 要求等级不低于2 未领取该奖励
function ShopData:initFirstRecharge()
-- local lv = DataManager.PlayerData:getLv()
-- if lv > 1 and not self:getHasGotFirstRechargeReward() then
-- self:markPopUpGift(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ShopConst.FIRST_RECHARGE_ID)
-- end
end
-- 是否有首充奖励 有支付且未领取
function ShopData:getHasFirstRechargeReward()
-- local pay = DataManager.PlayerData:getTotalPayAmount()
-- if pay > 0 and not self:getHasGotFirstRechargeReward() then
-- return true
-- else
-- return false
-- end
return false
end
-- 是否已领取首充奖励
function ShopData:getHasGotFirstRechargeReward()
-- 通用act礼包中是否有已购
-- local boughtNum = self:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ShopConst.FIRST_RECHARGE_ID)
-- return boughtNum > 0
return true
end
-- 侧边栏是否展示 要求功能开启 未领取该奖励
function ShopData:getShowFirstRechargeSideBar()
-- if not self:getIsFirstRechargeOpen() then
-- return false
-- end
-- if not self:getHasGotFirstRechargeReward() then
-- return true
-- else
-- return false
-- end
return false
end
-- 侧边栏红点
function ShopData:showFirstRechargeRp()
-- if not self:getIsFirstRechargeOpen() then
-- return false
-- end
-- return self:getHasFirstRechargeReward()
return false
end
-- 首充结束 ----------------------------------------------------------------------------------------------
-- 入门礼包 ----------------------------------------------------------------------------------------------
function ShopData:initIntroductGift(introductGift)
introductGift = introductGift or {}
self.introductGift = introductGift or {}
self.introductGiftTriggerTime = self.introductGift.trigger_at or 0
self:checkPopIntroductGift()
end
-- 如果可购买则标记可弹窗
function ShopData:checkPopIntroductGift()
if (self:getIntroductGiftRemainTime() > 0 and self:getIntroductGiftRemainBuyCount() > 0) then
self:markPopUpGift(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ShopConst.INTRODUCT_GIFT_ID)
end
end
function ShopData:getIntroductGiftTriggerTime()
return self.introductGiftTriggerTime // 1000
end
function ShopData:setIntroductGiftTriggerTime(time)
self.introductGiftTriggerTime = time
end
-- 入门礼包剩余时间
function ShopData:getIntroductGiftRemainTime()
local cfgInfo = self:getActGiftConfig()[GConst.ShopConst.INTRODUCT_GIFT_ID]
local triggerTime = self:getIntroductGiftTriggerTime()
local remainTime = triggerTime + (cfgInfo.limit_time or 0) * 3600 - Time:getServerTime()
return remainTime
end
-- 入门礼包剩余可购次数
function ShopData:getIntroductGiftRemainBuyCount()
local cfgInfo = self:getActGiftConfig()[GConst.ShopConst.INTRODUCT_GIFT_ID]
local buyCount = self:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ShopConst.INTRODUCT_GIFT_ID)
return (cfgInfo.limit or 1) - buyCount
end
-- 触发入门礼包(如果已经触发则不会更新)
function ShopData:onTriggerIntroductGift()
if self:getIntroductGiftTriggerTime() <= 0 then
self:initIntroductGift({trigger_at = Time:getServerTime() * 1000})
-- 标记弹窗
self:markPopUpGift(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ShopConst.INTRODUCT_GIFT_ID)
end
end
-- 侧边栏是否展示(时间次数均满足)
function ShopData:getIntroductGiftShowSideBar()
return self:getIntroductGiftRemainBuyCount() > 0 and self:getIntroductGiftRemainTime() > 0
end
-- 入门礼包结束 --------------------------------------------------------------------------------------------
-- 武器礼包 --------------------------------------------------------------------------------------------
-- 初始化礼包(礼包类型1下的礼包可以直接复用这里的方法)
function ShopData:initGift(giftType, gift, isInit)
if giftType == nil or gift == nil then
return
end
if EDITOR_MODE then
Logger.logHighlight("初始化礼包[%s] -- now_ts:%s", giftType, Time:getServerTime())
Logger.printTable(gift)
end
if not self.gifts then
self.gifts = {}
end
local giftStruct = {}
if giftType == PayManager.PURCHARSE_ACT_TYPE.WEAPON_GIFT or giftType == PayManager.PURCHARSE_ACT_TYPE.ARMOR_GIFT then
giftStruct.id = gift.gift_id
giftStruct.triggerTime = gift.trigger_at
giftStruct.expireTime = gift.expire_at
giftStruct.cdEndTime = gift.cd_end_at
end
local tempId = self.gifts[giftType] and self.gifts[giftType].id or 0
local tempTrigerTime = self.gifts[giftType] and self.gifts[giftType].triggerTime or 0
self.gifts[giftType] = giftStruct
if not isInit and self:hasGift(giftType) then
if tempId == self.gifts[giftType].id and tempTrigerTime == self.gifts[giftType].triggerTime then
if EDITOR_MODE then
Logger.logHighlight("重复礼包数据,不处理弹窗:" .. tempId)
end
else
self:markPopUpGift(PayManager.PURCHARSE_TYPE.ACT_GIFT, self.gifts[giftType].id)
end
end
self:setDirty()
end
-- 当前是否有礼包
function ShopData:hasGift(giftType)
if GFunc.isShenhe() then
return false
end
return self.gifts ~= nil and self:getGiftRemainTime(giftType) > 0
end
-- 获取当前礼包
function ShopData:getGift(giftType)
if not self:hasGift(giftType) then
return nil
end
return self.gifts[giftType]
end
-- 获取礼包倒计时
function ShopData:getGiftRemainTime(giftType)
if not self.gifts or not self.gifts[giftType] then
return -1
end
return (self.gifts[giftType].expireTime // 1000) - Time:getServerTime()
end
-- 检查是否弹出ACT_GIFT类型的礼包
function ShopData:checkPopGift(actGiftType)
local gifts = self:getPopUpGiftByType(PayManager.PURCHARSE_TYPE.ACT_GIFT)
if gifts and #gifts > 0 then
for _, actId in ipairs(gifts) do
local cfgInfo = self:getActGiftConfig()[actId]
if cfgInfo and cfgInfo.type == actGiftType then
ModuleManager.ShopManager:triggerGiftPopUI(PayManager.PURCHARSE_TYPE.ACT_GIFT, actId, BIReport.PAY_UI_SHOW_TYPE.TRIGGER_POP)
end
end
end
end
-- 礼包购买成功
function ShopData:onGiftBuySuccess(giftType)
self.gifts[giftType].expireTime = -1
self:setDirty()
end
-- 武器礼包结束 -----------------------------------------------------------------------------------------
-- 底部栏是否有红点
function ShopData:getRp()
if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.MALL, true) then
return false
end
if GFunc.isShenhe() then
return false
end
local isHotOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.MALL_DAILY, true)
-- 主要商品 每日特惠广告道具
local hotAdGoods = self:getMallDailyGoods() and self:getMallDailyGoods()[1]
local hotAdGoodsBuyCount = hotAdGoods and hotAdGoods.bought or 0
local hotAdGoodsRp = self:getMallDailyFirstItemAdMaxCount() - hotAdGoodsBuyCount > 0
-- 主要商品 每日特惠刷新
local hotRefreshRp = self:getMallDailyAdLeftCount() > 0
-- 主要商品 钻石广告道具
local gemAdId = 1 -- 约定首位为免费栏位
local cfgInfo = self:getMallTreasureConfig()[gemAdId]
local gemAdMaxTimes = cfgInfo and cfgInfo.daily or 0
local gemAdRp = gemAdMaxTimes - DataManager.ShopData:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.MALL_TREASURE, gemAdId) > 0
-- 主要商品 金币广告道具
local coinAdId = 1 -- 约定首位为免费栏位
local cfgInfo = self:getMallGoldConfig()[coinAdId]
local coinAdMaxTimes = cfgInfo and cfgInfo.daily or 0
local coinAdRp = coinAdMaxTimes - DataManager.ShopData:getCommonDailyCoinAdBuyCount() > 0
return (isHotOpen and (hotAdGoodsRp or hotRefreshRp)) or gemAdRp or coinAdRp or self:getShopDiscountRedPoint()
end
-- 商店界面特惠页签是否有红点
function ShopData:checkShopDiscountRedPoint()
local discountRedPointTime = LocalData:getShopDiscountRedPointTime()
local today = Time:getBeginningOfServerToday()
if discountRedPointTime == today then
self.shopDiscountRedPoint = false
return
end
local actIds = self:getActChapterStoreCanBuyActIds()
if actIds and #actIds > 0 then
self.shopDiscountRedPoint = true
return
end
if not self:getBeginnerGiftHasBuy() then
self.shopDiscountRedPoint = true
return
end
actIds = self:getLevelUpGiftActIds()
if actIds and #actIds > 0 then
self.shopDiscountRedPoint = true
return
end
if self:hasGrowUpGift() then
self.shopDiscountRedPoint = true
return
end
local id = self:getValidCoinGiftId()
if id and id > 0 then
self.shopDiscountRedPoint = true
return
end
self.shopDiscountRedPoint = false
LocalData:setShopDiscountRedPointTime(today)
end
function ShopData:getShopDiscountRedPoint()
return self.shopDiscountRedPoint
end
function ShopData:markShopDiscountRedPoint()
if not self.shopDiscountRedPoint then
return
end
self.shopDiscountRedPoint = false
local today = Time:getBeginningOfServerToday()
LocalData:setShopDiscountRedPointTime(today)
end
function ShopData:getEntranceDiscountRedPoint()
return not self.isClickedDiscount
end
function ShopData:markEntranceDiscountRedPoint()
self.isClickedDiscount = true
end
function ShopData:checkLoginPopInfo()
-- 初始化礼包弹出逻辑
local actPopUpGifts = self:getPopUpGiftByType(PayManager.PURCHARSE_TYPE.ACT_GIFT)
if not actPopUpGifts or #actPopUpGifts <= 0 then
self:markPopLastChapterActGift()
end
end
function ShopData:markPopLastChapterActGift()
local chapterPopUpGifts = self:getPopUpGiftByType(PayManager.PURCHARSE_TYPE.CHAPTER_GIFT)
if not chapterPopUpGifts or #chapterPopUpGifts <= 0 then
local list = self:getActChapterStoreCanBuyActIds()
if list and list[1] then
self:markPopUpGift(PayManager.PURCHARSE_TYPE.CHAPTER_GIFT, list[#list])
end
end
end
-- 重置符文每日礼包次数
function ShopData:resetRunesGift()
for index, id in ipairs(GConst.RunesConst.GIFT_IDS) do
self:resetGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, id)
end
end
return ShopData