WarReportLogic.lua 16 KB

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