From 388823edfe6308cba6f76ca6dc4f20022c5cb2be Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 30 六月 2025 19:03:50 +0800
Subject: [PATCH] 10431 【英文】看广告获得限时代金券

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py |  255 +++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 205 insertions(+), 50 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py
index 9a35b2a..5a3d184 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py
@@ -25,6 +25,7 @@
 import PlayerCompensation
 import PlayerDBGSEvent
 import ChPyNetSendPack
+import DataRecordPack
 import NetPackCommon
 import IpyGameDataPY
 import PyGameData
@@ -55,6 +56,8 @@
         self.tagLV = 0
         self.tagJob = 0
         self.tagScore = 0
+        self.tagFace = 0
+        self.tagFacePic = 0
         return
     
 class ArenaBattleRec():
@@ -72,6 +75,8 @@
         self.tagPlayerID = 0 # 小于10000的为机器人ID
         self.tagLV = 0
         self.tagJob = 0
+        self.tagFace = 0
+        self.tagFacePic = 0
         self.tagScore = 0
         
         self.addScore = 0
@@ -90,6 +95,7 @@
 value4        tagScore        目标积分,非实时积分,一般机器人时有用
 strValue1    resultInfo    isWin,addScore
 strValue2    updInfo    isDispose,updScore
+strValue3    faceInfo    face,facePic
 '''
 
 ''' 榜单数据 '''
@@ -101,10 +107,18 @@
 def SetArenaBillRealmLV(billData, realmLV): return billData.SetValue1(realmLV)
 def GetArenaBillLV(billData): return billData.GetValue2()
 def SetArenaBillLV(billData, lv): billData.SetValue2(lv)
+def GetArenaBillFace(billData): return billData.GetValue3()
+def SetArenaBillFace(billData, face): billData.SetValue3(face)
+def GetArenaBillFacePic(billData): return billData.GetValue4()
+def SetArenaBillFacePic(billData, facePic): billData.SetValue4(facePic)
 def GetArenaBillScore(billData): return billData.GetCmpValue()
-def GetArenaBillFightPower(billData): return billData.GetCmpValue2()
-def SetArenaBillFightPower(billData, fightPower): billData.SetCmpValue2(fightPower)
-                
+def SetArenaBillScore(billData, score): return billData.SetCmpValue(score)
+def GetArenaBillFightPower(billData): return billData.GetCmpValue2() * ShareDefine.Def_PerPointValue + billData.GetCmpValue3()
+def SetArenaBillFightPower(billData, fightPower):
+    billData.SetCmpValue2(fightPower / ShareDefine.Def_PerPointValue)
+    billData.SetCmpValue3(fightPower % ShareDefine.Def_PerPointValue)
+    return
+
 def OnServerStart():
     universalRecMgr = GameWorld.GetUniversalRecMgr()
     recDataList = universalRecMgr.GetTypeList(Def_RecType_ArenaBattleRecord)
@@ -130,6 +144,11 @@
         battleRec.isDispose = int(updInfo[0] if len(updInfo) > 0 else 0)
         battleRec.updScore = int(updInfo[1] if len(updInfo) > 1 else 0)
         
+        strValue3 = recData.GetStrValue3()
+        faceInfo = strValue3.split(",") if strValue3 else []
+        battleRec.tagFace = int(faceInfo[0] if len(faceInfo) > 0 else 0)
+        battleRec.tagFacePic = int(faceInfo[1] if len(faceInfo) > 1 else 0)
+        
         battleRecList = GetPlayerArenaBattleRecList(playerID)
         battleRecList.append(battleRec)
         
@@ -148,8 +167,10 @@
             if billBoard.GetCount() > 0:
                 robotMaxCount = IpyGameDataPY.GetFuncCfg("ArenaRobot", 1)
                 PlayerBillboard.UpdateBillboardMaxCount(ShareDefine.Def_BT_Arena, robotMaxCount)
+                __RandRobotLVList(robotMaxCount)
             else:
                 __ResetArenaRobotBillboard()
+                
     return
 
 def OnServerClose():
@@ -170,6 +191,7 @@
             
             recData.SetStrValue1("%s,%s" % (int(battleRec.isWin), battleRec.addScore))
             recData.SetStrValue2("%s,%s" % (int(battleRec.isDispose), battleRec.updScore))
+            recData.SetStrValue3("%s,%s" % (battleRec.tagFace, battleRec.tagFacePic))
             
     return
 
@@ -208,6 +230,7 @@
     if updScore != None:
         __SyncPlayerBechallengedUpdScore(curPlayer, updScore)
         
+    PlayerControl.DoOfflineUnprocessed(curPlayer, "BattleResult", __DoOfflineArenaBattleResult)
     return
 
 def OnDayEx():
@@ -270,6 +293,10 @@
     # 删除对战记录
     GameWorld.GetUniversalRecMgr().Delete(Def_RecType_ArenaBattleRecord)
     PyGameData.g_arenaPlayerBattleRecDict = {}
+    PyGameData.g_arenaPlayerMatchDict = {}
+    
+    # 删除未处理的
+    PlayerControl.DelOfflineUnprocessed("BattleResult")
     
     # 更新新赛季信息
     if openServerDay <= customMaxServerDay and OSSeasonState == 0:
@@ -293,6 +320,11 @@
     robotMaxCount = IpyGameDataPY.GetFuncCfg("ArenaRobot", 1)
     GameWorld.Log("    重置初始化竞技场机器人榜单! robotMaxCount=%s" % robotMaxCount)
     PlayerBillboard.UpdateBillboardMaxCount(ShareDefine.Def_BT_Arena, robotMaxCount)
+    
+    PyGameData.g_arenaRobotLVList = []
+    worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaWorldLV, worldLV)
+    GameWorld.Log("    worldLV=%s" % worldLV)
     
     # 获取机器人随机等级、积分列表
     robotLVList = __RandRobotLVList(robotMaxCount)
@@ -318,8 +350,9 @@
         value1 = robotRealmLV
         value2 = robotLV
         cmpValue = robotScore
-        cmpValue2 = robotFightPower
-        PlayerBillboard.UpdatePlayerBillboard(robotID, robotName, opInfo, ShareDefine.Def_BT_Arena, type2, value1, value2, cmpValue, autoSort=False, cmpValue2=cmpValue2)
+        cmpValue2 = robotFightPower / ShareDefine.Def_PerPointValue
+        cmpValue3 = robotFightPower % ShareDefine.Def_PerPointValue
+        PlayerBillboard.UpdatePlayerBillboard(robotID, robotName, opInfo, ShareDefine.Def_BT_Arena, type2, value1, value2, cmpValue, autoSort=False, cmpValue2=cmpValue2, cmpValue3=cmpValue3)
         
     billBoard.Sort()
     return
@@ -369,11 +402,13 @@
             
     lvList[0] = robotMinLV
     lvList[-1] = robotMaxLV
+    PyGameData.g_arenaRobotLVList = sorted(lvList, reverse=True)
     return lvList
 
 def __GetRobotLVRange():
     ## 获取赛季机器人等级范围
-    worldLV = max(1, PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv))
+    worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaWorldLV)
+    worldLV = max(1, worldLV)
     ipyDataMgr = IpyGameDataPY.IPY_Data()
     maxCnt = ipyDataMgr.GetWorldLVCount()
     worldLVTime = 0
@@ -503,11 +538,11 @@
     # 其他的获得保底奖励
     orderPlayerIDList = orderPlayerIDDict.keys()
     floorPlayerIDList = []
-    for playerID, batRecList in PyGameData.g_arenaPlayerBattleRecDict.items():
-        if not batRecList:
-            #GameWorld.DebugLog("没有对战记录,不发奖励")
-            continue
+    for playerID, battleRecList in PyGameData.g_arenaPlayerBattleRecDict.items():
         if playerID in orderPlayerIDList:
+            continue
+        if not battleRecList:
+            #GameWorld.DebugLog("没有对战记录的不发! ", playerID)
             continue
         floorPlayerIDList.append(playerID)
         PlayerCompensation.SendMailByKey("ArenaFloorAward%s" % awardType, [playerID], floorAwardList)
@@ -515,21 +550,27 @@
     GameWorld.Log("    奖励保底玩家信息: %s" % floorPlayerIDList)
     return
 
-def MapServer_Arena(curPlayer, msgList):
-    GameWorld.DebugLog("MapServer_Arena %s" % str(msgList), curPlayer.GetPlayerID())
+def MapServer_Arena(playerID, msgList):
+    GameWorld.DebugLog("MapServer_Arena %s" % str(msgList), playerID)
     if not msgList:
         return
     
+    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
     cmd = msgList[0]
     cmdDict = msgList[1] if len(msgList) > 1 else {}
     retDict = {}
     
     # 匹配刷新
     if cmd == "MatchRefresh":
+        if not curPlayer:
+            return
         __DoArenaMatchRefresh(curPlayer, cmdDict["isRefresh"], cmdDict["playerLV"], cmdDict["playerScore"], cmdDict.get("gmMatchIDList"))
         
     # 对战结算
     elif cmd == "BattleResult":
+        if not curPlayer:
+            PlayerControl.AddOfflineUnprocessed(playerID, "BattleResult", cmdDict)
+            return
         retDict = __DoArenaBattleResult(curPlayer, cmdDict)
         
     return msgList + [retDict]
@@ -568,13 +609,13 @@
         playerOrder = maxOrder + 1
         
     GameWorld.DebugLog("    maxOrder=%s,playerOrder=%s" % (maxOrder, playerOrder), playerID)
-    
+    highRandOrder, lowRandOrder = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 5) # 前X名匹配比自己高名次时直接随机
     matchOrderList = [] # 匹配到的名次
     # 非第一名的匹配比自身名次高的
     if playerOrder > 1 and higherOrderPerList:
         higherOrderCount = playerOrder - 1 # 比玩家高的名次的个数
         # 小于10个的直接纯随机
-        if 0 < higherOrderCount < 10:
+        if 0 < higherOrderCount < highRandOrder:
             randOrderList = range(1, playerOrder)
             random.shuffle(randOrderList)
             matchOrderList.extend(randOrderList[:len(higherOrderPerList)])
@@ -582,7 +623,7 @@
                                % (higherOrderCount, randOrderList, matchOrderList), playerID)
             
         # 按比例划分
-        elif higherOrderCount >= 10:
+        elif higherOrderCount >= highRandOrder:
             randMaxOrder = playerOrder - 1
             for per in higherOrderPerList:
                 per = min(per, 100) # 最多到100
@@ -605,7 +646,7 @@
     if 1 <= playerOrder < maxOrder and lowerOrderPerList:
         lowerOrderCount = maxOrder - playerOrder # 比玩家低的名次的个数
         # 小于10个的直接纯随机
-        if 0 < lowerOrderCount < 10:
+        if 0 < lowerOrderCount < lowRandOrder:
             randOrderList = range(playerOrder + 1, maxOrder + 1)
             random.shuffle(randOrderList)
             matchOrderList.extend(randOrderList[:len(lowerOrderPerList)])
@@ -613,7 +654,7 @@
                                % (lowerOrderCount, randOrderList, matchOrderList), playerID)
             
         # 按比例划分
-        elif lowerOrderCount >= 10:
+        elif lowerOrderCount >= lowRandOrder:
             randMinOrder = playerOrder + 1
             for per in lowerOrderPerList:
                 per = min(per, 100) # 最多到100
@@ -664,17 +705,23 @@
             matchOrderList = matchOrderList[:needMatchCount - len(gmMatchOrderList)]
         matchOrderList += gmMatchOrderList
         matchOrderList.sort()
+            
+    matchRobotRate = IpyGameDataPY.GetFuncCfg("ArenaMatch", 4) # 每次可直接匹配一个机器人概率
+    if matchRobotRate and matchOrderList and len(matchOrderList) >= needMatchCount and GameWorld.CanHappen(matchRobotRate, 100):
+        popOrder = matchOrderList.pop(-1) # 去掉最后一个
+        GameWorld.DebugLog("    概率匹配到一个机器人,去掉最后一个! matchRobotRate=%s,popOrder=%s" % (matchRobotRate, popOrder), playerID)
+        
     GameWorld.DebugLog("    最终匹配到的名次列表: matchOrderList=%s" % matchOrderList, playerID)
     
     # 随机机器人备用信息
-    openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1)
+    openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1)    
     
-    randRobotLVPerRange = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 3)
-    minLV, maxLV = IpyGameDataPY.GetFuncEvalCfg("ArenaRobot", 2) # 机器人最小、最大等级
-    randMinLV = min(minLV, int(playerLV * randRobotLVPerRange[0] / 100.0))
-    randMaxLV = min(maxLV, int(playerLV * randRobotLVPerRange[1] / 100.0))
+    minLV, _ = IpyGameDataPY.GetFuncEvalCfg("ArenaRobot", 2) # 机器人最小、最大等级
+    randMinLV, randMaxLV = minLV - 10, minLV
+    #randMinLV = min(minLV, int(playerLV * randRobotLVPerRange[0] / 100.0))
+    #randMaxLV = min(maxLV, int(playerLV * randRobotLVPerRange[1] / 100.0))
     
-    randRobotScorePerRange = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 4)
+    randRobotScorePerRange = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 3)
     randMinScore = int(playerScore * randRobotScorePerRange[0] / 100.0)
     randMaxScore = int(playerScore * randRobotScorePerRange[1] / 100.0)
     
@@ -714,10 +761,18 @@
                         SetArenaBillRealmLV(billData, cacheDict["RealmLV"])
                         SetArenaBillLV(billData, cacheDict["LV"])
                         SetArenaBillFightPower(billData, cacheDict["FightPower"])
+                        SetArenaBillFace(billData, cacheDict.get("Face", 0))
+                        SetArenaBillFacePic(billData, cacheDict.get("FacePic", 0))
+                else:
+                    if matchIndex < len(PyGameData.g_arenaRobotLVList):
+                        robotLV = PyGameData.g_arenaRobotLVList[matchIndex] # 同步更新机器人榜单变化等级
+                        SetArenaBillLV(billData, robotLV)
                         
                 matchPlayer.tagLV = GetArenaBillLV(billData)
                 matchPlayer.tagJob = GetArenaBillJob(billData)
                 matchPlayer.tagScore = GetArenaBillScore(billData)
+                matchPlayer.tagFace = GetArenaBillFace(billData)
+                matchPlayer.tagFacePic = GetArenaBillFacePic(billData)
                 
                 GameWorld.DebugLog("    %s 匹配在榜单上的: tagPlayerID=%s,tagLV=%s,tagScore=%s,matchOrder=%s" 
                                    % (i + 1, matchPlayer.tagPlayerID, matchPlayer.tagLV, matchPlayer.tagScore, matchOrder), playerID)
@@ -749,19 +804,40 @@
         matchInfo.Job = matchPlayer.tagJob
         matchInfo.LV = matchPlayer.tagLV
         matchInfo.Score = matchPlayer.tagScore
+        matchInfo.Face = matchPlayer.tagFace
+        matchInfo.FacePic = matchPlayer.tagFacePic
         
         # 玩家读取额外信息, 机器人其他信息不处理,这里直接读最新的查看缓存,防止刷新不及时(并不是实时数据,只是相对实时,前端可自行控制刷新频率)
         if matchInfo.PlayerID > MaxRobotID:
             curCache = PlayerViewCache.FindViewCache(matchInfo.PlayerID)
             if curCache:
                 cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
+                fightPower = cacheDict["FightPower"]
+                matchInfo.LV = cacheDict["LV"]
                 matchInfo.PlayerName = cacheDict["Name"]
                 matchInfo.RealmLV = cacheDict["RealmLV"]
-                matchInfo.FightPower = cacheDict["FightPower"]
-                
+                matchInfo.FightPower = fightPower % ShareDefine.Def_PerPointValue
+                matchInfo.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue
+                matchInfo.Face = cacheDict.get("Face", 0)
+                matchInfo.FacePic = cacheDict.get("FacePic", 0)
+        else:
+            # 此处机器人的暂忽略等级变化的同步,仅在刷新、更新积分时同步,此处省略查询机器人所属榜单排名
+            pass
+        
         clientPack.MatchList.append(matchInfo)
     clientPack.MatchCount = len(clientPack.MatchList)
     NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
+def __DoOfflineArenaBattleResult(curPlayer, recData, cmdName, cmdDict):
+    ## 执行离线未处理的战斗结果
+    recTime = recData.GetTime()
+    msgList = [cmdName, cmdDict]
+    retDict = __DoArenaBattleResult(curPlayer, cmdDict)
+    retDict["offlineRecTime"] = recTime
+    ret = msgList + [retDict]
+    resultName = '%s' % ret 
+    curPlayer.MapServer_QueryPlayerResult(0, 0, "Arena", resultName, len(resultName))
     return
 
 def __DoArenaBattleResult(curPlayer, cmdDict):
@@ -770,6 +846,7 @@
     retDict = {}
     retDict.update(cmdDict)
     
+    accID = curPlayer.GetAccID()
     playerID = curPlayer.GetPlayerID()
     GameWorld.DebugLog("竞技场玩家战斗结果: %s" % str(cmdDict), playerID)
     
@@ -793,14 +870,15 @@
    
     curScore = playerScore
     isFindTag = False
-    tagLV, tagJob, tagScore = 0, 0, 0
+    tagLV, tagJob, tagScore, tagFace, tagFacePic = 0, 0, 0, 0, 0
+    tagRealmLV, tagFightPower, tagAccID = 0, 0, "" # 机器人无值
     
     # 先找匹配列表
     matchList = PyGameData.g_arenaPlayerMatchDict.get(playerID, [])
     for matchPlayer in matchList:
         if matchPlayer.tagPlayerID == tagPlayerID:
             isFindTag = True
-            tagLV, tagJob, tagScore = matchPlayer.tagLV, matchPlayer.tagJob, matchPlayer.tagScore
+            tagLV, tagJob, tagScore, tagFace, tagFacePic = matchPlayer.tagLV, matchPlayer.tagJob, matchPlayer.tagScore, matchPlayer.tagFace, matchPlayer.tagFacePic
             GameWorld.DebugLog("    对手在匹配列表中! tagLV=%s, tagJob=%s, tagScore=%s" % (tagLV, tagJob, tagScore), playerID)
             break
         
@@ -810,7 +888,7 @@
         for battleRec in curBattleRecList:
             if battleRec.tagPlayerID == tagPlayerID:
                 isFindTag = True
-                tagLV, tagJob, tagScore = battleRec.tagLV, battleRec.tagJob, battleRec.tagScore
+                tagLV, tagJob, tagScore, tagFace, tagFacePic = battleRec.tagLV, battleRec.tagJob, battleRec.tagScore, battleRec.tagFace, battleRec.tagFacePic
                 GameWorld.DebugLog("    对手在对战记录中! tagLV=%s, tagJob=%s, tagScore=%s" % (tagLV, tagJob, tagScore), playerID)
                 break
             
@@ -840,45 +918,71 @@
     
     opInfo = ""
     # 结算自己
-    addScore = __CalcBattleAddScore(curScore, tagScore, isWin)
+    addScore = __CalcBattleAddScore(playerID, curScore, tagScore, isWin)
     updScore = max(0, playerScore + addScore)
-    GameWorld.DebugLog("    更新自身积分: addScore=%s,updScore=%s" % (addScore, updScore), playerID)
     
     curOrder = billBoard.IndexOfByID(playerID) + 1  # 更新前获取名次
+    cmpValue2 = fightPower / ShareDefine.Def_PerPointValue
+    cmpValue3 = fightPower % ShareDefine.Def_PerPointValue
+    face = curPlayer.GetFace()
+    facePic =  curPlayer.GetFacePic()
     PlayerBillboard.UpdatePlayerBillboard(playerID, playerName, opInfo, ShareDefine.Def_BT_Arena, playerJob,
-                                          realmLV, playerLV, updScore, autoSort=False, cmpValue2=fightPower)
+                                          realmLV, playerLV, updScore, autoSort=False, cmpValue2=cmpValue2, cmpValue3=cmpValue3, value3=face, value4=facePic)
     
     awardItemList = []
     if isWin:
         randItemList = IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 3)
         awardItemInfo = GameWorld.GetResultByRandomList(randItemList)
         if awardItemInfo:
-            awardItemList.append(awardItemInfo)
-            
+            awardItemList.append(awardItemInfo[:3])
+            isWorldNotify = awardItemInfo[3] if len(awardItemInfo) > 3 else 0
+            if isWorldNotify:
+                PlayerControl.WorldNotify(0, "ArenaWinerItem", [curPlayer.GetName(), awardItemInfo[0], "", awardItemInfo[1]])
+                
+    tagAddScore = __CalcBattleAddScore(tagPlayerID, tagScore, curScore, not isWin)
+    updTagScore = max(0, tagScore + tagAddScore)
     # 结算对手,仅玩家时结算,机器人不处理
     if tagPlayerID > MaxRobotID:
-        tagAddScore = __CalcBattleAddScore(tagScore, curScore, not isWin)
-        updTagScore = max(0, tagScore + tagAddScore)
-        GameWorld.DebugLog("    更新对手积分: tagAddScore=%s,updTagScore=%s" % (tagAddScore, updTagScore), playerID)
         tagCache = PlayerViewCache.FindViewCache(tagPlayerID)
         if tagCache:
             cacheDict = PlayerViewCache.GetCachePropDataDict(tagCache)
             tagOpInfo = ""
+            tagLV = cacheDict["LV"]
             tagPlayerName = cacheDict["Name"]
             tagRealmLV = cacheDict["RealmLV"]
             tagFightPower = cacheDict["FightPower"]
+            tagAccID = cacheDict["AccID"]
+            tagCmpValue2 = tagFightPower / ShareDefine.Def_PerPointValue
+            tagCmpValue3 = tagFightPower % ShareDefine.Def_PerPointValue
+            tagFace = cacheDict.get("Face", 0)
+            tagFacePic = cacheDict.get("FacePic", 0)
             PlayerBillboard.UpdatePlayerBillboard(tagPlayerID, tagPlayerName, tagOpInfo, ShareDefine.Def_BT_Arena, tagJob,
-                                                  tagRealmLV, tagLV, updTagScore, autoSort=False, cmpValue2=tagFightPower)
+                                                  tagRealmLV, tagLV, updTagScore, autoSort=False, cmpValue2=tagCmpValue2, cmpValue3=tagCmpValue3, value3=tagFace, value4=tagFacePic)
     else:
-        updTagScore = tagScore
-        GameWorld.DebugLog("    机器人对手,积分不变!updTagScore=%s" % updTagScore, playerID)
-        
+        robotBillboardData = billBoard.FindByID(tagPlayerID)
+        if robotBillboardData:
+            SetArenaBillScore(robotBillboardData, updTagScore)
+            
     # 都更新完后排序一次
     billBoard.Sort()
     updOrder = billBoard.IndexOfByID(playerID) + 1 # 取最新名次
+    GameWorld.DebugLog("    更新自身积分: addScore=%s,updScore=%s,curOrder=%s,updOrder=%s" % (addScore, updScore, curOrder, updOrder), playerID)
+    GameWorld.DebugLog("    更新对手积分: tagPlayerID=%s,tagAddScore=%s,updTagScore=%s" % (tagPlayerID, tagAddScore, updTagScore), playerID)
     retDict.update({"addScore":addScore, "updScore":updScore, "curOrder":curOrder, "updOrder":updOrder,
                     "awardItemList":awardItemList, "isOK":True})
     
+    if tagPlayerID <= MaxRobotID:
+        tagUpdOrder = billBoard.IndexOfByID(tagPlayerID) + 1 # 取最新名次
+        tagOrderIndex = tagUpdOrder - 1
+        if tagUpdOrder >= 1 and tagOrderIndex < len(PyGameData.g_arenaRobotLVList) and tagOrderIndex < billBoard.GetCount():
+            GameWorld.DebugLog("    PyGameData.g_arenaRobotLVList=%s" % PyGameData.g_arenaRobotLVList, playerID)
+            updRobotLV = PyGameData.g_arenaRobotLVList[tagOrderIndex]
+            robotBillboardData = billBoard.At(tagOrderIndex)
+            SetArenaBillLV(robotBillboardData, updRobotLV)
+            GameWorld.DebugLog("    机器人在榜上,更新等级信息! tagPlayerID=%s,tagUpdOrder=%s,updRobotLV=%s" % (tagPlayerID, tagUpdOrder, updRobotLV), playerID)
+        else:
+            GameWorld.DebugLog("    机器人不在榜上,不更新等级信息! tagPlayerID=%s" % tagPlayerID, playerID)
+            
     battleRecMaxCount = min(MaxBattleRecCount, IpyGameDataPY.GetFuncCfg("ArenaSet", 4))
     
     # 插入对战记录
@@ -893,6 +997,8 @@
     battleRec.addScore = addScore
     battleRec.isDispose = 1
     battleRec.updScore = updScore
+    battleRec.tagFace = tagFace
+    battleRec.tagFacePic = tagFacePic
     curBattleRecList.append(battleRec)
     if len(curBattleRecList) > battleRecMaxCount:
         curBattleRecList = curBattleRecList[len(curBattleRecList) - battleRecMaxCount:]
@@ -911,6 +1017,8 @@
         tagBattleRec.addScore = tagAddScore
         tagBattleRec.isDispose = 1 if tagOnline else 0
         tagBattleRec.updScore = updTagScore
+        tagBattleRec.tagFace = face
+        tagBattleRec.tagFacePic = facePic
         tagBattleRecList.append(tagBattleRec)
         if len(tagBattleRecList) > battleRecMaxCount:
             tagBattleRecList = tagBattleRecList[len(tagBattleRecList) - battleRecMaxCount:]
@@ -924,6 +1032,11 @@
     
     # 对战结束,最后免费刷新一次匹配列表
     __DoArenaMatchRefresh(curPlayer, True, playerLV, updScore)
+    
+    drDict = {"AccID":accID, "PlayerID":playerID, "playerLV":playerLV, "realmLV":realmLV, "fightPower":fightPower, "curScore":[curScore, addScore, updScore], 
+              "TagAccID":tagAccID, "TagPlayerID":tagPlayerID, "tagLV":tagLV, "tagRealmLV":tagRealmLV, "tagFightPower":tagFightPower, 
+              "tagScore":[tagScore, tagAddScore, updTagScore], "isWin":isWin}
+    DataRecordPack.SendEventPack("ArenaBattleResult", drDict)
     return retDict
 
 def __SyncPlayerBechallengedUpdScore(curPlayer, updScore):
@@ -936,26 +1049,28 @@
                                                        cmdStr, len(cmdStr), curPlayer.GetRouteServerIndex())
     return
 
-def __CalcBattleAddScore(curScore, tagScore, isWin):
+def __CalcBattleAddScore(playerID, curScore, tagScore, isWin):
     ## 计算对战增加积分
     diffScore = curScore - tagScore # 积分差,有正负
     calcScoreFormatDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 1) if isWin else IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 2)
     scoreKeyList = calcScoreFormatDict.keys()
     scoreKeyList.sort()
-    calcKey = ""
+    calcKey = None
     for scoreKey in scoreKeyList:
         if diffScore <= scoreKey:
             calcKey = scoreKey
             break
         
-    if not calcKey:
+    if calcKey == None:
+        GameWorld.ErrLog("    计算得分公式: playerID=%s,diffScore=%s,scoreKeyList=%s,isWin=%s 找不到对应key公式" 
+                           % (playerID, diffScore, scoreKeyList, isWin))
         return 0
     
     compileKey = "ArenaBattleScore_%s_%s" % (int(isWin), str(calcKey))
     formatStr = calcScoreFormatDict[calcKey]
     addScore = eval(FormulaControl.GetCompileFormula(compileKey, formatStr))
-    GameWorld.DebugLog("    计算得分公式: diffScore=%s,isWin=%s,compileKey=%s,formatStr=%s,addScore=%s" 
-                       % (diffScore, isWin, compileKey, formatStr, addScore))
+    GameWorld.DebugLog("    计算得分公式: playerID=%s,diffScore=%s,scoreKeyList=%s,isWin=%s,compileKey=%s,formatStr=%s,addScore=%s" 
+                       % (playerID, diffScore, scoreKeyList, isWin, compileKey, formatStr, addScore))
     return addScore
 
 #// A9 A8 查看竞技场对战记录 #tagCGQueryArenaBattleRecord
@@ -985,18 +1100,24 @@
         recInfo.PlayerID = battleRec.tagPlayerID
         recInfo.Job = battleRec.tagJob
         recInfo.LV = battleRec.tagLV
+        recInfo.Score = battleRec.tagScore
         recInfo.AddScore = str(battleRec.addScore)
         recInfo.AddScoreLen = len(recInfo.AddScore)
         recInfo.IsWin = battleRec.isWin
         recInfo.Time = battleRec.battleTime
+        recInfo.Face = battleRec.tagFace
+        recInfo.FacePic = battleRec.tagFacePic
         
         if recInfo.PlayerID > MaxRobotID:
             curCache = PlayerViewCache.FindViewCache(recInfo.PlayerID)
             if curCache:
                 cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
+                fightPower = cacheDict["FightPower"]
+                recInfo.LV = cacheDict["LV"]
                 recInfo.PlayerName = cacheDict["Name"]
                 recInfo.RealmLV = cacheDict["RealmLV"]
-                recInfo.FightPower = cacheDict["FightPower"]
+                recInfo.FightPower = fightPower % ShareDefine.Def_PerPointValue
+                recInfo.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue
                 
         clientPack.BattleRecordList.append(recInfo)
         
@@ -1004,7 +1125,41 @@
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 
-
-
-
-
+#// A9 A5 查看竞技场对战玩家最新信息 #tagCGQueryArenaBattlePlayer
+#
+#struct    tagCGQueryArenaBattlePlayer
+#{
+#    tagHead        Head;
+#    DWORD        PlayerID;        //目标玩家ID,仅支持查真实玩家
+#};
+def OnQueryArenaBattlePlayer(index, clientData, tick):
+    
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    if not curPlayer:
+        return
+    
+    tagPlayerID = clientData.PlayerID
+    tagBattleRecList = GetPlayerArenaBattleRecList(tagPlayerID)
+    if not tagBattleRecList:
+        GameWorld.ErrLog("竞技场玩家无对战记录,无法查询最新数据! tagPlayerID=%s" % tagPlayerID, curPlayer.GetPlayerID())
+        return
+    tagBattleRec = tagBattleRecList[-1] # 取最后一条为最新数据
+    tagScore = tagBattleRec.updScore
+    
+    clientPack = ChPyNetSendPack.tagGCArenaBattlePlayerInfo()
+    clientPack.PlayerID = tagPlayerID
+    clientPack.Score = tagScore
+    
+    curCache = PlayerViewCache.FindViewCache(tagPlayerID)
+    if curCache:
+        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
+        fightPower = cacheDict["FightPower"]
+        clientPack.LV = cacheDict["LV"]
+        clientPack.Job = cacheDict["Job"]
+        clientPack.PlayerName = cacheDict["Name"]
+        clientPack.RealmLV = cacheDict["RealmLV"]
+        clientPack.FightPower = fightPower % ShareDefine.Def_PerPointValue
+        clientPack.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue
+        
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return

--
Gitblit v1.8.0