AbsSurpriseChest.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. local Msg = require("core.Msg")
  2. local Util = require("common.Util")
  3. local ObjHuman = require("core.ObjHuman")
  4. local Lang = require("common.Lang")
  5. local Broadcast = require("broadcast.Broadcast")
  6. local Grid = require("bag.Grid")
  7. local BagLogic = require("bag.BagLogic")
  8. local AbsActLogic = require("absAct.AbsActLogic")
  9. local AbsActDefine = require("absAct.AbsActDefine")
  10. local MailManager = require("mail.MailManager")
  11. local MailExcel = require("excel.mail")
  12. local AbsActExcel = require("excel.absAct")
  13. local ItemExcel = require("excel.item").item
  14. local ItemDefine = require("bag.ItemDefine")
  15. local YunYingLogic = require("yunying.YunYingLogic")
  16. local PanelDefine = require("broadcast.PanelDefine")
  17. local CycleActivityLogic = require("yunying.CycleActivity")
  18. --[[
  19. absAct.xlxs-surpriseChest
  20. 新英雄来袭-惊喜宝箱
  21. 1.每天凌晨0点解锁一个宝箱,每个宝箱都会有单独对应的任务
  22. 2.完成任务可以领取奖励;未完成任务,跨天后可以花元宝补领奖励
  23. DB:
  24. human.db.absAct[id] = {
  25. curDay = xxx, -- 当前是哪一天
  26. days = {
  27. [day] = {
  28. state = xxx, -- 天数 = 状态(0未解锁,1已解锁(不能领),2可领,3已领取,4可补领,5已补领)
  29. cnt = xxx,
  30. },
  31. ...
  32. }
  33. }
  34. local:
  35. getActID() -- 获取活动id
  36. getSChestDBAndConfig() -- 获取DB和配置
  37. getInitDB() -- 初始DB数据
  38. getCurSChestInfo() -- 取当天配置信息
  39. updateSend() -- 更新活动状态
  40. getReward() -- 获得奖励
  41. everyReqTriggerTask() -- 每次活动请求时触发任务
  42. wrapSurpriseChestNet() -- 包装惊喜宝箱协议数据
  43. public:
  44. getAndSendMsg() -- 发送活动数据
  45. isRed() -- 红点提醒
  46. isActive() -- 激活状态
  47. isOpen() -- 活动开启
  48. getLeftTime() -- 得到活动剩余时间
  49. get() -- 领取任务完成奖励
  50. buGet() -- 领取补领奖励
  51. updateDaily() -- 每日更新
  52. finishTaskCB() -- 完成任务回调
  53. --]]
  54. STATE_0 = 0 -- 未解锁
  55. STATE_1 = 1 -- 已解锁(不能领)
  56. STATE_2 = 2 -- 可领
  57. STATE_3 = 3 -- 已领取
  58. STATE_4 = 4 -- 可补领
  59. STATE_5 = 5 -- 已补领
  60. TASK_1 = 1 -- 活跃度达到X点活跃值
  61. TASK_2 = 2 -- 冠军联赛挑战X次
  62. TASK_3 = 3 -- 在线时长达到X分钟
  63. TASK_4 = 4 -- 接取任意悬赏任务X次
  64. TASK_5 = 5 -- 占卜消耗X个占卜币
  65. TASK_6 = 6 -- 挑战X次公会boss
  66. TASK_7 = 7 -- 参与女巫森林X次
  67. local S_CHEST_CONFIG = {} -- actID = {sChestInfo,...}
  68. local function getSChestDBAndConfig(human, id)
  69. local actDB = human.db.absAct[id]
  70. if not actDB then return end -- 判断活动是否存在
  71. local absActConfig = AbsActExcel.absActivity[id]
  72. if not absActConfig then return end -- 判断活动配置是否存在
  73. local actId = absActConfig.actId -- 活动里面的子活动id
  74. if not S_CHEST_CONFIG[actId] then -- 未缓存配置信息
  75. S_CHEST_CONFIG[actId] = {}
  76. local len = 0
  77. for _,sChestInfo in pairs(AbsActExcel.surpriseChest) do
  78. if actId == sChestInfo.actId then
  79. len = len + 1
  80. S_CHEST_CONFIG[actId][len] = sChestInfo
  81. end
  82. end
  83. end
  84. return actDB,id,actId,S_CHEST_CONFIG[actId] -- 活动DB,活动id,子活动id,子活动配置
  85. end
  86. local function getInitDB(human, funcID, isUpdateDaily)
  87. -- local state = AbsActLogic.isStarted(human, funcID)
  88. local state = CycleActivityLogic.isStarted(human, funcID)
  89. if not state then return end
  90. local actDB,id,actId,sChestConfig = getSChestDBAndConfig(human, funcID)
  91. if not actDB then return end
  92. -- 初始活动DB数据
  93. local absConfig = AbsActExcel.absActivity[funcID]
  94. if not actDB.curDay or isUpdateDaily then -- 若没初始 或者 跨天更新
  95. actDB.curDay = Util.diffDay(absConfig.realStartTime) + 1 -- DB当前任务是哪一天
  96. end
  97. actDB.days = actDB.days or {} -- DB所有天的数据
  98. -- DB初始各天数据
  99. for _,sChestInfo in ipairs(sChestConfig) do
  100. actDB.days[sChestInfo.day] = actDB.days[sChestInfo.day] or {}
  101. if sChestInfo.day == actDB.curDay then -- 当天
  102. if (actDB.days[sChestInfo.day].state or 0) == STATE_0 then -- 若为未解锁状态
  103. actDB.days[sChestInfo.day].state = STATE_1 -- 改为已解锁状态
  104. end
  105. elseif sChestInfo.day < actDB.curDay then -- 之前的天数
  106. if (actDB.days[sChestInfo.day].state or 0) < STATE_3 then -- 若小于已领取状态
  107. actDB.days[sChestInfo.day].state = STATE_4 -- 改为可补领状态
  108. end
  109. else -- 后面天数,改为未解锁
  110. actDB.days[sChestInfo.day].state = STATE_0
  111. end
  112. actDB.days[sChestInfo.day].cnt = actDB.days[sChestInfo.day].cnt or 0 -- 任务完成数,默认为0
  113. if sChestInfo.day == actDB.curDay then -- 当前天
  114. if actDB.days[sChestInfo.day].cnt >= sChestInfo.maxCnt then -- 任务完成次数够
  115. if (actDB.days[sChestInfo.day].state or 0) ~= STATE_3 then -- 不等于领取状态
  116. actDB.days[sChestInfo.day].state = STATE_2 -- 修改可领取状态
  117. end
  118. end
  119. end
  120. end
  121. return actDB,id,actId,sChestConfig
  122. end
  123. local function getCurSChestInfo(human, actDB, sChestConfig)
  124. -- 取得当天的配置信息
  125. local curSChestInfo
  126. for _,sChestInfo in ipairs(sChestConfig) do
  127. if sChestInfo.day == actDB.curDay then
  128. curSChestInfo = sChestInfo
  129. break
  130. end
  131. end
  132. return curSChestInfo
  133. end
  134. local function updateSend(human, day, actDB)
  135. local msgRet = Msg.gc.GC_ABS_SURPRISE_CHEST_UPDATE
  136. msgRet.day = day
  137. msgRet.cnt = actDB.days[day].cnt
  138. msgRet.state = actDB.days[day].state
  139. Msg.send(msgRet, human.fd)
  140. end
  141. local function getReward(human, funcID, day, isBuGet)
  142. local actDB,id,actId,sChestConfig = getInitDB(human, funcID)
  143. if not actDB then return end
  144. local sChestInfo
  145. for _,tempInfo in ipairs(sChestConfig) do
  146. if day == tempInfo.day then
  147. sChestInfo = tempInfo
  148. break
  149. end
  150. end
  151. if not sChestInfo then return end
  152. if isBuGet then -- 补领
  153. if actDB.days[day].state ~= STATE_4 then return end -- 不是可补领状态
  154. if not ObjHuman.checkRMB(human, sChestInfo.yuanbao) then -- 补领需判断需要的钻石是否足够
  155. return
  156. end
  157. actDB.days[day].state = STATE_5 -- 改变为已补领状态
  158. ObjHuman.decZuanshi(human, -sChestInfo.yuanbao, "abs_surpriseChest_buyGet") -- 扣钻石
  159. BagLogic.addItemList(human, sChestInfo.items, "abs_surpriseChest_buyGet") -- 添加补领道具
  160. else -- 完成任务的领取
  161. if actDB.days[day].state ~= STATE_2 then return end -- 不是可领状态
  162. actDB.days[day].state = STATE_3 -- 改变为已领取状态
  163. BagLogic.addItemList(human, sChestInfo.items, "abs_surpriseChest_get") -- 添加完成任务道具
  164. end
  165. Broadcast.sendErr(human, Lang.ABS_SURPRISE_CHEST_GET_SUCESS)
  166. updateSend(human, day, actDB) -- 信息改变,推道前端更新
  167. YunYingLogic.sendBanner(human)
  168. YunYingLogic.updateIcon(YYInfo[funcID], human)
  169. YunYingLogic.sendGroupUpdate(YYInfo[funcID], human, PanelDefine.PANEL_ID_5015)
  170. end
  171. local function everyReqTriggerTask(human, funcID)
  172. -- 在线时长达到X分钟这个任务,每次请求活动时,算一下在线时间
  173. local time = math.max(os.time() - human.db.lastLoginTime, 0)
  174. local onlineTime = (human.db.onlineTimeDay or 0) + time
  175. finishTaskCB(human, funcID, TASK_3, math.floor(onlineTime / 60), true)
  176. if human.db.dailyTask and human.db.dailyTask.nowHuoYue then
  177. finishTaskCB(human, funcID, TASK_1, human.db.dailyTask.nowHuoYue, true)
  178. end
  179. end
  180. local function wrapSurpriseChestNet(net, sChestInfo, actDB)
  181. net.day = sChestInfo.day
  182. net.cnt = actDB.days[sChestInfo.day].cnt
  183. net.state = actDB.days[sChestInfo.day].state
  184. net.maxCnt = sChestInfo.maxCnt
  185. net.panelID = sChestInfo.panelID
  186. net.yuanbao = sChestInfo.yuanbao
  187. net.desc = sChestInfo.desc
  188. local len = 0
  189. for _, itemCf in ipairs(sChestInfo.items) do
  190. len = len + 1
  191. Grid.makeItem(net.items[len], itemCf[1], itemCf[2])
  192. end
  193. net.items[0] = len
  194. end
  195. function getAndSendMsg(human, funcID)
  196. local actDB,id,actId,sChestConfig = getInitDB(human, funcID)
  197. if not actDB then return end
  198. everyReqTriggerTask(human, funcID)
  199. local msgRet = Msg.gc.GC_ABS_SURPRISE_CHEST_QUERY
  200. msgRet.actId = funcID
  201. msgRet.day = actDB.curDay
  202. local len = 0
  203. for _,sChestInfo in ipairs(sChestConfig) do
  204. len = len + 1
  205. wrapSurpriseChestNet(msgRet.dayChests[len], sChestInfo, actDB)
  206. end
  207. msgRet.dayChests[0] = len
  208. Msg.send(msgRet, human.fd)
  209. end
  210. function isRed(human, YYInfo, absActConfig)
  211. local actDB = getInitDB(human, absActConfig.funcID)
  212. if not actDB then return end
  213. for _,sChestDayDB in ipairs(actDB.days) do
  214. if sChestDayDB.state == STATE_2 then return true end -- 只要有一个可领状态则有红点
  215. end
  216. end
  217. function isActive(human, YYInfo, funcConfig)
  218. return not isOpen(human, YYInfo, funcConfig)
  219. end
  220. function isOpen(human, YYInfo, funcConfig)
  221. -- return AbsActLogic.isStarted(human, funcConfig.funcID)
  222. return CycleActivityLogic.isStarted(human, funcConfig.funcID)
  223. end
  224. function getLeftTime(human, YInfo, funcConfig)
  225. -- local ret, endTime, startTime = AbsActLogic.isStarted(human, funcConfig.funcID)
  226. local ret, endTime, startTime = CycleActivityLogic.isStarted(human, funcConfig.funcID)
  227. if ret == true then
  228. return endTime - os.time()
  229. else
  230. return 0
  231. end
  232. end
  233. function get(human, actId, day)
  234. getReward(human, actId, day)
  235. end
  236. function buGet(human, actId, day)
  237. getReward(human, actId, day, true)
  238. end
  239. function updateDaily(human, funcID)
  240. getInitDB(human, funcID, true)
  241. end
  242. -- 登出
  243. function onLogout(human, funcID, parameter)
  244. finishTaskCB(human, funcID, TASK_3, math.floor(human.db.onlineTimeDay / 60), true)
  245. end
  246. -- 悬赏任务
  247. function onBarTaskgetDo(human, funcID, parameter)
  248. finishTaskCB(human, funcID, TASK_4, 1)
  249. end
  250. -- 副本
  251. function onCopyFight(human, funcID, parameter)
  252. finishTaskCB(human, funcID, TASK_7, parameter)
  253. end
  254. -- 每日任务
  255. function onDailyTask(human, funcID, parameter)
  256. finishTaskCB(human, funcID, TASK_1, human.db.dailyTask.nowHuoYue, true)
  257. end
  258. -- 竞技场
  259. function onJjcFight(human, funcID, parameter)
  260. finishTaskCB(human, funcID, TASK_2, 1)
  261. end
  262. -- 公会副本
  263. function onUnionEctypeFight(human, funcID, parameter)
  264. finishTaskCB(human, funcID, TASK_6, parameter)
  265. end
  266. -- 占卜
  267. function onZhanBuBuyCard(human, funcID, parameter)
  268. finishTaskCB(human, funcID, TASK_5, parameter)
  269. end
  270. -- 任务完成
  271. function finishTaskCB(human, funcID, type, cnt, isRelpace)
  272. local actDB,id,actId,sChestConfig = getInitDB(human, funcID)
  273. if not actDB then return end
  274. local curSChestDayDB = actDB.days[actDB.curDay]
  275. if not curSChestDayDB then return end -- 没有当前天数DB数据(没有当前天数的任务)
  276. if curSChestDayDB.state ~= STATE_1 then return end -- 不是解锁状态,不能完成任务
  277. local curSChestInfo = getCurSChestInfo(human, actDB, sChestConfig)
  278. if not curSChestInfo then return end -- 没有当天配置信息
  279. if curSChestInfo.type ~= type then return end -- 当天的任务类型不一致
  280. if isRelpace then -- 若是直接替换值
  281. curSChestDayDB.cnt = cnt -- 设置任务完成次数
  282. else
  283. curSChestDayDB.cnt = curSChestDayDB.cnt + cnt -- 设置任务完成次数
  284. end
  285. if curSChestDayDB.cnt < 0 then
  286. curSChestDayDB.cnt = 0
  287. end
  288. if curSChestDayDB.cnt >= curSChestInfo.maxCnt then -- 任务完成次数够
  289. curSChestDayDB.state = STATE_2 -- 修改可领取状态
  290. curSChestDayDB.cnt = curSChestInfo.maxCnt -- 修改为最大完成次数
  291. YunYingLogic.sendBanner(human)
  292. end
  293. --updateSend(human, actDB.curDay, actDB) -- 更新推送当天DB数据
  294. end