123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452 |
- ---
- --- Created by zhouzhipeng.
- --- DateTime: 2024/11/07 15:13
- --- Desc:限时礼包
- ---
- TimeLimitGift = {}
- TimeLimitGift.__index = TimeLimitGift
- local this = {}
- local function _playerDbKey()
- return "T$time_limit_gift_data"
- end
- TimeLimitGiftTypes = {
- -- 使用常规条件
- CONDITION = 1,
- -- 100级后,强化一次,再次强化不满足条件时弹出 100级后第2次强化不满足条件时弹出
- SPECIAL2 = 2,
- -- 领取某所以限时礼包后弹出, condition配置 礼包id
- SPECIAL3 = 3,
- -- 购买该礼包后,指定礼包不会再出现,4#礼包id 需要记录该礼包是否购买 5类型 用该类型是否购买作为条件
- SPECIAL4 = 4,
- -- 出现后顶替掉其他礼包,礼包id 用4类型已记录的判断该礼包是否出现
- SPECIAL5 = 5,
- }
- function TimeLimitGift.get(actor)
- local obj = getplaydef(actor, _playerDbKey())
- return setmetatable(obj or {}, TimeLimitGift)
- end
- function TimeLimitGift:save(actor)
- setplaydef(actor, _playerDbKey(), self)
- end
- function TimeLimitGift:getTimeLimitGiftInfo()
- if not self.timeLimitGiftInfo then
- self.timeLimitGiftInfo = {}
- end
- return self.timeLimitGiftInfo
- end
- --- 获取特殊2条件 强化消耗不足次数
- function TimeLimitGift:getSpecial2Count()
- if not self.special2Count then
- self.special2Count = 0
- end
- return self.special2Count
- end
- function TimeLimitGift:setSpecial2Count(count)
- if not self.special2Count then
- self.special2Count = 0
- end
- self.special2Count = count
- end
- --- 获取特殊4条件 是否买过某礼包
- function TimeLimitGift:getSpecial4ById(id)
- if not self.special4 then
- self.special4 = {}
- end
- return self.special4[id] or false
- end
- function TimeLimitGift:setSpecial4(id, isAllBuy)
- if not self.special4 then
- self.special4 = {}
- end
- self.special4[id] = isAllBuy
- end
- --- 登录触发
- function TimeLimitGift.login(play)
- TimeLimitGift.checkTimeLimitGiftTime(play)
- TimeLimitGift.triggerTimeLimitGift(play, true)
- this.sendAllTimeLimitGift(play)
- end
- --- 升级触发
- function TimeLimitGift.levelUp(play, level)
- TimeLimitGift.triggerTimeLimitGift(play, false)
- end
- --- 请求购买限时礼包
- function TimeLimitGift.reqBuyTimeLimitGift(actor, msgData)
- local cfgId = tonumber(msgData['id'])
- local timeLimitGiftCfg = ConfigDataManager.getById("cfg_timelLimitGift_gift", cfgId)
- local timeLimitGiftData = TimeLimitGift.get(actor)
- local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
- local group = timeLimitGiftCfg.group
- local info = timeLimitGiftInfo[group]
- if not info then
- TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "限时礼包不能够买 id", cfgId, "记录已开启的内容", timeLimitGiftInfo)
- tipinfo(actor, "限时礼包未解锁:" .. cfgId)
- return
- end
- local preGift = timeLimitGiftCfg.pregift
- TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString()," 限时礼包购买前检查", preGift, "记录已购买的内容", info)
- -- 校验是否购买了前置礼包
- if not string.isNullOrEmpty(preGift) and not table.contains(info.timeLimitGift, tonumber(preGift)) then
- TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "限时前置礼包未购买 id", cfgId, "前置礼包id", preGift, "记录已购买的内容", info)
- tipinfo(actor, "限时前置礼包未购买:" .. preGift)
- return
- end
- -- 是否已购买当前礼包
- if table.contains(info.timeLimitGift, cfgId) then
- TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "该限时礼包已经购买过 id", cfgId, "记录已购买的内容", info)
- tipinfo(actor, "该限时礼包已经购买过")
- return
- end
- local cost = string.split(timeLimitGiftCfg.cost, "#")
- if not table.isNullOrEmpty(cost) then
- local itemCfgId = tonumber(cost[1])
- local count = tonumber(cost[2])
- local checkResult = Bag.checkItem(actor, itemCfgId, count)
- if not checkResult then
- --背包道具不足
- noticeTip.noticeinfo(actor, StringIdConst.TEXT346)
- return
- end
- removeitemfrombag(actor, itemCfgId, count,0,9999,'限时礼包')
- end
- table.insert(info.timeLimitGift, cfgId)
- if not string.isNullOrEmpty(timeLimitGiftCfg.addtime) then
- local addTime = tonumber(timeLimitGiftCfg.addtime)
- -- 增加持续时间
- TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "限时礼包购买后增加时间", addTime)
- info.endTime = info.endTime + addTime
- end
- TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), " timeLimitGiftInfo", timeLimitGiftInfo,"info", info, cfgId)
- timeLimitGiftData:save(actor)
- local reward_item = string.toIntIntMap(timeLimitGiftCfg.gift, "#", "|")
- additemmaptobag(actor, reward_item, 0, 9999, "限时礼包")
- sendluamsg(actor, LuaMessageIdToClient.COMMON_REWARD_PANEL, reward_item)
- local cfgIds = {}
- table.insert(cfgIds, group)
- this.sendTimeLimitGift(actor, cfgIds, false)
- TimeLimitGift.checkSpecial3Condition(actor, group, info.timeLimitGift)
- TimeLimitGift.checkSpecial4Condition(actor, group, info.timeLimitGift)
- TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "购买限时礼包 结束", cfgIds, timeLimitGiftData)
- end
- --- 触发限时礼包
- function TimeLimitGift.triggerTimeLimitGift(actor, isLogin)
- TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "触发限时礼包", isLogin)
- local timeLimitGiftData = TimeLimitGift.get(actor)
- local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
- --local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.CONDITION)
- local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all")
- if table.isNullOrEmpty(timeLimitGiftAllCfg) then
- return
- end
- local cfgIds = {}
- local nowMillis = getbaseinfo(actor, "now")
- for _, cfg in pairs(timeLimitGiftAllCfg) do
- --local var = timeLimitGiftInfo[cfg.id] or {endTime = 0, timeLimitGift = {}}
- local info = timeLimitGiftInfo[cfg.id] or {}
- local endTime = info.endTime or 0
- TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "配置数据", cfg, "结束时间:", endTime)
- if endTime ~= 0 then
- goto continue
- end
- local giftType = tonumber(cfg.type)
- if giftType == TimeLimitGiftTypes.SPECIAL2 or giftType == TimeLimitGiftTypes.SPECIAL3 then
- goto continue
- end
- TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "条件判断", cfg.condition)
- if not ConditionManager.Check(actor, cfg.condition) then
- TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "条件判断 条件不满足", cfg.condition)
- goto continue
- end
- if giftType == TimeLimitGiftTypes.SPECIAL5 then
- local isAllBuy = timeLimitGiftData:getSpecial4ById(cfg.param)
- if isAllBuy then
- -- 已买关联礼包 该礼包不开启
- goto continue
- else
- -- 关闭关联礼包 cfg.param 设置关闭时间
- local info1 = timeLimitGiftInfo[cfg.param]
- if info1 then
- info1.endTime = nowMillis - (10 * 60 * 1000)
- table.insert(cfgIds, cfg.param)
- TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "关闭该组礼包", cfg.param)
- end
- end
- end
- TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "条件判断 条件满足", cfg.condition, cfg.id)
- table.insert(cfgIds, cfg.id)
- local time = nowMillis + tonumber(cfg.timelimit)
- timeLimitGiftInfo[cfg.id] = { endTime = time, isSendMail = false, timeLimitGift = {} }
- :: continue ::
- end
- if table.count(cfgIds) > 0 then
- timeLimitGiftData:save(actor)
- end
- --不是登录,并且有新数据发送
- if not isLogin and table.count(cfgIds) > 0 then
- this.sendTimeLimitGift(actor, cfgIds, true)
- end
- TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "触发限时礼包 结束", cfgIds)
- end
- function this.sendAllTimeLimitGift(actor)
- local timeLimitGiftData = TimeLimitGift.get(actor)
- local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
- if table.isNullOrEmpty(timeLimitGiftInfo) then
- this.sendAllGiftMsg(actor, {})
- return
- end
- local nowMillis = getbaseinfo(actor, "now")
- local data = {}
- for cfgId, info in pairs(timeLimitGiftInfo) do
- if nowMillis < info.endTime then
- local res = {
- group = cfgId,
- endTime = info.endTime,
- timeLimitGiftInfo = info.timeLimitGift
- }
- table.insert(data, res)
- end
- end
- this.sendAllGiftMsg(actor, data)
- end
- function this.sendAllGiftMsg(actor, data)
- sendluamsg(actor, LuaMessageIdToClient.RES_ALL_TIME_LIMIT_GIFT, data)
- TimeLimitGift.print("发送所有限时礼包数据",actor, data)
- end
- function this.sendGiftMsg(actor, data)
- sendluamsg(actor, LuaMessageIdToClient.RES_TIME_LIMIT_GIFT, data)
- end
- function this.sendTimeLimitGift(actor, cfgIds, isNew)
- local timeLimitGiftData = TimeLimitGift.get(actor)
- local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
- for _, cfgId in pairs(cfgIds) do
- local info = timeLimitGiftInfo[cfgId]
- local res = {
- group = cfgId,
- endTime = info.endTime,
- timeLimitGiftInfo = info.timeLimitGift,
- isNew = isNew
- }
- this.sendGiftMsg(actor, res)
- end
- end
- --- 检查显示礼包结束时间
- function TimeLimitGift.checkTimeLimitGiftTime(actor)
- local timeLimitGiftData = TimeLimitGift.get(actor)
- local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
- local nowMillis = getbaseinfo(actor, "now")
- local isSave = false
- for cfgId, info in pairs(timeLimitGiftInfo) do
- -- 倒计时已结束,并且未发送过邮箱
- if nowMillis > info.endTime and not info.isSendMail then
- TimeLimitGift.print("检查显示礼包结束时间 actor:" .. actor:toString(), "发送邮箱", cfgId, info)
- -- 获取下一级礼包
- local timeLimitGift = info.timeLimitGift
- local cfgs = ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", cfgId)
- local buyCount = table.count(timeLimitGift)
- if table.isNullOrEmpty(timeLimitGift) or buyCount >= table.count(cfgs) then
- -- 没有购买过礼包 与 礼包已购买完
- -- 暂时不处理 第一个礼包一般需要购买
- else
- -- 只能按照顺序购买,下一个礼包等于购买礼包的数量加1
- local giftCfgs = ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", cfgId, "sort", buyCount + 1)
- TimeLimitGift.print("检查显示礼包结束时间 actor:" .. actor:toString(), "查询配置", cfgId, buyCount+ 1,"返回的配置", giftCfgs)
- if table.isNullOrEmpty(giftCfgs) then
- TimeLimitGift.print("没有配置礼包",actor:toString(), cfgId, buyCount+ 1, "查询的数据", giftCfgs)
- goto continue
- end
- local giftCfg = giftCfgs[1]
- if string.isNullOrEmpty(giftCfg.cost) then
- local mail = giftCfg.mail
- local reward_item = string.toIntIntMap(giftCfg.gift, "#", "|")
- sendconfigmailbyrid(actor, actor:toString(), tonumber(mail), reward_item)
- TimeLimitGift.print("检查显示礼包结束时间 actor:" .. actor:toString(), "邮件补发成功 补发礼包id",giftCfg.id, "道具信息", reward_item, "邮件id", mail)
- end
- end
- info.isSendMail = true
- isSave = true
- end
- :: continue ::
- end
- if isSave then
- timeLimitGiftData:save(actor)
- end
- end
- function TimeLimitGift.checkSpecial2Count(actor)
- local level = getbaseinfo(actor, "level")
- if level < 100 then
- return
- end
- local timeLimitGiftData = TimeLimitGift.get(actor)
- local count = timeLimitGiftData:getSpecial2Count()
- if count == 0 then
- count = 1
- timeLimitGiftData:setSpecial2Count(count)
- timeLimitGiftData:save(actor)
- end
- end
- --- 触发 特殊条件2
- function TimeLimitGift.checkSpecial2Condition(actor)
- local level = getbaseinfo(actor, "level")
- if level < 100 then
- return
- end
- local timeLimitGiftData = TimeLimitGift.get(actor)
- local count = timeLimitGiftData:getSpecial2Count()
- if count > 0 then
- -- 条件2
- --1.等于大于100
- --2.先满足等级大于100级 强化过消耗材料 不管成功与失败 及为满足
- --3.前面两个要求满足后,第一次弹消耗条件不满足,触发该礼包
- TimeLimitGift.print("触发 特殊条件2 actor:" .. actor:toString(), "触发次数", count)
- local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.SPECIAL2)
- if table.isNullOrEmpty(timeLimitGiftAllCfg) then
- return
- end
- local cfgIds = {}
- local nowMillis = getbaseinfo(actor, "now")
- local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
- for _, cfg in pairs(timeLimitGiftAllCfg) do
- local cfgId = cfg.id
- local info = timeLimitGiftInfo[cfgId] or {}
- local endTime = info.endTime or 0
- if endTime > 0 then
- -- 已开启
- goto continue
- end
- table.insert(cfgIds, cfg.id)
- local time = nowMillis + tonumber(cfg.timelimit)
- TimeLimitGift.print("触发 特殊条件2 actor:" .. actor:toString(), "开启礼包 礼包id", cfg.id, "礼包结束时间", time)
- timeLimitGiftInfo[cfg.id] = { endTime = time, isSendMail = false, timeLimitGift = {} }
- -- 开启礼包
- :: continue ::
- end
- if table.count(cfgIds) > 0 then
- timeLimitGiftData:save(actor)
- this.sendTimeLimitGift(actor, cfgIds, true)
- end
- end
- end
- --- 触发 特殊条件3
- function TimeLimitGift.checkSpecial3Condition(actor, group, timeLimitGift)
- local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.SPECIAL3)
- if table.isNullOrEmpty(timeLimitGiftAllCfg) then
- return
- end
- local cfgIds = {}
- local nowMillis = getbaseinfo(actor, "now")
- local timeLimitGiftData = TimeLimitGift.get(actor)
- local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
- for _, cfg in pairs(timeLimitGiftAllCfg) do
- local id = cfg.id
- local param = cfg.param
- if group ~= param then
- goto continue
- end
- local info = timeLimitGiftInfo[id] or {}
- local endTime = info.endTime or 0
- if endTime > 0 then
- -- 已开启
- goto continue
- end
- local count = table.count(timeLimitGift)
- local cfgs = ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", param)
- if count < table.count(cfgs) then
- goto continue
- end
- table.insert(cfgIds, cfg.id)
- local time = nowMillis + tonumber(cfg.timelimit)
- TimeLimitGift.print("触发 特殊条件3 actor:" .. actor:toString(), "开启礼包 礼包id", cfg.id, "礼包结束时间", time)
- timeLimitGiftInfo[cfg.id] = { endTime = time, isSendMail = false, timeLimitGift = {} }
- :: continue ::
- end
- if table.count(cfgIds) > 0 then
- timeLimitGiftData:save(actor)
- this.sendTimeLimitGift(actor, cfgIds, true)
- end
- end
- --- 触发 特殊条件4 记录该组礼包是否购买完,购买完记录未true
- function TimeLimitGift.checkSpecial4Condition(actor, group, timeLimitGift)
- local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.SPECIAL4)
- if table.isNullOrEmpty(timeLimitGiftAllCfg) then
- return
- end
- local timeLimitGiftData = TimeLimitGift.get(actor)
- local isSave = false
- for _, cfg in pairs(timeLimitGiftAllCfg) do
- --local param = cfg.param
- local id = cfg.id
- if group ~= id then
- goto continue
- end
- -- 已购买该礼包 group 为 4的礼包不能被条件通过
- local count = table.count(timeLimitGift)
- local cfgs = ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", group)
- if count < table.count(cfgs) then
- goto continue
- end
- timeLimitGiftData:setSpecial4(id, true)
- isSave = true
- TimeLimitGift.print("触发 特殊条件4 actor:" .. actor:toString(), "该group礼包已全部购买 触发条件4 group:", group)
- :: continue ::
- end
- if isSave then
- timeLimitGiftData:save(actor)
- end
- end
- function timelimitgifttest(actor, type, id)
- gameDebug.print(actor, "限时礼包礼包", id)
- --TimeLimitGift.login(actor)
- --TimeLimitGift.triggerTimeLimitGift(actor, false)
- TimeLimitGift.reqBuyTimeLimitGift(actor, { id = id })
- TimeLimitGift.print("限时礼包gm测试内容")
- end
- --- 打印日志
- local isPrintLog = true
- function TimeLimitGift.print(...)
- if isPrintLog then
- return
- end
- gameDebug.print(...)
- end
- -- 注册登录事件
- LoginEventListerTable:eventLister("0", "限时礼包", TimeLimitGift.login)
- -- 注册等级提升事件
- LevelUpEventListerTable:eventLister("0", "限时礼包", TimeLimitGift.levelUp)
- --注册凌晨刷新事件
- ZeroEventListerTable:eventLister("0", "限时礼包", TimeLimitGift.levelUp)
|