DrumBlastingLogic.lua 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  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. local itemLen = type(v.item[nowDay]) == "table" and #v.item[nowDay] or 0
  100. for j = 1,itemLen do
  101. Grid.makeItem(net.item[j],v.item[nowDay][j][1],v.item[nowDay][j][2])
  102. end
  103. net.item[0] = itemLen --#v.item[nowDay]
  104. net.panelID = v.panelID or 0
  105. end
  106. msgRet.blastingList[0] = len
  107. -- ��������
  108. taskConfig = AbsActExcel.blastingBox
  109. len = #taskConfig
  110. for i = 1,len do
  111. local v = taskConfig[i]
  112. local net = msgRet.boxList[i]
  113. net.id = i
  114. net.needCnt = v.needCnt
  115. net.state = absAct.box[i] or 0
  116. for j = 1,#v.item do
  117. Grid.makeItem(net.item[j],v.item[j][1],v.item[j][2])
  118. end
  119. net.item[0] = #v.item
  120. end
  121. msgRet.boxList[0] = len
  122. msgRet.blastingCnt = absAct.blastingCnt
  123. Msg.send(msgRet,human.fd)
  124. end
  125. -- ��ȡ��Ʒ
  126. -- type 1��,2��,3��
  127. function get(human,index,type,id)
  128. -- �жϻ�Ƿ���
  129. local state, endTime, starTime = AbsActLogic.isStarted(human, id)
  130. if not state then return end
  131. local absConfig = AbsActExcel.absActivity[id]
  132. if not absConfig then return end
  133. local absAct = human.db.absAct[id]
  134. if not absAct then
  135. return
  136. end
  137. initDB(human,id)
  138. local nowDay = Util.diffDay(starTime) + 1
  139. local item = nil
  140. -- ѡ���Ӧ����
  141. local config = nil
  142. local state = nil
  143. if type == 1 then
  144. config = AbsActExcel.drum[index]
  145. state = absAct.drum[index] and absAct.drum[index].state or 0
  146. elseif type == 2 then
  147. config = AbsActExcel.blasting[index]
  148. state = absAct.blasting[index] and absAct.blasting[index].state or 0
  149. elseif type == 3 then
  150. config = AbsActExcel.blastingBox[index]
  151. state = absAct.box[index] or 0
  152. end
  153. -- �����������
  154. if not config then
  155. return
  156. end
  157. -- ״̬��Ϊ����ȡ
  158. if state ~= 1 then
  159. return
  160. end
  161. -- �ı�״̬
  162. if type == 1 then
  163. item = config.item
  164. absAct.drum[index].state = 2
  165. elseif type == 2 then
  166. item = config.item[nowDay]
  167. absAct.blasting[index].state = 2
  168. -- ����һ��,�����ۼƴ��������ж��Ƿ�ﵽ������ȡ��ֵ
  169. absAct.blastingCnt = absAct.blastingCnt + 1
  170. for i = 1,#AbsActExcel.blastingBox do
  171. if absAct.blastingCnt - 1 < AbsActExcel.blastingBox[i].needCnt and absAct.blastingCnt == AbsActExcel.blastingBox[i].needCnt then
  172. absAct.box[i] = 1
  173. break
  174. end
  175. end
  176. elseif type == 3 then
  177. item = config.item
  178. absAct.box[index] = 2
  179. else
  180. return
  181. end
  182. BagLogic.addItemList(human, item, "abs_drumblasting")
  183. getAndSendMsg(human,id,actID)
  184. YunYingLogic.sendBanner(human)
  185. YunYingLogic.sendGroupUpdate(YYInfo[id], human, absConfig.panelID)
  186. end
  187. -- ÿ�������Ծ��
  188. function onDailyTask(human,funcID, parameter)
  189. drumTaskCallBack(human,funcID,1,parameter)
  190. end
  191. -- �ٻ�
  192. function onDrawCard(human,funcID, parameter)
  193. drumTaskCallBack(human,funcID,2,parameter)
  194. end
  195. -- ��ħ֮��
  196. function onHuangjingTower(human,funcID, parameter)
  197. drumTaskCallBack(human,funcID,3,parameter)
  198. end
  199. -- ��ֵ
  200. function onCharge(human, parameter,funcID)
  201. -- 临时处理
  202. drumTaskCallBack(human,funcID,4,parameter)
  203. end
  204. -- ��������
  205. function onDrill(human,funcID, parameter)
  206. drumTaskCallBack(human,funcID,5,parameter)
  207. end
  208. -- Ů��ɭ��
  209. function onCopyChallenge(human,funcID, parameter)
  210. drumTaskCallBack(human,funcID,6,parameter)
  211. end
  212. -- �ھ�����
  213. function onJjcFight(human,funcID, parameter)
  214. drumTaskCallBack(human,funcID,7,parameter)
  215. end
  216. -- ����̵깺��
  217. function onShopBuy(human,funcID,parameter)
  218. drumTaskCallBack(human,funcID,8,parameter)
  219. end
  220. -- ð��ɨ��
  221. function onMopup(human,funcID,parameter)
  222. drumTaskCallBack(human,funcID,9,parameter)
  223. end
  224. -- ������Ѩ
  225. function onBinglong(human,funcID,parameter)
  226. drumTaskCallBack(human,funcID,10,parameter)
  227. end
  228. -- ���
  229. function onExchangeJinbi(human,funcID,parameter)
  230. drumTaskCallBack(human,funcID,11,parameter)
  231. end
  232. -- ����
  233. function onBarTaskgetDo(human,funcID,parameter)
  234. drumTaskCallBack(human,funcID,12,parameter)
  235. end
  236. -- ����
  237. function onUnionDonate(human,funcID,parameter)
  238. drumTaskCallBack(human,funcID,13,parameter)
  239. end
  240. -- ���ḱ��
  241. function onUnionEctypeFight(human,funcID,parameter)
  242. drumTaskCallBack(human,funcID,14,parameter)
  243. end
  244. -- ռ��
  245. function onZhanBuBuyCard(human,funcID,parameter)
  246. -- ZhanbuLogic.lua 436行 传的数值为负, 不知道哪个监听该事件的地方需要数值为负,所以只处理当前模块
  247. if parameter < 0 then
  248. return
  249. end
  250. drumTaskCallBack(human,funcID,15,parameter)
  251. end
  252. -- ������ʯ
  253. function onDecZuanshi(human,funcID,parameter)
  254. drumTaskCallBack(human,funcID,16,parameter)
  255. end
  256. -- ������Ԩ
  257. function onLianyu(human,funcID,parameter)
  258. drumTaskCallBack(human,funcID,17,parameter)
  259. end
  260. -- �ϳɷ���
  261. function onFuwenHecheng(human,funcID,parameter)
  262. drumTaskCallBack(human,funcID,18,parameter)
  263. end
  264. -- �ص�
  265. function drumTaskCallBack(human,id,type,cnt)
  266. AbsActLogic.checkAbsActClean(human, id)
  267. local state, endTime, starTime = AbsActLogic.isStarted(human, id)
  268. -- 活動未開啓
  269. if not state or os.time() > endTime then
  270. return
  271. end
  272. local absConfig = AbsActExcel.absActivity[id]
  273. if not absConfig then return end
  274. local absActData = human.db.absAct[id]
  275. if not absActData then
  276. return
  277. end
  278. initDB(human,id)
  279. local nowDay = Util.diffDay(starTime) + 1
  280. -- ������������������
  281. local taskConfig = AbsActExcel.drum
  282. for k = 1,#taskConfig do
  283. if taskConfig[k].type == type and taskConfig[k].day == nowDay then
  284. local taskID = k
  285. human.db.absAct[id].drum[taskID] = human.db.absAct[id].drum[taskID] or {}
  286. human.db.absAct[id].drum[taskID].cnt = human.db.absAct[id].drum[taskID].cnt or 0
  287. human.db.absAct[id].drum[taskID].state = human.db.absAct[id].drum[taskID].state or 0
  288. human.db.absAct[id].drum[taskID].cnt = human.db.absAct[id].drum[taskID].cnt + cnt
  289. if human.db.absAct[id].drum[taskID].state ~= 0 and cnt < 0 then
  290. human.db.absAct[id].drum[taskID].cnt = human.db.absAct[id].drum[taskID].cnt - cnt
  291. end
  292. local config = AbsActExcel.drum[taskID]
  293. -- ��������
  294. if human.db.absAct[id].drum[taskID].cnt >= config.needCnt and human.db.absAct[id].drum[taskID].state == 0 then
  295. human.db.absAct[id].drum[taskID].state = 1
  296. -- �ж��Ƿ���������
  297. for i = 1,#config.blasting do
  298. local blastingID = config.blasting[i]
  299. local blastingConfig = AbsActExcel.blasting[blastingID]
  300. human.db.absAct[id].blasting[blastingID] = human.db.absAct[id].blasting[blastingID] or {}
  301. human.db.absAct[id].blasting[blastingID].cnt = human.db.absAct[id].blasting[blastingID].cnt or 0
  302. human.db.absAct[id].blasting[blastingID].state = human.db.absAct[id].blasting[blastingID].state or 0
  303. human.db.absAct[id].blasting[blastingID].cnt = human.db.absAct[id].blasting[blastingID].cnt + 1
  304. if human.db.absAct[id].blasting[blastingID].cnt >= 3 and human.db.absAct[id].blasting[blastingID].state ~= 2 then
  305. human.db.absAct[id].blasting[blastingID].state = 1
  306. end
  307. end
  308. end
  309. end
  310. end
  311. YunYingLogic.sendBanner(human)
  312. YunYingLogic.sendGroupUpdate(YYInfo[id], human, absConfig.panelID)
  313. end
  314. -- ÿ�����ùģ���״̬
  315. function updateDaily(human,id)
  316. local state, endTime, starTime = AbsActLogic.isStarted(human, id)
  317. if not state then return end
  318. local config = AbsActExcel.absActivity[id]
  319. if not config then return end
  320. AbsActLogic.checkAbsActClean(human, id)
  321. local absAct = human.db.absAct[id] or {}
  322. absAct.drum = {}
  323. absAct.blasting = {}
  324. absAct.box = absAct.box or {}
  325. absAct.blastingCnt = absAct.blastingCnt or 0
  326. human.db.absAct[id] = absAct
  327. end
  328. -- 因为玩家在活动未开启前完成了活跃度任务,活动开启后没法完成活跃度任务,所以在玩家上线时,做一次更新活跃度数据操作
  329. function specialFunc(human, id)
  330. AbsActLogic.checkAbsActClean(human, id)
  331. local state, endTime, starTime = AbsActLogic.isStarted(human, id)
  332. -- 活動未開啓
  333. if not state or os.time() > endTime then
  334. return
  335. end
  336. local absConfig = AbsActExcel.absActivity[id]
  337. if not absConfig then return end
  338. local absActData = human.db.absAct[id]
  339. if not absActData then
  340. return
  341. end
  342. initDB(human,id)
  343. local nowHuoYue = human.db.dailyTask and human.db.dailyTask.nowHuoYue or 0
  344. if nowHuoYue > 0 then
  345. local nowDay = Util.diffDay(starTime) + 1
  346. local actType = 1
  347. -- ������������������
  348. local singleData
  349. local isChange = false
  350. local taskConfig = AbsActExcel.drum
  351. for k = 1,#taskConfig do
  352. if taskConfig[k].type == actType and taskConfig[k].day == nowDay then
  353. local taskID = k
  354. human.db.absAct[id].drum[taskID] = human.db.absAct[id].drum[taskID] or {}
  355. singleData = human.db.absAct[id].drum[taskID]
  356. singleData.cnt = singleData.cnt or 0
  357. singleData.state = singleData.state or 0
  358. if singleData.cnt > 0 then
  359. break
  360. end
  361. singleData.cnt = nowHuoYue
  362. isChange = true
  363. -- if human.db.absAct[id].drum[taskID].state ~= 0 and cnt < 0 then
  364. -- human.db.absAct[id].drum[taskID].cnt = human.db.absAct[id].drum[taskID].cnt - cnt
  365. -- end
  366. local config = AbsActExcel.drum[taskID]
  367. -- ��������
  368. if singleData.cnt >= config.needCnt and singleData.state == 0 then
  369. singleData.state = 1
  370. -- �ж��Ƿ���������
  371. for i = 1,#config.blasting do
  372. local blastingID = config.blasting[i]
  373. local blastingConfig = AbsActExcel.blasting[blastingID]
  374. human.db.absAct[id].blasting[blastingID] = human.db.absAct[id].blasting[blastingID] or {}
  375. human.db.absAct[id].blasting[blastingID].cnt = human.db.absAct[id].blasting[blastingID].cnt or 0
  376. human.db.absAct[id].blasting[blastingID].state = human.db.absAct[id].blasting[blastingID].state or 0
  377. human.db.absAct[id].blasting[blastingID].cnt = human.db.absAct[id].blasting[blastingID].cnt + 1
  378. if human.db.absAct[id].blasting[blastingID].cnt >= 3 and human.db.absAct[id].blasting[blastingID].state ~= 2 then
  379. human.db.absAct[id].blasting[blastingID].state = 1
  380. end
  381. end
  382. end
  383. end
  384. end
  385. if isChange then
  386. YunYingLogic.sendBanner(human)
  387. YunYingLogic.sendGroupUpdate(YYInfo[id], human, absConfig.panelID)
  388. end
  389. end
  390. end
  391. function onLogin(human, id)
  392. specialFunc(human, id)
  393. end
  394. function isRed(human, YYInfo, funcConfig)
  395. local state = AbsActLogic.isStarted(human, funcConfig.funcID)
  396. if not state then return end
  397. local absConfig = AbsActExcel.absActivity[funcConfig.funcID]
  398. local absAct = human.db.absAct[funcConfig.funcID]
  399. if not absAct then return true end
  400. initDB(human,funcConfig.funcID)
  401. for k,v in pairs(absAct.drum) do
  402. if v.state == 1 then
  403. return true
  404. end
  405. end
  406. for k,v in pairs(absAct.blasting) do
  407. if v.state == 1 then
  408. return true
  409. end
  410. end
  411. for k,v in pairs(absAct.box) do
  412. if v == 1 then
  413. return true
  414. end
  415. end
  416. return false
  417. end
  418. -- ������
  419. function buling(human,funcID,conf)
  420. -- ����������Ϊ30��
  421. AbsActLogic.checkAbsActClean(human, funcID)
  422. initDB(human,funcID)
  423. local absConfig = AbsActExcel.absActivity[funcID]
  424. --
  425. local absAct = human.db.absAct[funcID]
  426. if absAct.buling == 1 then
  427. return
  428. end
  429. absAct.buling = 1
  430. local config = AbsActExcel.blastingBox
  431. local len = #config
  432. for i = 1,len do
  433. if config[i].needCnt > absAct.blastingCnt then
  434. absAct.blastingCnt = config[i].needCnt
  435. absAct.box[i] = 1
  436. end
  437. end
  438. getAndSendMsg(human,id,absConfig.actID)
  439. end