AreaBattleCS.lua 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. -- 战区争霸(跨服)
  2. local InnerMsg = require("core.InnerMsg")
  3. local Log = require("common.Log")
  4. local Timer = require("core.Timer")
  5. local Util = require("common.Util")
  6. local MiddleManager = require("middle.MiddleManager")
  7. local AreaBattleDB = require("areaBattle.AreaBattleDB")
  8. local AreaBattleDefine = require("areaBattle.AreaBattleDefine")
  9. local CombatVideo = require("combat.CombatVideo")
  10. local CombatDefine = require("combat.CombatDefine")
  11. local CombatLogicCS = require("combat.CombatLogicCS")
  12. local CommonDefine = require("common.CommonDefine")
  13. local BattleDataCS = require("battleDataManager.BattleDataCS")
  14. -- 当天处于星期几(星期六为7, 星期天为1)
  15. local wDay
  16. -- 玩家战斗数据缓存表
  17. local battleDataCache = {}
  18. local function updateWDay()
  19. wDay = Util.getWeekDay()
  20. end
  21. local function getTodayStartTime()
  22. local now = os.time()
  23. return Util.getDayStartTime(now)
  24. end
  25. local function isOpen()
  26. if not wDay then
  27. updateWDay()
  28. end
  29. if not table.find(AreaBattleDefine.OPEN_WDAY_AREA, wDay) then
  30. return false
  31. end
  32. local now = os.time()
  33. local toDayStartTime = getTodayStartTime()
  34. if wDay == AreaBattleDefine.OPEN_WDAY_AREA[1] and now < (toDayStartTime + AreaBattleDefine.PREPARE_STATE_START_SEC) then
  35. return false
  36. end
  37. if wDay == AreaBattleDefine.OPEN_WDAY_AREA[2] and now > (toDayStartTime + AreaBattleDefine.END_STATE_START_SEC) then
  38. return false
  39. end
  40. return true
  41. end
  42. local function writeLog(logStr)
  43. Log.write(Log.LOGID_OSS_AREABATTLE_BATTLE, logStr)
  44. end
  45. -- 计算一个服的总战力
  46. local function calcSrvPower(playerArray)
  47. local power = 0
  48. for _, v in ipairs(playerArray or {}) do
  49. power = power + (v.power or 0)
  50. end
  51. return power
  52. end
  53. -- 获取战斗对象的区服Id, uuid
  54. local function getBattleObjInfo(matchIdx, battleIdx, objIdentity)
  55. local matchSrvArr = AreaBattleDB.GetMatchSrvArr()
  56. local matchData = matchSrvArr[matchIdx]
  57. if not matchData then
  58. return
  59. end
  60. local targetSrvId = matchData[objIdentity]
  61. if not targetSrvId then
  62. return
  63. end
  64. local serverList = AreaBattleDB.GetServerList()
  65. if not serverList[targetSrvId] then
  66. return
  67. end
  68. local srvPlayerArr = serverList[targetSrvId].playerInfoArr
  69. local playerInfo = srvPlayerArr[battleIdx]
  70. return targetSrvId, playerInfo and playerInfo.uuid
  71. end
  72. -- 进入准备阶段的处理
  73. local function prepareHandle()
  74. -- 清除录像数据
  75. CombatVideo.ClearOutVideoByCombatType(CombatVideo.VIDEOTYPE_AREABATTLE)
  76. -- 重置录像缓存
  77. AreaBattleDB.ResetVideoShowCache()
  78. -- 重置战区争霸数据
  79. AreaBattleDB.ResetData()
  80. -- 更新状态
  81. AreaBattleDB.UpdateState(AreaBattleDefine.STATE_PREPARE)
  82. -- 通知普通服
  83. NotifySrvJoin()
  84. end
  85. -- 进入新一轮的处理
  86. local function newRoundHandle()
  87. local stateDB = AreaBattleDB.GetState()
  88. -- 上一轮奖励没有发放, 在新一轮开始时, 先发奖
  89. if stateDB == AreaBattleDefine.STATE_AWARD then
  90. AwardPrizesHandle()
  91. stateDB = AreaBattleDB.GetState()
  92. end
  93. prepareHandle()
  94. end
  95. -- 区服算法
  96. local function matchAlgorithm(serverArr, len)
  97. local usedTb = {}
  98. local pairTb = {}
  99. local function getNextUnuseIdx(nowIdx)
  100. for i=nowIdx, len do
  101. if not usedTb[i] then
  102. return i
  103. end
  104. end
  105. end
  106. local function checkRandIdx(startIdx, endIdx)
  107. local tbl= {}
  108. for i= startIdx, endIdx do
  109. if i <= len and not usedTb[i] then
  110. table.insert(tbl, i)
  111. end
  112. end
  113. return tbl
  114. end
  115. local currentIdx = 1
  116. while currentIdx <= len do
  117. currentIdx = getNextUnuseIdx(currentIdx)
  118. if not currentIdx then
  119. break
  120. end
  121. local startIdx = currentIdx+1
  122. local endIdx = currentIdx+3
  123. local correctTb = checkRandIdx(startIdx, endIdx)
  124. local matchIdx = correctTb[math.random(1, #correctTb)]
  125. usedTb[currentIdx] = true
  126. usedTb[matchIdx] = true
  127. table.insert(pairTb, {serverArr[currentIdx], serverArr[matchIdx]})
  128. currentIdx = currentIdx + 1
  129. end
  130. return pairTb
  131. end
  132. -- 生成匹配列表
  133. local function genMacthArr()
  134. local joinSrvArr = AreaBattleDB.GetJoinSrvArr()
  135. if not joinSrvArr or #joinSrvArr <= 0 then
  136. return
  137. end
  138. local srvCnt = #joinSrvArr
  139. if srvCnt > 1 then
  140. if srvCnt % 2 ~= 0 then
  141. local deleteSrvId = joinSrvArr[srvCnt]
  142. joinSrvArr[srvCnt] = nil
  143. srvCnt = srvCnt - 1
  144. local logStr = "移除多余的区服, 区服Id: " .. deleteSrvId
  145. writeLog(logStr)
  146. end
  147. table.sort(joinSrvArr)
  148. end
  149. local matchArr = matchAlgorithm(joinSrvArr, srvCnt)
  150. AreaBattleDB.UpdateMatchSrvArrt(matchArr)
  151. end
  152. -- 获取玩家的战斗数据
  153. local function getPlayerBattleData(serverId, playerUuid, extraArgs)
  154. extraArgs.serverId = serverId
  155. extraArgs.playerUuid = playerUuid
  156. BattleDataCS.GetPlayerCombatData(serverId, playerUuid, BattleDataCS.AREABTTLE_TAG, CombatDefine.COMBAT_TYPE33, extraArgs)
  157. end
  158. -- 进入战斗阶段的处理
  159. local function BattleStageHandle()
  160. local stateDB = AreaBattleDB.GetState()
  161. if stateDB ~= AreaBattleDefine.STATE_BATTLE then
  162. return
  163. end
  164. genMacthArr()
  165. local matchSrvArr = AreaBattleDB.GetMatchSrvArr()
  166. local serverList = AreaBattleDB.GetServerList()
  167. if not matchSrvArr or #matchSrvArr == 0 or not next(serverList) then
  168. return
  169. end
  170. local args = {
  171. firstIdx = 0,
  172. secondIdx = 0,
  173. identity = 0, --身份,1-进攻方, 2-防御方
  174. serverId = 0,
  175. playerUuid = "",
  176. }
  177. for idx, matchSrvTb in ipairs(matchSrvArr) do
  178. local serverId1 = matchSrvTb[1]
  179. local serverId2 = matchSrvTb[2]
  180. local playerArr1 = serverList[serverId1] and serverList[serverId1].playerInfoArr or {}
  181. local playerArr2 = serverList[serverId2] and serverList[serverId2].playerInfoArr or {}
  182. local maxPlayerCnt = math.max(#playerArr1, #playerArr2)
  183. args.firstIdx = idx
  184. for i=1, maxPlayerCnt do
  185. args.secondIdx = i
  186. local playerUuid1 = playerArr1[i].uuid
  187. local playerUuid2 = playerArr2[i].uuid
  188. if playerUuid1 then
  189. args.identity = 1
  190. getPlayerBattleData(serverId1, playerUuid1, args)
  191. end
  192. if playerUuid2 then
  193. args.identity = 2
  194. getPlayerBattleData(serverId2, playerUuid2, args)
  195. end
  196. end
  197. end
  198. local delay_sec = math.random(AreaBattleDefine.BATTLE_DATA_CACHE_TIME_AREA[1], AreaBattleDefine.BATTLE_DATA_CACHE_TIME_AREA[2])
  199. Timer.addLater(delay_sec, StartBattle)
  200. end
  201. -- 战斗结束, 把结果更新到DB
  202. local function updateDBBattleResult(battleInfo)
  203. local attackerServerId = battleInfo.attackerServerId
  204. local attackerUuid = battleInfo.attackerUuid
  205. local defenerServerId = battleInfo.defenerServerId
  206. local defenerUuid = battleInfo.defenerUuid
  207. local isWin = battleInfo.isWin
  208. local serverList = AreaBattleDB.GetServerList()
  209. local attackerSrvData = serverList[attackerServerId]
  210. if attackerSrvData then
  211. if isWin == 1 then
  212. attackerSrvData.winTimes = (attackerSrvData.winTimes or 0) + 1
  213. attackerSrvData.winPlayerArr = attackerSrvData.winPlayerArr or {}
  214. table.insert(attackerSrvData.winPlayerArr, attackerUuid)
  215. else
  216. attackerSrvData.defeatTimes = (attackerSrvData.defeatTimes or 0) + 1
  217. end
  218. end
  219. local defenerSrvData = serverList[defenerServerId]
  220. if defenerSrvData then
  221. if isWin == 0 then
  222. defenerSrvData.winTimes = (defenerSrvData.winTimes or 0) + 1
  223. defenerSrvData.winPlayerArr = defenerSrvData.winPlayerArr or {}
  224. table.insert(defenerSrvData.winPlayerArr, defenerUuid)
  225. else
  226. defenerSrvData.defeatTimes = (defenerSrvData.defeatTimes or 0) + 1
  227. end
  228. end
  229. AreaBattleDB.UpdateServerList(serverList)
  230. end
  231. -- 生成用于通知各个普通服发奖的数据
  232. local function genNotifyInfo(serverInfo)
  233. local info = {
  234. isWin = 0,
  235. winPlayerArr = {},
  236. defeatPlayerArr = {}
  237. }
  238. if (serverInfo.winTimes or 0) > (serverInfo.defeatTimes or 0) then
  239. info.isWin = 1
  240. end
  241. for _, playerUuid in ipairs(serverInfo.playerInfoArr) do
  242. if table.find(serverInfo.winPlayerArr) then
  243. table.insert(info.winPlayerArr, playerUuid)
  244. else
  245. table.insert(info.defeatPlayerArr, playerUuid)
  246. end
  247. end
  248. return info
  249. end
  250. -- 生成日志
  251. local function genLog()
  252. local t1, t2 = {}, {}
  253. local joinSrvArr = AreaBattleDB.GetJoinSrvArr()
  254. for idx, srvId in ipairs(joinSrvArr or {}) do
  255. t1[idx] = srvId
  256. end
  257. local str1 = table.concat(t1, ",")
  258. writeLog(str1)
  259. local len = 0
  260. local matchSrvArr = AreaBattleDB.GetMatchSrvArr()
  261. for _, srvTb in ipairs(matchSrvArr or {}) do
  262. for _, servrId in ipairs(srvTb) do
  263. len = len + 1
  264. t2[len] = servrId
  265. end
  266. end
  267. local str2 = table.concat(t2, "-")
  268. writeLog(str2)
  269. local serverList = AreaBattleDB.GetServerList()
  270. for serverId, srvInfo in pairs(serverList or {}) do
  271. local t = {serverId, srvInfo.winTimes or 0, srvInfo.defeatTimes or 0}
  272. if srvInfo.winPlayerArr and #srvInfo.winPlayerArr > 0 then
  273. local s = table.concat(Util.copyTable(srvInfo.winPlayerArr), "-")
  274. table.insert(t, s)
  275. end
  276. local str3 = table.concat(t, "|")
  277. writeLog(str3)
  278. end
  279. end
  280. -------------------------------------------C2N-------------------------------------------
  281. -- 通知普通服,争霸开始
  282. function NotifySrvJoin()
  283. local msgData = InnerMsg.wl.WL_AREABATTLE_OPEN
  284. local fdList = MiddleManager.MiddleManager_GetAllFD()
  285. for _, fd in pairs(fdList) do
  286. InnerMsg.sendMsg(fd, msgData)
  287. end
  288. end
  289. -- 通知普通服发奖
  290. function NotifySrvAwardPrizes(fd, args)
  291. local msgData = InnerMsg.wl.WL_AREABATTLE_SEND_REWARD
  292. msgData.srvBattleRes = args
  293. InnerMsg.sendMsg(fd, msgData)
  294. end
  295. -------------------------------------------N2C-----------------------------------------------
  296. -- 普通服加入战斗
  297. function N2C_JoinBattle(msg)
  298. local sourceServerId = msg.sourceServerId
  299. local joinBattleArray = msg.joinBattleArray
  300. local joinSrvArr = AreaBattleDB.GetJoinSrvArr()
  301. local serverList = AreaBattleDB.GetServerList()
  302. if not table.find(joinSrvArr, sourceServerId) and not serverList[sourceServerId] then
  303. -- 参战列表
  304. table.insert(joinSrvArr, sourceServerId)
  305. AreaBattleDB.UpdateJoinSrvArr(joinSrvArr)
  306. -- 服务器列表
  307. serverList[sourceServerId] = {
  308. winTimes = 0,
  309. defeatTimes = 0,
  310. winPlayerArr = {},
  311. playerInfoArr = joinBattleArray
  312. }
  313. AreaBattleDB.UpdateServerList(serverList)
  314. end
  315. end
  316. -- 普通服请求争霸活动的基本数据
  317. function N2C_GetBaseInfo(msg)
  318. local fd = MiddleManager.getFDBySvrIndex(msg.sourceServerId)
  319. local msgData = InnerMsg.wl.WL_AREABATTLE_BASEINFO_QUERY
  320. msgData.playerUuid = msg.playerUuid
  321. local state = AreaBattleDB.GetState()
  322. msgData.stage = state
  323. msgData.startTime, msgData.endTime = 0, 0
  324. if wDay == AreaBattleDefine.OPEN_WDAY_AREA[1] then
  325. local toDayStartTime = getTodayStartTime()
  326. msgData.startTime = toDayStartTime + AreaBattleDefine.PREPARE_STATE_START_SEC
  327. msgData.endTime = toDayStartTime + 86400 + AreaBattleDefine.END_STATE_START_SEC
  328. elseif wDay == AreaBattleDefine.OPEN_WDAY_AREA[2] then
  329. local toDayStartTime = getTodayStartTime()
  330. msgData.startTime = toDayStartTime - 86400 + AreaBattleDefine.PREPARE_STATE_START_SEC
  331. msgData.endTime = toDayStartTime + AreaBattleDefine.END_STATE_START_SEC
  332. end
  333. InnerMsg.sendMsg(fd, msgData)
  334. end
  335. -- 普通服请求本服参战玩家列表
  336. function N2C_GetJoinPlayerArr(msg)
  337. local sourceServerId = msg.sourceServerId
  338. local fd = MiddleManager.getFDBySvrIndex(sourceServerId)
  339. local msgData = InnerMsg.wl.WL_AREABATTLE_JOINPLAYER_QUERY
  340. msgData.errCode = 0
  341. msgData.playerArray = {}
  342. msgData.playerUuid = msg.playerUuid
  343. local joinSrvArr = AreaBattleDB.GetJoinSrvArr()
  344. if not joinSrvArr or not table.find(joinSrvArr, sourceServerId) then
  345. msgData.errCode = -1
  346. return InnerMsg.sendMsg(fd, msgData)
  347. end
  348. local serverList = AreaBattleDB.GetServerList()
  349. msgData.playerArray = serverList[sourceServerId] and serverList[sourceServerId].playerInfoArr or {}
  350. InnerMsg.sendMsg(fd, msgData)
  351. end
  352. -- 普通服请求本次参战的区服的匹配列表
  353. -- { { {server1, power1}, {server2, power2} }, }
  354. function N2C_GetMatchList(msg)
  355. local sourceServerId = msg.sourceServerId
  356. local fd = MiddleManager.getFDBySvrIndex(sourceServerId)
  357. local msgData = InnerMsg.wl.WL_AREABATTLE_MATCHLIST_QUERY
  358. msgData.playerUuid = msg.playerUuid
  359. msgData.matchList = {}
  360. local mathcList = AreaBattleDB.GetMatchSrvArr()
  361. local serverList = AreaBattleDB.GetServerList()
  362. for k, matchSrvTb in ipairs(mathcList) do
  363. msgData.matchList[k] = {}
  364. for idx, serverId in ipairs(matchSrvTb) do
  365. if serverList[serverId] then
  366. -- table.insert(msgData.matchList[k], serverId)
  367. local power = calcSrvPower(serverList[serverId].playerInfoArr)
  368. -- table.insert(msgData.matchList[k], power)
  369. msgData.matchList[k][idx] = {serverId, power}
  370. end
  371. end
  372. end
  373. InnerMsg.sendMsg(fd, msgData)
  374. end
  375. -- 普通服请求本服的战斗录像展示数据
  376. function N2C_GetVideoShowData(msg)
  377. local sourceServerId = msg.sourceServerId
  378. local fd = MiddleManager.getFDBySvrIndex(sourceServerId)
  379. local msgData = InnerMsg.wl.WL_AREABATTLE_VIDEOSHOW_QUERY
  380. msgData.errCode = 0
  381. msgData.playerUuid = msg.playerUuid
  382. msgData.videoShowData = {}
  383. msgData.srvInfo = {}
  384. local state = AreaBattleDB.GetState()
  385. if state ~= AreaBattleDefine.STATE_AWARD and state ~= AreaBattleDefine.STATE_END then
  386. msgData.errCode = -2
  387. return InnerMsg.sendMsg(fd, msgData)
  388. end
  389. local videoSecondIdx, leftSrvId, rightSrvId = 0, 0, 0
  390. local matchSrvArr = AreaBattleDB.GetMatchSrvArr()
  391. for k, srvTb in ipairs(matchSrvArr) do
  392. if table.find(srvTb, sourceServerId) then
  393. videoSecondIdx = k
  394. leftSrvId = srvTb[1]
  395. rightSrvId = srvTb[2]
  396. break
  397. end
  398. end
  399. if videoSecondIdx == 0 then
  400. msgData.errCode = -1
  401. return InnerMsg.sendMsg(fd, msgData)
  402. end
  403. local serverList = AreaBattleDB.GetServerList()
  404. if serverList[leftSrvId] then
  405. msgData.srvInfo.leftSrvId = leftSrvId
  406. msgData.srvInfo.leftWinTimes = serverList[leftSrvId].winTimes or 0
  407. msgData.srvInfo.leftSrvPower = calcSrvPower(serverList[leftSrvId].playerInfoArr)
  408. end
  409. if serverList[rightSrvId] then
  410. msgData.srvInfo.rightSrvId = rightSrvId
  411. msgData.srvInfo.rightWinTimes = serverList[rightSrvId].winTimes or 0
  412. msgData.srvInfo.rightSrvPower = calcSrvPower(serverList[rightSrvId].playerInfoArr)
  413. end
  414. local videoArr = AreaBattleDB.GetSrvVideoShowData(videoSecondIdx)
  415. msgData.videoShowData = videoArr
  416. InnerMsg.sendMsg(fd, msgData)
  417. end
  418. ---------------------------------------------------------------------------------------------
  419. function oneMin()
  420. if _G.is_middle ~= true then return end
  421. if not isOpen() then
  422. return
  423. end
  424. -- 与 onHour() 处理错开
  425. if Util.getMin() == 0 then
  426. return
  427. end
  428. local now = os.time()
  429. local toDayStartTime = getTodayStartTime()
  430. -- 活动第一天, 当前时间 >= 开启时间
  431. if wDay == AreaBattleDefine.OPEN_WDAY_AREA[1] then
  432. local nowRoundStartTi = AreaBattleDB.GetNowRoundStartTi()
  433. if nowRoundStartTi<= 0 or Util.diffDay(nowRoundStartTi) >= 2 then
  434. print("===================时间周六, 通过oneMin()活动开启========================")
  435. return newRoundHandle()
  436. end
  437. end
  438. -- 活动最后一天, 当前时间 < 活动结束时间
  439. if wDay == AreaBattleDefine.OPEN_WDAY_AREA[2] then
  440. local stateDB = AreaBattleDB.GetState()
  441. local nowRoundStartTi = AreaBattleDB.GetNowRoundStartTi()
  442. -- DB中活动时间处于上一轮, 则开启新一轮活动
  443. if nowRoundStartTi <= 0 or Util.diffDay(nowRoundStartTi) >= 2 then
  444. print("=================时间周日, 通过oneMin()活动开启========================")
  445. return newRoundHandle()
  446. end
  447. -- 当前处于准备阶段, 但是当前时间 >= 对战开始时间, 则进入对战阶段
  448. if now >= (toDayStartTime + AreaBattleDefine.BATTLE_STATE_START_SEC) and stateDB == AreaBattleDefine.STATE_PREPARE then
  449. -- 防止某些情况下,进入准备阶段后,普通服数据还没上传完就进入对战阶段
  450. local prepareStartTi = AreaBattleDB.GetPrepareStartTi()
  451. if now - prepareStartTi > AreaBattleDefine.PREPARE_NEED_TIME then
  452. print("======================时间周日, 通过oneMin()进入对战阶段========================")
  453. AreaBattleDB.UpdateState(AreaBattleDefine.STATE_BATTLE)
  454. BattleStageHandle()
  455. return
  456. end
  457. end
  458. -- 当前时间 >= 发奖时间
  459. if now >= (toDayStartTime + AreaBattleDefine.END_STATE_START_SEC) and stateDB == AreaBattleDefine.STATE_AWARD then
  460. print("=====================时间周日, 通过oneMin()开始发奖=======================")
  461. AwardPrizesHandle()
  462. AreaBattleDB.UpdateState(AreaBattleDefine.STATE_END)
  463. end
  464. end
  465. end
  466. function onHour(hour)
  467. if _G.is_middle ~= true then return end
  468. if hour == 0 or not wDay then
  469. updateWDay()
  470. end
  471. -- if not isOpen() then
  472. -- return
  473. -- end
  474. if not table.find(AreaBattleDefine.OPEN_WDAY_AREA, wDay) then
  475. return
  476. end
  477. -- 对战阶段
  478. if wDay == AreaBattleDefine.OPEN_WDAY_AREA[2] and hour >= 12 then
  479. local now = os.time()
  480. local stateDB = AreaBattleDB.GetState()
  481. local prepareStartTi = AreaBattleDB.GetPrepareStartTi()
  482. -- 防止某些情况下,进入准备阶段后,普通服数据还没上传完就进入对战阶段
  483. if stateDB == AreaBattleDefine.STATE_PREPARE and (now - prepareStartTi > AreaBattleDefine.PREPARE_NEED_TIME) then
  484. AreaBattleDB.UpdateState(AreaBattleDefine.STATE_BATTLE)
  485. BattleStageHandle()
  486. end
  487. end
  488. -- 发奖阶段
  489. if wDay == AreaBattleDefine.OPEN_WDAY_AREA[2] and hour >= 22 then
  490. local stateDB = AreaBattleDB.GetState()
  491. if stateDB == AreaBattleDefine.STATE_AWARD then
  492. print("===========时间周日, 通过onHour()开始发奖=======================")
  493. AwardPrizesHandle()
  494. AreaBattleDB.UpdateState(AreaBattleDefine.STATE_END)
  495. end
  496. end
  497. end
  498. -- 通知普通服发奖
  499. function BrocastServer(srvTb)
  500. for fd, notifyInfo in pairs(srvTb) do
  501. NotifySrvAwardPrizes(fd, notifyInfo)
  502. end
  503. end
  504. -- 给服务器分批
  505. function BatchServer()
  506. local matchSrvArr = AreaBattleDB.GetMatchSrvArr()
  507. if not matchSrvArr or not next(matchSrvArr) then
  508. return
  509. end
  510. local len, delay_sec = 0, 0
  511. local srvTb = {}
  512. local serverList = AreaBattleDB.GetServerList()
  513. for serverId, serverInfo in pairs(serverList or {}) do
  514. local fd = MiddleManager.getFDBySvrIndex(serverId)
  515. if fd then
  516. len = len + 1
  517. local notifyInfo = genNotifyInfo(serverInfo)
  518. srvTb[fd] = notifyInfo
  519. end
  520. if len >= AreaBattleDefine.BATCH_MAX_SRV_NUM then
  521. delay_sec = delay_sec + 5
  522. Timer.addLater(delay_sec, BrocastServer, srvTb)
  523. srvTb = {}
  524. len = 0
  525. end
  526. end
  527. if len > 0 then
  528. delay_sec = delay_sec + 5
  529. Timer.addLater(delay_sec, BrocastServer, srvTb)
  530. end
  531. end
  532. -- 发奖
  533. function AwardPrizesHandle()
  534. genLog()
  535. BatchServer()
  536. end
  537. -- 开始战斗
  538. function StartBattle()
  539. for firstIdx, battleDList in pairs(battleDataCache) do
  540. for secondIdx, playerBattleData in pairs(battleDList) do
  541. local attackerInfo = playerBattleData.attackerInfo
  542. local defenerInfo = playerBattleData.defenerInfo
  543. local args = {
  544. isWin = 0,
  545. attackerServerId = "",
  546. attackerUuid = "",
  547. defenerServerId = "",
  548. defenerUuid = ""
  549. }
  550. if attackerInfo and defenerInfo then -- 正常情况
  551. args.attackerServerId = attackerInfo.serverId
  552. args.attackerUuid = attackerInfo.playerUuid
  553. args.defenerServerId = defenerInfo.serverId
  554. args.defenerUuid = defenerInfo.playerUuid
  555. args.videoSecondIdx = firstIdx
  556. -- CombatLogicCS.combatBegin(attackerInfo.battleData, defenerInfo.battleData, CombatDefine.COMBAT_TYPE33, FightEnd, args)
  557. pcall(CombatLogicCS.combatBegin, attackerInfo.battleData, defenerInfo.battleData, CombatDefine.COMBAT_TYPE33, FightEnd, args)
  558. elseif attackerInfo or defenerInfo then
  559. -- 有一方战斗数据异常, 则跳过战斗,有战斗数据的一方胜利
  560. if attackerInfo then
  561. args.isWin = 1
  562. args.attackerServerId = attackerInfo.serverId
  563. args.attackerUuid = attackerInfo.playerUuid
  564. local srvId, playerUuid = getBattleObjInfo(firstIdx, secondIdx, 2)
  565. args.defenerServerId = srvId
  566. args.defenerUuid = playerUuid
  567. else
  568. local srvId, playerUuid = getBattleObjInfo(firstIdx, secondIdx, 1)
  569. args.attackerServerId = srvId
  570. args.attackerUuid = playerUuid
  571. args.isWin = 0
  572. args.defenerServerId = defenerInfo.serverId
  573. args.defenerUuid = defenerInfo.playerUuid
  574. end
  575. updateDBBattleResult(args)
  576. end
  577. end
  578. end
  579. AreaBattleDB.UpdateState(AreaBattleDefine.STATE_AWARD)
  580. battleDataCache = {}
  581. end
  582. -- 外部调用
  583. -- 收到玩家的战斗数据后, 进行缓存
  584. function BattleDataHanle(msg)
  585. if msg.errCode == 1 then
  586. local extraArgs = msg.extraArgs
  587. local firstIdx = extraArgs.firstIdx
  588. local secondIdx = extraArgs.secondIdx
  589. local identity = extraArgs.identity
  590. battleDataCache[firstIdx] = battleDataCache[firstIdx] or {}
  591. battleDataCache[firstIdx][secondIdx] = battleDataCache[firstIdx][secondIdx] or {}
  592. local targetTb = battleDataCache[firstIdx][secondIdx]
  593. local playerBattleData = nil
  594. if identity == 1 then
  595. if not targetTb.attackerInfo then
  596. targetTb.attackerInfo = {}
  597. playerBattleData = targetTb.attackerInfo
  598. end
  599. end
  600. if identity == 2 then
  601. if not targetTb.defenerInfo then
  602. targetTb.defenerInfo = {}
  603. playerBattleData = targetTb.defenerInfo
  604. end
  605. end
  606. if playerBattleData then
  607. -- playerBattleData.errCode = errCode
  608. playerBattleData.serverId = extraArgs.serverId
  609. playerBattleData.playerUuid = extraArgs.playerUuid
  610. playerBattleData.battleData = {
  611. objList = msg.objList,
  612. helpList = msg.helpList,
  613. roleBase = msg.roleBase,
  614. formation = msg.formation,
  615. jiBan = msg.jiBan,
  616. }
  617. end
  618. end
  619. -- 开始进入战斗
  620. -- StartBattle()
  621. end
  622. -- 外部调用, 来自本模块的战斗结束后的回调函数
  623. function FightEnd(result, combatType, combatInfo, extraArgs)
  624. if result == CombatDefine.RESULT_WIN then
  625. extraArgs.isWin = 1
  626. end
  627. updateDBBattleResult(extraArgs)
  628. combatInfo.time = os.time()
  629. combatInfo.defender.name = ""
  630. CombatVideo.SaveCombatVideo(CombatVideo.VIDEOTYPE_AREABATTLE, combatInfo, extraArgs.videoSecondIdx)
  631. end