DrumBlastingLogic.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. --[[
  2. absAct[id] = {
  3. drum = {
  4. [id] = cnt,state
  5. [id] = cnt,state
  6. }
  7. blasting = {
  8. [id] = cnt,state
  9. }
  10. box = {
  11. [id] = state
  12. }
  13. blastingCnt = 0
  14. buling = 0
  15. }
  16. ]]
  17. local AbsActLogic = require("absAct.AbsActLogic")
  18. local AbsActExcel = require("excel.absAct")
  19. local BuyExcel = require("excel.buy")
  20. local Util = require("common.Util")
  21. local Msg = require("core.Msg")
  22. local Grid = require("bag.Grid")
  23. local BagLogic = require("bag.BagLogic")
  24. local BuyLogic = require("topup.BuyLogic")
  25. local YunYingLogic = require("yunying.YunYingLogic")
  26. function isOpen(human, YYInfo, funcConfig)
  27. local state, endTime, startTime = AbsActLogic.isStarted(human, funcConfig.funcID)
  28. if not state then return end
  29. local absAct = human.db.absAct[funcConfig.funcID]
  30. if absAct and absAct.dayCnt and absAct.dayCnt <= 0 and #absAct.item <= 0 then
  31. return false
  32. end
  33. return true, endTime, startTime
  34. end
  35. function isActive(human, YYInfo, funcConfig)
  36. return not isOpen(human, YYInfo, funcConfig)
  37. end
  38. -- 初始化数据库
  39. function initDB(human,id)
  40. local absAct = human.db.absAct[id]
  41. absAct.drum = absAct.drum or {}
  42. absAct.blasting = absAct.blasting or {}
  43. absAct.box = absAct.box or {}
  44. absAct.blastingCnt = absAct.blastingCnt or 0
  45. absAct.buling = absAct.buling or 0
  46. end
  47. -- 发送数据
  48. function getAndSendMsg(human,id,actID)
  49. -- 判断活动是否开启
  50. local state, endTime, starTime = AbsActLogic.isStarted(human, id)
  51. if not state then return end
  52. local absConfig = AbsActExcel.absActivity[id]
  53. if not absConfig then return end
  54. local absAct = human.db.absAct[id]
  55. if not absAct then
  56. return
  57. end
  58. initDB(human,id)
  59. local nowDay = Util.diffDay(starTime) + 1
  60. -- 构造数据
  61. local msgRet = Msg.gc.GC_ABS_ND_TASK_QUERY
  62. -- 鼓数据
  63. local taskConfig = AbsActExcel.drum
  64. local len = #taskConfig
  65. local count = 0
  66. msgRet.day = nowDay
  67. BuyLogic.fontBuyItem(human, msgRet.buyItem, AbsActExcel.blastingBox[1].buyID)
  68. for i = 1,len do
  69. local v = taskConfig[i]
  70. if v.day == nowDay then
  71. count = count + 1
  72. local net = msgRet.drumList[count]
  73. net.id = i
  74. net.desc = v.desc
  75. net.name = v.name
  76. net.needCnt = v.needCnt
  77. net.panelID = v.panelID
  78. net.nowCnt = absAct.drum[i] and absAct.drum[i].cnt or 0
  79. net.state = absAct.drum[i] and absAct.drum[i].state or 0
  80. for j = 1,#v.item do
  81. Grid.makeItem(net.item[j],v.item[j][1],v.item[j][2])
  82. end
  83. net.item[0] = #v.item
  84. end
  85. end
  86. msgRet.drumList[0] = count
  87. -- 炮数据
  88. taskConfig = AbsActExcel.blasting
  89. len = #taskConfig
  90. for i = 1,len do
  91. local v = taskConfig[i]
  92. local net = msgRet.blastingList[i]
  93. net.id = i
  94. net.desc = v.desc
  95. net.name = v.name
  96. net.needCnt = v.needCnt
  97. net.nowCnt = absAct.blasting[i] and absAct.blasting[i].cnt or 0
  98. net.state = absAct.blasting[i] and absAct.blasting[i].state or 0
  99. for j = 1,#v.item[nowDay] do
  100. Grid.makeItem(net.item[j],v.item[nowDay][j][1],v.item[nowDay][j][2])
  101. end
  102. net.item[0] = #v.item[nowDay]
  103. net.panelID = v.panelID or 0
  104. end
  105. msgRet.blastingList[0] = len
  106. -- 宝箱数据
  107. taskConfig = AbsActExcel.blastingBox
  108. len = #taskConfig
  109. for i = 1,len do
  110. local v = taskConfig[i]
  111. local net = msgRet.boxList[i]
  112. net.id = i
  113. net.needCnt = v.needCnt
  114. net.state = absAct.box[i] or 0
  115. for j = 1,#v.item do
  116. Grid.makeItem(net.item[j],v.item[j][1],v.item[j][2])
  117. end
  118. net.item[0] = #v.item
  119. end
  120. msgRet.boxList[0] = len
  121. msgRet.blastingCnt = absAct.blastingCnt
  122. Msg.send(msgRet,human.fd)
  123. end
  124. -- 领取物品
  125. -- type 1鼓,2炮,3箱
  126. function get(human,index,type,id)
  127. -- 判断活动是否开起
  128. local state, endTime, starTime = AbsActLogic.isStarted(human, id)
  129. if not state then return end
  130. local absConfig = AbsActExcel.absActivity[id]
  131. if not absConfig then return end
  132. local absAct = human.db.absAct[id]
  133. if not absAct then
  134. return
  135. end
  136. initDB(human,id)
  137. local nowDay = Util.diffDay(starTime) + 1
  138. local item = nil
  139. -- 选择对应类型
  140. local config = nil
  141. local state = nil
  142. if type == 1 then
  143. config = AbsActExcel.drum[index]
  144. state = absAct.drum[index] and absAct.drum[index].state or 0
  145. elseif type == 2 then
  146. config = AbsActExcel.blasting[index]
  147. state = absAct.blasting[index] and absAct.blasting[index].state or 0
  148. elseif type == 3 then
  149. config = AbsActExcel.blastingBox[index]
  150. state = absAct.box[index] or 0
  151. end
  152. -- 传入参数错误
  153. if not config then
  154. return
  155. end
  156. -- 状态不为可领取
  157. if state ~= 1 then
  158. return
  159. end
  160. -- 改变状态
  161. if type == 1 then
  162. item = config.item
  163. absAct.drum[index].state = 2
  164. elseif type == 2 then
  165. item = config.item[nowDay]
  166. absAct.blasting[index].state = 2
  167. -- 放炮一次,增加累计次数,并判断是否达到宝箱领取数值
  168. absAct.blastingCnt = absAct.blastingCnt + 1
  169. for i = 1,#AbsActExcel.blastingBox do
  170. if absAct.blastingCnt - 1 < AbsActExcel.blastingBox[i].needCnt and absAct.blastingCnt == AbsActExcel.blastingBox[i].needCnt then
  171. absAct.box[i] = 1
  172. break
  173. end
  174. end
  175. elseif type == 3 then
  176. item = config.item
  177. absAct.box[index] = 2
  178. else
  179. return
  180. end
  181. BagLogic.addItemList(human, item, "abs_drumblasting")
  182. getAndSendMsg(human,id,actID)
  183. YunYingLogic.sendBanner(human)
  184. YunYingLogic.sendGroupUpdate(YYInfo[id], human, absConfig.panelID)
  185. end
  186. -- 每日任务活跃度
  187. function onDailyTask(human,funcID, parameter)
  188. drumTaskCallBack(human,funcID,1,parameter)
  189. end
  190. -- 召唤
  191. function onDrawCard(human,funcID, parameter)
  192. drumTaskCallBack(human,funcID,2,parameter)
  193. end
  194. -- 恶魔之塔
  195. function onHuangjingTower(human,funcID, parameter)
  196. drumTaskCallBack(human,funcID,3,parameter)
  197. end
  198. -- 充值
  199. function onCharge(human, parameter,funcID)
  200. drumTaskCallBack(human,funcID,4,parameter)
  201. end
  202. -- 勇者试炼
  203. function onDrill(human,funcID, parameter)
  204. drumTaskCallBack(human,funcID,5,parameter)
  205. end
  206. -- 女巫森林
  207. function onCopyChallenge(human,funcID, parameter)
  208. drumTaskCallBack(human,funcID,6,parameter)
  209. end
  210. -- 冠军联赛
  211. function onJjcFight(human,funcID, parameter)
  212. drumTaskCallBack(human,funcID,7,parameter)
  213. end
  214. -- 随机商店购买
  215. function onShopBuy(human,funcID,parameter)
  216. drumTaskCallBack(human,funcID,8,parameter)
  217. end
  218. -- 冒险扫荡
  219. function onMopup(human,funcID,parameter)
  220. drumTaskCallBack(human,funcID,9,parameter)
  221. end
  222. -- 冰龙巢穴
  223. function onBinglong(human,funcID,parameter)
  224. drumTaskCallBack(human,funcID,10,parameter)
  225. end
  226. -- 点金
  227. function onExchangeJinbi(human,funcID,parameter)
  228. drumTaskCallBack(human,funcID,11,parameter)
  229. end
  230. -- 悬赏
  231. function onBarTaskgetDo(human,funcID,parameter)
  232. drumTaskCallBack(human,funcID,12,parameter)
  233. end
  234. -- 捐赠
  235. function onUnionDonate(human,funcID,parameter)
  236. drumTaskCallBack(human,funcID,13,parameter)
  237. end
  238. -- 公会副本
  239. function onUnionEctypeFight(human,funcID,parameter)
  240. drumTaskCallBack(human,funcID,14,parameter)
  241. end
  242. -- 占卜
  243. function onZhanBuBuyCard(human,funcID,parameter)
  244. drumTaskCallBack(human,funcID,15,parameter)
  245. end
  246. -- 消耗钻石
  247. function onDecZuanshi(human,funcID,parameter)
  248. drumTaskCallBack(human,funcID,16,parameter)
  249. end
  250. -- 绝望深渊
  251. function onLianyu(human,funcID,parameter)
  252. drumTaskCallBack(human,funcID,17,parameter)
  253. end
  254. -- 合成符文
  255. function onFuwenHecheng(human,funcID,parameter)
  256. drumTaskCallBack(human,funcID,18,parameter)
  257. end
  258. -- 回调
  259. function drumTaskCallBack(human,id,type,cnt)
  260. AbsActLogic.checkAbsActClean(human, id)
  261. initDB(human,id)
  262. local state, endTime, starTime = AbsActLogic.isStarted(human, id)
  263. local absConfig = AbsActExcel.absActivity[id]
  264. if not absConfig then return end
  265. local nowDay = Util.diffDay(starTime) + 1
  266. -- 完成任务,增加任务次数
  267. local taskConfig = AbsActExcel.drum
  268. for k = 1,#taskConfig do
  269. if taskConfig[k].type == type and taskConfig[k].day == nowDay then
  270. local taskID = k
  271. human.db.absAct[id].drum[taskID] = human.db.absAct[id].drum[taskID] or {}
  272. human.db.absAct[id].drum[taskID].cnt = human.db.absAct[id].drum[taskID].cnt or 0
  273. human.db.absAct[id].drum[taskID].state = human.db.absAct[id].drum[taskID].state or 0
  274. human.db.absAct[id].drum[taskID].cnt = human.db.absAct[id].drum[taskID].cnt + cnt
  275. if human.db.absAct[id].drum[taskID].state ~= 0 and cnt < 0 then
  276. human.db.absAct[id].drum[taskID].cnt = human.db.absAct[id].drum[taskID].cnt - cnt
  277. end
  278. local config = AbsActExcel.drum[taskID]
  279. -- 鼓任务达成
  280. if human.db.absAct[id].drum[taskID].cnt >= config.needCnt and human.db.absAct[id].drum[taskID].state == 0 then
  281. human.db.absAct[id].drum[taskID].state = 1
  282. -- 判断是否达成炮任务
  283. for i = 1,#config.blasting do
  284. local blastingID = config.blasting[i]
  285. local blastingConfig = AbsActExcel.blasting[blastingID]
  286. human.db.absAct[id].blasting[blastingID] = human.db.absAct[id].blasting[blastingID] or {}
  287. human.db.absAct[id].blasting[blastingID].cnt = human.db.absAct[id].blasting[blastingID].cnt or 0
  288. human.db.absAct[id].blasting[blastingID].state = human.db.absAct[id].blasting[blastingID].state or 0
  289. human.db.absAct[id].blasting[blastingID].cnt = human.db.absAct[id].blasting[blastingID].cnt + 1
  290. if human.db.absAct[id].blasting[blastingID].cnt >= 3 and human.db.absAct[id].blasting[blastingID].state ~= 2 then
  291. human.db.absAct[id].blasting[blastingID].state = 1
  292. end
  293. end
  294. end
  295. end
  296. end
  297. YunYingLogic.sendBanner(human)
  298. YunYingLogic.sendGroupUpdate(YYInfo[id], human, absConfig.panelID)
  299. end
  300. -- 每日重置鼓,炮状态
  301. function updateDaily(human,id)
  302. local state, endTime, starTime = AbsActLogic.isStarted(human, id)
  303. if not state then return end
  304. local config = AbsActExcel.absActivity[id]
  305. if not config then return end
  306. AbsActLogic.checkAbsActClean(human, id)
  307. local absAct = human.db.absAct[id]
  308. absAct.drum = {}
  309. absAct.blasting = {}
  310. absAct.box = absAct.box or {}
  311. absAct.blastingCnt = absAct.blastingCnt or 0
  312. end
  313. function isRed(human, YYInfo, funcConfig)
  314. local state = AbsActLogic.isStarted(human, funcConfig.funcID)
  315. if not state then return end
  316. local absConfig = AbsActExcel.absActivity[funcConfig.funcID]
  317. local absAct = human.db.absAct[funcConfig.funcID]
  318. if not absAct then return true end
  319. initDB(human,funcConfig.funcID)
  320. for k,v in pairs(absAct.drum) do
  321. if v.state == 1 then
  322. return true
  323. end
  324. end
  325. for k,v in pairs(absAct.blasting) do
  326. if v.state == 1 then
  327. return true
  328. end
  329. end
  330. for k,v in pairs(absAct.box) do
  331. if v == 1 then
  332. return true
  333. end
  334. end
  335. return false
  336. end
  337. -- 购买补领
  338. function buling(human,funcID,conf)
  339. -- 将达标次数设为30次
  340. AbsActLogic.checkAbsActClean(human, funcID)
  341. initDB(human,funcID)
  342. local absConfig = AbsActExcel.absActivity[funcID]
  343. --
  344. local absAct = human.db.absAct[funcID]
  345. if absAct.buling == 1 then
  346. return
  347. end
  348. absAct.buling = 1
  349. local config = AbsActExcel.blastingBox
  350. local len = #config
  351. for i = 1,len do
  352. if config[i].needCnt > absAct.blastingCnt then
  353. absAct.blastingCnt = config[i].needCnt
  354. absAct.box[i] = 1
  355. end
  356. end
  357. getAndSendMsg(human,id,absConfig.actID)
  358. end