586 lines
16 KiB
Lua
586 lines
16 KiB
Lua
local GiftPopData = class("GiftPopData", BaseData)
|
||
|
||
local ActGiftCfg = ConfigManager:getConfig("act_gift")
|
||
|
||
local SPECIAL_TYPE = "special"
|
||
|
||
function GiftPopData:getGiftConfig(id)
|
||
return ActGiftCfg[id]
|
||
end
|
||
|
||
function GiftPopData:ctor()
|
||
self:clear()
|
||
end
|
||
|
||
function GiftPopData:clear()
|
||
self.popGiftMap = {}
|
||
self.triggerTimeMap = {}
|
||
self.notBuyCountMap = {} -- 距离上次购买后,触发了但是未购买的总次数,用于更新CD <giftType, notBuyCount>
|
||
self.typeIds = {}
|
||
self.data.isDirty = false
|
||
self.carrierUnlockGiftPopFlag = false
|
||
end
|
||
|
||
function GiftPopData:getBiReportByGiftType(giftId)
|
||
return PayManager:getItemGetType(PayManager.PURCHARSE_TYPE.ACT_GIFT, giftId)
|
||
end
|
||
|
||
function GiftPopData:initPopCfg()
|
||
if self.typeIds and table.nums(self.typeIds) > 0 then
|
||
return
|
||
end
|
||
local popType = {}
|
||
for type, _ in pairs(GConst.GiftPopConst.BI_POP_GIFT_TYPE) do
|
||
popType[type] = true
|
||
end
|
||
|
||
self.typeIds = {}
|
||
for id, info in pairs(ActGiftCfg) do
|
||
local giftType = info.type
|
||
if popType[giftType] then
|
||
self.typeIds[giftType] = self.typeIds[giftType] or {}
|
||
|
||
local parameter = info.parameter or SPECIAL_TYPE
|
||
self.typeIds[giftType][parameter] = self.typeIds[giftType][parameter] or {}
|
||
|
||
table.insert(self.typeIds[giftType][parameter], id)
|
||
end
|
||
end
|
||
end
|
||
|
||
function GiftPopData:initData(data)
|
||
self:initPopCfg()
|
||
|
||
data = data or {}
|
||
self.popGiftMap = {}
|
||
self.triggerTimeMap = {}
|
||
self.notBuyCountMap = {}
|
||
self:refreshPopGift(data.trigger_gifts, data.not_buy_count)
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("---------------------------GiftPopData:initData---------------------------")
|
||
Logger.printTable(data)
|
||
Logger.printTable(self.popGiftMap)
|
||
Logger.printTable(self.triggerTimeMap)
|
||
Logger.printTable(self.notBuyCountMap)
|
||
end
|
||
end
|
||
|
||
function GiftPopData:refreshPopGift(data, notBuyCountMap)
|
||
if not data then
|
||
return
|
||
end
|
||
|
||
self.triggerTimeMap = data or {}
|
||
self.notBuyCountMap = notBuyCountMap or {}
|
||
|
||
local nowTime = Time:getServerTime()
|
||
for id, triggerTime in pairs(data) do
|
||
local config = ActGiftCfg[id]
|
||
if config then
|
||
local giftType = config.type
|
||
local endTime = triggerTime + config.limit_time * 3600
|
||
local buyCount = DataManager.PaymentData:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, id)
|
||
local notBuyCount = self:getPopGiftNotBuyCount(id)
|
||
local cooldown
|
||
if config.cd then
|
||
if config.max_cd_times then
|
||
cooldown = triggerTime + (config.cd or 0) * 3600 * math.max(1, math.min(notBuyCount + 1, config.max_cd_times))
|
||
else
|
||
cooldown = triggerTime + (config.cd or 0) * 3600
|
||
end
|
||
else
|
||
cooldown = triggerTime
|
||
end
|
||
|
||
local realEndTime = endTime
|
||
if buyCount and buyCount > 0 then -- 已购买
|
||
if not config.cd then
|
||
cooldown = nowTime
|
||
end
|
||
endTime = nowTime
|
||
end
|
||
|
||
local info = {
|
||
beginTime = triggerTime,
|
||
endTime = endTime,
|
||
realEndTime = realEndTime,
|
||
cooldown = cooldown,
|
||
type = giftType,
|
||
id = id,
|
||
}
|
||
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("初始化礼包冷却 -- giftId:%s notBuyCount:%s triggerTime:%s cooldown:%s", id, notBuyCount, Time:formatTimeYMDHMS2(triggerTime), Time:formatTimeYMDHMS2(cooldown))
|
||
end
|
||
|
||
self.popGiftMap[giftType] = self.popGiftMap[giftType] or {}
|
||
|
||
local parameter = config.parameter or SPECIAL_TYPE
|
||
self.popGiftMap[giftType][parameter] = self.popGiftMap[giftType][parameter] or {}
|
||
table.insert(self.popGiftMap[giftType][parameter], info)
|
||
end
|
||
end
|
||
|
||
self:setGiftDirty()
|
||
end
|
||
|
||
function GiftPopData:getMinPopGiftData()
|
||
local nowTime = Time:getServerTime()
|
||
local result
|
||
local minTime
|
||
for type, map in pairs(self.popGiftMap) do
|
||
local find = false
|
||
for parameter, list in pairs(map) do
|
||
for _, info in ipairs(list) do
|
||
local endTime = info.endTime
|
||
if type == PayManager.PURCHARSE_ACT_TYPE.GIFT_POP_CHAPTER then
|
||
endTime = info.beginTime + ActGiftCfg[info.id].limit_time_2 * 3600
|
||
end
|
||
if endTime > nowTime and (not minTime or endTime < minTime) then
|
||
local boughtCount = self:getGiftBoughtNum(info.id)
|
||
if boughtCount <= 0 then
|
||
minTime = endTime
|
||
result = info
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
return result
|
||
end
|
||
|
||
function GiftPopData:getCustomGiftList(giftType, parameter)
|
||
if not self.popGiftMap[giftType] then
|
||
return
|
||
end
|
||
|
||
return self.popGiftMap[giftType][parameter]
|
||
end
|
||
|
||
function GiftPopData:getPopGiftMap()
|
||
return self.popGiftMap
|
||
end
|
||
|
||
function GiftPopData:getPopGiftListByGiftType(giftType)
|
||
if not self.popGiftMap[giftType] then
|
||
return {}
|
||
end
|
||
local list = {}
|
||
for k,v in pairs(self.popGiftMap[giftType]) do
|
||
for kk, vv in pairs(v) do
|
||
local boughtCount = DataManager.GiftPopData:getGiftBoughtNum(vv.id)
|
||
if boughtCount <= 0 then
|
||
table.insert(list, vv)
|
||
end
|
||
end
|
||
end
|
||
table.sort(list, function(a, b)
|
||
return a.id < b.id
|
||
end)
|
||
return list
|
||
end
|
||
|
||
function GiftPopData:getPopGiftTriggerTime(giftId)
|
||
return self.triggerTimeMap and self.triggerTimeMap[giftId] or 0
|
||
end
|
||
|
||
function GiftPopData:getPopGiftNotBuyCount(giftId)
|
||
local giftType = ActGiftCfg[giftId].type
|
||
return self.notBuyCountMap and self.notBuyCountMap[giftType] or 0
|
||
end
|
||
|
||
function GiftPopData:resetNotBuyCount(giftId)
|
||
if ActGiftCfg[giftId] then
|
||
local giftType = ActGiftCfg[giftId].type
|
||
if self.notBuyCountMap and self.notBuyCountMap[giftType] then
|
||
self.notBuyCountMap[giftType] = 0
|
||
|
||
-- 本地重置冷却时间
|
||
for giftType, map in pairs(self.popGiftMap) do
|
||
for parameter, list in pairs(map) do
|
||
for _, info in ipairs(list) do
|
||
if info.type == ActGiftCfg[giftId].type then
|
||
local triggerTime = self:getPopGiftTriggerTime(info.id)
|
||
local oldCoolDown = info.cooldown
|
||
info.cooldown = triggerTime + (ActGiftCfg[info.id].cd or 0) * 3600
|
||
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("因购买调整礼包 %s 冷却时间:%s->%s", info.id, Time:formatTimeYMDHMS2(oldCoolDown), Time:formatTimeYMDHMS2(info.cooldown))
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 同步服务器
|
||
ModuleManager.GiftPopManager:syncActivePopGiftNotBuyCountOnly(self.notBuyCountMap)
|
||
end
|
||
end
|
||
end
|
||
|
||
function GiftPopData:setPopGiftType(type, params)
|
||
self.data.popGiftType = type
|
||
self.params = params
|
||
end
|
||
|
||
function GiftPopData:getPopGiftType(isFirstEnter)
|
||
if self.data.popGiftType then
|
||
return self.data.popGiftType, self.params
|
||
end
|
||
|
||
if isFirstEnter then
|
||
if not self.data.popGiftType then
|
||
local nowTime = Time:getServerTime()
|
||
for type, map in pairs(self.popGiftMap) do
|
||
for parameter, list in pairs(map) do
|
||
for _, info in ipairs(list) do
|
||
if info.endTime > nowTime then
|
||
local boughtCount = self:getGiftBoughtNum(info.id)
|
||
if boughtCount <= 0 then
|
||
self.data.popGiftType = type
|
||
return self.data.popGiftType, self.params
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
return self.data.popGiftType, self.params
|
||
end
|
||
|
||
function GiftPopData:setGiftDirty()
|
||
self.data.isDirty = not self.data.isDirty
|
||
end
|
||
|
||
function GiftPopData:onPopGiftTime()
|
||
-- if not GFunc.IsGotServerTime() then
|
||
-- return false
|
||
-- end
|
||
|
||
if not self.lastGiftPopTime then
|
||
self.lastGiftPopTime = LocalData:getPopGiftTime()
|
||
end
|
||
|
||
return Time:getServerTime() > self.lastGiftPopTime
|
||
end
|
||
|
||
-- 获得自选礼包的所选index
|
||
function GiftPopData:getGiftChooseRewardIndex(giftId)
|
||
return LocalData:getPopGiftChooseIndex(giftId)
|
||
end
|
||
|
||
function GiftPopData:setGiftChooseRewardIndex(giftId, index)
|
||
LocalData:setPopGiftChooseIndex(giftId, index)
|
||
|
||
self:setGiftDirty()
|
||
end
|
||
|
||
function GiftPopData:getGiftValueStr(giftId)
|
||
local cfg = self:getGiftConfig(giftId)
|
||
if not cfg then
|
||
return GConst.EMPTY_STRING
|
||
end
|
||
if not cfg.value then
|
||
return GConst.EMPTY_STRING
|
||
end
|
||
return cfg.value .. "%"
|
||
end
|
||
|
||
function GiftPopData:getGiftRewards(giftId)
|
||
local cfg = self:getGiftConfig(giftId)
|
||
if not cfg then
|
||
return
|
||
end
|
||
return cfg.reward
|
||
end
|
||
|
||
function GiftPopData:getGiftChooseRewards(giftId)
|
||
local cfg = self:getGiftConfig(giftId)
|
||
if not cfg then
|
||
return
|
||
end
|
||
return cfg.choose_reward
|
||
end
|
||
|
||
function GiftPopData:getGiftPrice(giftId)
|
||
local cfg = self:getGiftConfig(giftId)
|
||
if not cfg then
|
||
return
|
||
end
|
||
return GFunc.getFormatPrice(cfg.recharge_id)
|
||
end
|
||
|
||
function GiftPopData:getGiftParameter(giftId)
|
||
local cfg = self:getGiftConfig(giftId)
|
||
if not cfg then
|
||
return
|
||
end
|
||
return cfg.parameter
|
||
end
|
||
|
||
function GiftPopData:getGiftBanner(giftId)
|
||
local cfg = self:getGiftConfig(giftId)
|
||
if not cfg then
|
||
return
|
||
end
|
||
return cfg.banner or 1
|
||
end
|
||
|
||
function GiftPopData:activePopGift(giftType, parameter, parameter2, parameter3)
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("----activePopGift---- giftType = %s | parameter = %s | parameter2 = %s" , giftType, parameter, parameter2)
|
||
Logger.printTable(self.typeIds[giftType])
|
||
end
|
||
|
||
if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.GIFT_POPUP, true) then
|
||
return
|
||
end
|
||
|
||
local giftIds
|
||
if not self.typeIds[giftType] then
|
||
return
|
||
end
|
||
|
||
giftIds = table.refCopy(self.typeIds[giftType][parameter])
|
||
if not giftIds then
|
||
return
|
||
end
|
||
|
||
local map = {}
|
||
-- for _, id in ipairs(giftIds) do
|
||
-- map[id] = true
|
||
-- end
|
||
|
||
local nowTime = Time:getServerTime()
|
||
local activingGiftInfos = self.popGiftMap[giftType] and self.popGiftMap[giftType][parameter]
|
||
if activingGiftInfos then
|
||
for _, info in ipairs(activingGiftInfos) do
|
||
-- if map[info.id] then
|
||
if info.cooldown > nowTime then -- 冷却或未结束
|
||
map[info.id] = true
|
||
end
|
||
|
||
if info.endTime > nowTime then -- 冷却或未结束
|
||
map[info.id] = true
|
||
end
|
||
|
||
if giftType == 19 then
|
||
map[info.id] = true
|
||
end
|
||
-- end
|
||
end
|
||
end
|
||
for i = #giftIds, 1, -1 do
|
||
if map[giftIds[i]] then
|
||
table.remove(giftIds, i)
|
||
end
|
||
end
|
||
---- 需要触发了
|
||
self.popGiftMap[giftType] = self.popGiftMap[giftType] or {}
|
||
self.popGiftMap[giftType][parameter] = self.popGiftMap[giftType][parameter] or {}
|
||
self.triggerTimeMap = self.triggerTimeMap or {}
|
||
self.notBuyCountMap = self.notBuyCountMap or {}
|
||
-- 记录得该类型礼包得未购买次数,根据购买时间更新
|
||
local notBuyCount = self.notBuyCountMap[giftType] or 0
|
||
local bought = false
|
||
for _, giftId in ipairs(giftIds) do
|
||
local lastBoughtTime = DataManager.PaymentData:getGiftBoughtTime(giftType, giftId) -- 上次购买时间
|
||
local lastTriggerTime = self:getPopGiftTriggerTime(giftId)
|
||
if lastBoughtTime < 0 then
|
||
lastBoughtTime = 0
|
||
end
|
||
if lastTriggerTime < 0 then
|
||
lastTriggerTime = 0
|
||
end
|
||
-- 如果上一次的购买时间大于最近一次的触发时间,说明上一次买了
|
||
if lastBoughtTime > lastTriggerTime then
|
||
bought = true
|
||
break
|
||
end
|
||
end
|
||
if bought then
|
||
notBuyCount = 1
|
||
else
|
||
notBuyCount = notBuyCount + 1
|
||
end
|
||
|
||
local isActiveThisTime = false
|
||
local activeMap = {}
|
||
local payAverage = DataManager.PaymentData:getPayAverage()
|
||
for _, giftId in ipairs(giftIds) do
|
||
local isPayConditionValid = false
|
||
-- 判断档位有效性,只触发对应档位的
|
||
local payCondition = ActGiftCfg[giftId].pay_condition
|
||
if payCondition then
|
||
if payCondition[1] <= payAverage and payAverage < payCondition[2] then
|
||
isPayConditionValid = true
|
||
elseif payCondition[2] >= 9999 and payAverage >= 9999 then
|
||
isPayConditionValid = true
|
||
end
|
||
else
|
||
isPayConditionValid = true
|
||
end
|
||
-- 判断额外参数
|
||
local isParameterProValid = false
|
||
local parameterPro = ActGiftCfg[giftId].parameter_pro
|
||
if parameterPro then
|
||
if giftType == PayManager.PURCHARSE_ACT_TYPE.GIFT_POP_HERO_LV then -- 英雄等级
|
||
local lv = parameterPro[1] or 0
|
||
if parameter2 == lv then
|
||
isParameterProValid = true
|
||
end
|
||
elseif giftType == PayManager.PURCHARSE_ACT_TYPE.GIFT_POP_CHAPTER then -- 章节礼包
|
||
if parameterPro[1] and DataManager.PaymentData:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, parameterPro[1]) > 0 then
|
||
isParameterProValid = true
|
||
end
|
||
elseif giftType == PayManager.PURCHARSE_ACT_TYPE.GIFT_POP_EQUIP_RESONANCE then -- 装备共鸣弹窗礼包
|
||
if parameterPro[1] and parameterPro[1] == parameter2 and parameterPro[2] <= parameter3 then
|
||
isParameterProValid = true
|
||
end
|
||
|
||
end
|
||
else
|
||
isParameterProValid = true
|
||
end
|
||
|
||
if isPayConditionValid and isParameterProValid then
|
||
local cfg = ActGiftCfg[giftId]
|
||
local info = {
|
||
id = giftId,
|
||
type = giftType,
|
||
beginTime = nowTime,
|
||
endTime = nowTime + cfg.limit_time * 3600,
|
||
realEndTime = nowTime + cfg.limit_time * 3600,
|
||
}
|
||
if cfg.cd then
|
||
if cfg.max_cd_times then
|
||
info.cooldown = nowTime + cfg.cd * 3600 * math.max(1, math.min(notBuyCount + 1, cfg.max_cd_times))
|
||
else
|
||
info.cooldown = nowTime + cfg.cd * 3600
|
||
end
|
||
else
|
||
info.cooldown = nowTime
|
||
end
|
||
table.insert(self.popGiftMap[giftType][parameter], info)
|
||
self.triggerTimeMap[giftId] = nowTime
|
||
self.notBuyCountMap[giftType] = notBuyCount
|
||
activeMap[giftId] = nowTime
|
||
self:setPopGiftType(giftType, giftId)
|
||
self:setGiftDirty()
|
||
-- bi日志上报
|
||
local biType = self:getBiReportByGiftType(giftId)
|
||
if biType then
|
||
BIReport:postPopGift(biType, giftId, cfg.recharge_id, Time:getServerTime())
|
||
end
|
||
DataManager.PaymentData:resetGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, giftId)
|
||
|
||
-- 标记本次触发
|
||
isActiveThisTime = true
|
||
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("成功触发礼包 -- giftId:%s notBuyCount:%s cooldown:%s", giftId, notBuyCount, Time:formatTimeYMDHMS2(info.cooldown))
|
||
end
|
||
end
|
||
end
|
||
|
||
if table.nums(activeMap) <= 0 then
|
||
return
|
||
end
|
||
ModuleManager.ActivityPopManager:setGiftPopState(true)
|
||
ModuleManager.GiftPopManager:syncActivePopGift(activeMap, self.notBuyCountMap)
|
||
|
||
return true, isActiveThisTime, activeMap
|
||
end
|
||
|
||
function GiftPopData:getGiftBoughtNum(giftId)
|
||
return DataManager.PaymentData:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, giftId) or 0
|
||
end
|
||
|
||
-- 等级弹窗礼包
|
||
function GiftPopData:activeLvUpPopGift(lv)
|
||
local giftType = PayManager.PURCHARSE_ACT_TYPE.GIFT_POP_LV
|
||
self:activePopGift(giftType, lv)
|
||
end
|
||
|
||
function GiftPopData:getActivePopGiftId()
|
||
return self.heroLvUpPopGiftId
|
||
end
|
||
|
||
function GiftPopData:setActivePopGiftId(giftId)
|
||
self.heroLvUpPopGiftId = giftId
|
||
end
|
||
|
||
-- 装备共鸣弹窗礼包
|
||
function GiftPopData:activeEquipResonancePopGift(type, lv)
|
||
local giftType = PayManager.PURCHARSE_ACT_TYPE.GIFT_POP_EQUIP_RESONANCE
|
||
local _, _, activeMap = self:activePopGift(giftType, SPECIAL_TYPE, type, lv)
|
||
if activeMap then
|
||
for k,v in pairs(activeMap) do
|
||
self:setActivePopGiftId(k)
|
||
EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.MAIN_UI_CHECK_POP_TIMELY)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 英雄等级弹窗礼包
|
||
function GiftPopData:activeHeroLvUpPopGift(heroId, lv)
|
||
local giftType = PayManager.PURCHARSE_ACT_TYPE.GIFT_POP_HERO_LV
|
||
local _, _, activeMap = self:activePopGift(giftType, heroId, lv)
|
||
if activeMap then
|
||
for k,v in pairs(activeMap) do
|
||
self:setActivePopGiftId(k)
|
||
EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.MAIN_UI_CHECK_POP_TIMELY)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 章节弹窗礼包
|
||
function GiftPopData:activeChapterPopGift(chapterId)
|
||
local giftType = PayManager.PURCHARSE_ACT_TYPE.GIFT_POP_CHAPTER
|
||
local _, _, activeMap = self:activePopGift(giftType, chapterId)
|
||
if activeMap then
|
||
for k,v in pairs(activeMap) do
|
||
self:setActivePopGiftId(k)
|
||
EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.MAIN_UI_CHECK_POP_TIMELY)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 防线弹窗礼包
|
||
function GiftPopData:activeDefenseLinePopGift(lv)
|
||
local giftType = PayManager.PURCHARSE_ACT_TYPE.GIFT_POP_DEFENSE_LINE
|
||
local _, _, activeMap = self:activePopGift(giftType, lv)
|
||
if activeMap then
|
||
for k,v in pairs(activeMap) do
|
||
self:setActivePopGiftId(k)
|
||
EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.MAIN_UI_CHECK_POP_TIMELY)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
function GiftPopData:checkChapterGiftVersion()
|
||
if self.popGiftMap == nil then
|
||
return
|
||
end
|
||
if self.typeIds == nil then
|
||
return
|
||
end
|
||
local popGiftServerMap = self.popGiftMap[PayManager.PURCHARSE_ACT_TYPE.GIFT_POP_CHAPTER] or GConst.EMPTY_TABLE
|
||
local maxId = DataManager.ChapterData:getMaxPassId() or 0
|
||
local popGiftCfgMap = self.typeIds[PayManager.PURCHARSE_ACT_TYPE.GIFT_POP_CHAPTER] or GConst.EMPTY_TABLE
|
||
for chapterId, v in pairs(popGiftCfgMap) do
|
||
if maxId >= chapterId then
|
||
if popGiftServerMap[chapterId] == nil or #popGiftServerMap[chapterId] <= 0 then
|
||
self:activeChapterPopGift(chapterId)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
return GiftPopData |