Kaynağa Gözat

战区争霸战报分享回访功能

gitxsm 7 ay önce
ebeveyn
işleme
e5385a97ef

+ 84 - 24
script/module/areaBattle/AreaBattleCS.lua

@@ -18,6 +18,8 @@ local wDay
 -- 玩家战斗数据缓存表
 local battleDataCache = {}
 
+local requestArr = {}
+
 
 local function updateWDay()
     wDay = Util.getWeekDay()
@@ -203,31 +205,30 @@ local function getPlayerBattleData(serverId, playerUuid, extraArgs)
     BattleDataCS.GetPlayerCombatData(serverId, playerUuid, BattleDataCS.AREABTTLE_TAG, CombatDefine.COMBAT_TYPE33, extraArgs)
 end
 
--- 处于准备阶段处理, 给服务器进行匹配, 并通知普通服上传玩家战斗数据
-local function prepareHandle()
-    local stateDB = AreaBattleDB.GetState()
-    if stateDB ~= AreaBattleDefine.STATE_PREPARE then
+function Timed_GetPlayerBattleData()
+    if not requestArr or not next(requestArr) then
         return
     end
 
-    -- 服务器进行匹配
-    genMacthArr()
+    local maxNum = math.min(#requestArr, AreaBattleDefine.GET_BATTLE_MAX_CNT_TIMES)
+    for i=1, maxNum do
+        local info = table.remove(requestArr)
+        getPlayerBattleData(info[1], info[2], info[3])
+    end
 
-    -- 让普通服上传战斗数据
+    if #requestArr > 0 then
+        Timer.addLater(1, Timed_GetPlayerBattleData, requestArr)
+    end
+end
+
+-- 向普通服请求战斗数据
+local function requestPlayerBattleData()
     local matchSrvArr = AreaBattleDB.GetMatchSrvArr()
     local serverList = AreaBattleDB.GetServerList()
     if not matchSrvArr or #matchSrvArr == 0 or not next(serverList) then
         return
     end
 
-    local args = {
-        firstIdx = 0,
-        secondIdx = 0,
-        identity = 0, --身份,1-进攻方, 2-防御方
-        serverId = 0,
-        playerUuid = "",
-    }
-
     for idx, matchSrvTb in ipairs(matchSrvArr) do
         local serverId1 = matchSrvTb[1]
         local serverId2 = matchSrvTb[2]
@@ -235,24 +236,53 @@ local function prepareHandle()
         local playerArr2 = serverList[serverId2] and serverList[serverId2].playerInfoArr or {}
         local maxPlayerCnt = math.max(#playerArr1, #playerArr2)
 
-        args.firstIdx = idx
-
         for i=1, maxPlayerCnt do
-            args.secondIdx = i
             local playerUuid1 = playerArr1[i].uuid
             local playerUuid2 = playerArr2[i].uuid
 
             if playerUuid1 then
-                args.identity = 1
-                getPlayerBattleData(serverId1, playerUuid1, args)
+                local args = {
+                    firstIdx = idx,
+                    secondIdx = i,
+                    identity = 1, --身份,1-进攻方, 2-防御方
+                    serverId = 0,
+                    playerUuid = "",
+                }
+                -- getPlayerBattleData(serverId1, playerUuid1, args)
+                requestArr[#requestArr+1] = {serverId1, playerUuid1, args}
             end
 
             if playerUuid2 then
-                args.identity = 2
-                getPlayerBattleData(serverId2, playerUuid2, args)
+                local args = {
+                    firstIdx = idx,
+                    secondIdx = i,
+                    identity = 2, --身份,1-进攻方, 2-防御方
+                    serverId = 0,
+                    playerUuid = "",
+                }
+                -- getPlayerBattleData(serverId2, playerUuid2, args)
+                requestArr[#requestArr+1] = {serverId2, playerUuid2, args}
             end
         end
     end
+
+    Timed_GetPlayerBattleData()
+end
+
+
+
+-- 处于准备阶段处理, 给服务器进行匹配, 并通知普通服上传玩家战斗数据
+local function prepareHandle()
+    local stateDB = AreaBattleDB.GetState()
+    if stateDB ~= AreaBattleDefine.STATE_PREPARE then
+        return
+    end
+
+    -- 服务器进行匹配
+    genMacthArr()
+
+    -- 让普通服上传战斗数据
+    requestPlayerBattleData()
 end
 
 -- 上一轮 ~ 新一轮准备阶段的处理
@@ -455,7 +485,7 @@ function N2C_GetBaseInfo(msg)
         msgData.endTime = toDayStartTime + AreaBattleDefine.END_STATE_START_SEC
 
         local now = os.time()
-        if state == AreaBattleDefine.STATE_AWARD and now < toDayStartTime + END_STATE_START_SEC then
+        if state == AreaBattleDefine.STATE_AWARD and now < toDayStartTime + AreaBattleDefine.END_STATE_START_SEC then
             msgData.stage = AreaBattleDefine.STATE_BATTLE
         end
     else
@@ -609,7 +639,6 @@ function oneMin()
         return
     end
 
-
     local now = os.time()
     local toDayStartTime = getTodayStartTime()
 
@@ -629,6 +658,23 @@ function oneMin()
         if now >= (toDayStartTime + AreaBattleDefine.BATTLE_STATE_START_SEC) and stateDB == AreaBattleDefine.STATE_PREPARE then
             -- 防止某些情况下,进入准备阶段后普通服数据还没上传完就进入对战阶段
             if now - nowRoundStartTi > AreaBattleDefine.BATTLE_DATA_TIME then
+
+                -- 重启跨服后导致战斗数据缓存没了,则重新获取
+                if not next(battleDataCache) then
+                    -- 可能存在响应比较慢的情况,保证只执行一次 requestPlayerBattleData
+                    print("=============战斗数据缓存没了,重新请求=====================")
+                    if #requestArr == 0 then
+                        return requestPlayerBattleData()
+                    end
+                end
+
+                -- 处于请求战斗数据过程中, 等请求完再进入战斗
+                if #requestArr > 0 then
+                    print("=============处于请求战斗缓存中,请稍后=====================")
+                    return
+                end
+
+
                 print("======================时间周日, 通过oneMin()进入对战阶段========================")
                 AreaBattleDB.UpdateState(AreaBattleDefine.STATE_BATTLE)
                 BattleStageHandle()
@@ -664,6 +710,20 @@ function onHour(hour)
 
         -- 防止某些情况下,进入准备阶段后,普通服数据还没上传完就进入对战阶段
         if stateDB == AreaBattleDefine.STATE_PREPARE and (now - nowRoundStartTi > AreaBattleDefine.BATTLE_DATA_TIME) then
+
+            -- 重启跨服后导致战斗数据缓存没了,则重新获取
+            if not next(battleDataCache) then
+                -- 可能存在响应比较慢的情况,保证只执行一次 requestPlayerBattleData
+                if #requestArr == 0 then
+                    return requestPlayerBattleData()
+                end
+            end
+
+            -- 处于请求战斗数据过程中, 等请求完再进入战斗
+            if #requestArr > 0 then
+                return
+            end
+
             AreaBattleDB.UpdateState(AreaBattleDefine.STATE_BATTLE)
             BattleStageHandle()
         end

+ 3 - 1
script/module/areaBattle/AreaBattleDefine.lua

@@ -55,4 +55,6 @@ AWARDTYPE2MAILID = {
     [AWARD_TYPE4] = 7028,
     [AWARD_TYPE5] = 7029,
     [AWARD_TYPE6] = 7025,
-}
+}
+
+GET_BATTLE_MAX_CNT_TIMES = 20  -- 一次最多请求30名玩家的战斗数据

+ 0 - 1
script/module/areaBattle/AreaBattleNS.lua

@@ -119,7 +119,6 @@ function mailQueue:insertDB()
 
         local ok, err = pcall(sendMail, AreaBattleDefine.AWARDTYPE2MAILID[awardType], uuid, playerInfo[2])
         if not ok then
-            print(err)
             if not self.repeatTb[uuid] or self.repeatTb[uuid] < self.repeatMaxTimes then -- 插入失败后,最多重新插入3次
                 mailQueue:add(playerInfo)
                 self.repeatTb[uuid] = (self.repeatTb[uuid] or 0) + 1

+ 15 - 0
script/module/combat/CombatVideo.lua

@@ -17,6 +17,7 @@ local Broadcast = require("broadcast.Broadcast")
 local RoleLogic = require("role.RoleLogic")
 local InnerMsg = require("core.InnerMsg")
 local MiddleManager = require("middle.MiddleManager")
+local PanelDefine = require("broadcast.PanelDefine")
 
 
 VIDEO_SINGLE_MAXCNT = 5 	-- 个人记录条数上限
@@ -367,6 +368,18 @@ local function lookCSCombatVideo(combatVideo, args)
 	CombatLogic.sendCombatFinish(human, combatInfo)
 end
 
+local function videoPlayBack(combatVideo, args)
+	local human = ObjHuman.onlineUuid[args.playerUid]
+	if not human then
+		return
+	end
+	combatVideo.combatInfo.panelID = PanelDefine.PANEL_ID_1018
+	CombatLogic.repeatCombat(human, combatVideo.combatInfo)
+end
+
+
+
+
 -- 向跨服查询战斗录像数据
 function NS_Video_Query(videoUuid, extraArgs)
 	if not videoUuid then
@@ -391,6 +404,8 @@ function NS_Video_Query_Result(msg)
 
 	if extraArgs.opType == 1 then
 		lookCSCombatVideo(msg.videoData, extraArgs)
+	elseif extraArgs.opType == 2 then
+		videoPlayBack(msg.videoData, extraArgs)
 	end
 end
 

+ 11 - 0
script/module/warReport/WarReportLogic.lua

@@ -29,6 +29,7 @@ local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
 local ItemDefine = require("bag.ItemDefine")
 local HeroGrowUp = require("absAct.HeroGrowUp")
 local Config = require("Config")
+local CombatVideo = require("combat.CombatVideo")
 
 WAR_REPORT_1 = 1 -- 冠军联赛
 WAR_REPORT_2 = 2 -- 王者争霸
@@ -366,6 +367,16 @@ end
 -- 回放
 function playBack(human, type, id, nDesServerID)
    print("[playBack] type = "..type.. " id = "..id.." nDesServerID = "..nDesServerID)
+
+
+   if type == 5 then
+      local extraArgs = {
+         playerUid = human.db._id,
+         opType = 2,
+      }
+      return CombatVideo.NS_Video_Query(id, extraArgs)
+   end
+
    -- 本服
    if -1 >= nDesServerID then
       local msgInner = {} --InnerMsg.lw.LW_WARREPORT_GET_COMBATINFO