|  |  | 
 |  |  |     matchState = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
 | 
 |  |  |     if not matchState and not PyGameData.g_crossPKRoomDict:
 | 
 |  |  |         GameWorld.Log("匹配已结束,且当前没有PK中的房间了!主动广播子服最新榜单! ")
 | 
 |  |  |         zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossRealmPKZone", zoneID)
 | 
 |  |  |         crossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  |         zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
 | 
 |  |  |         if zoneIpyData:
 | 
 |  |  |             serverGroupIDList = zoneIpyData.GetServerGroupIDList()
 | 
 |  |  |             SyncPKSyncBillboardToClientServer(zoneID, seasonID, serverGroupIDList)
 | 
 |  |  | 
 |  |  |         serverTime = GameWorld.GetServerTime()
 | 
 |  |  |         curSeasonID = 0
 | 
 |  |  |         seasonState = 0
 | 
 |  |  |         seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", zoneID)
 | 
 |  |  |         crossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  |         seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", crossZoneName, zoneID)
 | 
 |  |  |         seasonList = [] if not seasonList else seasonList
 | 
 |  |  |         for seasonIpyData in seasonList:
 | 
 |  |  |             startDateStr = seasonIpyData.GetStartDate()
 | 
 |  |  | 
 |  |  |     
 | 
 |  |  |     zoneSeasonTimeDict = {}
 | 
 |  |  |     serverTime = GameWorld.GetServerTime()
 | 
 |  |  |     ipyDataMgr = IpyGameDataPY.IPY_Data()
 | 
 |  |  |     for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
 | 
 |  |  |         zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
 | 
 |  |  |     crossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  |     crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
 | 
 |  |  |     if not crossZoneList:
 | 
 |  |  |         return zoneSeasonTimeDict
 | 
 |  |  |      | 
 |  |  |     for zoneIpyData in crossZoneList:
 | 
 |  |  |         zoneID = zoneIpyData.GetZoneID()
 | 
 |  |  |         
 | 
 |  |  |         # 规定每个赛区的赛季时间需按顺序配置
 | 
 |  |  |         seasonIpyDataList = []
 | 
 |  |  |         for sIndex in xrange(ipyDataMgr.GetCrossRealmPKSeasonCount()):
 | 
 |  |  |             seasonIpyData = ipyDataMgr.GetCrossRealmPKSeasonByIndex(sIndex)
 | 
 |  |  |             if zoneID == seasonIpyData.GetZoneID():
 | 
 |  |  |                 seasonIpyDataList.append(seasonIpyData)
 | 
 |  |  |                  | 
 |  |  |         seasonIpyDataList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", crossZoneName, zoneID)
 | 
 |  |  |         if not seasonIpyDataList:
 | 
 |  |  |             continue
 | 
 |  |  |          | 
 |  |  |         for i, seasonIpyData in enumerate(seasonIpyDataList):
 | 
 |  |  |             seasonID = seasonIpyData.GetSeasonID()
 | 
 |  |  |             startDateStr = seasonIpyData.GetStartDate()
 | 
 |  |  | 
 |  |  |     
 | 
 |  |  |     gameWorld = GameWorld.GetGameWorld()
 | 
 |  |  |     serverTime = GameWorld.GetServerTime()
 | 
 |  |  |     crossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  |     for zoneID, seasonTimeInfo in zoneSeasonTimeDict.items():
 | 
 |  |  |         zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossRealmPKZone", zoneID)
 | 
 |  |  |         zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
 | 
 |  |  |         if not zoneIpyData:
 | 
 |  |  |             continue
 | 
 |  |  |         
 | 
 |  |  | 
 |  |  |         PyGameData.g_crossPKRoomDict = {}
 | 
 |  |  |         GameWorld.Log("跨服PK匹配状态开启,重置相关匹配数据!")
 | 
 |  |  |         
 | 
 |  |  |     ipyDataMgr = IpyGameDataPY.IPY_Data()
 | 
 |  |  |     for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
 | 
 |  |  |         zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
 | 
 |  |  |     crossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  |     crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
 | 
 |  |  |     if not crossZoneList:
 | 
 |  |  |         return
 | 
 |  |  |      | 
 |  |  |     for zoneIpyData in crossZoneList:
 | 
 |  |  |         zoneID = zoneIpyData.GetZoneID()
 | 
 |  |  |         
 | 
 |  |  |         # 广播当前赛区的所有子服跨服PK赛季状态变更
 | 
 |  |  | 
 |  |  |         
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def ClientServerMsg_ServerInitOK(serverGroupID, tick):
 | 
 |  |  |     ## 子服启动成功
 | 
 |  |  |     GameWorld.Log("子服启动成功,同步给子服对应的赛季信息: serverGroupID=%s" % (serverGroupID))
 | 
 |  |  |     zoneID = GetCrossPKServerGroupZoneID(serverGroupID)
 | 
 |  |  |     if not zoneID:
 | 
 |  |  |         GameWorld.Log("    该子服没有分配赛区,不同步!")
 | 
 |  |  | def Sync_CrossPKInitDataToClientServer(tick, serverGroupID=0):
 | 
 |  |  |     ''' 同步跨服PK活动数据到子服务器
 | 
 |  |  |     @param serverGroupID: 为0时同步所有子服
 | 
 |  |  |     '''
 | 
 |  |  |      | 
 |  |  |     GameWorld.Log("同步给子服对应的赛季信息: syncServerGroupID=%s" % (serverGroupID))
 | 
 |  |  |     if serverGroupID:
 | 
 |  |  |         ipyData = GetCrossPKServerGroupZone(serverGroupID)
 | 
 |  |  |         if not ipyData:
 | 
 |  |  |             return
 | 
 |  |  |         crossZoneList = [ipyData]
 | 
 |  |  |     else:
 | 
 |  |  |         crossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  |         crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
 | 
 |  |  |     if not crossZoneList:
 | 
 |  |  |         return
 | 
 |  |  |     gameWorld = GameWorld.GetGameWorld()
 | 
 |  |  |     seasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID)
 | 
 |  |  |     seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
 | 
 |  |  |     matchState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
 | 
 |  |  |     seasonInfo = {"ZoneID":zoneID, "SeasonID":seasonID, "SeasonState":seasonState, "MatchState":matchState}
 | 
 |  |  |     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKSeasonInfo, seasonInfo, [serverGroupID])
 | 
 |  |  |     for zoneIpyData in crossZoneList:
 | 
 |  |  |         zoneID = zoneIpyData.GetZoneID()
 | 
 |  |  |         seasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID)
 | 
 |  |  |         seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
 | 
 |  |  |         matchState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
 | 
 |  |  |         seasonInfo = {"ZoneID":zoneID, "SeasonID":seasonID, "SeasonState":seasonState, "MatchState":matchState}
 | 
 |  |  |         serverGroupIDList = [serverGroupID] if serverGroupID else zoneIpyData.GetServerGroupIDList()
 | 
 |  |  |         CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKSeasonInfo, seasonInfo, serverGroupIDList)
 | 
 |  |  |          | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def GetCrossPKServerGroupZoneID(serverGroupID):
 | 
 |  |  | def GetCrossPKServerGroupZone(serverGroupID):
 | 
 |  |  |     ## 获取服务器组ID对应的跨服PK所属赛区,返回0代表该服务器没有分配赛区
 | 
 |  |  |     ipyDataMgr = IpyGameDataPY.IPY_Data()
 | 
 |  |  |     for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
 | 
 |  |  |         zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
 | 
 |  |  |     crossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  |     crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
 | 
 |  |  |     if not crossZoneList:
 | 
 |  |  |         return
 | 
 |  |  |      | 
 |  |  |     for zoneIpyData in crossZoneList:
 | 
 |  |  |         for groupInfo in zoneIpyData.GetServerGroupIDList():
 | 
 |  |  |             if (isinstance(groupInfo, int) and serverGroupID == groupInfo) \
 | 
 |  |  |                 or (isinstance(groupInfo, tuple) and len(groupInfo) == 2 and groupInfo[0] <= serverGroupID <= groupInfo[1]):
 | 
 |  |  |                 return zoneIpyData.GetZoneID()
 | 
 |  |  |     return 0
 | 
 |  |  |                 return zoneIpyData
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def OnPlayerLoginCrossServer(curPlayer):
 | 
 |  |  |     # 跨服登录处理
 | 
 |  |  | 
 |  |  |         return
 | 
 |  |  |     __OnLoginNotifyPKOverInfo(curPlayer)
 | 
 |  |  |     
 | 
 |  |  |     crossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  |     crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
 | 
 |  |  |     if not crossZoneList:
 | 
 |  |  |         return
 | 
 |  |  |     # 同步所有赛区赛季信息
 | 
 |  |  |     zoneSeasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeasonInfo()
 | 
 |  |  |     zoneSeasonInfo.ZoneList = []
 | 
 |  |  |     ipyDataMgr = IpyGameDataPY.IPY_Data()
 | 
 |  |  |     for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
 | 
 |  |  |         zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
 | 
 |  |  |     for zoneIpyData in crossZoneList:
 | 
 |  |  |         zoneID = zoneIpyData.GetZoneID()
 | 
 |  |  |         zoneInfo = ChPyNetSendPack.tagGCCrossRealmPKZone()
 | 
 |  |  |         zoneInfo.ZoneID = zoneID
 | 
 |  |  |         zoneInfo.ZoneName = zoneIpyData.GetZoneName().decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())
 | 
 |  |  |         zoneInfo.ZoneNameLen = len(zoneInfo.ZoneName)
 | 
 |  |  |         zoneInfo.SeasonList = []
 | 
 |  |  |         seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", zoneID)
 | 
 |  |  |         seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", crossZoneName, zoneID)
 | 
 |  |  |         seasonList = [] if not seasonList else seasonList
 | 
 |  |  |         for seasonIpyData in seasonList:
 | 
 |  |  |             seasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeason()
 | 
 |  |  | 
 |  |  |     seasonStatePack.SeasonID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID)
 | 
 |  |  |     seasonStatePack.SeasonState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState)
 | 
 |  |  |     seasonStatePack.MatchState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
 | 
 |  |  |     seasonStatePack.CrossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  |     seasonStatePack.CrossZoneNameLen = len(seasonStatePack.CrossZoneName)
 | 
 |  |  |     NetPackCommon.SendFakePack(curPlayer, seasonStatePack)
 | 
 |  |  |         
 | 
 |  |  |     return
 | 
 |  |  | 
 |  |  | #        return
 | 
 |  |  | 
 | 
 |  |  |     vsRoomID = curPlayer.GetVsRoomId()
 | 
 |  |  |     if vsRoomID and PlayerControl.GetCrossRealmState(curPlayer) == 1:
 | 
 |  |  |     if vsRoomID and PlayerControl.GetCrossMapID(curPlayer) == ChConfig.Def_FBMapID_CrossRealmPK:
 | 
 |  |  |         GameWorld.DebugLog("玩家跨服PK状态,不能取消匹配!vsRoomID=%s" % vsRoomID, curPlayer.GetPlayerID())
 | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  | 
 |  |  | #    ipyDataMgr = IpyGameDataPY.IPY_Data()
 | 
 |  |  | #    if maxDanLV == None:
 | 
 |  |  | #        maxDanLV = ipyDataMgr.GetCrossRealmPKDanCount() - 1
 | 
 |  |  | #    for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
 | 
 |  |  | #        zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
 | 
 |  |  | #    crossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  | #    crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
 | 
 |  |  | #    if not crossZoneList:
 | 
 |  |  | #        return
 | 
 |  |  | #    for zoneIpyData in crossZoneList:
 | 
 |  |  | #        pkZoneID = zoneIpyData.GetZoneID()
 | 
 |  |  | #        
 | 
 |  |  | #        addPlayerList = []
 | 
 |  |  | 
 |  |  |     GameWorld.Log("    zoneID=%s,seasonID=%s,seasonState=%s,matchState=%s" % (zoneID, seasonID, seasonState, matchState))
 | 
 |  |  |     if not zoneID:
 | 
 |  |  |         return
 | 
 |  |  |      | 
 |  |  |     if not seasonID:
 | 
 |  |  |         dbSeasonID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID)
 | 
 |  |  |         if dbSeasonID:
 | 
 |  |  |             GameWorld.ErrLog("    已经有分配赛季ID的暂定不能被置为0! dbSeasonID=%s" % dbSeasonID)
 | 
 |  |  |             return
 | 
 |  |  |          | 
 |  |  |     gameWorld = GameWorld.GetGameWorld()
 | 
 |  |  |     curSeasonState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState)
 | 
 |  |  |     
 | 
 |  |  | 
 |  |  |     seasonStatePack.SeasonID = seasonID
 | 
 |  |  |     seasonStatePack.SeasonState = seasonState
 | 
 |  |  |     seasonStatePack.MatchState = matchState
 | 
 |  |  |     seasonStatePack.CrossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  |     seasonStatePack.CrossZoneNameLen = len(seasonStatePack.CrossZoneName)
 | 
 |  |  |     playerManager = GameWorld.GetPlayerManager()
 | 
 |  |  |     for i in xrange(playerManager.GetPlayerCount()):
 | 
 |  |  |         curPlayer = playerManager.GetPlayerByIndex(i)
 | 
 |  |  | 
 |  |  |                     matchPlayer.MaxProDef = readyPlayerInfo["MaxProDef"]
 | 
 |  |  |                     break
 | 
 |  |  |                 
 | 
 |  |  |             PlayerControl.SetCrossRealmState(player, ChConfig.Def_FBMapID_CrossRealmPK)
 | 
 |  |  |             PlayerControl.SetCrossMapID(player, ChConfig.Def_FBMapID_CrossRealmPK)
 | 
 |  |  |             SetIsCrossPKMatching(player, 0)
 | 
 |  |  |             
 | 
 |  |  |             # 通知匹配成功,可进入跨服
 | 
 |  |  | 
 |  |  |             GameWorld.DebugLog("    房间ID不同, playerID=%s" % (playerID))
 | 
 |  |  |             continue
 | 
 |  |  |         player.SetDict(ChConfig.Def_PlayerKey_IsLoginToMergeServer, 0)
 | 
 |  |  |         PlayerControl.SetCrossRealmState(player, 0)
 | 
 |  |  |         PlayerControl.SetCrossMapID(player, 0)
 | 
 |  |  |         
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | 
 |  |  |         
 | 
 |  |  |         sendMapOverInfo = [roomID, zoneID, seasonID, timeStr, overType, winnerID, roundWinnerIDList, pkScore, danLV, cWinCount, addScore, tagPlayerID, tagPlayerName, notifyState]
 | 
 |  |  |         player = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
 | 
 |  |  |         if not player:
 | 
 |  |  |             CrossRealmPlayer.DoOfflinePlayerExitCrossServer(playerID)
 | 
 |  |  |         if not player or PlayerControl.GetIsTJG(player):
 | 
 |  |  |             GameWorld.DebugLog("    玩家不在线 或脱机中,先缓存,玩家上线后再同步,playerID=%s" % (playerID))
 | 
 |  |  |             overInfoData = PyGameDataStruct.tagDBCrossPKUnNotifyOverInfo()
 | 
 |  |  | 
 |  |  |     overInfoData = PyDataManager.GetCrossPKUnNotifyOverInfoManager().GetPlayerUnNotifyOverInfo(playerID)
 | 
 |  |  |     if not overInfoData:
 | 
 |  |  |         return
 | 
 |  |  |     PlayerControl.SetCrossRealmState(curPlayer, 0)
 | 
 |  |  |     PlayerControl.SetCrossMapID(curPlayer, 0)
 | 
 |  |  |     PlayerControl.SetVsRoomId(curPlayer, 0)
 | 
 |  |  |     
 | 
 |  |  |     zoneID = overInfoData.ZoneID
 |