DrumBlastingLogic.lua 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  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. -- 延迟加载 AbsActLogic,避免循环依赖
  18. local AbsActLogic = nil
  19. local function getAbsActLogic()
  20. if not AbsActLogic then
  21. AbsActLogic = require("absAct.AbsActLogic")
  22. end
  23. return AbsActLogic
  24. end
  25. local AbsActExcel = require("excel.absAct")
  26. local BuyExcel = require("excel.buy")
  27. local Util = require("common.Util")
  28. local Msg = require("core.Msg")
  29. local Grid = require("bag.Grid")
  30. local BagLogic = require("bag.BagLogic")
  31. local BuyLogic = require("topup.BuyLogic")
  32. local YunYingLogic = require("yunying.YunYingLogic")
  33. local Log = require("common.Log")
  34. function isOpen(human, YYInfo, funcConfig)
  35. local state, endTime, startTime = getAbsActLogic().isStarted(human, funcConfig.funcID)
  36. if not state then return end
  37. local absAct = human.db.absAct[funcConfig.funcID]
  38. if absAct and absAct.dayCnt and absAct.dayCnt <= 0 and #absAct.item <= 0 then
  39. return false
  40. end
  41. return true, endTime, startTime
  42. end
  43. function isActive(human, YYInfo, funcConfig)
  44. return not isOpen(human, YYInfo, funcConfig)
  45. end
  46. -- ��ʼ�����ݿ�
  47. function initDB(human,id)
  48. local absAct = human.db.absAct[id]
  49. absAct.drum = absAct.drum or {}
  50. absAct.blasting = absAct.blasting or {}
  51. absAct.box = absAct.box or {}
  52. absAct.blastingCnt = absAct.blastingCnt or 0
  53. absAct.buling = absAct.buling or 0
  54. end
  55. -- ��������
  56. function getAndSendMsg(human,id,actID)
  57. -- �жϻ�Ƿ���
  58. local state, endTime, starTime = getAbsActLogic().isStarted(human, id)
  59. if not state then return end
  60. local absConfig = AbsActExcel.absActivity[id]
  61. if not absConfig then return end
  62. local absAct = human.db.absAct[id]
  63. if not absAct then
  64. -- Log.write(Log.LOGID_DEBUG, "[DrumBlastingLogic.getAndSendMsg] 活动数据不存在,创建空数据 - 活动ID: "..tostring(id))
  65. human.db.absAct[id] = {}
  66. human.db.absAct[id].finish = endTime
  67. absAct = human.db.absAct[id]
  68. end
  69. -- 检查并重置损坏/过期的数据
  70. if absAct and not absAct.drum then
  71. -- Log.write(Log.LOGID_DEBUG, "[DrumBlastingLogic.getAndSendMsg] 检测到数据不完整,重新初始化 - 活动ID: "..tostring(id))
  72. human.db.absAct[id] = {}
  73. human.db.absAct[id].finish = endTime
  74. absAct = human.db.absAct[id]
  75. end
  76. -- Log.write(Log.LOGID_DEBUG, "[DrumBlastingLogic.getAndSendMsg] 初始化数据 - 玩家: "..tostring(human.db.name)..", 活动ID: "..tostring(id))
  77. initDB(human,id)
  78. local nowDay = Util.diffDay(starTime) + 1
  79. -- ��������
  80. local msgRet = Msg.gc.GC_ABS_ND_TASK_QUERY
  81. -- ������
  82. local taskConfig = AbsActExcel.drum
  83. local len = #taskConfig
  84. local count = 0
  85. msgRet.day = nowDay
  86. BuyLogic.fontBuyItem(human, msgRet.buyItem, AbsActExcel.blastingBox[1].buyID)
  87. for i = 1,len do
  88. local v = taskConfig[i]
  89. if v.day == nowDay then
  90. count = count + 1
  91. local net = msgRet.drumList[count]
  92. net.id = i
  93. net.desc = v.desc
  94. net.name = v.name
  95. net.needCnt = v.needCnt
  96. net.panelID = v.panelID
  97. net.nowCnt = absAct.drum[i] and absAct.drum[i].cnt or 0
  98. net.state = absAct.drum[i] and absAct.drum[i].state or 0
  99. for j = 1,#v.item do
  100. Grid.makeItem(net.item[j],v.item[j][1],v.item[j][2])
  101. end
  102. net.item[0] = #v.item
  103. end
  104. end
  105. msgRet.drumList[0] = count
  106. -- ������
  107. taskConfig = AbsActExcel.blasting
  108. len = #taskConfig
  109. for i = 1,len do
  110. local v = taskConfig[i]
  111. local net = msgRet.blastingList[i]
  112. net.id = i
  113. net.desc = v.desc
  114. net.name = v.name
  115. net.needCnt = v.needCnt
  116. net.nowCnt = absAct.blasting[i] and absAct.blasting[i].cnt or 0
  117. net.state = absAct.blasting[i] and absAct.blasting[i].state or 0
  118. local itemLen = type(v.item[nowDay]) == "table" and #v.item[nowDay] or 0
  119. for j = 1,itemLen do
  120. Grid.makeItem(net.item[j],v.item[nowDay][j][1],v.item[nowDay][j][2])
  121. end
  122. net.item[0] = itemLen --#v.item[nowDay]
  123. net.panelID = v.panelID or 0
  124. end
  125. msgRet.blastingList[0] = len
  126. -- ��������
  127. taskConfig = AbsActExcel.blastingBox
  128. len = #taskConfig
  129. for i = 1,len do
  130. local v = taskConfig[i]
  131. local net = msgRet.boxList[i]
  132. net.id = i
  133. net.needCnt = v.needCnt
  134. net.state = absAct.box[i] or 0
  135. for j = 1,#v.item do
  136. Grid.makeItem(net.item[j],v.item[j][1],v.item[j][2])
  137. end
  138. net.item[0] = #v.item
  139. end
  140. msgRet.boxList[0] = len
  141. msgRet.blastingCnt = absAct.blastingCnt
  142. Msg.send(msgRet,human.fd)
  143. end
  144. -- ��ȡ��Ʒ
  145. -- type 1��,2��,3��
  146. function get(human,index,itemType,id)
  147. -- �жϻ�Ƿ���
  148. local state, endTime, starTime = getAbsActLogic().isStarted(human, id)
  149. if not state then return end
  150. local absConfig = AbsActExcel.absActivity[id]
  151. if not absConfig then return end
  152. local absAct = human.db.absAct[id]
  153. if not absAct then
  154. return
  155. end
  156. initDB(human,id)
  157. local nowDay = Util.diffDay(starTime) + 1
  158. local allItems = {} -- ����������ȡʱ�ռ����н���
  159. -- ���indexΪ0��nil����������ȡ��type�����п���ȡ�Ľ���
  160. if index then
  161. local hasReward = false
  162. if itemType == 1 then
  163. -- �������񣺱�������drum������ȡ״̬Ϊ1��
  164. local taskConfig = AbsActExcel.drum
  165. for i = 1, #taskConfig do
  166. local v = taskConfig[i]
  167. if v.day == nowDay then
  168. -- ȷ�����ݽṹ����
  169. absAct.drum[i] = absAct.drum[i] or {}
  170. local taskState = absAct.drum[i].state or 0
  171. if taskState == 1 then
  172. hasReward = true
  173. -- �ռ�����
  174. for j = 1, #v.item do
  175. table.insert(allItems, v.item[j])
  176. end
  177. -- ����״̬
  178. absAct.drum[i].state = 2
  179. end
  180. end
  181. end
  182. elseif itemType == 2 then
  183. -- ���ڽ�������������blasting����ȡ״̬Ϊ1��
  184. local taskConfig = AbsActExcel.blasting
  185. for i = 1, #taskConfig do
  186. local v = taskConfig[i]
  187. -- ȷ�����ݽṹ����
  188. absAct.blasting[i] = absAct.blasting[i] or {}
  189. local blastingState = absAct.blasting[i].state or 0
  190. if blastingState == 1 then
  191. hasReward = true
  192. -- �ռ�����
  193. local itemLen = type(v.item[nowDay]) == "table" and #v.item[nowDay] or 0
  194. for j = 1, itemLen do
  195. table.insert(allItems, v.item[nowDay][j])
  196. end
  197. -- ����״̬
  198. absAct.blasting[i].state = 2
  199. -- ����һ�Σ��ۼƷ��ڴ������ж��Ƿ�ﵽ���Ƚ�����ȡֵ
  200. absAct.blastingCnt = (absAct.blastingCnt or 0) + 1
  201. for j = 1, #AbsActExcel.blastingBox do
  202. if absAct.blastingCnt - 1 < AbsActExcel.blastingBox[j].needCnt and absAct.blastingCnt == AbsActExcel.blastingBox[j].needCnt then
  203. absAct.box[j] = 1
  204. break
  205. end
  206. end
  207. end
  208. end
  209. elseif itemType == 3 then
  210. -- ���Ƚ�������������box����ȡ״̬Ϊ1��
  211. local taskConfig = AbsActExcel.blastingBox
  212. for i = 1, #taskConfig do
  213. local v = taskConfig[i]
  214. local boxState = absAct.box[i] or 0
  215. if boxState == 1 then
  216. hasReward = true
  217. -- �ռ�����
  218. for j = 1, #v.item do
  219. table.insert(allItems, v.item[j])
  220. end
  221. -- ����״̬
  222. absAct.box[i] = 2
  223. end
  224. end
  225. end
  226. -- ����н������򷢷�
  227. if hasReward and #allItems > 0 then
  228. BagLogic.addItemList(human, allItems, "abs_drumblasting")
  229. getAndSendMsg(human, id, absConfig.actID)
  230. YunYingLogic.sendBanner(human)
  231. YunYingLogic.sendGroupUpdate(YYInfo[id], human, absConfig.panelID)
  232. end
  233. return
  234. end
  235. -- ԭ���߼���������ȡ
  236. local item = nil
  237. -- ѡ���Ӧ����?
  238. local config = nil
  239. local state = nil
  240. if itemType == 1 then
  241. config = AbsActExcel.drum[index]
  242. state = absAct.drum[index] and absAct.drum[index].state or 0
  243. elseif itemType == 2 then
  244. config = AbsActExcel.blasting[index]
  245. state = absAct.blasting[index] and absAct.blasting[index].state or 0
  246. elseif itemType == 3 then
  247. config = AbsActExcel.blastingBox[index]
  248. state = absAct.box[index] or 0
  249. end
  250. -- �����������?
  251. if not config then
  252. return
  253. end
  254. -- ״̬��Ϊ����ȡ
  255. if state ~= 1 then
  256. return
  257. end
  258. -- �ı�״̬
  259. if itemType == 1 then
  260. item = config.item
  261. absAct.drum[index].state = 2
  262. elseif itemType == 2 then
  263. item = config.item[nowDay]
  264. absAct.blasting[index].state = 2
  265. -- ����һ��,�����ۼƴ��������ж��Ƿ�ﵽ������ȡ���?
  266. absAct.blastingCnt = absAct.blastingCnt + 1
  267. for i = 1,#AbsActExcel.blastingBox do
  268. if absAct.blastingCnt - 1 < AbsActExcel.blastingBox[i].needCnt and absAct.blastingCnt == AbsActExcel.blastingBox[i].needCnt then
  269. absAct.box[i] = 1
  270. break
  271. end
  272. end
  273. elseif itemType == 3 then
  274. item = config.item
  275. absAct.box[index] = 2
  276. else
  277. return
  278. end
  279. BagLogic.addItemList(human, item, "abs_drumblasting")
  280. getAndSendMsg(human,id,absConfig.actID)
  281. YunYingLogic.sendBanner(human)
  282. YunYingLogic.sendGroupUpdate(YYInfo[id], human, absConfig.panelID)
  283. end
  284. -- ÿ�������Ծ��?
  285. function onDailyTask(human,funcID, parameter)
  286. drumTaskCallBack(human,funcID,1,parameter)
  287. end
  288. -- �ٻ�
  289. function onDrawCard(human,funcID, parameter)
  290. drumTaskCallBack(human,funcID,2,parameter)
  291. end
  292. -- ��ħ֮��
  293. function onHuangjingTower(human,funcID, parameter)
  294. drumTaskCallBack(human,funcID,3,parameter)
  295. end
  296. -- ��ֵ
  297. function onCharge(human, parameter,funcID)
  298. -- 临时处理
  299. drumTaskCallBack(human,funcID,4,parameter)
  300. end
  301. -- ��������
  302. function onDrill(human,funcID, parameter)
  303. drumTaskCallBack(human,funcID,5,parameter)
  304. end
  305. -- Ů��ɭ��
  306. function onCopyChallenge(human,funcID, parameter)
  307. drumTaskCallBack(human,funcID,6,parameter)
  308. end
  309. -- �ھ�����
  310. function onJjcFight(human,funcID, parameter)
  311. drumTaskCallBack(human,funcID,7,parameter)
  312. end
  313. -- ����̵깺��?
  314. function onShopBuy(human,funcID,parameter)
  315. drumTaskCallBack(human,funcID,8,parameter)
  316. end
  317. -- ð��ɨ��
  318. function onMopup(human,funcID,parameter)
  319. drumTaskCallBack(human,funcID,9,parameter)
  320. end
  321. -- ������Ѩ
  322. function onBinglong(human,funcID,parameter)
  323. drumTaskCallBack(human,funcID,10,parameter)
  324. end
  325. -- ���?
  326. function onExchangeJinbi(human,funcID,parameter)
  327. drumTaskCallBack(human,funcID,11,parameter)
  328. end
  329. -- ����
  330. function onBarTaskgetDo(human,funcID,parameter)
  331. drumTaskCallBack(human,funcID,12,parameter)
  332. end
  333. -- ����
  334. function onUnionDonate(human,funcID,parameter)
  335. drumTaskCallBack(human,funcID,13,parameter)
  336. end
  337. -- ���ḱ��
  338. function onUnionEctypeFight(human,funcID,parameter)
  339. drumTaskCallBack(human,funcID,14,parameter)
  340. end
  341. -- ռ��
  342. function onZhanBuBuyCard(human,funcID,parameter)
  343. -- ZhanbuLogic.lua 436�? 传的数值为�?, 不知道哪�?监听该事件的地方需要数值为负,所以只处理当前模块
  344. if parameter < 0 then
  345. return
  346. end
  347. drumTaskCallBack(human,funcID,15,parameter)
  348. end
  349. -- ������ʯ
  350. function onDecZuanshi(human,funcID,parameter)
  351. drumTaskCallBack(human,funcID,16,parameter)
  352. end
  353. -- ������Ԩ
  354. function onLianyu(human,funcID,parameter)
  355. drumTaskCallBack(human,funcID,17,parameter)
  356. end
  357. -- �ϳɷ���
  358. function onFuwenHecheng(human,funcID,parameter)
  359. drumTaskCallBack(human,funcID,18,parameter)
  360. end
  361. -- �ص�
  362. function drumTaskCallBack(human,id,type,cnt)
  363. getAbsActLogic().checkAbsActClean(human, id)
  364. local state, endTime, starTime = getAbsActLogic().isStarted(human, id)
  365. -- 活動�?開啓
  366. if not state or os.time() > endTime then
  367. return
  368. end
  369. local absConfig = AbsActExcel.absActivity[id]
  370. if not absConfig then return end
  371. local absActData = human.db.absAct[id]
  372. if not absActData then
  373. return
  374. end
  375. initDB(human,id)
  376. local nowDay = Util.diffDay(starTime) + 1
  377. -- ������������������
  378. local taskConfig = AbsActExcel.drum
  379. for k = 1,#taskConfig do
  380. if taskConfig[k].type == type and taskConfig[k].day == nowDay then
  381. local taskID = k
  382. human.db.absAct[id].drum[taskID] = human.db.absAct[id].drum[taskID] or {}
  383. human.db.absAct[id].drum[taskID].cnt = human.db.absAct[id].drum[taskID].cnt or 0
  384. human.db.absAct[id].drum[taskID].state = human.db.absAct[id].drum[taskID].state or 0
  385. human.db.absAct[id].drum[taskID].cnt = human.db.absAct[id].drum[taskID].cnt + cnt
  386. if human.db.absAct[id].drum[taskID].state ~= 0 and cnt < 0 then
  387. human.db.absAct[id].drum[taskID].cnt = human.db.absAct[id].drum[taskID].cnt - cnt
  388. end
  389. local config = AbsActExcel.drum[taskID]
  390. -- ��������
  391. if human.db.absAct[id].drum[taskID].cnt >= config.needCnt and human.db.absAct[id].drum[taskID].state == 0 then
  392. human.db.absAct[id].drum[taskID].state = 1
  393. -- �ж��Ƿ���������
  394. for i = 1,#config.blasting do
  395. local blastingID = config.blasting[i]
  396. local blastingConfig = AbsActExcel.blasting[blastingID]
  397. human.db.absAct[id].blasting[blastingID] = human.db.absAct[id].blasting[blastingID] or {}
  398. human.db.absAct[id].blasting[blastingID].cnt = human.db.absAct[id].blasting[blastingID].cnt or 0
  399. human.db.absAct[id].blasting[blastingID].state = human.db.absAct[id].blasting[blastingID].state or 0
  400. human.db.absAct[id].blasting[blastingID].cnt = human.db.absAct[id].blasting[blastingID].cnt + 1
  401. if human.db.absAct[id].blasting[blastingID].cnt >= 3 and human.db.absAct[id].blasting[blastingID].state ~= 2 then
  402. human.db.absAct[id].blasting[blastingID].state = 1
  403. end
  404. end
  405. end
  406. end
  407. end
  408. YunYingLogic.sendBanner(human)
  409. YunYingLogic.sendGroupUpdate(YYInfo[id], human, absConfig.panelID)
  410. end
  411. -- ÿ�����ùģ���״̬
  412. function updateDaily(human,id)
  413. local state, endTime, starTime = getAbsActLogic().isStarted(human, id)
  414. if not state then return end
  415. local config = AbsActExcel.absActivity[id]
  416. if not config then return end
  417. getAbsActLogic().checkAbsActClean(human, id)
  418. local absAct = human.db.absAct[id] or {}
  419. absAct.drum = {}
  420. absAct.blasting = {}
  421. absAct.box = absAct.box or {}
  422. absAct.blastingCnt = absAct.blastingCnt or 0
  423. human.db.absAct[id] = absAct
  424. end
  425. -- 因为玩�?�在活动�?开�?前完成了活跃度任务,活动开�?后没法完成活跃度任务,所以在玩�?�上线时,做一次更新活跃度数据操作
  426. function specialFunc(human, id)
  427. getAbsActLogic().checkAbsActClean(human, id)
  428. local state, endTime, starTime = getAbsActLogic().isStarted(human, id)
  429. -- 活動�?開啓
  430. if not state or os.time() > endTime then
  431. return
  432. end
  433. local absConfig = AbsActExcel.absActivity[id]
  434. if not absConfig then return end
  435. local absActData = human.db.absAct[id]
  436. if not absActData then
  437. return
  438. end
  439. initDB(human,id)
  440. local nowHuoYue = human.db.dailyTask and human.db.dailyTask.nowHuoYue or 0
  441. if nowHuoYue > 0 then
  442. local nowDay = Util.diffDay(starTime) + 1
  443. local actType = 1
  444. -- ������������������
  445. local singleData
  446. local isChange = false
  447. local taskConfig = AbsActExcel.drum
  448. for k = 1,#taskConfig do
  449. if taskConfig[k].type == actType and taskConfig[k].day == nowDay then
  450. local taskID = k
  451. human.db.absAct[id].drum[taskID] = human.db.absAct[id].drum[taskID] or {}
  452. singleData = human.db.absAct[id].drum[taskID]
  453. singleData.cnt = singleData.cnt or 0
  454. singleData.state = singleData.state or 0
  455. if singleData.cnt > 0 then
  456. break
  457. end
  458. singleData.cnt = nowHuoYue
  459. isChange = true
  460. -- if human.db.absAct[id].drum[taskID].state ~= 0 and cnt < 0 then
  461. -- human.db.absAct[id].drum[taskID].cnt = human.db.absAct[id].drum[taskID].cnt - cnt
  462. -- end
  463. local config = AbsActExcel.drum[taskID]
  464. -- ��������
  465. if singleData.cnt >= config.needCnt and singleData.state == 0 then
  466. singleData.state = 1
  467. -- �ж��Ƿ���������
  468. for i = 1,#config.blasting do
  469. local blastingID = config.blasting[i]
  470. local blastingConfig = AbsActExcel.blasting[blastingID]
  471. human.db.absAct[id].blasting[blastingID] = human.db.absAct[id].blasting[blastingID] or {}
  472. human.db.absAct[id].blasting[blastingID].cnt = human.db.absAct[id].blasting[blastingID].cnt or 0
  473. human.db.absAct[id].blasting[blastingID].state = human.db.absAct[id].blasting[blastingID].state or 0
  474. human.db.absAct[id].blasting[blastingID].cnt = human.db.absAct[id].blasting[blastingID].cnt + 1
  475. if human.db.absAct[id].blasting[blastingID].cnt >= 3 and human.db.absAct[id].blasting[blastingID].state ~= 2 then
  476. human.db.absAct[id].blasting[blastingID].state = 1
  477. end
  478. end
  479. end
  480. end
  481. end
  482. if isChange then
  483. YunYingLogic.sendBanner(human)
  484. YunYingLogic.sendGroupUpdate(YYInfo[id], human, absConfig.panelID)
  485. end
  486. end
  487. end
  488. function onLogin(human, id)
  489. specialFunc(human, id)
  490. end
  491. function isRed(human, YYInfo, funcConfig)
  492. local state = getAbsActLogic().isStarted(human, funcConfig.funcID)
  493. if not state then return end
  494. local absConfig = AbsActExcel.absActivity[funcConfig.funcID]
  495. local absAct = human.db.absAct[funcConfig.funcID]
  496. if not absAct then return true end
  497. initDB(human,funcConfig.funcID)
  498. for k,v in pairs(absAct.drum) do
  499. if v.state == 1 then
  500. return true
  501. end
  502. end
  503. for k,v in pairs(absAct.blasting) do
  504. if v.state == 1 then
  505. return true
  506. end
  507. end
  508. for k,v in pairs(absAct.box) do
  509. if v == 1 then
  510. return true
  511. end
  512. end
  513. return false
  514. end
  515. -- ������
  516. function buling(human,funcID,conf)
  517. -- ����������Ϊ30��
  518. getAbsActLogic().checkAbsActClean(human, funcID)
  519. initDB(human,funcID)
  520. local absConfig = AbsActExcel.absActivity[funcID]
  521. --
  522. local absAct = human.db.absAct[funcID]
  523. if absAct.buling == 1 then
  524. return
  525. end
  526. absAct.buling = 1
  527. local config = AbsActExcel.blastingBox
  528. local len = #config
  529. for i = 1,len do
  530. if config[i].needCnt > absAct.blastingCnt then
  531. absAct.blastingCnt = config[i].needCnt
  532. absAct.box[i] = 1
  533. end
  534. end
  535. getAndSendMsg(human,id,absConfig.actID)
  536. end