--- --- 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)