AreaBattleNS.lua 17 KB

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