ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
@@ -226,7 +226,7 @@
            
        return pos
    
def UpdateCrossPKBillboard(zoneID, seasonID, winner, loser):
def UpdateCrossPKBillboard(zoneID, seasonID, winner, loser, syncClientServer=False):
    ## 更新跨服PK排行榜,跨服服务器结算调用,子服不调用
    
    curZoneSeasonID = GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID)
@@ -310,13 +310,15 @@
    matchState = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
    if not matchState and not PyGameData.g_crossPKRoomDict:
        GameWorld.Log("匹配已结束,且当前没有PK中的房间了!主动广播子服最新榜单! ")
        syncClientServer = True
    if syncClientServer:
        crossZoneName = GameWorld.GetCrossZoneName()
        zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
        if zoneIpyData:
            serverGroupIDList = zoneIpyData.GetServerGroupIDList()
            SyncPKSyncBillboardToClientServer(zoneID, seasonID, serverGroupIDList)
            
    return
    return True
#// C0 01 查看跨服竞技场赛季排行榜 #tagCGViewCrossPKBillboard
#
@@ -438,6 +440,9 @@
def ClientServerMsg_PKBillboard(serverGroupID, msgData):
    ## 收到子服请求查询PK排行榜信息
    if "GMSetCrossPK" in msgData:
        _GMSetCrossPK(serverGroupID, msgData)
        return
    zoneID = msgData["ZoneID"]
    seasonID = msgData["SeasonID"]
    exData = msgData.get("ExData", {}) # 原数据返回子服
@@ -1082,6 +1087,9 @@
        DR_CrossReamlPK("CancelRoom", dataDict)
        break
    
    if playerID in PyGameData.g_crossPKZoneMatchRobotPlayerDict:
        PyGameData.g_crossPKZoneMatchRobotPlayerDict.pop(playerID)
        GameWorld.DebugLog("    从匹配机器人队列中移除!")
    return
def ClientServerMsg_PKPrepareOK(playerInfoDict, tick):
@@ -1794,6 +1802,58 @@
    DR_CrossReamlPK("PKOverRobot", dataDict)
    return
def _GMSetCrossPK(serverGroupID, msgData):
    ## 收到子服GM同步的设置跨服PK数据
    if not GameWorld.IsCrossServer():
        GameWorld.ErrLog("GMSetCrossPK非跨服服务器不处理该跨服GM请求!")
        return
    zoneID = msgData["ZoneID"]
    seasonID = msgData["SeasonID"]
    playerInfoDict = msgData["PlayerInfo"]
    accID = playerInfoDict["accID"]
    playerID = playerInfoDict["playerID"]
    playerName = playerInfoDict["playerName"]
    playerJob = playerInfoDict["playerJob"]
    fightPower = playerInfoDict["fightPower"]
    realmLV = playerInfoDict["realmLV"]
    pkScore = playerInfoDict["pkScore"]
    danLV = playerInfoDict["danLV"]
    cWinCount = playerInfoDict["cWinCount"]
    ondayScore = playerInfoDict["ondayScore"]
    zoneMatchPlayerList = PyGameData.g_crossPKZoneMatchPlayerDict.get(zoneID, [])
    if playerID in zoneMatchPlayerList or playerID in PyGameData.g_crossPKZoneMatchRobotPlayerDict or playerID in PyGameData.g_crossPKZoneMatchRobotPlayerDict:
        GameWorld.ErrLog("GMSetCrossPK玩家正在匹配中,无法设置该GM请求数据! playerID=%s,accID=%s" % (playerID, accID))
        return
    pkPlayer = CrossPKPlayer()
    pkPlayer.accID = accID
    pkPlayer.playerID = playerID
    pkPlayer.playerName = playerName
    pkPlayer.playerJob = playerJob
    pkPlayer.pkScore = pkScore
    pkPlayer.danLV = danLV
    pkPlayer.fightPower = fightPower
    pkPlayer.realmLV = realmLV
    pkPlayer.cWinCount = cWinCount
    pkPlayer.ondayScore = ondayScore
    pkPlayer.serverGroupID = serverGroupID
    pkPlayer.pkZoneID = zoneID
    pkPlayer.seasonID = seasonID
    # 更新排行榜
    isOK = UpdateCrossPKBillboard(zoneID, seasonID, pkPlayer, None, True)
    GameWorld.Log("GMSetCrossPK设置跨服PK榜单玩家数据成功: isOK=%s,zoneID=%s,seasonID=%s,pkScore=%s,danLV=%s,cWinCount=%s,accID=%s"
                  % (isOK, zoneID, seasonID, pkScore, danLV, cWinCount, accID), playerID)
    # 记录流向
    dataDict = {"zoneID":zoneID, "seasonID":seasonID, "pkPlayer":pkPlayer.GetDRInfo()}
    DR_CrossReamlPK("GMSet", dataDict)
    return
##================================== 以下是子服逻辑 ==========================================
def OnGameServerInitOK():
@@ -2180,3 +2240,30 @@
    DataRecordPack.SendEventPack("CrossPK_%s" % eventName, drDataDict)
    return
def IsCrossRealmPKPlayer(playerID, checkPreSeason=False, checkAllSeason=False):
    ## 仅跨服服务器判断用
    # @param checkPreSeason: 检查上一赛季
    # @param checkAllSeason: 检查所有赛季
    # 默认取分区1的赛季作为当前赛季,所有分区赛季ID相同,且递增
    gameWorld = GameWorld.GetGameWorld()
    nowSeasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % 1)
    preSeasonID = nowSeasonID - 1
    crossPKBillboardMgr = PyDataManager.GetCrossPKBillboardManager()
    crossZoneName = GameWorld.GetCrossZoneName()
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetCrossRealmPKSeasonCount()):
        seasonIpyData = ipyDataMgr.GetCrossRealmPKSeasonByIndex(index)
        if crossZoneName != seasonIpyData.GetCrossZoneName():
            continue
        zoneID = seasonIpyData.GetZoneID()
        seasonID = seasonIpyData.GetSeasonID()
        if checkAllSeason or seasonID == nowSeasonID or (checkPreSeason and seasonID == preSeasonID):
            pass
        else:
            continue
        _, orderDict = crossPKBillboardMgr.GetCrossPKBillboardInfo(zoneID, seasonID)
        if orderDict and playerID in orderDict:
            return True
    return False