AreaBattleNS.lua 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  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. net.heroList[k].heroCamp = heroInfo.heroCamp or 999
  72. end
  73. end
  74. local function sendMail(mailId, receiverUuid, itemArray)
  75. if not mailId or not receiverUuid then
  76. return
  77. end
  78. local mailCfg = MailExcel.mail[mailId]
  79. local content = mailCfg.content
  80. MailManager.add(MailManager.SYSTEM, receiverUuid, mailCfg.title, content, itemArray, mailCfg.senderName or "GM")
  81. end
  82. local function writeLog(logStr)
  83. Log.write(Log.LOGID_OSS_AREABATTLE_AWARD, logStr)
  84. end
  85. function mailQueue:add(playerInfo)
  86. table.insert(self.uuidArray, playerInfo)
  87. end
  88. function mailQueue:clear()
  89. Util.cleanTable(self.uuidArray)
  90. Util.cleanTable(self.repeatTb)
  91. end
  92. function mailQueue:insertDB()
  93. local maxNum = math.min(self.insertMaxNum, #self.uuidArray)
  94. for i=1, maxNum do
  95. local resTag = AreaBattleDefine.MAIL_SUCC_TAG
  96. local playerInfo = table.remove(self.uuidArray)
  97. local uuid = playerInfo[1]
  98. local awardType = playerInfo[3]
  99. local ok, err = pcall(sendMail, AreaBattleDefine.AWARDTYPE2MAILID[awardType], uuid, playerInfo[2])
  100. if not ok then
  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.winPlayerArr, normalAward, normalAwardType)
  139. insertPlayerAward(playerAwardArray, srvBattleRes.defeatPlayerArr, battleDefeatAward, defeateAwardType)
  140. insertPlayerAward(playerAwardArray, srvBattleRes.defeatPlayerArr, normalAward, normalAwardType)
  141. len = #playerAwardArray
  142. for uuid in pairs(playerUidList) do
  143. if not table.find(srvBattleRes.winPlayerArr, uuid) and not table.find(srvBattleRes.defeatPlayerArr, uuid) then
  144. len = len + 1
  145. local item = {}
  146. for idx, itemInfo in ipairs(normalAward) do
  147. item[idx] = {itemInfo[1], itemInfo[2]}
  148. end
  149. playerAwardArray[len] = {uuid, item, normalAwardType}
  150. end
  151. end
  152. if len == 0 then
  153. return
  154. end
  155. return playerAwardArray
  156. end
  157. -- 开服天数检查
  158. local function checkSvrOpenDays()
  159. local openDay = CommonDB.getServerOpenDay()
  160. local ctrlCfg = RoleSystemExcel.roleSystem[RoleSystemDefine.ROLE_SYS_ID_1306]
  161. if ctrlCfg.openSvrDay > openDay then
  162. return false
  163. end
  164. return true
  165. end
  166. -- 单个英雄数据
  167. local function getHeroInfo(human, targetHeroUuid)
  168. local HeroLogic = require("hero.HeroLogic")
  169. local heroGrid = HeroLogic.getHeroGridByUuid(human, targetHeroUuid)
  170. if heroGrid then
  171. local heroCfg = HeroExcel.hero[heroGrid.id]
  172. local heroInfo = {
  173. heroUuid = targetHeroUuid,
  174. heroStar = heroGrid.star,
  175. heroLevel = heroGrid.lv,
  176. heroCamp = heroGrid.camp or heroCfg.camp,
  177. heroBody = heroCfg.body
  178. }
  179. return heroInfo
  180. end
  181. end
  182. -- 获取上阵英雄数据
  183. local function getHeroListInfo(human, targetHeroUuid)
  184. local len = 0
  185. local heroArr = {}
  186. local heroList = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE32)
  187. if not next(heroList) then
  188. heroList = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE1)
  189. end
  190. for _, heroUuid in pairs(heroList) do
  191. if not targetHeroUuid or targetHeroUuid == heroUuid then
  192. len = len + 1
  193. heroArr[len] = getHeroInfo(human, heroUuid)
  194. end
  195. end
  196. if len == 0 then
  197. return
  198. end
  199. return heroArr
  200. end
  201. -- 生成玩家展示数据
  202. local function genPlayerShowData(playerUuid)
  203. local human = ObjHuman.onlineUuid[playerUuid]
  204. if not human then
  205. local db = RoleDBLogic.getDb(playerUuid)
  206. if not db then
  207. return
  208. end
  209. human = {}
  210. human.db = db
  211. end
  212. local showInfo = {}
  213. showInfo.uuid = playerUuid
  214. showInfo.power = human.db.zhandouli
  215. showInfo.name = human.db.name
  216. showInfo.head = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_1)
  217. showInfo.headFrame = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_2)
  218. -- showInfo.heroList = getHeroListInfo(human)
  219. return showInfo
  220. end
  221. -- 生成本服参战列表
  222. local function genJoinBattleArray()
  223. local rankList = BillboardLogic.GetRankList(BillboardDefine.TYPE_ZHANDOULI)
  224. if not rankList then
  225. return
  226. end
  227. local len = 0
  228. local joinBattleArray = {}
  229. for _, PlayerData in ipairs(rankList) do
  230. if len >= AreaBattleDefine.JOIN_BATTLE_MAX_CNT then
  231. break
  232. end
  233. local pkayerInfo = genPlayerShowData(PlayerData.uuid)
  234. if pkayerInfo then
  235. len = len + 1
  236. joinBattleArray[len] = pkayerInfo
  237. end
  238. end
  239. table.shuffle(joinBattleArray)
  240. return joinBattleArray
  241. end
  242. function getActState(human)
  243. local state, leftTime = 1, 0
  244. if not openCheck() then
  245. state = 0
  246. end
  247. return state, leftTime
  248. end
  249. function isOpen(human)
  250. return RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_1306)
  251. end
  252. function getCombatObjList(human, side, args, combatType)
  253. if side == CombatDefine.ATTACK_SIDE and not human then return end
  254. if side == CombatDefine.DEFEND_SIDE and human then
  255. return
  256. end
  257. if not human then
  258. local uuid = args[1]
  259. local db = RoleDBLogic.getDb(uuid)
  260. if not db then
  261. return
  262. end
  263. human = {}
  264. human.db = db
  265. end
  266. local heroList = CombatPosLogic.getCombatHeros(human, combatType)
  267. if next(heroList) then
  268. return CombatLogic.getHumanObjList(human, combatType)
  269. else
  270. return CombatLogic.getHumanObjList(human, CombatDefine.COMBAT_TYPE1)
  271. end
  272. end
  273. --------------------------------------------N2C----------------------------------------------------
  274. -- 加入战斗
  275. local function joinBattle()
  276. local joinBattleArray = genJoinBattleArray()
  277. -- if not joinBattleArray or #joinBattleArray <= 0 then
  278. -- return
  279. -- end
  280. print("================joinBattle================", #joinBattleArray)
  281. local msgData = InnerMsg.lw.LW_AREABATTLE_JOIN_BATTLE
  282. msgData.sourceServerId = Config.SVR_INDEX
  283. msgData.joinBattleArray = joinBattleArray or {}
  284. InnerMsg.sendMsg(0, msgData)
  285. end
  286. -- 获取活动基础信息
  287. function GetBaseInfo(human)
  288. local msgData = InnerMsg.lw.LW_AREABATTLE_BASEINFO_QUERY
  289. msgData.sourceServerId = Config.SVR_INDEX
  290. msgData.playerUuid = human.db._id
  291. InnerMsg.sendMsg(0, msgData)
  292. end
  293. -- 获取本服参战玩家列表
  294. function GetJoinPlayerArr(human)
  295. -- if not openCheck() then
  296. -- local msgRet = Msg.gc.GC_AREABATTLE_JOINPLAYER_QUERY
  297. -- msgRet.errCode = -2
  298. -- msgRet.isJoin = 0
  299. -- msgRet.playerArray[0] = 0
  300. -- return Msg.send(msgRet, human.fd)
  301. -- end
  302. local msgData = InnerMsg.lw.LW_AREABATTLE_JOINPLAYER_QUERY
  303. msgData.sourceServerId = Config.SVR_INDEX
  304. msgData.playerUuid = human.db._id
  305. InnerMsg.sendMsg(0, msgData)
  306. end
  307. -- 获取区服匹配列表(两两匹配)
  308. function GetMatchList(human)
  309. -- if not openCheck() then
  310. -- local msgRet = Msg.gc.GC_AREABATTLE_MATCHLIST_QUERY
  311. -- msgRet.errCode = -2
  312. -- msgRet.matchList[0] = 0
  313. -- return Msg.send(msgRet, human.fd)
  314. -- end
  315. local msgData = InnerMsg.lw.LW_AREABATTLE_MATCHLIST_QUERY
  316. msgData.sourceServerId = Config.SVR_INDEX
  317. msgData.playerUuid = human.db._id
  318. InnerMsg.sendMsg(0, msgData)
  319. end
  320. --获取录像
  321. function GetCombatVideo(human)
  322. -- if not openCheck() then
  323. -- local msgRet = Msg.gc.GC_GODSAREA_QUERY_COMBATVIDEO
  324. -- msgRet.errCode = -2
  325. -- msgRet.leftWinTimes = 0
  326. -- msgRet.rightWinTimes = 0
  327. -- msgRet.leftSrvName = ""
  328. -- msgRet.leftSrvPower = 0
  329. -- msgRet.rightSrvName = ""
  330. -- msgRet.rightSrvPower = 0
  331. -- msgRet.videoList[0] = 0
  332. -- return Msg.send(msgRet, human.fd)
  333. -- end
  334. local msgData = InnerMsg.lw.LW_AREABATTLE_VIDEOSHOW_QUERY
  335. msgData.sourceServerId = Config.SVR_INDEX
  336. msgData.playerUuid = human.db._id
  337. InnerMsg.sendMsg(0, msgData)
  338. end
  339. -- 获取奖励列表
  340. function GetAwardInfo(human)
  341. local msgRet = Msg.gc.GC_AREABATTLE_REWARD_QUERY
  342. populateAwardMsg(msgRet.winJoinAward, AreaBattleConfig[1].winAward1)
  343. populateAwardMsg(msgRet.winJoinAward2, AreaBattleConfig[1].winAward2)
  344. populateAwardMsg(msgRet.winNormalAward, AreaBattleConfig[1].winAward3)
  345. populateAwardMsg(msgRet.defaultJoinAward, AreaBattleConfig[1].defeatAward1)
  346. populateAwardMsg(msgRet.defaultJoinAward2, AreaBattleConfig[1].defeatAward2)
  347. populateAwardMsg(msgRet.defaultNormalAward, AreaBattleConfig[1].defeatAward3)
  348. Msg.send(msgRet, human.fd)
  349. end
  350. --------------------------------------------C2N----------------------------------------------------
  351. -- 收到活动开启通知
  352. function C2N_BattleStart()
  353. if not checkSvrOpenDays() then
  354. return
  355. end
  356. joinBattle()
  357. end
  358. -- 收到活动基础信息
  359. function C2N_BaseInfo(msg)
  360. local human = ObjHuman.onlineUuid[msg.playerUuid]
  361. if not human then
  362. return
  363. end
  364. local msgRet = Msg.gc.GC_AREABATTLE_BASEINFO_QUERY
  365. msgRet.stage = msg.stage
  366. msgRet.startTime = msg.startTime
  367. msgRet.endTime = msg.endTime
  368. Msg.send(msgRet, human.fd)
  369. end
  370. -- 收到本服参战玩家列表
  371. function C2N_JoinPlayerArr(msg)
  372. local human = ObjHuman.onlineUuid[msg.playerUuid]
  373. if not human then
  374. return
  375. end
  376. local msgRet = Msg.gc.GC_AREABATTLE_JOINPLAYER_QUERY
  377. msgRet.errCode = msg.errCode
  378. msgRet.isJoin = 0
  379. msgRet.playerArray[0] = 0
  380. if msg.errCode == 0 then
  381. local playerArray = msg.playerArray
  382. table.sort(playerArray, function (a, b)
  383. return a.power > b.power
  384. end)
  385. for k, v in ipairs(playerArray) do
  386. msgRet.playerArray[0] = k
  387. msgRet.playerArray[k].name = v.name
  388. msgRet.playerArray[k].power = v.power
  389. msgRet.playerArray[k].head = v.head
  390. msgRet.playerArray[k].headFrame = v.headFrame
  391. if v.uuid == msg.playerUuid then
  392. msgRet.isJoin = 1
  393. end
  394. end
  395. end
  396. Msg.send(msgRet, human.fd)
  397. end
  398. -- 收到本轮活动的区服匹配列表
  399. function C2N_MatchList(msg)
  400. local human = ObjHuman.onlineUuid[msg.playerUuid]
  401. if not human then
  402. return
  403. end
  404. local msgRet = Msg.gc.GC_AREABATTLE_MATCHLIST_QUERY
  405. msgRet.errCode = 0
  406. local matchListMsg = msgRet.matchList
  407. matchListMsg[0] = 0
  408. if not next(msg.matchList) then
  409. msgRet.errCode = -1
  410. else
  411. for k, v in ipairs(msg.matchList) do
  412. matchListMsg[0] = k
  413. --for _, srvInfo in ipairs(v) do
  414. local leftSrv = v[1]
  415. local rightSrv = v[2]
  416. matchListMsg[k].leftSrvName = (leftSrv[1] - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
  417. matchListMsg[k].leftSrvPower = leftSrv[2]
  418. matchListMsg[k].rightSrvName = (rightSrv[1] - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
  419. matchListMsg[k].rightSrvPower = rightSrv[2]
  420. --end
  421. end
  422. end
  423. Msg.send(msgRet, human.fd)
  424. end
  425. -- 收到本服的战斗录像展示数据
  426. function C2N_VideoShowData(msg)
  427. local human = ObjHuman.onlineUuid[msg.playerUuid]
  428. if not human then
  429. return
  430. end
  431. local errCode = msg.errCode
  432. local msgRet = Msg.gc.GC_GODSAREA_QUERY_COMBATVIDEO
  433. msgRet.errCode = errCode
  434. msgRet.leftWinTimes = 0
  435. msgRet.rightWinTimes = 0
  436. msgRet.leftSrvName = ""
  437. msgRet.leftSrvPower = 0
  438. msgRet.rightSrvName = ""
  439. msgRet.rightSrvPower = 0
  440. msgRet.videoList[0] = 0
  441. if errCode ~= 0 then
  442. return Msg.send(msgRet, human.fd)
  443. end
  444. local srvInfo = msg.srvInfo
  445. msgRet.leftWinTimes = srvInfo.leftWinTimes
  446. msgRet.rightWinTimes = srvInfo.rightWinTimes
  447. msgRet.leftSrvName = (srvInfo.leftSrvId - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
  448. msgRet.leftSrvPower = srvInfo.leftSrvPower
  449. msgRet.rightSrvName = (srvInfo.rightSrvId - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
  450. msgRet.rightSrvPower = srvInfo.rightSrvPower
  451. for k, v in ipairs(msg.videoShowData) do
  452. msgRet.videoList[0] = k
  453. -- msgRet.videoList[k].atkData = v.atkData
  454. -- msgRet.videoList[k].defenerData = v.defenerData
  455. populateObjMsg(msgRet.videoList[k].atkData, v.atkData)
  456. populateObjMsg(msgRet.videoList[k].defenerData, v.defenerData)
  457. msgRet.videoList[k].atkFormation = v.atkFormation
  458. msgRet.videoList[k].defenerFormation = v.defenerFormation
  459. msgRet.videoList[k].round = v.round
  460. msgRet.videoList[k].maxRound = v.maxRound
  461. msgRet.videoList[k].time = v.time
  462. msgRet.videoList[k].videoUuid = v.videoUuid
  463. msgRet.videoList[k].result = v.result
  464. end
  465. Msg.send(msgRet, human.fd)
  466. end
  467. -- 收到给玩家发奖励通知
  468. function C2N_SendReward(msg)
  469. print("================C2N_SendReward000===================")
  470. local playerAwardArray = genPlayerAwardArray(msg.srvBattleRes)
  471. if not playerAwardArray then
  472. return
  473. end
  474. print("================C2N_SendReward001===================")
  475. mailQueue:clear()
  476. for _, playerInfo in ipairs(playerAwardArray) do
  477. mailQueue:add(playerInfo)
  478. end
  479. mailQueue:insertDB()
  480. end