AreaBattleNS.lua 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. -- 战区争霸(普通服)
  2. local Config = require("Config")
  3. local Msg = require("core.Msg")
  4. local Lang = require("common.Lang")
  5. local ObjHuman = require("core.ObjHuman")
  6. local Broadcast = require("broadcast.Broadcast")
  7. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  8. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  9. local CombatDefine = require("combat.CombatDefine")
  10. local RoleDBLogic = require("role.RoleDBLogic")
  11. local CombatPosLogic = require("combat.CombatPosLogic")
  12. local CombatLogic = require("combat.CombatLogic")
  13. local MailExcel = require("excel.mail")
  14. local Util = require("common.Util")
  15. local InnerMsg = require("core.InnerMsg")
  16. local RoleHeadLogic = require("role.RoleHeadLogic")
  17. local MailManager = require("mail.MailManager")
  18. local AreaBattleConfig = require("excel.areaBattle").reward
  19. local HeroExcel = require("excel.hero")
  20. local Log = require("common.Log")
  21. local Timer = require("core.Timer")
  22. local CommonDB = require("common.CommonDB")
  23. local RoleSystemExcel = require("excel.roleSystem")
  24. local Grid = require("bag.Grid")
  25. local BillboardLogic = require("billboard.BillboardLogic")
  26. local BillboardDefine = require("billboard.BillboardDefine")
  27. local AreaBattleDefine = require("areaBattle.AreaBattleDefine")
  28. local mailQueue = {
  29. uuidArray = {},
  30. insertMaxNum = 100, -- 一次最多插入数据库的邮件数量
  31. repeatMaxTimes = 3, -- 第一次失败后重试次数
  32. repeatTb = {}
  33. }
  34. -- 检查是否开启
  35. local function openCheck()
  36. local wDay = Util.getWeekDay()
  37. if not table.find(AreaBattleDefine.OPEN_WDAY_AREA, wDay) then
  38. return false
  39. end
  40. local now = os.time()
  41. local toDayStartTime = Util.getDayStartTime(now)
  42. if wDay == AreaBattleDefine.OPEN_WDAY_AREA[1] and now < (toDayStartTime + AreaBattleDefine.PREPARE_STATE_START_SEC) then
  43. return false
  44. end
  45. if wDay == AreaBattleDefine.OPEN_WDAY_AREA[2] and now > (toDayStartTime + AreaBattleDefine.END_STATE_START_SEC) then
  46. return false
  47. end
  48. return true
  49. end
  50. -- 生成符合协议数据结构的奖励数据
  51. local function populateAwardMsg(msgTb, awardCfg)
  52. for idx, itemCfg in ipairs(awardCfg) do
  53. msgTb[0] = idx
  54. Grid.makeItem(msgTb[idx], itemCfg[1], itemCfg[2])
  55. end
  56. end
  57. -- 生成符合协议数据结构的英雄数据
  58. local function populateObjMsg(net, data)
  59. net.name = data.name or ""
  60. net.power = data.power or 0
  61. net.head = data.head or 0
  62. net.headFrame = data.headFrame or 0
  63. net.playerLv = data.playerLv or 90
  64. net.heroList[0] = 0
  65. for k, heroInfo in ipairs(data.heroList) do
  66. net.heroList[0] = k
  67. net.heroList[k].heroId = heroInfo.heroId or 1001
  68. net.heroList[k].heroColor = heroInfo.heroColor or 0
  69. net.heroList[k].heroStar = heroInfo.heroStar or 1
  70. net.heroList[k].heroLv = heroInfo.heroLv or 1
  71. end
  72. end
  73. local function sendMail(mailId, receiverUuid, itemArray)
  74. if not mailId or not receiverUuid then
  75. return
  76. end
  77. local mailCfg = MailExcel.mail[mailId]
  78. local content = mailCfg.content
  79. MailManager.add(MailManager.SYSTEM, receiverUuid, mailCfg.title, content, itemArray, mailCfg.senderName or "GM")
  80. end
  81. local function writeLog(logStr)
  82. Log.write(Log.LOGID_OSS_AREABATTLE_AWARD, logStr)
  83. end
  84. function mailQueue:add(playerInfo)
  85. table.insert(self.uuidArray, playerInfo)
  86. end
  87. function mailQueue:clear()
  88. Util.cleanTable(self.uuidArray)
  89. Util.cleanTable(self.repeatTb)
  90. end
  91. function mailQueue:insertDB()
  92. local maxNum = math.min(self.insertMaxNum, #self.uuidArray)
  93. for i=1, maxNum do
  94. local resTag = AreaBattleDefine.MAIL_SUCC_TAG
  95. local playerInfo = table.remove(self.uuidArray)
  96. local uuid = playerInfo[1]
  97. local awardType = playerInfo[3]
  98. local ok, err = pcall(sendMail, AreaBattleDefine.AWARDTYPE2MAILID[awardType], uuid, playerInfo[2])
  99. if not ok then
  100. print(err)
  101. if not self.repeatTb[uuid] or self.repeatTb[uuid] < self.repeatMaxTimes then -- 插入失败后,最多重新插入3次
  102. mailQueue:add(playerInfo)
  103. self.repeatTb[uuid] = (self.repeatTb[uuid] or 0) + 1
  104. end
  105. resTag = AreaBattleDefine.MAIL_FAIL_TAG
  106. end
  107. local str = string.format("Result: %s, playerUuid: %s, AwardType: %d, insertErrTimes: %d, errInfo: %s",
  108. resTag, uuid, awardType, self.repeatTb[uuid] or 0, err)
  109. writeLog(str)
  110. end
  111. if #self.uuidArray > 0 then
  112. Timer.addLater(3, mailQueue.insertDB, mailQueue)
  113. end
  114. end
  115. local function insertPlayerAward(playerArr, battlePlyerArr, awardArr, awardType)
  116. local len = #playerArr
  117. for _, uuid in pairs(battlePlyerArr or {}) do
  118. len = len + 1
  119. local item = {}
  120. for idx, itemInfo in ipairs(awardArr) do
  121. item[idx] = {itemInfo[1], itemInfo[2]}
  122. end
  123. playerArr[len] = {uuid, item, awardType}
  124. end
  125. end
  126. local function genPlayerAwardArray(srvBattleRes)
  127. local DataCache = require("core.DataCache")
  128. local playerUidList = DataCache.Get_PlayerUuidList()
  129. local winAwardType, defeateAwardType, normalAwardType = AreaBattleDefine.AWARD_TYPE1, AreaBattleDefine.AWARD_TYPE2, AreaBattleDefine.AWARD_TYPE3
  130. local battleWinAwward, battleDefeatAward, normalAward = AreaBattleConfig[1].winAward1, AreaBattleConfig[1].winAward2, AreaBattleConfig[1].winAward3
  131. if srvBattleRes.isWin == 0 then
  132. winAwardType, defeateAwardType, normalAwardType = AreaBattleDefine.AWARD_TYPE4, AreaBattleDefine.AWARD_TYPE5, AreaBattleDefine.AWARD_TYPE6
  133. battleWinAwward, battleDefeatAward, normalAward = AreaBattleConfig[1].defeatAward1, AreaBattleConfig[1].defeatAward2, AreaBattleConfig[1].defeatAward3
  134. end
  135. local len = 0
  136. local playerAwardArray = {}
  137. insertPlayerAward(playerAwardArray, srvBattleRes.winPlayerArr, battleWinAwward, winAwardType)
  138. insertPlayerAward(playerAwardArray, srvBattleRes.defeatPlayerArr, battleDefeatAward, defeateAwardType)
  139. len = #playerAwardArray
  140. for uuid in pairs(playerUidList) do
  141. if not table.find(srvBattleRes.winPlayerArr, uuid) and not table.find(srvBattleRes.defeatPlayerArr, uuid) then
  142. len = len + 1
  143. local item = {}
  144. for idx, itemInfo in ipairs(normalAward) do
  145. item[idx] = {itemInfo[1], itemInfo[2]}
  146. end
  147. playerAwardArray[len] = {uuid, item, normalAwardType}
  148. end
  149. end
  150. if len == 0 then
  151. return
  152. end
  153. return playerAwardArray
  154. end
  155. -- 开服天数检查
  156. local function checkSvrOpenDays()
  157. local openDay = CommonDB.getServerOpenDay()
  158. local ctrlCfg = RoleSystemExcel.roleSystem[RoleSystemDefine.ROLE_SYS_ID_1306]
  159. if ctrlCfg.openSvrDay > openDay then
  160. return false
  161. end
  162. return true
  163. end
  164. -- 单个英雄数据
  165. local function getHeroInfo(human, targetHeroUuid)
  166. local HeroLogic = require("hero.HeroLogic")
  167. local heroGrid = HeroLogic.getHeroGridByUuid(human, targetHeroUuid)
  168. if heroGrid then
  169. local heroCfg = HeroExcel.hero[heroGrid.id]
  170. local heroInfo = {
  171. heroUuid = targetHeroUuid,
  172. heroStar = heroGrid.star,
  173. heroLevel = heroGrid.lv,
  174. heroCamp = heroGrid.camp or heroCfg.camp,
  175. heroBody = heroCfg.body
  176. }
  177. return heroInfo
  178. end
  179. end
  180. -- 获取上阵英雄数据
  181. local function getHeroListInfo(human, targetHeroUuid)
  182. local len = 0
  183. local heroArr = {}
  184. local heroList = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE32)
  185. if not next(heroList) then
  186. heroList = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE1)
  187. end
  188. for _, heroUuid in pairs(heroList) do
  189. if not targetHeroUuid or targetHeroUuid == heroUuid then
  190. len = len + 1
  191. heroArr[len] = getHeroInfo(human, heroUuid)
  192. end
  193. end
  194. if len == 0 then
  195. return
  196. end
  197. return heroArr
  198. end
  199. -- 生成玩家展示数据
  200. local function genPlayerShowData(playerUuid)
  201. local human = ObjHuman.onlineUuid[playerUuid]
  202. if not human then
  203. local db = RoleDBLogic.getDb(playerUuid)
  204. if not db then
  205. return
  206. end
  207. human = {}
  208. human.db = db
  209. end
  210. local showInfo = {}
  211. showInfo.uuid = playerUuid
  212. showInfo.power = human.db.zhandouli
  213. showInfo.name = human.db.name
  214. showInfo.head = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_1)
  215. showInfo.headFrame = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_2)
  216. -- showInfo.heroList = getHeroListInfo(human)
  217. return showInfo
  218. end
  219. -- 生成本服参战列表
  220. local function genJoinBattleArray()
  221. local rankList = BillboardLogic.GetRankList(BillboardDefine.TYPE_ZHANDOULI)
  222. if not rankList then
  223. return
  224. end
  225. local len = 0
  226. local joinBattleArray = {}
  227. for _, PlayerData in ipairs(rankList) do
  228. if len >= AreaBattleDefine.JOIN_BATTLE_MAX_CNT then
  229. break
  230. end
  231. local pkayerInfo = genPlayerShowData(PlayerData.uuid)
  232. if pkayerInfo then
  233. len = len + 1
  234. joinBattleArray[len] = pkayerInfo
  235. end
  236. end
  237. table.shuffle(joinBattleArray)
  238. return joinBattleArray
  239. end
  240. function getActState(human)
  241. local state, leftTime = 1, 0
  242. if not openCheck() then
  243. state = 0
  244. end
  245. return state, leftTime
  246. end
  247. function isOpen(human)
  248. return RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_1306)
  249. end
  250. function getCombatObjList(human, side, args, combatType)
  251. if side == CombatDefine.ATTACK_SIDE and not human then return end
  252. if side == CombatDefine.DEFEND_SIDE and human then
  253. return
  254. end
  255. if not human then
  256. local uuid = args[1]
  257. local db = RoleDBLogic.getDb(uuid)
  258. if not db then
  259. return
  260. end
  261. human = {}
  262. human.db = db
  263. end
  264. local heroList = CombatPosLogic.getCombatHeros(human, combatType)
  265. if next(heroList) then
  266. return CombatLogic.getHumanObjList(human, combatType)
  267. else
  268. return CombatLogic.getHumanObjList(human, CombatDefine.COMBAT_TYPE1)
  269. end
  270. end
  271. --------------------------------------------N2C----------------------------------------------------
  272. -- 加入战斗
  273. local function joinBattle()
  274. local joinBattleArray = genJoinBattleArray()
  275. -- if not joinBattleArray or #joinBattleArray <= 0 then
  276. -- return
  277. -- end
  278. print("================joinBattle================", #joinBattleArray)
  279. local msgData = InnerMsg.lw.LW_AREABATTLE_JOIN_BATTLE
  280. msgData.sourceServerId = Config.SVR_INDEX
  281. msgData.joinBattleArray = joinBattleArray or {}
  282. InnerMsg.sendMsg(0, msgData)
  283. end
  284. -- 获取活动基础信息
  285. function GetBaseInfo(human)
  286. local msgData = InnerMsg.lw.LW_AREABATTLE_BASEINFO_QUERY
  287. msgData.sourceServerId = Config.SVR_INDEX
  288. msgData.playerUuid = human.db._id
  289. InnerMsg.sendMsg(0, msgData)
  290. end
  291. -- 获取本服参战玩家列表
  292. function GetJoinPlayerArr(human)
  293. if not openCheck() then
  294. local msgRet = Msg.gc.GC_AREABATTLE_JOINPLAYER_QUERY
  295. msgRet.errCode = -2
  296. msgRet.isJoin = 0
  297. msgRet.playerArray[0] = 0
  298. return Msg.send(msgRet, human.fd)
  299. end
  300. local msgData = InnerMsg.lw.LW_AREABATTLE_JOINPLAYER_QUERY
  301. msgData.sourceServerId = Config.SVR_INDEX
  302. msgData.playerUuid = human.db._id
  303. InnerMsg.sendMsg(0, msgData)
  304. end
  305. -- 获取区服匹配列表(两两匹配)
  306. function GetMatchList(human)
  307. if not openCheck() then
  308. local msgRet = Msg.gc.GC_AREABATTLE_MATCHLIST_QUERY
  309. msgRet.errCode = -2
  310. msgRet.matchList[0] = 0
  311. return Msg.send(msgRet, human.fd)
  312. end
  313. local msgData = InnerMsg.lw.LW_AREABATTLE_MATCHLIST_QUERY
  314. msgData.sourceServerId = Config.SVR_INDEX
  315. msgData.playerUuid = human.db._id
  316. InnerMsg.sendMsg(0, msgData)
  317. end
  318. --获取录像
  319. function GetCombatVideo(human)
  320. if not openCheck() then
  321. local msgRet = Msg.gc.GC_GODSAREA_QUERY_COMBATVIDEO
  322. msgRet.errCode = -2
  323. msgRet.leftWinTimes = 0
  324. msgRet.rightWinTimes = 0
  325. msgRet.leftSrvName = ""
  326. msgRet.leftSrvPower = 0
  327. msgRet.rightSrvName = ""
  328. msgRet.rightSrvPower = 0
  329. return Msg.send(msgRet, human.fd)
  330. end
  331. local msgData = InnerMsg.lw.LW_AREABATTLE_VIDEOSHOW_QUERY
  332. msgData.sourceServerId = Config.SVR_INDEX
  333. msgData.playerUuid = human.db._id
  334. InnerMsg.sendMsg(0, msgData)
  335. end
  336. -- 获取奖励列表
  337. function GetAwardInfo(human)
  338. local msgRet = Msg.gc.GC_AREABATTLE_REWARD_QUERY
  339. populateAwardMsg(msgRet.winJoinAward, AreaBattleConfig[1].winAward1)
  340. populateAwardMsg(msgRet.winJoinAward2, AreaBattleConfig[1].winAward2)
  341. populateAwardMsg(msgRet.winNormalAward, AreaBattleConfig[1].winAward3)
  342. populateAwardMsg(msgRet.defaultJoinAward, AreaBattleConfig[1].defeatAward1)
  343. populateAwardMsg(msgRet.defaultJoinAward2, AreaBattleConfig[1].defeatAward2)
  344. populateAwardMsg(msgRet.defaultNormalAward, AreaBattleConfig[1].defeatAward3)
  345. Msg.send(msgRet, human.fd)
  346. end
  347. --------------------------------------------C2N----------------------------------------------------
  348. -- 收到活动开启通知
  349. function C2N_BattleStart()
  350. if not checkSvrOpenDays() then
  351. return
  352. end
  353. joinBattle()
  354. end
  355. -- 收到活动基础信息
  356. function C2N_BaseInfo(msg)
  357. local human = ObjHuman.onlineUuid[msg.playerUuid]
  358. if not human then
  359. return
  360. end
  361. local msgRet = Msg.gc.GC_AREABATTLE_BASEINFO_QUERY
  362. msgRet.stage = msg.stage
  363. msgRet.startTime = msg.startTime
  364. msgRet.endTime = msg.endTime
  365. Msg.send(msgRet, human.fd)
  366. end
  367. -- 收到本服参战玩家列表
  368. function C2N_JoinPlayerArr(msg)
  369. local human = ObjHuman.onlineUuid[msg.playerUuid]
  370. if not human then
  371. return
  372. end
  373. local msgRet = Msg.gc.GC_AREABATTLE_JOINPLAYER_QUERY
  374. msgRet.errCode = msg.errCode
  375. msgRet.isJoin = 0
  376. msgRet.playerArray[0] = 0
  377. if msg.errCode == 0 then
  378. local playerArray = msg.playerArray
  379. table.sort(playerArray, function (a, b)
  380. return a.power > b.power
  381. end)
  382. for k, v in ipairs(playerArray) do
  383. msgRet.playerArray[0] = k
  384. msgRet.playerArray[k].name = v.name
  385. msgRet.playerArray[k].power = v.power
  386. msgRet.playerArray[k].head = v.head
  387. msgRet.playerArray[k].headFrame = v.headFrame
  388. if v.uuid == msg.playerUuid then
  389. msgRet.isJoin = 1
  390. end
  391. end
  392. end
  393. Msg.send(msgRet, human.fd)
  394. end
  395. -- 收到本轮活动的区服匹配列表
  396. function C2N_MatchList(msg)
  397. local human = ObjHuman.onlineUuid[msg.playerUuid]
  398. if not human then
  399. return
  400. end
  401. local msgRet = Msg.gc.GC_AREABATTLE_MATCHLIST_QUERY
  402. msgRet.errCode = 0
  403. local matchListMsg = msgRet.matchList
  404. matchListMsg[0] = 0
  405. if not next(msg.matchList) then
  406. msgRet.errCode = -1
  407. else
  408. for k, v in ipairs(msg.matchList) do
  409. matchListMsg[0] = k
  410. --for _, srvInfo in ipairs(v) do
  411. local leftSrv = v[1]
  412. local rightSrv = v[2]
  413. matchListMsg[k].leftSrvName = (leftSrv[1] - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
  414. matchListMsg[k].leftSrvPower = leftSrv[2]
  415. matchListMsg[k].rightSrvName = (rightSrv[1] - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
  416. matchListMsg[k].rightSrvPower = rightSrv[2]
  417. --end
  418. end
  419. end
  420. Msg.send(msgRet, human.fd)
  421. end
  422. -- 收到本服的战斗录像展示数据
  423. function C2N_VideoShowData(msg)
  424. local human = ObjHuman.onlineUuid[msg.playerUuid]
  425. if not human then
  426. return
  427. end
  428. local errCode = msg.errCode
  429. local msgRet = Msg.gc.GC_GODSAREA_QUERY_COMBATVIDEO
  430. msgRet.errCode = errCode
  431. msgRet.leftWinTimes = 0
  432. msgRet.rightWinTimes = 0
  433. msgRet.leftSrvName = ""
  434. msgRet.leftSrvPower = 0
  435. msgRet.rightSrvName = ""
  436. msgRet.rightSrvPower = 0
  437. if errCode ~= 0 then
  438. msgRet.videoList[0] = 0
  439. return Msg.send(msgRet, human.fd)
  440. end
  441. local srvInfo = msg.srvInfo
  442. msgRet.leftWinTimes = srvInfo.leftWinTimes
  443. msgRet.rightWinTimes = srvInfo.rightWinTimes
  444. msgRet.leftSrvName = (srvInfo.leftSrvId - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
  445. msgRet.leftSrvPower = srvInfo.leftSrvPower
  446. msgRet.rightSrvName = (srvInfo.rightSrvId - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
  447. msgRet.rightSrvPower = srvInfo.rightSrvPower
  448. for k, v in ipairs(msg.videoShowData) do
  449. msgRet.videoList[0] = k
  450. -- msgRet.videoList[k].atkData = v.atkData
  451. -- msgRet.videoList[k].defenerData = v.defenerData
  452. populateObjMsg(msgRet.videoList[k].atkData, v.atkData)
  453. populateObjMsg(msgRet.videoList[k].defenerData, v.defenerData)
  454. msgRet.videoList[k].atkFormation = v.atkFormation
  455. msgRet.videoList[k].defenerFormation = v.defenerFormation
  456. msgRet.videoList[k].round = v.round
  457. msgRet.videoList[k].maxRound = v.maxRound
  458. msgRet.videoList[k].time = v.time
  459. msgRet.videoList[k].videoUuid = v.videoUuid
  460. print("==========C2N_VideoShowData===========", v.videoUuid)
  461. msgRet.videoList[k].result = v.result
  462. end
  463. Msg.send(msgRet, human.fd)
  464. end
  465. -- 收到给玩家发奖励通知
  466. function C2N_SendReward(msg)
  467. print("================C2N_SendReward000===================")
  468. local playerAwardArray = genPlayerAwardArray(msg.srvBattleRes)
  469. if not playerAwardArray then
  470. return
  471. end
  472. print("================C2N_SendReward001===================")
  473. mailQueue:clear()
  474. for _, playerInfo in ipairs(playerAwardArray) do
  475. mailQueue:add(playerInfo)
  476. end
  477. mailQueue:insertDB()
  478. end