WarReportLogic.lua 13 KB

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