ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py
@@ -29,6 +29,7 @@
import PlayerControl
import PyDataManager
import NetPackCommon
import GameXiangong
import GameWorship
import PyGameData
import ChConfig
@@ -37,6 +38,7 @@
import datetime
import random
import time
import json
Def_CrossChampionshipPlayerMax = 64 # 最大玩家数
Def_CrossChampionshipPlayerWFCount = 8 # 胜负排位所需玩家数
@@ -51,6 +53,7 @@
value3:playerIDA        玩家IDA
value4:playerIDB        玩家IDB
value5:winPlayerID      获胜玩家ID
strValue3:battleDict    镜像PK场次结果 {"玩家ID":[[第1场胜负,加积分,...], ...], ...}
'''
Def_RecType_CrossChampionshipGuess = ShareDefine.Def_UniversalGameRecType_CrossChampionshipGuess
@@ -70,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,...]
'''
@@ -81,7 +85,8 @@
'''
跨服排位争霸赛官职挑战信息
ShareDefine.Def_UniversalGameRecType_CrossChampionshipOffChallenge
value1:zoneID官职ID      官职ID*10 + 分区ID
value1:官职ID             官职ID
value2:zoneID            分区ID
StrValue3:               {挑战玩家信息key:value, ...}
'''
@@ -111,6 +116,8 @@
        self.lv = 0
        self.fightPower = 0
        self.realmLV = 0
        self.face = 0
        self.facePic = 0
        return
    
    def GetString(self):
@@ -125,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
@@ -207,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():
@@ -229,6 +240,7 @@
        self.playerIDA = 0
        self.playerIDB = 0
        self.winPlayerID = 0
        self.playerBatDict = {} # 镜像PK场次结果 {"玩家ID":[[第1场胜负,加积分,...], ...], ...}
        
        # 不存档
        self.roomID = 0
@@ -238,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():
@@ -278,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
    
@@ -324,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
@@ -343,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
@@ -437,7 +481,11 @@
        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
        
@@ -455,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))
@@ -505,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
@@ -538,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
@@ -599,6 +646,9 @@
                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)
@@ -632,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)
@@ -842,14 +893,14 @@
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo, 1)
    return "OK"
def OnMinuteProcess(curMinute):
def OnMinuteProcess(curMinute=None):
    if not GameWorld.IsCrossServer():
        return
    
    Dispose_CrossChampionshipState()
    
    # 每半小时存档一次
    if curMinute % 30 == 0:
    if curMinute != None and curMinute % 30 == 0:
        SaveChampionshipData()
    return
@@ -1075,31 +1126,32 @@
    
    # 生成参赛玩家名单: 取跨服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, True)
            battlePlayerList = billboardList[:Def_CrossChampionshipPlayerMax]
            for num, billboardData in enumerate(battlePlayerList, 1):
                playerID = billboardData.PlayerID
            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)
@@ -1359,52 +1411,7 @@
def DoCrossChampionshipStartEnter(state):
    ## 开启进场处理逻辑
    if state not in ShareDefine.CrossChampionshipEnterStateInfo:
        return
    groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state]
    mapIndex = 0
    mapIDList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 3)
    GameWorld.Log("跨服排位争霸赛开启进场副本: groupMark=%s,mapIDList=%s" % (groupMark, mapIDList))
    champMgr = GetChampionshipMgr()
    pkZoneIDList = champMgr.GetChampPKZoneIDList()
    for zoneID in pkZoneIDList:
        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
        if not pkZoneMgr:
            continue
        if groupMark not in pkZoneMgr.battleInfo:
            GameWorld.Log("该跨服排位争霸赛分区没有对战组! zoneID=%s,groupMark=%s" % (zoneID, groupMark), zoneID)
            continue
        if mapIndex >= len(mapIDList):
            GameWorld.ErrLog("该跨服排位争霸赛分区没有分配对战地图! zoneID=%s,mapIndex=%s" % (zoneID, mapIndex), zoneID)
            continue
        mapID = mapIDList[mapIndex]
        mapIndex += 1
        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):
@@ -1539,6 +1546,21 @@
        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):
@@ -1565,7 +1587,8 @@
                    pkZoneMgr.playerDict[playerID] = batPlayer
                batPlayer.SetAttr(attrDict)
                
        if isSync:
    if isSync:
        for zoneID in zoneBatPlayerInfo.keys():
            Sync_ChampionshipPKZoneGroupInfo(zoneID)
            
    return
@@ -1692,95 +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 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 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:
@@ -1799,10 +1811,7 @@
    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)
@@ -1811,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
@@ -1833,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
@@ -1864,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:
@@ -1884,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:
@@ -1894,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:
@@ -1910,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():
@@ -1953,9 +2020,14 @@
    pkZoneIDList = champMgr.GetChampPKZoneIDList()
    GameWorld.Log("pkZoneIDList=%s" % pkZoneIDList)
    
    worshipList = []
    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:
@@ -1985,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()
@@ -1997,14 +2070,13 @@
                
                offZoneMgr.officialInfo[officialID] = offObj
                
                worshipValue = rank
                if GameWorship.GetWorshipIpyData(worshipType, worshipValue):
                    worshipData = GameWorship.AddWorshipPlayer(playerID, worshipType, worshipValue, zoneID=zoneID, isNotify=False)
                    worshipList.append(worshipData)
            # 名次奖励
            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
@@ -2046,7 +2118,8 @@
    PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "ChampionshipOver")
    
    # 通知新添加的膜拜
    GameWorship.SyncAddCrossWorship(worshipList)
    GameWorship.SendNewWorshipPlayer(syncNewWorshipList)
    GameXiangong.SendNewXiangongPlayerToClientServer(syncNewXiangongDict)
    GameWorld.Log("===================================================================")
    return
@@ -2931,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)
@@ -2955,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)
    
@@ -3114,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
@@ -3133,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)