OpenServerTotalConsume.lua 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. local Msg = require("core.Msg")
  2. local Util = require("common.Util")
  3. local Lang = require("common.Lang")
  4. local Broadcast = require("broadcast.Broadcast")
  5. local PanelDefine = require("broadcast.PanelDefine")
  6. local BagLogic = require("bag.BagLogic")
  7. local Grid = require("bag.Grid")
  8. local OpenAct = require("present.OpenAct")
  9. local DrawCardLogic = require("drawCard.DrawCardLogic")
  10. local YunYingLogic = require("yunying.YunYingLogic")
  11. local OpenActExcel = require("excel.openAct")
  12. --[[
  13. 开服活动-累计消耗类活动 累计消耗钻、累计招募
  14. DB:
  15. human.db.openServerReach = {
  16. [type] = { -- 消耗类型
  17. value = xxx, -- 累计消耗值
  18. [id] = xxx, -- 档位领取状态(0不可领,1可领,2已领)
  19. ...
  20. },
  21. ...
  22. }
  23. local:
  24. getDB() -- 获得单笔充值DB数据
  25. getOpenActConfig() -- 通过消耗类型得到开服活动配置
  26. getOpenActParam() -- 通过消耗类型得到开服活动参数
  27. getReachType() -- 通过活动参数得到开服活动消耗类型
  28. reachTouchHanlde() -- 消耗达标处理
  29. wrapTConsumeList() -- 包装单笔充值档位数据
  30. public:
  31. isRed() -- 红点提醒
  32. isActive() -- 激活状态
  33. isBaseOpen() -- 开启活动基本条件
  34. isOpen() -- 活动开启
  35. getLeftTime() -- 得到活动剩余时间
  36. query() -- 发送活动信息
  37. get() -- 领取活动奖励
  38. onDecZuanshi() -- 消耗钻石回调
  39. onDrawCard() -- 抽卡回调
  40. --]]
  41. STATE_0 = 0 -- 不可领
  42. STATE_1 = 1 -- 可领
  43. STATE_2 = 2 -- 已领完
  44. OA_REACH_TYPE_1 = 1 -- 钻石消耗
  45. OA_REACH_TYPE_2 = 2 -- 招募达标
  46. local function getDB(human, reachType)
  47. human.db.openServerReach = human.db.openServerReach or {}
  48. human.db.openServerReach[reachType] = human.db.openServerReach[reachType] or {}
  49. return human.db.openServerReach[reachType]
  50. end
  51. local function getOpenActConfig(reachType)
  52. if reachType == OA_REACH_TYPE_1 then return OpenActExcel.totalConsume end
  53. if reachType == OA_REACH_TYPE_2 then return OpenActExcel.drawCardConsume end
  54. end
  55. local function getOpenActParam(reachType)
  56. if reachType == OA_REACH_TYPE_1 then return OpenAct.OPEN_ACT_TOTAL_CONSUME end
  57. if reachType == OA_REACH_TYPE_2 then return OpenAct.OPEN_ACT_DRAW_CARD end
  58. end
  59. local function getReachType(funcConfig)
  60. if funcConfig.param == OpenAct.OPEN_ACT_TOTAL_CONSUME then return OA_REACH_TYPE_1 end
  61. if funcConfig.param == OpenAct.OPEN_ACT_DRAW_CARD then return OA_REACH_TYPE_2 end
  62. end
  63. local function reachTouchHanlde(human, funcID, reachType, value)
  64. local funcConfig = YunYingLogic.getFuncConfig(funcID)
  65. if not funcConfig then return end
  66. local openActConfig = getOpenActConfig(reachType)
  67. if not openActConfig then return end
  68. local tConsumeDB = getDB(human, reachType)
  69. tConsumeDB.value = (tConsumeDB.value or 0) + value
  70. -- 取之前是不是有红点
  71. local beforeRed = isRed(human, nil, funcConfig)
  72. local isActive
  73. for id,tConsumeInfo in ipairs(openActConfig) do
  74. if tConsumeInfo.needConsume <= tConsumeDB.value and
  75. tConsumeDB[id] ~= STATE_2 then
  76. tConsumeDB[id] = STATE_1
  77. isActive = true
  78. end
  79. end
  80. -- 之前没有红点,现在激活了红点通知(只需要通知banner上的红点)
  81. if not beforeRed and isActive then
  82. YunYingLogic.sendBanner(human)
  83. end
  84. end
  85. local function wrapTConsumeList(net, id, tConsumeInfo, sConsumeDB)
  86. net.id = id
  87. net.needConsume = tConsumeInfo.needConsume
  88. net.state = sConsumeDB[id] or STATE_0
  89. local len = 0
  90. for index,itemInfo in ipairs(tConsumeInfo.rewards) do
  91. len = len + 1
  92. Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
  93. end
  94. net.items[0] = len
  95. end
  96. function isRed(human, YYInfo, funcConfig)
  97. local reachType = getReachType(funcConfig)
  98. if not reachType then return end
  99. local openActConfig = getOpenActConfig(reachType)
  100. if not openActConfig then return end
  101. local tConsumesDB = getDB(human, reachType)
  102. if not tConsumesDB then return end
  103. for id in ipairs(openActConfig) do
  104. if tConsumesDB[id] and tConsumesDB[id] == STATE_1 then return true end
  105. end
  106. end
  107. function isActive(human, YYInfo, funcConfig)
  108. return not isOpen(human, YYInfo, funcConfig)
  109. end
  110. function isBaseOpen(human, YYInfo, funcConfig, noSend)
  111. if human.db.lv < funcConfig.openLv then
  112. if not noSend then
  113. local str = Util.format(Lang.ROLE_LEV_ERROR, funcConfig.openLv)
  114. return Broadcast.sendErr(human, str)
  115. end
  116. end
  117. local flag = OpenAct.getOpenActTime(funcConfig.param)
  118. if not flag then return end
  119. return true
  120. end
  121. function isOpen(human, YYInfo, funcConfig)
  122. if isBaseOpen(human, YYInfo, funcConfig, true) then return true end
  123. end
  124. function getLeftTime(human, YYInfo, funcConfig)
  125. local _,leftTime = OpenAct.getOpenActTime(funcConfig.param)
  126. return leftTime
  127. end
  128. function query(human, reachType)
  129. local openActConfig = getOpenActConfig(reachType)
  130. if not openActConfig then return end
  131. local openActParam = getOpenActParam(reachType)
  132. if not openActParam then return end
  133. local _,leftTime = OpenAct.getOpenActTime(openActParam)
  134. local tConsumeDB = getDB(human, reachType)
  135. local msgRet = Msg.gc.GC_OPEN_SERVER_REACH_QUERY
  136. msgRet.type = reachType
  137. msgRet.value = tConsumeDB.value or 0
  138. msgRet.leftTime = leftTime
  139. local len = 0
  140. for id,tConsumeInfo in ipairs(openActConfig) do
  141. len = len + 1
  142. wrapTConsumeList(msgRet.list[len], id, tConsumeInfo, tConsumeDB)
  143. end
  144. msgRet.list[0] = len
  145. Msg.send(msgRet, human.fd)
  146. end
  147. function get(human, funcID, reachType, id)
  148. local funcConfig = YunYingLogic.getFuncConfig(funcID)
  149. if not funcConfig then return end
  150. local openActConfig = getOpenActConfig(reachType)
  151. if not openActConfig then return end
  152. local tConsumeInfo = openActConfig[id]
  153. if not tConsumeInfo then return end
  154. local tConsumeDB = getDB(human, reachType)
  155. if tConsumeDB[id] ~= STATE_1 then return end
  156. tConsumeDB[id] = STATE_2
  157. BagLogic.addItemList(human, tConsumeInfo.rewards, "openServerTConsume_get")
  158. query(human, reachType)
  159. -- 现在没有红点了通知
  160. if not isRed(human, nil, funcConfig) then
  161. YunYingLogic.sendBanner(human)
  162. YunYingLogic.updateIcon(YYInfo[funcID], human)
  163. YunYingLogic.sendGroupUpdate(YYInfo[funcID], human, funcConfig.panelID)
  164. end
  165. end
  166. function onDecZuanshi(human, funcID, value)
  167. local funcConfig = YunYingLogic.getFuncConfig(funcID)
  168. if not funcConfig then return end
  169. if not isOpen(human, nil, funcConfig) then return end
  170. local reachType = getReachType(funcConfig)
  171. if reachType == OA_REACH_TYPE_1 then
  172. reachTouchHanlde(human, funcID, reachType, value)
  173. end
  174. end
  175. function onDrawCard(human, funcID, value, drawType)
  176. local funcConfig = YunYingLogic.getFuncConfig(funcID)
  177. if not funcConfig then return end
  178. if not isOpen(human, nil, funcConfig) then return end
  179. local reachType = getReachType(funcConfig)
  180. if reachType == OA_REACH_TYPE_2 then
  181. if drawType == DrawCardLogic.DRAWCARD_ID2 or
  182. drawType == DrawCardLogic.DRAWCARD_ID5 or
  183. drawType == DrawCardLogic.DRAWCARD_ID6 then
  184. reachTouchHanlde(human, funcID, reachType, value)
  185. end
  186. end
  187. end