From f57e8ca8c2c367578d5e7a358aa44f7b7cadf3bb Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 28 四月 2025 15:00:07 +0800
Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(FamilyGCZ命令支持技能攻击)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py |  731 +++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 492 insertions(+), 239 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py
index 3e6f773..294786f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py
@@ -29,6 +29,8 @@
 import PlayerControl
 import PyDataManager
 import NetPackCommon
+import GameXiangong
+import GameWorship
 import PyGameData
 import ChConfig
 import PlayerFB
@@ -36,6 +38,7 @@
 import datetime
 import random
 import time
+import json
 
 Def_CrossChampionshipPlayerMax = 64 # 最大玩家数
 Def_CrossChampionshipPlayerWFCount = 8 # 胜负排位所需玩家数
@@ -50,6 +53,7 @@
 value3:playerIDA        玩家IDA
 value4:playerIDB        玩家IDB
 value5:winPlayerID      获胜玩家ID
+strValue3:battleDict    镜像PK场次结果 {"玩家ID":[[第1场胜负,加积分,...], ...], ...}
 '''
 
 Def_RecType_CrossChampionshipGuess = ShareDefine.Def_UniversalGameRecType_CrossChampionshipGuess
@@ -61,6 +65,7 @@
 value3:guessPlayerID     竞猜玩家ID
 value4:tagPlayerID       目标玩家ID
 value5:moneyTotal        投注总货币值
+StrValue1:isClose        是否已结算
 '''
 
 Def_RecType_CrossChampionshipOfficial = ShareDefine.Def_UniversalGameRecType_CrossChampionshipOfficial
@@ -68,10 +73,11 @@
 跨服排位争霸赛最终排名官职信息
 ShareDefine.Def_UniversalGameRecType_CrossChampionshipOfficial
 time:time                上一次辞退下级仙官时间
-value1:zoneID官职ID      官职ID*10 + 分区ID
+value1:官职ID            官职ID
 value2:playerID          玩家ID,可能为0
 value3:worshipValue      被膜拜次数*10 + 是否双倍
 value4:rank              排名
+value5:zoneID            分区ID
 StrValue3:               [申请该官职玩家ID,...]
 '''
 
@@ -79,7 +85,8 @@
 '''
 跨服排位争霸赛官职挑战信息
 ShareDefine.Def_UniversalGameRecType_CrossChampionshipOffChallenge
-value1:zoneID官职ID      官职ID*10 + 分区ID
+value1:官职ID             官职ID
+value2:zoneID            分区ID
 StrValue3:               {挑战玩家信息key:value, ...}
 '''
 
@@ -109,6 +116,8 @@
         self.lv = 0
         self.fightPower = 0
         self.realmLV = 0
+        self.face = 0
+        self.facePic = 0
         return
     
     def GetString(self):
@@ -123,9 +132,11 @@
                 playerShortInfo["LV"] = cacheDict.get("LV", 1)
                 playerShortInfo["FightPower"] = cacheDict.get("FightPower", 0)
                 playerShortInfo["RealmLV"] = cacheDict.get("RealmLV", 0)
+                playerShortInfo["Face"] = cacheDict.get("Face", 0)
+                playerShortInfo["FacePic"] = cacheDict.get("FacePic", 0)
                 self.applyPlayerInfo[applyPlayerID] = playerShortInfo
         return {"zoneID":self.zoneID, "officialID":self.officialID, "lastDismissJuniorTime":self.lastDismissJuniorTime,
-                "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName,
+                "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName, "face":self.face, "facePic":self.facePic,
                 "job":self.job, "lv":self.lv, "fightPower":self.fightPower, "realmLV":self.realmLV, "rank":self.rank,
                 "worshipCount":self.worshipCount, "applyPlayerInfo":self.applyPlayerInfo, "challengeList":self.challengeList,
                 "worshipDouble":self.worshipDouble
@@ -180,6 +191,7 @@
         self.tagPlayerID = 0 # 目标玩家ID
         self.moneyTotal = 0 # 投注总货币值
         self.guessRank = 0 # 竞猜名次,没有名次的竞猜默认0;1-代表第一名
+        self.isClose = 0 # 是否已结算
         return
     
     def GetString(self):
@@ -204,11 +216,13 @@
         self.lv = 0
         self.fightPower = 0
         self.realmLV = 0
+        self.face = 0
+        self.facePic = 0
         return
     
     def GetString(self):
         return {"zoneID":self.zoneID, "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName,
-                "job":self.job, "lv":self.lv, "fightPower":self.fightPower, "realmLV":self.realmLV}
+                "job":self.job, "lv":self.lv, "fightPower":self.fightPower, "realmLV":self.realmLV, "face":self.face, "facePic":self.facePic}
     
     def SetAttr(self, attrDict):
         for k, v in attrDict.items():
@@ -226,6 +240,7 @@
         self.playerIDA = 0
         self.playerIDB = 0
         self.winPlayerID = 0
+        self.playerBatDict = {} # 镜像PK场次结果 {"玩家ID":[[第1场胜负,加积分,...], ...], ...}
         
         # 不存档
         self.roomID = 0
@@ -235,7 +250,7 @@
     
     def GetString(self):
         return {"overTime":self.overTime, "zoneID":self.zoneID, "groupMark":self.groupMark, "battleNum":self.battleNum,
-                "playerIDA":self.playerIDA, "playerIDB":self.playerIDB, "winPlayerID":self.winPlayerID}
+                "playerIDA":self.playerIDA, "playerIDB":self.playerIDB, "winPlayerID":self.winPlayerID, "playerBatDict":self.playerBatDict}
         
     def SetAttr(self, attrDict):
         for k, v in attrDict.items():
@@ -275,7 +290,24 @@
             GameWorld.Log("无该跨服排位争霸赛对战场次信息: groupMark=%s,battleNum=%s" % (groupMark, battleNum))
             
         # 不可能执行的代码,方便 . 出提示代码
-        if False:
+        if not battle and False:
+            battle = ChampionshipBattle()
+        return battle
+    
+    def GetBattleByPlayerID(self, groupMark, playerID):
+        battle = None
+        if groupMark in self.battleInfo:
+            battleDict = self.battleInfo[groupMark]
+            for bat in battleDict.values():
+                if playerID == bat.playerIDA or playerID == bat.playerIDB:
+                    battle = bat
+                    break
+                
+        if not battle:
+            GameWorld.Log("无该跨服排位争霸赛对战场次信息: groupMark=%s,playerID=%s" % (groupMark, playerID))
+            
+        # 不可能执行的代码,方便 . 出提示代码
+        if not battle and False:
             battle = ChampionshipBattle()
         return battle
     
@@ -321,6 +353,19 @@
     if not obj or not hasattr(obj, "playerName"):
         return
     
+    packDataObj = PyDataManager.GetDBPlayerPackDataManager().GetPlayerPackObj(playerID)
+    # 如果有打包数据,以打包数据为准
+    if packDataObj:
+        obj.accID = packDataObj.accID
+        obj.playerName = packDataObj.playerName
+        obj.job = packDataObj.job
+        obj.lv = packDataObj.lv
+        obj.fightPower = packDataObj.fightPower
+        obj.realmLV = packDataObj.realmLV
+        obj.face = packDataObj.face
+        obj.facePic = packDataObj.facePic
+        return
+    
     if playerID < 10000:
         if obj.playerName:
             return
@@ -340,6 +385,8 @@
         obj.lv = cacheDict.get("LV", obj.lv)
         obj.fightPower = cacheDict.get("FightPower", obj.fightPower)
         obj.realmLV = cacheDict.get("RealmLV", obj.realmLV)
+        obj.face = cacheDict.get("Face", obj.face)
+        obj.facePic = cacheDict.get("FacePic", obj.facePic)
         
     return
 
@@ -361,12 +408,15 @@
         return
     
     def GetChampPKZoneIDList(self): return self._pkZoneInfo.keys()
-    def GetChampPKZoneMgr(self, zoneID):
+    def GetChampPKZoneMgr(self, zoneID, addNew=False):
+        pkZoneMgr = None
         if zoneID in self._pkZoneInfo:
             pkZoneMgr = self._pkZoneInfo[zoneID]
-        else:
+        elif addNew:
             pkZoneMgr = ChampionshipPKZoneMgr(zoneID)
             self._pkZoneInfo[zoneID] = pkZoneMgr
+        if not pkZoneMgr:
+            GameWorld.ErrLog("找不到跨服排位赛分区管理! zoneID=%s" % zoneID)
         return pkZoneMgr
     
     def GetPlayerPKZoneID(self, playerID):
@@ -374,6 +424,8 @@
         # @return: 如果在排位中则返回所在排位分区,否则返回当前服务器所在跨服匹配PK分区
         for zoneID in self._pkZoneInfo.keys():
             pkZoneMgr = self.GetChampPKZoneMgr(zoneID)
+            if not pkZoneMgr:
+                continue
             if playerID in pkZoneMgr.GetBatPlayerIDList():
                 return zoneID
         return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
@@ -429,14 +481,18 @@
         playerIDA = recData.GetValue3()
         playerIDB = recData.GetValue4()
         winPlayerID = recData.GetValue5()
-        
+        strValue3 = recData.GetStrValue3()
+        try:
+            playerBatDict = eval(strValue3) if strValue3 else {}
+        except:
+            playerBatDict = {}
         #if not playerIDA and not playerIDB:
         #    continue
         
         groupMark = groupInfo / 100
         battleNum = groupInfo % 100
         
-        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
         
         if groupMark in groupMarkList and battleNum:
             battle = ChampionshipBattle()
@@ -447,6 +503,7 @@
             battle.playerIDA = playerIDA
             battle.playerIDB = playerIDB
             battle.winPlayerID = winPlayerID
+            battle.playerBatDict = playerBatDict
             pkZoneMgr.AddBattle(groupMark, battleNum, battle)
             GameWorld.Log("分组玩家: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,winPlayerID=%s" 
                           % (zoneID, groupMark, battleNum, playerIDA, playerIDB, winPlayerID))
@@ -471,8 +528,11 @@
         guessPlayerID = recData.GetValue3()
         tagPlayerID = recData.GetValue4()
         moneyTotal = recData.GetValue5()
+        isClose = GameWorld.ToIntDef(recData.GetStrValue1(), 0)
         
         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+        if not pkZoneMgr:
+            continue
         playerGuessList = pkZoneMgr.GetPlayerGuessList(guessPlayerID, guessType)
         guessObj = ChampionshipGuess()
         guessObj.zoneID = zoneID
@@ -481,6 +541,7 @@
         guessObj.guessPlayerID = guessPlayerID
         guessObj.tagPlayerID = tagPlayerID
         guessObj.moneyTotal = moneyTotal
+        guessObj.isClose = isClose
         playerGuessList.append(guessObj)
         
         if guessType not in pkZoneMgr.supportCountInfo:
@@ -493,9 +554,8 @@
     for index in xrange(officialRecDataList.Count()):
         recData = officialRecDataList.At(index)
         lastDismissJuniorTime = recData.GetTime()
-        value1 = recData.GetValue1()
-        officialID = value1 / 10
-        zoneID = value1 % 10
+        officialID = recData.GetValue1()
+        zoneID = recData.GetValue5()
         playerID = recData.GetValue2()
         worshipValue = recData.GetValue3()
         worshipCount = worshipValue / 10
@@ -526,9 +586,8 @@
     GameWorld.Log("加载跨服排位官职挑战记录信息! %s" % challengeRecDataList.Count())
     for index in xrange(challengeRecDataList.Count()):
         recData = challengeRecDataList.At(index)
-        value1 = recData.GetValue1()
-        officialID = value1 / 10
-        zoneID = value1 % 10
+        officialID = recData.GetValue1()
+        zoneID = recData.GetValue2()
         strValue3 = recData.GetStrValue3()
         if not strValue3:
             continue
@@ -547,7 +606,10 @@
     return
 
 def OnServerClose():
-    
+    SaveChampionshipData()
+    return
+
+def SaveChampionshipData():
     if not GameWorld.IsCrossServer():
         return
     
@@ -560,7 +622,8 @@
     groupRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGroup)
     for zoneID in pkZoneIDList:
         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
-        
+        if not pkZoneMgr:
+            continue
         # 保存参赛玩家名单
         batPlayerIDList = pkZoneMgr.GetBatPlayerIDList()
         GameWorld.Log("    zoneID=%s,batPlayerIDCount=%s, %s" % (zoneID, len(batPlayerIDList), batPlayerIDList))
@@ -583,12 +646,17 @@
                 recData.SetValue3(batObj.playerIDA)
                 recData.SetValue4(batObj.playerIDB)
                 recData.SetValue5(batObj.winPlayerID)
+                strValue3 = "%s" % batObj.playerBatDict
+                strValue3 = strValue3.replace(" ", "")
+                recData.SetStrValue3(strValue3)
                 
     GameWorld.Log("保存跨服排位玩家竞猜记录!")
     universalRecMgr.Delete(Def_RecType_CrossChampionshipGuess)
     guessRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGuess)
     for zoneID in pkZoneIDList:
         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+        if not pkZoneMgr:
+            continue
         for guessType, playerGuessDict in pkZoneMgr.guessInfo.items():
             for guessPlayerID, guessObjList in playerGuessDict.items():
                 #GameWorld.Log("    zoneID=%s,guessType=%s,guessPlayerID=%s,guessCount=%s" % (zoneID, guessType, guessPlayerID, len(guessObjList)))
@@ -599,6 +667,7 @@
                     recData.SetValue3(guessPlayerID)
                     recData.SetValue4(guessObj.tagPlayerID)
                     recData.SetValue5(guessObj.moneyTotal)
+                    recData.SetStrValue1("%s" % guessObj.isClose)
                     
     offZoneIDList = champMgr.GetChampOfficialZoneIDList()
     GameWorld.Log("保存跨服排位玩家官职信息! offZoneIDList=%s" % offZoneIDList)
@@ -613,22 +682,23 @@
             offObj = offZoneMgr.GetOfficialObj(officialID)
             if not offObj:
                 continue
-            value1 = offObj.officialID * 10 + zoneID
             recData = officialRecDataList.AddRec()
             recData.SetTime(offObj.lastDismissJuniorTime)
-            recData.SetValue1(value1)
+            recData.SetValue1(officialID)
             recData.SetValue2(offObj.playerID)
             recData.SetValue3(offObj.worshipCount * 10 + offObj.worshipDouble)
             recData.SetValue4(offObj.rank)
+            recData.SetValue5(zoneID)
             strValue3 = "%s" % offObj.applyPlayerInfo.keys()
             strValue3 = strValue3.replace(" ", "")
             recData.SetStrValue3(strValue3)
             
-            #GameWorld.Log("        zoneID=%s,officialID=%s,playerID=%s,rank=%s,challengeCount=%s" 
-            #              % (zoneID, officialID, offObj.playerID, offObj.rank, len(offObj.challengeList)))
+            GameWorld.Log("        zoneID=%s,officialID=%s,playerID=%s,rank=%s,challengeCount=%s" 
+                          % (zoneID, officialID, offObj.playerID, offObj.rank, len(offObj.challengeList)))
             for challengeDict in offObj.challengeList:
                 challRecData = challengeRecDataList.AddRec()
-                challRecData.SetValue1(value1)
+                challRecData.SetValue1(officialID)
+                challRecData.SetValue2(zoneID)
                 strValue3 = str(challengeDict)
                 strValue3 = strValue3.replace(" ", "")
                 challRecData.SetStrValue3(strValue3)
@@ -705,6 +775,8 @@
     champMgr = GetChampionshipMgr()
     for zoneID in champMgr.GetChampPKZoneIDList():
         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+        if not pkZoneMgr:
+            continue
         if playerID in pkZoneMgr.GetBatPlayerIDList():
             # 是参赛玩家
             return True
@@ -738,11 +810,22 @@
         
     return
 
+def DoChampionshipOpen(curPlayer):
+    NotifyPlayerChampionshipInfo(curPlayer, GameWorld.GetGameWorld().GetTick())
+    return
+
 def OnPlayerLogin(curPlayer, tick):
     
     if GameWorld.IsCrossServer():
         return
     
+    if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+        return
+    
+    NotifyPlayerChampionshipInfo(curPlayer, tick)
+    return
+
+def NotifyPlayerChampionshipInfo(curPlayer, tick):
     playerID = curPlayer.GetPlayerID()
     champMgr = GetChampionshipMgr()
     pkZoneIDList = champMgr.GetChampPKZoneIDList()
@@ -754,6 +837,8 @@
     if pkZoneIDList:
         playerZoneID = champMgr.GetPlayerPKZoneID(playerID)
         pkZoneMgr = champMgr.GetChampPKZoneMgr(playerZoneID)
+        if not pkZoneMgr:
+            return
         if playerID not in pkZoneMgr.syncGuessPlayerIDInfo:
             sendMsg = {"zoneID":playerZoneID, "playerID":playerID, "exDataType":"ChampionshipGuessQuery"}
             CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipGuess, sendMsg)
@@ -763,11 +848,60 @@
             
     return
 
-def OnMinuteProcess():
+def ChampionshipErrorDo():
+    ## 状态异常后处理
+    
+    stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
+    if not stateError:
+        return "state is not error."
+    
+    if PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo):
+        return "already done."
+    
+    champMgr = GetChampionshipMgr()
+    
+    # 返还未结算的竞猜消耗
+    moneyType, _ = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1)
+    moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType)
+    for zoneID in champMgr.GetChampPKZoneIDList():
+        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+        if not pkZoneMgr:
+            continue
+        
+        backGuessTypeList = []
+        playerGuessMoneyInfo = {}
+        for guessType, playerGuessDict in pkZoneMgr.guessInfo.items():
+            for guessPlayerID, guessObjList in playerGuessDict.items():
+                for guessObj in guessObjList:
+                    if guessObj.isClose:
+                        # 已经结算的不处理
+                        continue
+                    guessObj.isClose = 1
+                    if guessType not in backGuessTypeList:
+                        backGuessTypeList.append(guessType)
+                    playerGuessMoneyInfo[guessPlayerID] = playerGuessMoneyInfo.get(guessPlayerID, 0) + guessObj.moneyTotal
+                    
+        GameWorld.Log("竞猜需要返还玩家信息: moneyItemID=%s,zoneID=%s,backGuessTypeList=%s, %s" % (moneyItemID, zoneID, backGuessTypeList, playerGuessMoneyInfo))
+        if not moneyItemID or not playerGuessMoneyInfo:
+            continue
+        
+        for guessPlayerID, totalMoney in playerGuessMoneyInfo.items():
+            paramList = []
+            addItemList = [[moneyItemID, totalMoney, 0]]
+            PlayerCompensation.SendMailByKey("CrossChampionshipGuessBack", [guessPlayerID], addItemList, paramList, crossMail=True)
+            
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo, 1)
+    return "OK"
+
+def OnMinuteProcess(curMinute=None):
     if not GameWorld.IsCrossServer():
         return
     
     Dispose_CrossChampionshipState()
+    
+    # 每半小时存档一次
+    if curMinute != None and curMinute % 30 == 0:
+        SaveChampionshipData()
     return
 
 def __GetChampionshipStartDate():
@@ -985,37 +1119,39 @@
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID, crossChampionshipID)
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState, updState)
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 0)
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo, 0)
     
     champMgr = GetChampionshipMgr()
     champMgr.ClearPKZone() # 仅清理PK分区信息,仙官信息不变
     
     # 生成参赛玩家名单: 取跨服PK所有分区 championshipSeason 赛季的数据
     if championshipSeason:
-        crossPKBillboardMgr = PyDataManager.GetCrossPKBillboardManager()
+        crossBillboardMgr = PyDataManager.GetCrossBillboardManager()
         for zoneID in hisZoneIDList:
-            billboardList = crossPKBillboardMgr.GetCrossPKBillboardInfo(zoneID, championshipSeason)[0]
-            GameWorld.Log("zoneID=%s,billboardListLen=%s" % (zoneID, len(billboardList)))
-            if not billboardList:
+            groupValue1, groupValue2 = zoneID, championshipSeason
+            billboardObj = crossBillboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_CrossRealmPK, groupValue1, groupValue2)
+            billboardDataLen = billboardObj.GetCount()
+            GameWorld.Log("zoneID=%s,championshipSeason=%s,billboardDataLen=%s" % (zoneID, championshipSeason, billboardDataLen))
+            if not billboardDataLen:
                 # 没有玩家上榜的不处理
                 continue
-            pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
-            battlePlayerList = billboardList[:Def_CrossChampionshipPlayerMax]
-            for num, billboardData in enumerate(battlePlayerList, 1):
-                playerID = billboardData.PlayerID
+            pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
+            for index in range(Def_CrossChampionshipPlayerMax):
+                if index >= billboardDataLen:
+                    break
+                billboardData = billboardObj.At(index)
+                playerID = billboardData.ID
+                
                 batPlayer = ChampionshipBatPlayer()
                 batPlayer.zoneID = zoneID
                 batPlayer.playerID = playerID
-                batPlayer.playerName = billboardData.PlayerName
-                batPlayer.job = billboardData.Job
-                batPlayer.fightPower = billboardData.FightPower
-                batPlayer.realmLV = billboardData.RealmLV
                 pkZoneMgr.playerDict[playerID] = batPlayer
                 
                 getPlayer = pkZoneMgr.GetBatPlayer(playerID)
                 dataDict = {"zoneID":zoneID, "playerID":playerID, "accID":getPlayer.accID, "fightPower":getPlayer.fightPower}
                 DR_CrossChampionshipPK("StartPlayer", dataDict)
                 
-                GameWorld.Log("    AddBattlePlayer num=%s,playerID=%s,accID=%s,fightPower=%s" % (num, playerID, getPlayer.accID, getPlayer.fightPower))
+                GameWorld.Log("    AddBattlePlayer index=%s,playerID=%s,accID=%s,fightPower=%s" % (index, playerID, getPlayer.accID, getPlayer.fightPower))
                 
     GameWorld.Log("=============================================================")
     Send_CrossServerMsg_ChampionshipState(newAct=True)
@@ -1034,6 +1170,8 @@
     champMgr = GetChampionshipMgr()
     for zoneID in champMgr.GetChampPKZoneIDList():
         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+        if not pkZoneMgr:
+            continue
         # 首轮取所有参赛玩家
         if preGroupMark == 0:
             batPlayerIDList = pkZoneMgr.GetBatPlayerIDList()
@@ -1134,7 +1272,8 @@
     champMgr = GetChampionshipMgr()
     for zoneID in champMgr.GetChampPKZoneIDList():
         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
-        
+        if not pkZoneMgr:
+            continue
         winPlayerIDList, losePlayerIDList = [], [] # 胜者组、败者组
         battleNumList = pkZoneMgr.battleInfo.get(preGroupMark, {}).keys()
         battleNumList.sort() # 对战编号按之前的分组顺序排序,确保分组顺序一致
@@ -1221,7 +1360,8 @@
     champMgr = GetChampionshipMgr()
     for zoneID in champMgr.GetChampPKZoneIDList():
         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
-        
+        if not pkZoneMgr:
+            continue
         battleNumList = pkZoneMgr.battleInfo.get(preGroupMark, {}).keys()
         battleNumList.sort() # 对战编号按之前的分组顺序排序,确保分组顺序一致
         for battleNum in battleNumList:
@@ -1240,7 +1380,7 @@
         
         # 处理8强竞猜发奖励
         guessType = 8
-        moneyType, _ = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1)
+        moneyType = ShareDefine.TYPE_Price_GongdePoint
         multiPrice = IpyGameDataPY.GetFuncCfg("CrossChamGuess", 3) # 猜中奖励倍值
         moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType)
         GameWorld.Log("竞猜返利货币类型: moneyType=%s,moneyItemID=%s,multiPrice=%s" % (moneyType, moneyItemID, multiPrice), zoneID)
@@ -1251,6 +1391,7 @@
             for guessObj in guessList:
                 if guessObj.guessType != guessType or guessObj.guessPlayerID != guessPlayerID:
                     continue
+                guessObj.isClose = 1
                 tagPlayerID = guessObj.tagPlayerID
                 moneyTotal = guessObj.moneyTotal
                 if not tagPlayerID or tagPlayerID not in top8PlayerIDList:
@@ -1270,48 +1411,7 @@
 
 def DoCrossChampionshipStartEnter(state):
     ## 开启进场处理逻辑
-    if state not in ShareDefine.CrossChampionshipEnterStateInfo:
-        return
-    groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state]
-    mapIDList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 3)
-    GameWorld.Log("跨服排位争霸赛开启进场副本: groupMark=%s,mapIDList=%s" % (groupMark, mapIDList))
-    champMgr = GetChampionshipMgr()
-    pkZoneIDList = champMgr.GetChampPKZoneIDList()
-    for index, zoneID in enumerate(pkZoneIDList):
-        if index >= len(mapIDList):
-            GameWorld.ErrLog("该跨服排位争霸赛分区没有分配对战地图! zoneID=%s,index=%s" % (zoneID, index), zoneID)
-            continue
-        mapID = mapIDList[index]
-        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
-        if groupMark not in pkZoneMgr.battleInfo:
-            GameWorld.Log("该跨服排位争霸赛分区没有对战组! zoneID=%s,groupMark=%s" % (zoneID, groupMark), zoneID)
-            continue
-        copyMapID = 0
-        copyPropertyList = []
-        battleDict = pkZoneMgr.battleInfo[groupMark]
-        for battleNum in battleDict.keys():
-            batObj = pkZoneMgr.GetBattle(groupMark, battleNum)
-            if not batObj:
-                continue
-            roomID = GetChampionshipPKRoomID(zoneID, groupMark, battleNum)
-            copyPropertyList.append([copyMapID, roomID])
-            batObj.mapID = mapID
-            batObj.roomID = roomID
-            batObj.copyMapID = copyMapID
-            
-            # 添加开启分线数据
-            realMapID = mapID
-            copyMapObj = PlayerFB.CrossCopyMapInfo(zoneID, 0)
-            copyMapObj.realMapID = realMapID
-            copyMapObj.copyMapID = copyMapID
-            key = (realMapID, copyMapID)
-            PyGameData.g_crossDynamicLineCopyMapInfo[key] = copyMapObj
-            GameWorld.Log("    对战房间! zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,roomID=%s,mapID=%s,copyMapID=%s" 
-                          % (zoneID, groupMark, battleNum, batObj.playerIDA, batObj.playerIDB, roomID, mapID, copyMapID))
-            copyMapID += 1
-            
-        PlayerFB.SendMapOpenFBEx(mapID, copyPropertyList)
-        
+    # 改为镜像战斗,废弃开地图房间
     return
 
 def Sync_CrossChampionshipDataToClientServer(serverGroupID=0):
@@ -1339,7 +1439,7 @@
     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipState, dataMsg, serverGroupIDList)
     return
 
-def Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList=None, serverGroupID=0, isSync=False):
+def Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList=None, serverGroupID=0, isSync=False, clearPlayer=False):
     # 通知参赛玩家
     
     zoneBatPlayerInfo = {}
@@ -1347,16 +1447,17 @@
     for zoneID in champMgr.GetChampPKZoneIDList():
         batPlayerList = []
         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
-        if syncPlayerIDList == None:
-            syncPlayerIDList = pkZoneMgr.GetBatPlayerIDList()
-        for playerID in syncPlayerIDList:
+        if not pkZoneMgr:
+            continue
+        playerIDList = pkZoneMgr.GetBatPlayerIDList() if syncPlayerIDList == None else syncPlayerIDList
+        for playerID in playerIDList:
             batPlayer = pkZoneMgr.GetBatPlayer(playerID)
             if not batPlayer:
                 continue
             batPlayerList.append(batPlayer.GetString())
         zoneBatPlayerInfo[zoneID] = batPlayerList
         
-    dataMsg = {"isSync":isSync, "zoneBatPlayerInfo":zoneBatPlayerInfo}
+    dataMsg = {"isSync":isSync, "zoneBatPlayerInfo":zoneBatPlayerInfo, "clearPlayer":clearPlayer}
     serverGroupIDList = [serverGroupID] if serverGroupID else []
     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipPlayer, dataMsg, serverGroupIDList)
     return
@@ -1371,6 +1472,8 @@
         champMgr = GetChampionshipMgr()
         for zoneID in champMgr.GetChampPKZoneIDList():
             pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+            if not pkZoneMgr:
+                continue
             for gMark in syncGroupMarkList:
                 battleDict = pkZoneMgr.battleInfo.get(gMark, {})
                 if not battleDict:
@@ -1395,12 +1498,13 @@
             guessList.append(guessObj.GetString())
         else:
             pkZoneMgr = champMgr.GetChampPKZoneMgr(syncZoneID)
-            for playerGuessDict in pkZoneMgr.guessInfo.values():
-                if playerID not in playerGuessDict:
-                    continue
-                playerGuessList = playerGuessDict[playerID]
-                for guess in playerGuessList:
-                    guessList.append(guess.GetString())
+            if pkZoneMgr:
+                for playerGuessDict in pkZoneMgr.guessInfo.values():
+                    if playerID not in playerGuessDict:
+                        continue
+                    playerGuessList = playerGuessDict[playerID]
+                    for guess in playerGuessList:
+                        guessList.append(guess.GetString())
                     
     dataMsg = {"exData":exData if exData else {}, "guessList":guessList}
     if syncPub:
@@ -1408,6 +1512,8 @@
         syncZoneIDList = [syncZoneID] if syncZoneID else champMgr.GetChampPKZoneIDList()
         for zoneID in syncZoneIDList:
             pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+            if not pkZoneMgr:
+                continue
             zoneSupportCountInfo[zoneID] = pkZoneMgr.supportCountInfo
         dataMsg["pubInfo"] = {"zoneSupportCountInfo":zoneSupportCountInfo}
         
@@ -1440,20 +1546,37 @@
         GameWorld.Log("子服重置跨服排位争霸赛对战数据! dbID=%s,ID=%s,PKZoneIDList=%s,prePKZoneIDList=%s" % (dbID, ID, PKZoneIDList, prePKZoneIDList))
         for zoneID in PKZoneIDList:
             champMgr.GetChampPKZoneMgr(zoneID)
+            
+    OnMapServerInitOK()
+    return
+
+def OnMapServerInitOK():
+    # 通知地图服务器状态
+    
+    if GameWorld.IsCrossServer():
+        return
+    
+    State = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)
+    StateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
+    
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossChampionshipState, State)
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossChampionshipStateError, StateError)
     return
 
 def CrossServerMsg_ChampionshipPlayer(msgData):
     ## 收到跨服服务器同步的信息  - 参赛玩家信息
     
     isSync = msgData["isSync"]
+    clearPlayer = msgData["clearPlayer"]
     zoneBatPlayerInfo = msgData["zoneBatPlayerInfo"]
     
     champMgr = GetChampionshipMgr()
     for zoneID, batPlayerList in zoneBatPlayerInfo.items():
-        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
         
         if not batPlayerList:
-            pkZoneMgr.playerDict = {}
+            if clearPlayer:
+                pkZoneMgr.playerDict = {}
         else:
             for attrDict in batPlayerList:
                 zoneID = attrDict["zoneID"]
@@ -1464,7 +1587,8 @@
                     pkZoneMgr.playerDict[playerID] = batPlayer
                 batPlayer.SetAttr(attrDict)
                 
-        if isSync:
+    if isSync:
+        for zoneID in zoneBatPlayerInfo.keys():
             Sync_ChampionshipPKZoneGroupInfo(zoneID)
             
     return
@@ -1479,7 +1603,7 @@
         groupMark = attrDict["groupMark"]
         battleNum = attrDict["battleNum"]
         
-        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
         battle = pkZoneMgr.GetBattle(groupMark, battleNum)
         if not battle:
             battle = ChampionshipBattle()
@@ -1534,7 +1658,7 @@
             # 非本服玩家
             continue
         
-        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
         
         guessObj = None
         playerGuessList = pkZoneMgr.GetPlayerGuessList(guessPlayerID, guessType)
@@ -1552,7 +1676,7 @@
     if pubInfo != None:
         zoneSupportCountInfo = pubInfo["zoneSupportCountInfo"]
         for zoneID, supportCountInfo in zoneSupportCountInfo.items():
-            pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+            pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
             pkZoneMgr.supportCountInfo = supportCountInfo
             pubZoneIDList.append(zoneID)
             
@@ -1564,7 +1688,7 @@
             # 非本服玩家
             return
         zoneID = exData.get("zoneID", 0)
-        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
         pkZoneMgr.syncGuessPlayerIDInfo[playerID] = tick
         curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
         if curPlayer == None:
@@ -1591,93 +1715,84 @@
     
     return
 
-def OnRequestChampionshipVSRoom(playerID, serverGroupID):
-    ## 请求进入排位对战房间
-    
-    stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
-    if stateError:
-        GameWorld.ErrLog("跨服排位状态已经异常无法进入! stateError=%s" % stateError, playerID)
-        return
-    
-    state = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)
-    if state not in ShareDefine.CrossChampionshipEnterStateInfo:
-        GameWorld.ErrLog("当前状态非跨服排位战斗状态无法进入: state=%s" % state, playerID)
-        return
-    groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state]
-    
-    mapPosList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 2)
-    if not mapPosList:
-        GameWorld.ErrLog("没有配置跨服排位对战地图进入坐标! CrossChamFB 数值2")
-        return
-    
-    roomID = 0
-    vsRoomDict = {}
-    
-    champMgr = GetChampionshipMgr()
-    for zoneID in champMgr.GetChampPKZoneIDList():
-        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
-        if groupMark not in pkZoneMgr.battleInfo:
-            continue
-        battleDict = pkZoneMgr.battleInfo[groupMark]
-        for battleNum in battleDict.keys():
-            batObj = pkZoneMgr.GetBattle(groupMark, battleNum)
-            if not batObj:
-                continue
-            
-            if playerID == batObj.playerIDA:# or batObj.playerIDA == 496607:
-                factionIndex = 0
-            elif playerID == batObj.playerIDB:# or batObj.playerIDB == 489566:
-                factionIndex = 1
-            else:
-                continue
-            
-            if not batObj.mapID:
-                GameWorld.ErrLog("该跨服排位对战没有分配对战地图,无法进入! groupMark=%s,battleNum=%s" % (groupMark, battleNum), playerID)
-                return
-            roomID = batObj.roomID
-            realMapID = batObj.mapID
-            copyMapID = batObj.copyMapID
-            key = (realMapID, copyMapID)
-            if key not in PyGameData.g_crossDynamicLineCopyMapInfo:
-                GameWorld.ErrLog("该跨服排位对战没有分配对战地图线路,无法进入! groupMark=%s,battleNum=%s,realMapID=%s,copyMapID=%s" 
-                                 % (groupMark, battleNum, realMapID, copyMapID), playerID)
-                return
-            copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key]
-            if copyMapObj.openState != IPY_PlayerDefine.fbosOpen:
-                GameWorld.Log("该跨服排位对战分配的地图线路非开启状态,无法进入! groupMark=%s,battleNum=%s,realMapID=%s,copyMapID=%s,openState=%s" 
-                              % (groupMark, battleNum, realMapID, copyMapID, copyMapObj.openState), playerID)
-                return
-            
-            posX, posY = mapPosList[factionIndex] if len(mapPosList) > factionIndex else mapPosList[0]
-            
-            registerMap = ChConfig.Def_FBMapID_CrossChampionship
-            dataMapID = realMapID
-            
-            vsRoomDict = {roomID:{playerID:{"regMapInfo":[registerMap, realMapID, dataMapID, copyMapID, posX, posY]}}}
-            GameWorld.Log("玩家请求跨服排位对战组: zoneID=%s,groupMark=%s,battleNum=%s,roomID=%s" 
-                          % (zoneID, groupMark, battleNum, roomID), playerID)
-            break
-        
-    if not roomID or not vsRoomDict:
-        GameWorld.ErrLog("找不到玩家跨服排位对战组: state=%s,groupMark=%s" % (state, groupMark), playerID)
-        return
-    PlayerFB.Send_CrossServerMsg_EnterVSRoomRet(vsRoomDict, [serverGroupID])
-    return
+#def OnRequestChampionshipVSRoom(playerID, serverGroupID):
+#    ## 请求进入排位对战房间
+#    
+#    stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
+#    if stateError:
+#        GameWorld.ErrLog("跨服排位状态已经异常无法进入! stateError=%s" % stateError, playerID)
+#        return
+#    
+#    state = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)
+#    if state not in ShareDefine.CrossChampionshipEnterStateInfo:
+#        GameWorld.ErrLog("当前状态非跨服排位战斗状态无法进入: state=%s" % state, playerID)
+#        return
+#    groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state]
+#    
+#    mapPosList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 2)
+#    if not mapPosList:
+#        GameWorld.ErrLog("没有配置跨服排位对战地图进入坐标! CrossChamFB 数值2")
+#        return
+#    
+#    roomID = 0
+#    vsRoomDict = {}
+#    
+#    champMgr = GetChampionshipMgr()
+#    for zoneID in champMgr.GetChampPKZoneIDList():
+#        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+#        if not pkZoneMgr:
+#            continue
+#        if groupMark not in pkZoneMgr.battleInfo:
+#            continue
+#        battleDict = pkZoneMgr.battleInfo[groupMark]
+#        for battleNum in battleDict.keys():
+#            batObj = pkZoneMgr.GetBattle(groupMark, battleNum)
+#            if not batObj:
+#                continue
+#            
+#            if playerID == batObj.playerIDA:# or batObj.playerIDA == 496607:
+#                factionIndex = 0
+#            elif playerID == batObj.playerIDB:# or batObj.playerIDB == 489566:
+#                factionIndex = 1
+#            else:
+#                continue
+#            
+#            if not batObj.mapID:
+#                GameWorld.ErrLog("该跨服排位对战没有分配对战地图,无法进入! groupMark=%s,battleNum=%s" % (groupMark, battleNum), playerID)
+#                return
+#            roomID = batObj.roomID
+#            realMapID = batObj.mapID
+#            copyMapID = batObj.copyMapID
+#            key = (realMapID, copyMapID)
+#            if key not in PyGameData.g_crossDynamicLineCopyMapInfo:
+#                GameWorld.ErrLog("该跨服排位对战没有分配对战地图线路,无法进入! groupMark=%s,battleNum=%s,realMapID=%s,copyMapID=%s" 
+#                                 % (groupMark, battleNum, realMapID, copyMapID), playerID)
+#                return
+#            copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key]
+#            if copyMapObj.openState != IPY_PlayerDefine.fbosOpen:
+#                GameWorld.Log("该跨服排位对战分配的地图线路非开启状态,无法进入! groupMark=%s,battleNum=%s,realMapID=%s,copyMapID=%s,openState=%s" 
+#                              % (groupMark, battleNum, realMapID, copyMapID, copyMapObj.openState), playerID)
+#                return
+#            
+#            posX, posY = mapPosList[factionIndex] if len(mapPosList) > factionIndex else mapPosList[0]
+#            
+#            registerMap = ChConfig.Def_FBMapID_CrossChampionship
+#            dataMapID = realMapID
+#            
+#            vsRoomDict = {roomID:{playerID:{"regMapInfo":[registerMap, realMapID, dataMapID, copyMapID, posX, posY]}}}
+#            GameWorld.Log("玩家请求跨服排位对战组: zoneID=%s,groupMark=%s,battleNum=%s,roomID=%s" 
+#                          % (zoneID, groupMark, battleNum, roomID), playerID)
+#            break
+#        
+#    if not roomID or not vsRoomDict:
+#        GameWorld.ErrLog("找不到玩家跨服排位对战组: state=%s,groupMark=%s" % (state, groupMark), playerID)
+#        return
+#    PlayerFB.Send_CrossServerMsg_EnterVSRoomRet(vsRoomDict, [serverGroupID])
+#    return
 
 def GetChampionshipPKRoomID(zoneID, groupMark, battleNum): return int("%d%03d%02d" % (zoneID, groupMark, battleNum))
-def MapServer_CrossChampionshipPKOver(infoList, tick):
-    ## 收到MapServer副本跨服排位PK结果同步
-    
-    roomID, winnerID, loserID, roundWinnerIDList, overType = infoList
-    zoneID = roomID / 100000
-    groupMark = roomID % 100000 / 100
-    battleNum = roomID % 100
-    GameWorld.Log("=== 收到MapServer_跨服排位PK战斗结果: zoneID=%s,groupMark=%s,battleNum=%s,roomID=%s,winnerID=%s,loserID=%s,roundWinnerIDList=%s,overType=%s" 
-                  % (zoneID, groupMark, battleNum, roomID, winnerID, loserID, roundWinnerIDList, overType), roomID)
-    DoBattleOverLogic(zoneID, groupMark, battleNum, winnerID, loserID, roundWinnerIDList, overType)
-    return
 
-def DoBattleOverLogic(zoneID, groupMark, battleNum, winnerID=0, loserID=0, roundWinnerIDList=None, overType=0):
+def DoBattleOverLogic(zoneID, groupMark, battleNum):
     ## 执行对战结算逻辑
     
     if not zoneID:
@@ -1690,14 +1805,13 @@
     
     champMgr = GetChampionshipMgr()
     pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+    if not pkZoneMgr:
+        return
     battleObj = pkZoneMgr.GetBattle(groupMark, battleNum)
     if not battleObj:
         return
     
-    if roundWinnerIDList == None:
-        roundWinnerIDList = []
-        
-    roomID = battleObj.roomID
+    roomID = GetChampionshipPKRoomID(zoneID, groupMark, battleNum) # 改版后roomID没用了,仅作为日志输出用
     if battleObj.overTime:
         GameWorld.ErrLog("跨服排位PK对战已经结算过了,不重复结算! zoneID=%s,groupMark=%s,battleNum=%s,winPlayerID=%s,overTime=%s" 
                          % (zoneID, groupMark, battleNum, battleObj.winPlayerID, GameWorld.ChangeTimeNumToStr(battleObj.overTime)), roomID)
@@ -1706,11 +1820,30 @@
     playerIDA = battleObj.playerIDA
     playerIDB = battleObj.playerIDB
     roomPlayerIDList = [playerIDA, playerIDB]
-    GameWorld.Log("结算跨服排位PK战斗结果: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,roomPlayerIDList=%s" 
+    GameWorld.Log("结算跨服排位PK胜负结果: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,roomPlayerIDList=%s" 
                   % (zoneID, groupMark, battleNum, playerIDA, playerIDB, roomPlayerIDList), roomID)
     
+    winnerID, loserID = 0, 0
     if playerIDA and playerIDB:
-        if not winnerID and not loserID:
+        totalScoreDict = {}
+        for batPlayerID, batRetList in battleObj.playerBatDict.items():
+            for retInfo in batRetList:
+                if not retInfo or len(retInfo) < 2:
+                    continue
+                addScore = retInfo[1]
+                totalScoreDict[batPlayerID] = totalScoreDict.get(batPlayerID, 0) + addScore
+        playerScoreA = totalScoreDict.get(playerIDA, 0)
+        playerScoreB = totalScoreDict.get(playerIDB, 0)
+        GameWorld.Log("    总积分: %s, %s" % (totalScoreDict, battleObj.playerBatDict), roomID)
+        if playerScoreA > playerScoreB:
+            winnerID = playerIDA
+            loserID = playerIDB
+            GameWorld.Log("    跨服排位赛玩家累计总分高者获胜! winner is playerIDA=%s,loserID=%s" % (playerIDA, loserID), roomID)
+        elif playerScoreB > playerScoreA:
+            winnerID = playerIDB
+            loserID = playerIDA
+            GameWorld.Log("    跨服排位赛玩家累计总分高者获胜! winner is playerIDB=%s,loserID=%s" % (playerIDB, loserID), roomID)
+        else: # 平分
             playerA = pkZoneMgr.GetBatPlayer(playerIDA)
             playerB = pkZoneMgr.GetBatPlayer(playerIDB)
             fightPowerA = playerA.fightPower if playerA else 0
@@ -1728,18 +1861,7 @@
                 winnerID, loserID = roomPlayerIDList
                 GameWorld.Log("    跨服排位赛对战地图没有玩家参与或没有胜负玩家,战力相同随机玩家获胜! fightPowerA=%s(%s) = fightPowerB=%s(%s),winnerID=%s,loserID=%s" 
                               % (fightPowerA, playerIDA, fightPowerB, playerIDB, winnerID, loserID), roomID)
-        elif not loserID:
-            for roomPlayerID in roomPlayerIDList:
-                if roomPlayerID != winnerID:
-                    loserID = roomPlayerID
-                    GameWorld.Log("    跨服排位赛对战地图没有失败玩家,默认对方为失败玩家! loserID=%s" % loserID, roomID)
-                    break
                 
-        if not winnerID or winnerID not in roomPlayerIDList or loserID not in roomPlayerIDList:
-            GameWorld.ErrLog("跨服排位赛PK房间胜负玩家异常,不结算! roomID=%s,winnerID=%s,loserID=%s,roomPlayerIDList=%s" 
-                             % (roomID, winnerID, loserID, roomPlayerIDList), roomID)
-            return
-        
     elif playerIDA:
         winnerID = playerIDA
         loserID = playerIDB
@@ -1759,9 +1881,6 @@
     winner = pkZoneMgr.GetBatPlayer(winnerID)
     loser = pkZoneMgr.GetBatPlayer(loserID)
     
-    winnerName = winner.playerName if winner else str(winnerID)
-    loserName = loser.playerName if loser else str(loserID)
-    
     # 决赛可获取最终名次
     playerRankInfo = {}
     if groupMark == 2:
@@ -1779,8 +1898,7 @@
     wAwardItemList, fAwardItemList = [], []
     if wfAwardItemList and len(wfAwardItemList) == 2:
         wAwardItemList, fAwardItemList = wfAwardItemList
-                
-    timeStr = GameWorld.GetCurrentDataTimeStr()
+        
     # 结算
     for playerID in [winnerID, loserID]:
         if not playerID:
@@ -1789,15 +1907,15 @@
         if playerID == winnerID:
             addItemList = wAwardItemList
             mailTypeKey = "CrossChampionshipPKWin%s" % groupMark
-            tagPlayerID, tagPlayerName = loserID, loserName
+            tagPlayerID = loserID
         else:
             addItemList = fAwardItemList
             mailTypeKey = "CrossChampionshipPKLose%s" % groupMark
-            tagPlayerID, tagPlayerName = winnerID, winnerName
+            tagPlayerID = winnerID
             
         rank = playerRankInfo.get(playerID, 0)
-        GameWorld.Log("    结算跨服排位赛玩家奖励: zoneID=%s,roomID=%s,groupMark=%s,battleNum=%s,rank=%s,tagPlayerID=%s" 
-                           % (zoneID, roomID, groupMark, battleNum, rank, tagPlayerID), playerID)
+        GameWorld.Log("    结算跨服排位赛玩家奖励: zoneID=%s,groupMark=%s,battleNum=%s,rank=%s,tagPlayerID=%s,addItemList=%s" 
+                           % (zoneID, groupMark, battleNum, rank, tagPlayerID, addItemList), playerID)
         if rank:
             paramList = [rank]
         else:
@@ -1805,30 +1923,84 @@
         playerIDList = [playerID]
         PlayerCompensation.SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList, crossMail=True)
         
-        player = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
-        if player:
-            overPack = ChPyNetSendPack.tagGCCrossChampionshipPKOver()
-            overPack.GroupMark = groupMark
-            overPack.TimeStr = timeStr
-            overPack.OverType = overType
-            overPack.WinnerID = winnerID
-            overPack.LoserID = loserID
-            overPack.RoundWinnerID = roundWinnerIDList
-            overPack.RoundCount = len(overPack.RoundWinnerID)
-            overPack.TagName = tagPlayerName
-            overPack.TagNameLen = len(overPack.TagName)
-            overPack.Rank = rank
-            NetPackCommon.SendFakePack(player, overPack)
-            
     # 同步子服
     Send_CrossServerMsg_ChampionshipGroup(battleObj=battleObj)
     
     # 记录流向
     winnerInfo = winner.GetString() if winner else {}
     loserInfo = loser.GetString() if loser else {}
-    dataDict = {"roundWinnerIDList":roundWinnerIDList, "overType":overType, "winner":winnerInfo, "loser":loserInfo, 
+    dataDict = {"winner":winnerInfo, "loser":loserInfo, 
                 "battle":battleObj.GetString(), "playerRankInfo":playerRankInfo}
     DR_CrossChampionshipPK("PKRoomOver", dataDict)    
+    return True
+
+def ClientServerMsg_ChampionshipPKOver(serverGroupID, msgData):
+    ## 收到子服同步的镜像PK结果
+    playerID = msgData["playerID"]
+    tagPlayerID = msgData["tagPlayerID"]
+    funcLineID = msgData["funcLineID"]
+    isWin = msgData["isWin"]
+    addScore = msgData["addScore"]
+    baseScore = msgData["baseScore"]
+    hpScore = msgData["hpScore"]
+    timeScore = msgData["timeScore"]
+    pkCountMax = msgData["pkCountMax"]
+    
+    zoneID = funcLineID / 100
+    groupMark = funcLineID % 100
+    
+    groupMarkList = ShareDefine.CrossChampionshipEnterStateInfo.values()
+    if groupMark not in groupMarkList:
+        GameWorld.ErrLog("跨服排位镜像PK结果分组异常! groupMark=%s" % groupMark, playerID)
+        return
+    
+    champMgr = GetChampionshipMgr()
+    pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+    if not pkZoneMgr:
+        return
+    battleObj = pkZoneMgr.GetBattleByPlayerID(groupMark, playerID)
+    if not battleObj:
+        GameWorld.ErrLog("跨服排位镜像PK结果玩家不在该排位分组中! zoneID=%s,groupMark=%s" % (zoneID, groupMark), playerID)
+        return
+    battleNum = battleObj.battleNum
+    playerIDA = battleObj.playerIDA
+    playerIDB = battleObj.playerIDB
+    roomPlayerIDList = [playerIDA, playerIDB]
+    # 有轮空的默认不用打
+    if playerID not in roomPlayerIDList or tagPlayerID not in roomPlayerIDList or not tagPlayerID or not playerIDA or not playerIDB:
+        GameWorld.ErrLog("跨服排位镜像PK结果玩家ID错误! zoneID=%s,groupMark=%s,playerID=%s,tagPlayerID=%s,roomPlayerIDList=%s" 
+                         % (zoneID, groupMark, playerID, tagPlayerID, roomPlayerIDList), playerID)
+        return
+    if playerID not in battleObj.playerBatDict:
+        battleObj.playerBatDict[playerID] = []
+    batRetList = battleObj.playerBatDict[playerID]
+    if len(batRetList) >= pkCountMax or not pkCountMax:
+        GameWorld.ErrLog("跨服排位镜像PK结果已达PK次数上限! zoneID=%s,groupMark=%s,playerID=%s,tagPlayerID=%s,batRetList=%s" 
+                         % (zoneID, groupMark, playerID, tagPlayerID, batRetList), playerID)
+        return
+    if battleObj.overTime:
+        GameWorld.ErrLog("跨服排位镜像PK胜负已经结算过了,不再更新PK结果! zoneID=%s,groupMark=%s,battleNum=%s,winPlayerID=%s,overTime=%s" 
+                         % (zoneID, groupMark, battleNum, battleObj.winPlayerID, GameWorld.ChangeTimeNumToStr(battleObj.overTime)), playerID)
+        return
+    
+    isWin = 1 if isWin else 0
+    batRetList.append([isWin, addScore, baseScore, hpScore, timeScore])
+    GameWorld.Log("跨服排位镜像PK结果: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,batCount=%s,isWin=%s,addScore=%s,baseScore=%s,hpScore=%s,timeScore=%s" 
+                  % (zoneID, groupMark, battleNum, playerIDA, playerIDB, len(batRetList), isWin, addScore, baseScore, hpScore, timeScore), playerID)
+    
+    # 是否都打完所有次数,是的话直接结算胜负
+    isAllOver = True
+    for roomPlayerID in roomPlayerIDList:
+        batList = battleObj.playerBatDict.get(roomPlayerID, [])
+        if len(batList) < pkCountMax:
+            isAllOver = False
+            break
+    if isAllOver:
+        if DoBattleOverLogic(zoneID, groupMark, battleNum):
+            return
+        
+    # 同步子服
+    Send_CrossServerMsg_ChampionshipGroup(battleObj=battleObj)
     return
 
 def DoCrossChampionshipFinalOver():
@@ -1841,13 +2013,25 @@
     champMgr = GetChampionshipMgr()
     champMgr.ClearOfficialZone() # 最终结算重置仙官信息,替换最新仙官
     
+    # 膜拜重置
+    worshipType = ShareDefine.Def_WorshipType_CrossChampionship
+    GameWorship.DelWorshipPlayer(worshipType)
+    
     pkZoneIDList = champMgr.GetChampPKZoneIDList()
     GameWorld.Log("pkZoneIDList=%s" % pkZoneIDList)
     
+    syncNewWorshipList = []
+    syncNewXiangongDict = {}
+    crossZoneName = GameWorld.GetCrossZoneName()
     for zoneID in pkZoneIDList:
         GameWorld.Log("=== 结算排位分区: zoneID=%s ===" % zoneID, zoneID)
+        zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
+        serverIDRangeList = zoneIpyData.GetServerGroupIDList() if zoneIpyData else []
+        
         finalPlayerIDList = []
         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+        if not pkZoneMgr:
+            continue
         battleNumList = pkZoneMgr.battleInfo.get(finalGroupMark, {}).keys()
         for battleNum in battleNumList:
             batObj = pkZoneMgr.GetBattle(finalGroupMark, battleNum)
@@ -1873,8 +2057,9 @@
             rankIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipRank", rank)
             officialID = rankIpyData.GetMainOfficialID() if rankIpyData else 0
             rankAwardItemList = rankIpyData.GetRankAwardItemList() if rankIpyData else []
-            GameWorld.Log("    最终排名: zoneID=%s,rank=%s,playerID=%s,officialID=%s,rankAwardItemList=%s,accID=%s,fightPower=%s" 
-                          % (zoneID, rank, playerID, officialID, rankAwardItemList, accID, fightPower), zoneID)
+            xiangongID = rankIpyData.GetXiangongID() if rankIpyData else 0
+            GameWorld.Log("    最终排名: zoneID=%s,rank=%s,playerID=%s,officialID=%s,xiangongID=%s,rankAwardItemList=%s,accID=%s,fightPower=%s" 
+                          % (zoneID, rank, playerID, officialID, xiangongID, rankAwardItemList, accID, fightPower), zoneID)
             
             if officialID:
                 offObj = ChampionshipOfficial()
@@ -1885,13 +2070,17 @@
                 
                 offZoneMgr.officialInfo[officialID] = offObj
                 
+                
             # 名次奖励
             paramList = [rank]
             PlayerCompensation.SendMailByKey("CrossChampionshipPKRank", [playerID], rankAwardItemList, paramList, crossMail=True)
             
+            GameXiangong.AddXiangongPlayer(xiangongID, playerID, serverIDRangeList, rank, syncNewXiangongDict)
+            GameWorship.AddWorshipPlayer(worshipType, rank, playerID, serverIDRangeList, syncNewWorshipList)
+            
         # 处理4强竞猜发奖励
         guessType = 4
-        moneyType, _ = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1)
+        moneyType = ShareDefine.TYPE_Price_GongdePoint
         multiPriceDict = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 4, {}) # 猜中奖励倍值字典
         moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType)
         GameWorld.Log("竞猜返利货币类型: moneyType=%s,moneyItemID=%s,multiPriceDict=%s" % (moneyType, moneyItemID, multiPriceDict), zoneID)
@@ -1902,6 +2091,7 @@
             for guessObj in guessList:
                 if guessObj.guessType != guessType or guessObj.guessPlayerID != guessPlayerID:
                     continue
+                guessObj.isClose = 1
                 tagPlayerID = guessObj.tagPlayerID
                 guessRank = guessObj.guessRank
                 moneyTotal = guessObj.moneyTotal
@@ -1926,6 +2116,10 @@
     
     serverGroupIDList = [] # 全服统一逻辑
     PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "ChampionshipOver")
+    
+    # 通知新添加的膜拜
+    GameWorship.SendNewWorshipPlayer(syncNewWorshipList)
+    GameXiangong.SendNewXiangongPlayerToClientServer(syncNewXiangongDict)
     GameWorld.Log("===================================================================")
     return
 
@@ -1934,6 +2128,8 @@
     
     champMgr = GetChampionshipMgr()
     pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+    if not pkZoneMgr:
+        return {}
     
     # 决赛
     finalGroupMark = 2
@@ -2021,9 +2217,8 @@
         if syncZonID != None and zoneID != syncZonID:
             continue
         offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
-        if syncOfficialIDList == None:
-            syncOfficialIDList = offZoneMgr.officialInfo.keys()
-        for officialID in syncOfficialIDList:
+        officialIDList = offZoneMgr.officialInfo.keys() if syncOfficialIDList == None else syncOfficialIDList
+        for officialID in officialIDList:
             offObj = offZoneMgr.GetOfficialObj(officialID)
             if not offObj:
                 continue
@@ -2170,6 +2365,8 @@
     
     champMgr = GetChampionshipMgr()
     pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+    if not pkZoneMgr:
+        return
     tagBatPlayer = pkZoneMgr.GetBatPlayer(tagPlayerID)
     if not tagBatPlayer:
         GameWorld.ErrLog("该分区不存在该参赛玩家,无法排位竞猜! zoneID=%s,tagPlayerID=%s" % (zoneID, tagPlayerID), playerID)
@@ -2280,7 +2477,21 @@
     playerID = msgData["playerID"]
     mainOfficialID = msgData["mainOfficialID"]
     officialID = msgData["officialID"]
+    cancel = msgData["cancel"]
     PropData = msgData["PropData"]
+    
+    if cancel:
+        champMgr = GetChampionshipMgr()
+        offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
+        officialObj = offZoneMgr.GetOfficialObj(officialID)
+        if not officialObj:
+            return
+        if playerID not in officialObj.applyPlayerInfo:
+            GameWorld.ErrLog("不在仙官申请列表里! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID)
+            return
+        officialObj.applyPlayerInfo.pop(playerID, None)
+        Send_CrossServerMsg_ChampionshipOfficial(zoneID, [officialID])
+        return
     
     mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", mainOfficialID)
     if not mainIpyData:
@@ -2306,7 +2517,7 @@
     if not mainOffObj or not officialObj:
         return
     
-    if mainOffObj.playerID:
+    if not mainOffObj.playerID:
         GameWorld.Log("仙官所属界主无玩家,无法申请! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID)
         return
     
@@ -2491,7 +2702,7 @@
     if not mainOffObj or not officialObj:
         return
     
-    if mainOffObj.playerID:
+    if not mainOffObj.playerID:
         GameWorld.Log("仙官所属界主无玩家,无法挑战! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID)
         return
     
@@ -2520,6 +2731,7 @@
         GameWorld.Log("挑战目标仙官玩家ID结果! zoneID=%s,mainOfficialID=%s,officialID=%s,fightPower=%s,tagFightPower=%s,tagPlayerID=%s,Ret=%s" 
                       % (zoneID, mainOfficialID, officialID, fightPower, tagFightPower, tagPlayerID, Ret), playerID)
         
+    syncOfficialIDList = [officialID]
     playerName = PropData.get("Name", str(playerID))
     # 暂时只记录挑战胜利的
     if Ret == 1:
@@ -2538,13 +2750,22 @@
         officialObj.ResetPlayer()
         officialObj.playerID = playerID
         
+        # 移除该玩家的其他仙官申请
+        for offID in offZoneMgr.officialInfo.keys():
+            offObj = offZoneMgr.GetOfficialObj(offID)
+            if not offObj:
+                continue
+            if playerID in offObj.applyPlayerInfo:
+                offObj.applyPlayerInfo.pop(playerID)
+                syncOfficialIDList.append(offID)
+                
         # 邮件通知对方,官职被挑战了
         if offPlayerID:
             PlayerCompensation.SendMailByKey("CrossChampionshipOfficialBeChallenge", [offPlayerID], [], [playerName, officialID], crossMail=True)
             
     exData = {"exDataType":"OfficialChallenge", "playerID":playerID, "tagPlayerName":officialObj.playerName,
               "mainOfficialID":mainOfficialID, "officialID":officialID, "Ret":Ret}
-    Send_CrossServerMsg_ChampionshipOfficial(zoneID, [officialID], exData=exData)
+    Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList, exData=exData)
     return
 
 #// C0 23 跨服排位仙官挑战记录查询 #tagCGChampionshipOfficialChallengeQuery
@@ -2740,14 +2961,19 @@
 def Sync_ChampionshipPKZoneGroupInfo(zoneID, groupMarkDict=None, curPlayer=None):
     ## 同步排位分区分组信息
     # @param groupMarkDict: {groupMark:[battleNum, ...], ...}
-        
+    
     champMgr = GetChampionshipMgr()
     if curPlayer:
         playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
         if playerZoneID != zoneID:
             return
+        if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+            return
         
     pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+    if not pkZoneMgr:
+        return
+    
     if groupMarkDict == None:
         groupMarkDict = {}
         for groupMark, groupDict in pkZoneMgr.battleInfo.items():
@@ -2760,9 +2986,11 @@
                 battleObj = pkZoneMgr.GetBattle(groupMark, battleNum)
                 if not battleObj:
                     continue
-                playerIDList.append(battleObj.playerIDA)
-                playerIDList.append(battleObj.playerIDB)
-                
+                if battleObj.playerIDA not in playerIDList:
+                    playerIDList.append(battleObj.playerIDA)
+                if battleObj.playerIDB not in playerIDList:
+                    playerIDList.append(battleObj.playerIDB)
+                    
     clientPack = ChPyNetSendPack.tagGCCrossChampionshipPKZoneGroupInfo()
     clientPack.ActID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID)
     clientPack.StateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
@@ -2776,11 +3004,14 @@
             battleObj = pkZoneMgr.GetBattle(groupMark, battleNum)
             if not battleObj:
                 continue
+            battleRetDict = {str(k):v for k, v in battleObj.playerBatDict.items()}
             battlePack = ChPyNetSendPack.tagGCCrossChampionshipPKBattle()
             battlePack.BattleNum = battleNum
             battlePack.WinPlayerID = battleObj.winPlayerID
             battlePack.PlayerIDA = battleObj.playerIDA
             battlePack.PlayerIDB = battleObj.playerIDB
+            battlePack.BattleRet = json.dumps(battleRetDict, ensure_ascii=False).replace(" ", "")
+            battlePack.BattleRetLen = len(battlePack.BattleRet)
             groupPack.BattleList.append(battlePack)
         groupPack.BattleCount = len(groupPack.BattleList)
         clientPack.GroupList.append(groupPack)
@@ -2800,6 +3031,8 @@
         playerPack.FightPower = batPlayer.fightPower % ShareDefine.Def_PerPointValue
         playerPack.FightPowerEx = batPlayer.fightPower / ShareDefine.Def_PerPointValue
         playerPack.RealmLV = batPlayer.realmLV
+        playerPack.Face = batPlayer.face
+        playerPack.FacePic = batPlayer.facePic
         clientPack.PlayerList.append(playerPack)
     clientPack.PlayerCount = len(clientPack.PlayerList)
     
@@ -2814,6 +3047,8 @@
             playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
             if playerZoneID != zoneID:
                 continue
+            if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+                continue
             NetPackCommon.SendFakePack(curPlayer, clientPack)
             
     return
@@ -2827,8 +3062,12 @@
     playerZoneID = champMgr.GetPlayerPKZoneID(playerID)
     if not playerZoneID:
         return
+    if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+        return
     
     pkZoneMgr = champMgr.GetChampPKZoneMgr(playerZoneID)
+    if not pkZoneMgr:
+        return
     
     clientPack = ChPyNetSendPack.tagGCChampionshipGuessPriInfo()
     clientPack.ZoneID = playerZoneID
@@ -2870,8 +3109,12 @@
         playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
         if playerZoneID != zoneID:
             return
+        if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+            return
         
     pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+    if not pkZoneMgr:
+        return
     
     # 公共竞猜信息
     clientPack = ChPyNetSendPack.tagGCChampionshipGuessPubInfo()
@@ -2911,6 +3154,8 @@
             playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
             if playerZoneID != zoneID:
                 continue
+            if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+                continue
             NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 
@@ -2922,6 +3167,8 @@
     if curPlayer:
         playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID())
         if playerZoneID != zoneID:
+            return
+        if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
             return
         
     clientPack = ChPyNetSendPack.tagGCChampionshipOfficialInfo()
@@ -2945,6 +3192,8 @@
         offPlayer.FightPower = offObj.fightPower % ShareDefine.Def_PerPointValue
         offPlayer.FightPowerEx = offObj.fightPower / ShareDefine.Def_PerPointValue
         offPlayer.RealmLV = offObj.realmLV
+        offPlayer.Face = offObj.face
+        offPlayer.FacePic = offObj.facePic
         
         offPack = ChPyNetSendPack.tagGCChampionshipOfficial()
         offPack.OfficialID = officialID
@@ -2964,6 +3213,8 @@
             applyPlayer.FightPower = fightPower % ShareDefine.Def_PerPointValue
             applyPlayer.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue
             applyPlayer.RealmLV = playerInfo.get("RealmLV", 1)
+            applyPlayer.Face = playerInfo.get("Face", 0)
+            applyPlayer.FacePic = playerInfo.get("FacePic", 0)
             
             offPack.ApplyPlayerList.append(applyPlayer)
         offPack.ApplyPlayerCount = len(offPack.ApplyPlayerList)
@@ -2982,6 +3233,8 @@
             playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID())
             if playerZoneID != zoneID:
                 continue
+            if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+                continue
             NetPackCommon.SendFakePack(curPlayer, clientPack)
             
     return

--
Gitblit v1.8.0