WarReportLogic.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. -------------------------------------------------------
  2. -- 战报
  3. --
  4. -------------------------------------------------------
  5. local LuaMongo = _G.lua_mongo
  6. local Util = require("common.Util")
  7. local Lang = require("common.Lang")
  8. local Msg = require("core.Msg")
  9. local ObjHuman = require("core.ObjHuman")
  10. local Grid = require("bag.Grid")
  11. local BagLogic = require("bag.BagLogic")
  12. local Broadcast = require("broadcast.Broadcast")
  13. local HeroLogic = require("hero.HeroLogic")
  14. local RoleLogic = require("role.RoleLogic")
  15. local CombatDefine = require("combat.CombatDefine")
  16. local HeroGrid = require("hero.HeroGrid")
  17. local CombatExcel = require("excel.combat").combat
  18. local CombatLogic = require("combat.CombatLogic")
  19. local InnerMsg = require("core.InnerMsg")
  20. local ChatHandler = require("chat.Handler")
  21. local Broadcast = require("broadcast.Broadcast")
  22. local Json = require("common.Json")
  23. local DB = require("common.DB")
  24. local ChatLogic = require("chat.ChatLogic")
  25. local WarReportMiddle = require("warReport.WarReportMiddle")
  26. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  27. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  28. local ItemDefine = require("bag.ItemDefine")
  29. local HeroGrowUp = require("absAct.HeroGrowUp")
  30. local Config = require("Config")
  31. WAR_REPORT_1 = 1 -- 冠军联赛
  32. WAR_REPORT_2 = 2 -- 王者争霸
  33. WAR_REPORT_3 = 3 -- 天梯
  34. WAR_REPORT_4 = 4 -- 切磋
  35. WAR_COUNT_MAX = 30
  36. WAR_COUNT_MAX1 = 20
  37. WAR_JJC_RANK = 20
  38. WAR_FRIEND_RANK = 30
  39. WAR_ADMIRE = 3 -- 点赞次数
  40. WAR_COMBATINFO_PLAYBACK = 1 -- 请求战斗数据用于回方
  41. WAR_COMBATINFO_HARM = 2 -- 请求战斗数据用于伤害列表
  42. WAR_OP_CONFIRM = 1 --确认
  43. WAR_OP_CANCEL = 0 --取消
  44. WAP_OP_TYPE1 = 1 --点赞
  45. WAP_OP_TYPE2 = 2 --收藏
  46. WAP_REWARD_GOD = 3000
  47. local war_report_count = {
  48. [WAR_REPORT_1] = 1,
  49. [WAR_REPORT_2] = 1,
  50. [WAR_REPORT_3] = 1,
  51. [WAR_REPORT_4] = 1,
  52. }
  53. local function makeReportNet(net, war_data)
  54. net.atkRole = war_data.combatInfo.attacker
  55. net.defRole = war_data.combatInfo.defender
  56. net.atkHeros = {}
  57. net.defHeros = {}
  58. net.time = war_data.time
  59. net.type = war_data.type
  60. net.admire = war_data.admire or 0
  61. net.collect = war_data.collect or 0
  62. net.atkRank = war_data.atkRank or 0
  63. net.defRank = war_data.defRank or 0
  64. net.id = war_data._id
  65. net.type = war_data.type
  66. net.admireList = war_data.admireList
  67. local combatInfo = war_data.combatInfo
  68. local result = combatInfo.result
  69. local frameCnt = result.frames and #result.frames or 0
  70. local lastFrame = result.frames and result.frames[frameCnt] or nil
  71. net.result = combatInfo.isWin and 1 or 2
  72. net.round = lastFrame and lastFrame.round or 0
  73. net.roundMax = combatInfo.maxRound
  74. for i = 1,CombatDefine.COMBAT_HERO_CNT do
  75. local atkPos = CombatLogic.getPos(CombatDefine.ATTACK_SIDE, i)
  76. local atkObj = combatInfo.objList[atkPos]
  77. net.atkHeros[i] = {}
  78. if atkObj then
  79. net.atkHeros[i].id = atkObj.id
  80. net.atkHeros[i].lv = atkObj.lv
  81. net.atkHeros[i].star = atkObj.star
  82. else
  83. net.atkHeros[i].id = 0
  84. end
  85. local defPos = CombatLogic.getPos(CombatDefine.DEFEND_SIDE, i)
  86. local defObj = combatInfo.objList[defPos]
  87. net.defHeros[i] = {}
  88. if defObj then
  89. net.defHeros[i].id = defObj.id
  90. net.defHeros[i].lv = defObj.lv
  91. net.defHeros[i].star = defObj.star
  92. else
  93. net.defHeros[i].id = 0
  94. end
  95. end
  96. net.atkFormation = combatInfo.atkFormation
  97. net.defFormation = combatInfo.defFormation
  98. end
  99. function initAfterStart()
  100. -- ���������
  101. if _G.is_middle ~= true then
  102. --return
  103. end
  104. -- ���Ӽ�¼����
  105. local war_count_data = {}
  106. local war_count_query = { war = 1 }
  107. LuaMongo.find(DB.db_war_report, war_count_query)
  108. if LuaMongo.next(war_count_data) then
  109. return
  110. end
  111. local warReport = {}
  112. warReport.war = 1
  113. warReport.war_report_count = war_report_count
  114. LuaMongo.insert(DB.db_war_report, warReport)
  115. end
  116. -- db_war_report
  117. -- ���Ӽ�¼ ���м�¼�����ķ�
  118. function add(type, combatInfo, atkRank, defRank)
  119. -- �Ż�֡���� ����
  120. CombatLogic.killFrames(combatInfo)
  121. if not _G.is_middle then
  122. WarReportMiddle.LW_WARREPORT_ADD(type, combatInfo, atkRank, defRank)
  123. return
  124. end
  125. local msgInner = InnerMsg.lw.LW_WARREPORT_ADD
  126. msgInner.type = type
  127. msgInner.combatInfo = combatInfo
  128. msgInner.atkRank = atkRank
  129. msgInner.defRank = defRank
  130. InnerMsg.sendMsg(0, msgInner)
  131. end
  132. -- ��ѯ
  133. function query(human, type, questType)
  134. if RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_202) ~= true then
  135. return
  136. end
  137. -- �������������ķ� ���� �����ղ� ��ȥ���ķ�������
  138. --[[local msgInner = InnerMsg.lw.LW_WARREPORT_QUERY
  139. local msgInner = {}
  140. msgInner.uuid = human.db._id
  141. msgInner.type = type
  142. msgInner.questType = questType
  143. msgInner.warReport = human.db.warReport
  144. InnerMsg.sendMsg(0, msgInner)]]
  145. WarReportMiddle.LW_WARREPORT_QUERY(0,type,human.db._id,human.db.warReport,questType)
  146. human.db.warDot = nil
  147. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_202)
  148. end
  149. -- ���ս���б�
  150. local makeReportQuery = {war_index = { ["$exists"] = 1}}
  151. function makeReport(type)
  152. local len = 0
  153. makeReportQuery.type = type
  154. LuaMongo.find(DB.db_war_report, makeReportQuery)
  155. local war_data_list = {}
  156. while true do
  157. local war_data = {}
  158. if not LuaMongo.next(war_data) then
  159. break
  160. end
  161. if len >= WAR_COUNT_MAX then
  162. break
  163. end
  164. len = len + 1
  165. war_data_list[len] = {}
  166. local net = war_data_list[len]
  167. makeReportNet(net, war_data)
  168. end
  169. return war_data_list
  170. end
  171. -- ����ղ�
  172. local makeCollectReportQuery = {_id = nil}
  173. function makeCollectReport(collect)
  174. local war_data_list = {}
  175. local len = 0
  176. for _, list in pairs(collect) do
  177. for _id , v in pairs(list) do
  178. makeCollectReportQuery._id = _id
  179. LuaMongo.find(DB.db_war_report, makeCollectReportQuery)
  180. local war_data = {}
  181. if LuaMongo.next(war_data) then
  182. if len >= WAR_COUNT_MAX then
  183. break
  184. end
  185. len = len + 1
  186. war_data_list[len] = {}
  187. local net = war_data_list[len]
  188. makeReportNet(net, war_data)
  189. end
  190. end
  191. end
  192. return war_data_list
  193. end
  194. -- ����ҵ�ս��
  195. local makeMyReportQuery = {}
  196. function makeMyReport(uuid)
  197. local len = 0
  198. makeMyReportQuery = {["$or"] = {{defUuid=uuid}, {atkUuid=uuid}}}
  199. LuaMongo.find(DB.db_war_report, makeMyReportQuery)
  200. local war_data_list = {}
  201. while true do
  202. local war_data = {}
  203. if not LuaMongo.next(war_data) then
  204. break
  205. end
  206. if len >= WAR_COUNT_MAX then
  207. break
  208. end
  209. len = len + 1
  210. war_data_list[len] = {}
  211. local net = war_data_list[len]
  212. makeReportNet(net, war_data)
  213. end
  214. return war_data_list
  215. end
  216. -- ����ս���б�
  217. local heroOther = {}
  218. function sendReport(human, war_data_list, questType)
  219. local len = #war_data_list
  220. local msgRet = Msg.gc.GC_WAR_REPORT_QUERY
  221. msgRet.admireCnt = human.db.warAdmire or 0
  222. msgRet.admireMax = WAR_ADMIRE
  223. msgRet.questType = questType
  224. msgRet.isEnd = 0
  225. local sendLen = 0
  226. -- ˢ���ղ�
  227. if questType == WAP_OP_TYPE2 then
  228. human.db.warReport = {}
  229. end
  230. local warReport = human.db.warReport
  231. for i = 1, len do
  232. sendLen = sendLen + 1
  233. local net = msgRet.warReportList[sendLen]
  234. local war = war_data_list[i]
  235. local heroLen = 0
  236. net.round = war.round
  237. net.roundMax = war.roundMax
  238. net.atkFormation = war.atkFormation
  239. net.defFormation = war.defFormation or 0
  240. net.time = war.time
  241. net.admire = war.admire
  242. net.collect = war.collect
  243. net.atkRank = war.atkRank
  244. net.defRank = war.defRank
  245. RoleLogic.makeRoleBase(war.atkRole, net.atkRole)
  246. RoleLogic.makeRoleBase(war.defRole, net.defRole)
  247. net.result = war.result
  248. net.type = war.type
  249. net.id = war.id
  250. net.isCollect = 0
  251. net.isAdmire = 0
  252. -- �����ղ��б�
  253. if questType == WAP_OP_TYPE2 then
  254. warReport[net.type] = warReport[net.type] or {}
  255. warReport[net.type][net.id] = 1
  256. end
  257. -- �Ƿ��ѵ���
  258. if war.admireList and war.admireList[human.db._id] then
  259. net.isAdmire = 1
  260. end
  261. -- �Ƿ����ղ�
  262. for _, list in pairs(warReport) do
  263. if list[net.id] then
  264. net.isCollect = 1
  265. break
  266. end
  267. end
  268. heroLen = 0
  269. for k, v in pairs(war.atkHeros) do
  270. if v.id ~= 0 then
  271. heroLen = heroLen + 1
  272. heroOther.lv = v.lv or 0
  273. heroOther.star = v.star or 0
  274. HeroGrid.makeHeroOrMonster(net.atkHeros[heroLen], v.id, nil, heroOther)
  275. end
  276. end
  277. net.atkHeros[0] = heroLen
  278. heroLen = 0
  279. for k, v in pairs(war.defHeros) do
  280. if v.id ~= 0 then
  281. heroLen = heroLen + 1
  282. heroOther.lv = v.lv or 0
  283. heroOther.star = v.star or 0
  284. HeroGrid.makeHeroOrMonster(net.defHeros[heroLen], v.id, nil, heroOther)
  285. end
  286. end
  287. net.defHeros[0] = heroLen
  288. msgRet.isEnd = 0
  289. if sendLen >= 5 then
  290. msgRet.warReportList[0] = sendLen
  291. Msg.send(msgRet, human.fd)
  292. sendLen = 0
  293. end
  294. end
  295. msgRet.warReportList[0] = sendLen
  296. msgRet.isEnd = 1
  297. Msg.send(msgRet, human.fd)
  298. end
  299. -- �˺���¼
  300. function harm(human, type, id)
  301. -- �������������ķ�
  302. local msgInner = {} --InnerMsg.lw.LW_WARREPORT_GET_COMBATINFO
  303. msgInner.uuid = human.db._id
  304. msgInner.type = type
  305. msgInner.id = id
  306. msgInner.mode = WAR_COMBATINFO_HARM
  307. --InnerMsg.sendMsg(0, msgInner)
  308. WarReportMiddle.LW_WARREPORT_GET_COMBATINFO(0,msgInner)
  309. end
  310. -- ս�����
  311. function sendFinish(human, combatInfo)
  312. if not combatInfo then return end
  313. local msgRet = Msg.gc.GC_WAR_REPROT_HARM
  314. if not CombatLogic.fontCombatFinish(msgRet.data, combatInfo) then
  315. return
  316. end
  317. Msg.send(msgRet,human.fd)
  318. end
  319. -- 回放
  320. function playBack(human, type, id, nDesServerID)
  321. print("[playBack] type = "..type.. " id = "..id.." nDesServerID = "..nDesServerID)
  322. -- 本服
  323. if -1 >= nDesServerID then
  324. local msgInner = {} --InnerMsg.lw.LW_WARREPORT_GET_COMBATINFO
  325. msgInner.uuid = human.db._id
  326. msgInner.type = type
  327. msgInner.id = id
  328. msgInner.mode = WAR_COMBATINFO_PLAYBACK
  329. --InnerMsg.sendMsg(0, msgInner)
  330. WarReportMiddle.LW_WARREPORT_GET_COMBATINFO(0,msgInner)
  331. else
  332. -- 天梯赛请求中心服
  333. local tMsgData = InnerMsg.lw.LW_WARREPORT_GET_COMBATINFO
  334. tMsgData.nSrcUID = human.db._id
  335. tMsgData.type = type
  336. tMsgData.id = id
  337. tMsgData.nSrcServerID = Config.SVR_INDEX
  338. tMsgData.nDesServerID = nDesServerID
  339. tMsgData.mode = WAR_COMBATINFO_PLAYBACK
  340. InnerMsg.sendMsg(0, tMsgData)
  341. end
  342. end
  343. -- 操作结果
  344. function opResult(human, opType, id, result)
  345. local msgRet = Msg.gc.GC_WAR_REPORT_OP_RESULT
  346. msgRet.opType = opType
  347. msgRet.result = result
  348. msgRet.id = id
  349. Msg.send(msgRet,human.fd)
  350. end
  351. -- �ղ�
  352. function collect(human, type, id, op)
  353. if op ~= WAR_OP_CONFIRM and op ~= WAR_OP_CANCEL then
  354. return
  355. end
  356. local warReport = human.db.warReport
  357. if op == WAR_OP_CONFIRM then
  358. -- �Ѿ����ղ��б�
  359. if warReport[type] and warReport[type][id] then
  360. return
  361. end
  362. -- �ղ�����
  363. local collectCnt = 0
  364. for k, v in pairs(warReport) do
  365. for _, data in pairs(v) do
  366. collectCnt = collectCnt + 1
  367. end
  368. end
  369. if collectCnt >= WAR_COUNT_MAX1 then
  370. return Broadcast.sendErr(human, Lang.WAR_REPORT_COLLECT_CNT_ERR)
  371. end
  372. elseif op == WAR_OP_CANCEL then
  373. if not warReport[type] or not warReport[type][id] then
  374. return
  375. end
  376. end
  377. local msgInner = {} --InnerMsg.lw.LW_WARREPORT_COLLECT
  378. msgInner.uuid = human.db._id
  379. msgInner.type = type
  380. msgInner.id = id
  381. msgInner.op = op
  382. --InnerMsg.sendMsg(0, msgInner)
  383. WarReportMiddle.LW_WARREPORT_COLLECT(0,msgInner)
  384. end
  385. -- �ղػ���
  386. function collectHumanDo(human, type, id, op)
  387. if op ~= WAR_OP_CONFIRM and op ~= WAR_OP_CANCEL then
  388. return
  389. end
  390. local warReport = human.db.warReport
  391. warReport[type] = warReport[type] or {}
  392. if op == WAR_OP_CONFIRM then
  393. warReport[type][id] = 1
  394. elseif op == WAR_OP_CANCEL then
  395. warReport[type][id] = nil
  396. end
  397. opResult(human, WAP_OP_TYPE2, id, op)
  398. end
  399. -- ����
  400. function admire(human, type, id)
  401. if human.db.warAdmire == nil then
  402. return Broadcast.sendErr(human, Lang.WAR_REPORT_ADMIRE_NOT_ENOUGH)
  403. end
  404. human.db.warAdmire = human.db.warAdmire - 1
  405. if human.db.warAdmire <= 0 then
  406. human.db.warAdmire = nil
  407. end
  408. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE6, 1)
  409. local msgInner = {} --InnerMsg.lw.LW_WARREPORT_ADMIRE
  410. msgInner.uuid = human.db._id
  411. msgInner.id = id
  412. --InnerMsg.sendMsg(0, msgInner)
  413. WarReportMiddle.LW_WARREPORT_ADMIRE(0,msgInner)
  414. end
  415. -- ���޻���
  416. function admireDo(human, id)
  417. BagLogic.cleanMomentItemList()
  418. BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, ItemDefine.ITEM_JINBI_ID, WAP_REWARD_GOD)
  419. BagLogic.addMomentItemList(human, "war_report")
  420. opResult(human, WAP_OP_TYPE1, id, WAR_OP_CONFIRM)
  421. end
  422. --
  423. function updateDaily(human)
  424. human.db.warAdmire = human.db.warAdmire or WAR_ADMIRE
  425. human.db.warDot = true
  426. end
  427. function isDot(human)
  428. return human.db.warDot
  429. end