TimeLimitGift.lua 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. ---
  2. --- Created by zhouzhipeng.
  3. --- DateTime: 2024/11/07 15:13
  4. --- Desc:限时礼包
  5. ---
  6. TimeLimitGift = {}
  7. TimeLimitGift.__index = TimeLimitGift
  8. local this = {}
  9. local function _playerDbKey()
  10. return "T$time_limit_gift_data"
  11. end
  12. TimeLimitGiftTypes = {
  13. -- 使用常规条件
  14. CONDITION = 1,
  15. -- 100级后,强化一次,再次强化不满足条件时弹出 100级后第2次强化不满足条件时弹出
  16. SPECIAL2 = 2,
  17. -- 领取某所以限时礼包后弹出, condition配置 礼包id
  18. SPECIAL3 = 3,
  19. -- 购买该礼包后,指定礼包不会再出现,4#礼包id 需要记录该礼包是否购买 5类型 用该类型是否购买作为条件
  20. SPECIAL4 = 4,
  21. -- 出现后顶替掉其他礼包,礼包id 用4类型已记录的判断该礼包是否出现
  22. SPECIAL5 = 5,
  23. }
  24. function TimeLimitGift.get(actor)
  25. local obj = getplaydef(actor, _playerDbKey())
  26. return setmetatable(obj or {}, TimeLimitGift)
  27. end
  28. function TimeLimitGift:save(actor)
  29. setplaydef(actor, _playerDbKey(), self)
  30. end
  31. function TimeLimitGift:getTimeLimitGiftInfo()
  32. if not self.timeLimitGiftInfo then
  33. self.timeLimitGiftInfo = {}
  34. end
  35. return self.timeLimitGiftInfo
  36. end
  37. --- 获取特殊2条件 强化消耗不足次数
  38. function TimeLimitGift:getSpecial2Count()
  39. if not self.special2Count then
  40. self.special2Count = 0
  41. end
  42. return self.special2Count
  43. end
  44. function TimeLimitGift:setSpecial2Count(count)
  45. if not self.special2Count then
  46. self.special2Count = 0
  47. end
  48. self.special2Count = count
  49. end
  50. --- 获取特殊4条件 是否买过某礼包
  51. function TimeLimitGift:getSpecial4ById(id)
  52. if not self.special4 then
  53. self.special4 = {}
  54. end
  55. return self.special4[id] or false
  56. end
  57. function TimeLimitGift:setSpecial4(id, isAllBuy)
  58. if not self.special4 then
  59. self.special4 = {}
  60. end
  61. self.special4[id] = isAllBuy
  62. end
  63. --- 登录触发
  64. function TimeLimitGift.login(play)
  65. TimeLimitGift.checkTimeLimitGiftTime(play)
  66. TimeLimitGift.triggerTimeLimitGift(play, true)
  67. this.sendAllTimeLimitGift(play)
  68. end
  69. --- 升级触发
  70. function TimeLimitGift.levelUp(play, level)
  71. TimeLimitGift.triggerTimeLimitGift(play, false)
  72. end
  73. --- 请求购买限时礼包
  74. function TimeLimitGift.reqBuyTimeLimitGift(actor, msgData)
  75. local cfgId = tonumber(msgData['id'])
  76. local timeLimitGiftCfg = ConfigDataManager.getById("cfg_timelLimitGift_gift", cfgId)
  77. local timeLimitGiftData = TimeLimitGift.get(actor)
  78. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  79. local group = timeLimitGiftCfg.group
  80. local info = timeLimitGiftInfo[group]
  81. if not info then
  82. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "限时礼包不能够买 id", cfgId, "记录已开启的内容", timeLimitGiftInfo)
  83. tipinfo(actor, "限时礼包未解锁:" .. cfgId)
  84. return
  85. end
  86. local preGift = timeLimitGiftCfg.pregift
  87. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString()," 限时礼包购买前检查", preGift, "记录已购买的内容", info)
  88. -- 校验是否购买了前置礼包
  89. if not string.isNullOrEmpty(preGift) and not table.contains(info.timeLimitGift, tonumber(preGift)) then
  90. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "限时前置礼包未购买 id", cfgId, "前置礼包id", preGift, "记录已购买的内容", info)
  91. tipinfo(actor, "限时前置礼包未购买:" .. preGift)
  92. return
  93. end
  94. -- 是否已购买当前礼包
  95. if table.contains(info.timeLimitGift, cfgId) then
  96. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "该限时礼包已经购买过 id", cfgId, "记录已购买的内容", info)
  97. tipinfo(actor, "该限时礼包已经购买过")
  98. return
  99. end
  100. local cost = string.split(timeLimitGiftCfg.cost, "#")
  101. if not table.isNullOrEmpty(cost) then
  102. local itemCfgId = tonumber(cost[1])
  103. local count = tonumber(cost[2])
  104. local checkResult = Bag.checkItem(actor, itemCfgId, count)
  105. if not checkResult then
  106. --背包道具不足
  107. noticeTip.noticeinfo(actor, StringIdConst.TEXT346)
  108. return
  109. end
  110. removeitemfrombag(actor, itemCfgId, count,0,9999,'限时礼包')
  111. end
  112. table.insert(info.timeLimitGift, cfgId)
  113. if not string.isNullOrEmpty(timeLimitGiftCfg.addtime) then
  114. local addTime = tonumber(timeLimitGiftCfg.addtime)
  115. -- 增加持续时间
  116. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "限时礼包购买后增加时间", addTime)
  117. info.endTime = info.endTime + addTime
  118. end
  119. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), " timeLimitGiftInfo", timeLimitGiftInfo,"info", info, cfgId)
  120. timeLimitGiftData:save(actor)
  121. local reward_item = string.toIntIntMap(timeLimitGiftCfg.gift, "#", "|")
  122. additemmaptobag(actor, reward_item, 0, 9999, "限时礼包")
  123. sendluamsg(actor, LuaMessageIdToClient.COMMON_REWARD_PANEL, reward_item)
  124. local cfgIds = {}
  125. table.insert(cfgIds, group)
  126. this.sendTimeLimitGift(actor, cfgIds, false)
  127. TimeLimitGift.checkSpecial3Condition(actor, group, info.timeLimitGift)
  128. TimeLimitGift.checkSpecial4Condition(actor, group, info.timeLimitGift)
  129. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "购买限时礼包 结束", cfgIds, timeLimitGiftData)
  130. end
  131. --- 触发限时礼包
  132. function TimeLimitGift.triggerTimeLimitGift(actor, isLogin)
  133. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "触发限时礼包", isLogin)
  134. local timeLimitGiftData = TimeLimitGift.get(actor)
  135. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  136. --local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.CONDITION)
  137. local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all")
  138. if table.isNullOrEmpty(timeLimitGiftAllCfg) then
  139. return
  140. end
  141. local cfgIds = {}
  142. local nowMillis = getbaseinfo(actor, "now")
  143. for _, cfg in pairs(timeLimitGiftAllCfg) do
  144. --local var = timeLimitGiftInfo[cfg.id] or {endTime = 0, timeLimitGift = {}}
  145. local info = timeLimitGiftInfo[cfg.id] or {}
  146. local endTime = info.endTime or 0
  147. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "配置数据", cfg, "结束时间:", endTime)
  148. if endTime ~= 0 then
  149. goto continue
  150. end
  151. local giftType = tonumber(cfg.type)
  152. if giftType == TimeLimitGiftTypes.SPECIAL2 or giftType == TimeLimitGiftTypes.SPECIAL3 then
  153. goto continue
  154. end
  155. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "条件判断", cfg.condition)
  156. if not ConditionManager.Check(actor, cfg.condition) then
  157. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "条件判断 条件不满足", cfg.condition)
  158. goto continue
  159. end
  160. if giftType == TimeLimitGiftTypes.SPECIAL5 then
  161. local isAllBuy = timeLimitGiftData:getSpecial4ById(cfg.param)
  162. if isAllBuy then
  163. -- 已买关联礼包 该礼包不开启
  164. goto continue
  165. else
  166. -- 关闭关联礼包 cfg.param 设置关闭时间
  167. local info1 = timeLimitGiftInfo[cfg.param]
  168. if info1 then
  169. info1.endTime = nowMillis - (10 * 60 * 1000)
  170. table.insert(cfgIds, cfg.param)
  171. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "关闭该组礼包", cfg.param)
  172. end
  173. end
  174. end
  175. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "条件判断 条件满足", cfg.condition, cfg.id)
  176. table.insert(cfgIds, cfg.id)
  177. local time = nowMillis + tonumber(cfg.timelimit)
  178. timeLimitGiftInfo[cfg.id] = { endTime = time, isSendMail = false, timeLimitGift = {} }
  179. :: continue ::
  180. end
  181. if table.count(cfgIds) > 0 then
  182. timeLimitGiftData:save(actor)
  183. end
  184. --不是登录,并且有新数据发送
  185. if not isLogin and table.count(cfgIds) > 0 then
  186. this.sendTimeLimitGift(actor, cfgIds, true)
  187. end
  188. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "触发限时礼包 结束", cfgIds)
  189. end
  190. function this.sendAllTimeLimitGift(actor)
  191. local timeLimitGiftData = TimeLimitGift.get(actor)
  192. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  193. if table.isNullOrEmpty(timeLimitGiftInfo) then
  194. this.sendAllGiftMsg(actor, {})
  195. return
  196. end
  197. local nowMillis = getbaseinfo(actor, "now")
  198. local data = {}
  199. for cfgId, info in pairs(timeLimitGiftInfo) do
  200. if nowMillis < info.endTime then
  201. local res = {
  202. group = cfgId,
  203. endTime = info.endTime,
  204. timeLimitGiftInfo = info.timeLimitGift
  205. }
  206. table.insert(data, res)
  207. end
  208. end
  209. this.sendAllGiftMsg(actor, data)
  210. end
  211. function this.sendAllGiftMsg(actor, data)
  212. sendluamsg(actor, LuaMessageIdToClient.RES_ALL_TIME_LIMIT_GIFT, data)
  213. TimeLimitGift.print("发送所有限时礼包数据",actor, data)
  214. end
  215. function this.sendGiftMsg(actor, data)
  216. sendluamsg(actor, LuaMessageIdToClient.RES_TIME_LIMIT_GIFT, data)
  217. end
  218. function this.sendTimeLimitGift(actor, cfgIds, isNew)
  219. local timeLimitGiftData = TimeLimitGift.get(actor)
  220. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  221. for _, cfgId in pairs(cfgIds) do
  222. local info = timeLimitGiftInfo[cfgId]
  223. local res = {
  224. group = cfgId,
  225. endTime = info.endTime,
  226. timeLimitGiftInfo = info.timeLimitGift,
  227. isNew = isNew
  228. }
  229. this.sendGiftMsg(actor, res)
  230. end
  231. end
  232. --- 检查显示礼包结束时间
  233. function TimeLimitGift.checkTimeLimitGiftTime(actor)
  234. local timeLimitGiftData = TimeLimitGift.get(actor)
  235. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  236. local nowMillis = getbaseinfo(actor, "now")
  237. local isSave = false
  238. for cfgId, info in pairs(timeLimitGiftInfo) do
  239. -- 倒计时已结束,并且未发送过邮箱
  240. if nowMillis > info.endTime and not info.isSendMail then
  241. TimeLimitGift.print("检查显示礼包结束时间 actor:" .. actor:toString(), "发送邮箱", cfgId, info)
  242. -- 获取下一级礼包
  243. local timeLimitGift = info.timeLimitGift
  244. local cfgs = ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", cfgId)
  245. local buyCount = table.count(timeLimitGift)
  246. if table.isNullOrEmpty(timeLimitGift) or buyCount >= table.count(cfgs) then
  247. -- 没有购买过礼包 与 礼包已购买完
  248. -- 暂时不处理 第一个礼包一般需要购买
  249. else
  250. -- 只能按照顺序购买,下一个礼包等于购买礼包的数量加1
  251. local giftCfgs = ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", cfgId, "sort", buyCount + 1)
  252. TimeLimitGift.print("检查显示礼包结束时间 actor:" .. actor:toString(), "查询配置", cfgId, buyCount+ 1,"返回的配置", giftCfgs)
  253. if table.isNullOrEmpty(giftCfgs) then
  254. TimeLimitGift.print("没有配置礼包",actor:toString(), cfgId, buyCount+ 1, "查询的数据", giftCfgs)
  255. goto continue
  256. end
  257. local giftCfg = giftCfgs[1]
  258. if string.isNullOrEmpty(giftCfg.cost) then
  259. local mail = giftCfg.mail
  260. local reward_item = string.toIntIntMap(giftCfg.gift, "#", "|")
  261. sendconfigmailbyrid(actor, actor:toString(), tonumber(mail), reward_item)
  262. TimeLimitGift.print("检查显示礼包结束时间 actor:" .. actor:toString(), "邮件补发成功 补发礼包id",giftCfg.id, "道具信息", reward_item, "邮件id", mail)
  263. end
  264. end
  265. info.isSendMail = true
  266. isSave = true
  267. end
  268. :: continue ::
  269. end
  270. if isSave then
  271. timeLimitGiftData:save(actor)
  272. end
  273. end
  274. function TimeLimitGift.checkSpecial2Count(actor)
  275. local level = getbaseinfo(actor, "level")
  276. if level < 100 then
  277. return
  278. end
  279. local timeLimitGiftData = TimeLimitGift.get(actor)
  280. local count = timeLimitGiftData:getSpecial2Count()
  281. if count == 0 then
  282. count = 1
  283. timeLimitGiftData:setSpecial2Count(count)
  284. timeLimitGiftData:save(actor)
  285. end
  286. end
  287. --- 触发 特殊条件2
  288. function TimeLimitGift.checkSpecial2Condition(actor)
  289. local level = getbaseinfo(actor, "level")
  290. if level < 100 then
  291. return
  292. end
  293. local timeLimitGiftData = TimeLimitGift.get(actor)
  294. local count = timeLimitGiftData:getSpecial2Count()
  295. if count > 0 then
  296. -- 条件2
  297. --1.等于大于100
  298. --2.先满足等级大于100级 强化过消耗材料 不管成功与失败 及为满足
  299. --3.前面两个要求满足后,第一次弹消耗条件不满足,触发该礼包
  300. TimeLimitGift.print("触发 特殊条件2 actor:" .. actor:toString(), "触发次数", count)
  301. local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.SPECIAL2)
  302. if table.isNullOrEmpty(timeLimitGiftAllCfg) then
  303. return
  304. end
  305. local cfgIds = {}
  306. local nowMillis = getbaseinfo(actor, "now")
  307. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  308. for _, cfg in pairs(timeLimitGiftAllCfg) do
  309. local cfgId = cfg.id
  310. local info = timeLimitGiftInfo[cfgId] or {}
  311. local endTime = info.endTime or 0
  312. if endTime > 0 then
  313. -- 已开启
  314. goto continue
  315. end
  316. table.insert(cfgIds, cfg.id)
  317. local time = nowMillis + tonumber(cfg.timelimit)
  318. TimeLimitGift.print("触发 特殊条件2 actor:" .. actor:toString(), "开启礼包 礼包id", cfg.id, "礼包结束时间", time)
  319. timeLimitGiftInfo[cfg.id] = { endTime = time, isSendMail = false, timeLimitGift = {} }
  320. -- 开启礼包
  321. :: continue ::
  322. end
  323. if table.count(cfgIds) > 0 then
  324. timeLimitGiftData:save(actor)
  325. this.sendTimeLimitGift(actor, cfgIds, true)
  326. end
  327. end
  328. end
  329. --- 触发 特殊条件3
  330. function TimeLimitGift.checkSpecial3Condition(actor, group, timeLimitGift)
  331. local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.SPECIAL3)
  332. if table.isNullOrEmpty(timeLimitGiftAllCfg) then
  333. return
  334. end
  335. local cfgIds = {}
  336. local nowMillis = getbaseinfo(actor, "now")
  337. local timeLimitGiftData = TimeLimitGift.get(actor)
  338. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  339. for _, cfg in pairs(timeLimitGiftAllCfg) do
  340. local id = cfg.id
  341. local param = cfg.param
  342. if group ~= param then
  343. goto continue
  344. end
  345. local info = timeLimitGiftInfo[id] or {}
  346. local endTime = info.endTime or 0
  347. if endTime > 0 then
  348. -- 已开启
  349. goto continue
  350. end
  351. local count = table.count(timeLimitGift)
  352. local cfgs = ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", param)
  353. if count < table.count(cfgs) then
  354. goto continue
  355. end
  356. table.insert(cfgIds, cfg.id)
  357. local time = nowMillis + tonumber(cfg.timelimit)
  358. TimeLimitGift.print("触发 特殊条件3 actor:" .. actor:toString(), "开启礼包 礼包id", cfg.id, "礼包结束时间", time)
  359. timeLimitGiftInfo[cfg.id] = { endTime = time, isSendMail = false, timeLimitGift = {} }
  360. :: continue ::
  361. end
  362. if table.count(cfgIds) > 0 then
  363. timeLimitGiftData:save(actor)
  364. this.sendTimeLimitGift(actor, cfgIds, true)
  365. end
  366. end
  367. --- 触发 特殊条件4 记录该组礼包是否购买完,购买完记录未true
  368. function TimeLimitGift.checkSpecial4Condition(actor, group, timeLimitGift)
  369. local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.SPECIAL4)
  370. if table.isNullOrEmpty(timeLimitGiftAllCfg) then
  371. return
  372. end
  373. local timeLimitGiftData = TimeLimitGift.get(actor)
  374. local isSave = false
  375. for _, cfg in pairs(timeLimitGiftAllCfg) do
  376. --local param = cfg.param
  377. local id = cfg.id
  378. if group ~= id then
  379. goto continue
  380. end
  381. -- 已购买该礼包 group 为 4的礼包不能被条件通过
  382. local count = table.count(timeLimitGift)
  383. local cfgs = ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", group)
  384. if count < table.count(cfgs) then
  385. goto continue
  386. end
  387. timeLimitGiftData:setSpecial4(id, true)
  388. isSave = true
  389. TimeLimitGift.print("触发 特殊条件4 actor:" .. actor:toString(), "该group礼包已全部购买 触发条件4 group:", group)
  390. :: continue ::
  391. end
  392. if isSave then
  393. timeLimitGiftData:save(actor)
  394. end
  395. end
  396. function timelimitgifttest(actor, type, id)
  397. gameDebug.print(actor, "限时礼包礼包", id)
  398. --TimeLimitGift.login(actor)
  399. --TimeLimitGift.triggerTimeLimitGift(actor, false)
  400. TimeLimitGift.reqBuyTimeLimitGift(actor, { id = id })
  401. TimeLimitGift.print("限时礼包gm测试内容")
  402. end
  403. --- 打印日志
  404. local isPrintLog = true
  405. function TimeLimitGift.print(...)
  406. if isPrintLog then
  407. return
  408. end
  409. gameDebug.print(...)
  410. end
  411. -- 注册登录事件
  412. LoginEventListerTable:eventLister("0", "限时礼包", TimeLimitGift.login)
  413. -- 注册等级提升事件
  414. LevelUpEventListerTable:eventLister("0", "限时礼包", TimeLimitGift.levelUp)
  415. --注册凌晨刷新事件
  416. ZeroEventListerTable:eventLister("0", "限时礼包", TimeLimitGift.levelUp)