|  |  | 
 |  |  |         self.playerJob = 0
 | 
 |  |  |         self.playerLV = 0
 | 
 |  |  |         self.maxHP = 0
 | 
 |  |  |         self.maxProDef = 0
 | 
 |  |  |         self.fightPower = 0
 | 
 |  |  |         self.realmLV = 0
 | 
 |  |  |         self.pkScore = 0
 | 
 |  |  | 
 |  |  |         billboardData.PKScore = pkPlayer.pkScore
 | 
 |  |  |         billboardData.DanLV = pkPlayer.danLV
 | 
 |  |  |         billboardData.Time = billboardTime
 | 
 |  |  |         GameWorld.Log("    更新PK积分排行榜: playerID=%s,pkScore=%s,order=%s" % (playerID, billboardData.PKScore, order), playerID)
 | 
 |  |  |         GameWorld.DebugLog("    更新PK积分排行榜: playerID=%s,pkScore=%s,order=%s" % (playerID, billboardData.PKScore, order), playerID)
 | 
 |  |  |         
 | 
 |  |  |     # 战斗结算更新榜单先不排序,只设置需要排序
 | 
 |  |  |     if isUpd:
 | 
 |  |  | 
 |  |  |     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()
 | 
 |  |  | 
 |  |  | def CrossServerMsg_PKSyncBillboard(syncInfo):
 | 
 |  |  |     ## 收到跨服服务器同步的排行榜信息
 | 
 |  |  |     zoneID, seasonID, syncBillboardList, exData, isFinalBillboardData = syncInfo
 | 
 |  |  |     GameWorld.Log("收到跨服服务器同步的排行榜信息: zoneID=%s,seasonID=%s,billboardDataCount=%s,exData=%s,isFinalBillboardData=%s"  | 
 |  |  |                   % (zoneID, seasonID, len(syncBillboardList), exData, isFinalBillboardData))
 | 
 |  |  |     GameWorld.DebugLog("收到跨服服务器同步的排行榜信息: zoneID=%s,seasonID=%s,billboardDataCount=%s,exData=%s,isFinalBillboardData=%s"  | 
 |  |  |                        % (zoneID, seasonID, len(syncBillboardList), exData, isFinalBillboardData))
 | 
 |  |  |     
 | 
 |  |  |     crossPKBillboardMgr = PyDataManager.GetCrossPKBillboardManager()
 | 
 |  |  |     billboardList, orderDict = crossPKBillboardMgr.UpdClientServerPKBillboard(zoneID, seasonID, syncBillboardList, isFinalBillboardData)
 | 
 |  |  | 
 |  |  |     
 | 
 |  |  |     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):
 | 
 |  |  |     # 跨服登录处理
 | 
 |  |  |      | 
 |  |  |     mapID = curPlayer.GetMapID()
 | 
 |  |  |     mapIDList = IpyGameDataPY.GetFuncCfg("CrossRealmPKMatch", 4)
 | 
 |  |  |     if mapID not in mapIDList:
 | 
 |  |  |         return
 | 
 |  |  |      | 
 |  |  |     GameWorld.Log("玩家登录跨服PK地图, mapID=%s" % mapID, curPlayer.GetPlayerID())
 | 
 |  |  |     if not __CheckCanLoginCrossServerPKMap(curPlayer):
 | 
 |  |  |         CrossRealmPlayer.PlayerExitCrossServer(curPlayer)
 | 
 |  |  |         return
 | 
 |  |  |      | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def OnPlayerLogin(curPlayer):
 | 
 |  |  |      | 
 |  |  |     # 本服登录处理
 | 
 |  |  |     if not GameWorld.IsCrossServer():
 | 
 |  |  |         # 本服没有分配赛区不处理
 | 
 |  |  |         if not GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID):
 | 
 |  |  |             return
 | 
 |  |  |         __OnLoginNotifyPKOverInfo(curPlayer)
 | 
 |  |  |          | 
 |  |  |         # 同步所有赛区赛季信息
 | 
 |  |  |         zoneSeasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeasonInfo()
 | 
 |  |  |         zoneSeasonInfo.ZoneList = []
 | 
 |  |  |         ipyDataMgr = IpyGameDataPY.IPY_Data()
 | 
 |  |  |         for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
 | 
 |  |  |             zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
 | 
 |  |  |             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 = [] if not seasonList else seasonList
 | 
 |  |  |             for seasonIpyData in seasonList:
 | 
 |  |  |                 seasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeason()
 | 
 |  |  |                 seasonInfo.SeasonID = seasonIpyData.GetSeasonID()
 | 
 |  |  |                 seasonInfo.StartDate = seasonIpyData.GetStartDate()
 | 
 |  |  |                 seasonInfo.EndDate = seasonIpyData.GetEndDate()
 | 
 |  |  |                 seasonInfo.EndTime = seasonIpyData.GetEndTime()
 | 
 |  |  |                 zoneInfo.SeasonList.append(seasonInfo)
 | 
 |  |  |             zoneInfo.SeasonCount = len(zoneInfo.SeasonList)
 | 
 |  |  |             zoneSeasonInfo.ZoneList.append(zoneInfo)
 | 
 |  |  |         zoneSeasonInfo.ZoneCount = len(zoneSeasonInfo.ZoneList)
 | 
 |  |  |         NetPackCommon.SendFakePack(curPlayer, zoneSeasonInfo)
 | 
 |  |  |          | 
 |  |  |         # 同步本服赛季状态
 | 
 |  |  |         gameWorld = GameWorld.GetGameWorld()
 | 
 |  |  |         seasonStatePack = ChPyNetSendPack.tagGCCrossRealmPKSeasonState()
 | 
 |  |  |         seasonStatePack.ZoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
 | 
 |  |  |         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)
 | 
 |  |  |         NetPackCommon.SendFakePack(curPlayer, seasonStatePack)
 | 
 |  |  |          | 
 |  |  |     # 跨服登录处理
 | 
 |  |  |     else:
 | 
 |  |  |         mapID = curPlayer.GetMapID()
 | 
 |  |  |         mapIDList = IpyGameDataPY.GetFuncCfg("CrossRealmPKMatch", 4)
 | 
 |  |  |         if mapID not in mapIDList:
 | 
 |  |  |             return
 | 
 |  |  |          | 
 |  |  |         GameWorld.Log("玩家登录跨服PK地图, mapID=%s" % mapID, curPlayer.GetPlayerID())
 | 
 |  |  |         if not __CheckCanLoginCrossServerPKMap(curPlayer):
 | 
 |  |  |             CrossRealmPlayer.PlayerExitCrossServer(curPlayer)
 | 
 |  |  |             return
 | 
 |  |  |      | 
 |  |  |     # 本服没有分配赛区不处理
 | 
 |  |  |     if not GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID):
 | 
 |  |  |         return
 | 
 |  |  |     __OnLoginNotifyPKOverInfo(curPlayer)
 | 
 |  |  |      | 
 |  |  |     crossZoneName = GameWorld.GetCrossZoneName()
 | 
 |  |  |     crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
 | 
 |  |  |     if not crossZoneList:
 | 
 |  |  |         return
 | 
 |  |  |     # 同步所有赛区赛季信息
 | 
 |  |  |     zoneSeasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeasonInfo()
 | 
 |  |  |     zoneSeasonInfo.ZoneList = []
 | 
 |  |  |     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", crossZoneName, zoneID)
 | 
 |  |  |         seasonList = [] if not seasonList else seasonList
 | 
 |  |  |         for seasonIpyData in seasonList:
 | 
 |  |  |             seasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeason()
 | 
 |  |  |             seasonInfo.SeasonID = seasonIpyData.GetSeasonID()
 | 
 |  |  |             seasonInfo.StartDate = seasonIpyData.GetStartDate()
 | 
 |  |  |             seasonInfo.EndDate = seasonIpyData.GetEndDate()
 | 
 |  |  |             seasonInfo.EndTime = seasonIpyData.GetEndTime()
 | 
 |  |  |             zoneInfo.SeasonList.append(seasonInfo)
 | 
 |  |  |         zoneInfo.SeasonCount = len(zoneInfo.SeasonList)
 | 
 |  |  |         zoneSeasonInfo.ZoneList.append(zoneInfo)
 | 
 |  |  |     zoneSeasonInfo.ZoneCount = len(zoneSeasonInfo.ZoneList)
 | 
 |  |  |     NetPackCommon.SendFakePack(curPlayer, zoneSeasonInfo)
 | 
 |  |  |      | 
 |  |  |     # 同步本服赛季状态
 | 
 |  |  |     gameWorld = GameWorld.GetGameWorld()
 | 
 |  |  |     seasonStatePack = ChPyNetSendPack.tagGCCrossRealmPKSeasonState()
 | 
 |  |  |     seasonStatePack.ZoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
 | 
 |  |  |     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
 | 
 |  |  |     
 | 
 |  |  | 
 |  |  |     CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_PKCancel, dataMsg)
 | 
 |  |  |     PlayerControl.SetVsRoomId(curPlayer, 0)
 | 
 |  |  |     SetIsCrossPKMatching(curPlayer, 0)
 | 
 |  |  |     GameWorld.Log("发送取消跨服PK匹配到跨服服务器:dataMsg=%s" % str(dataMsg), curPlayer.GetPlayerID())
 | 
 |  |  |     GameWorld.DebugLog("发送取消跨服PK匹配到跨服服务器:dataMsg=%s" % str(dataMsg), curPlayer.GetPlayerID())
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def ClientServerMsg_PKMatch(serverGroupID, playerInfoDict, tick):
 | 
 |  |  | 
 |  |  |     job = playerInfoDict["playerJob"] # ְҵ
 | 
 |  |  |     playerLV = playerInfoDict["playerLV"] # ְҵ
 | 
 |  |  |     maxHP = playerInfoDict["maxHP"] # ְҵ
 | 
 |  |  |     maxProDef = playerInfoDict["maxProDef"] # 护盾
 | 
 |  |  |     fightPower = playerInfoDict["fightPower"] # 战斗力
 | 
 |  |  |     realmLV = playerInfoDict["realmLV"] # 境界
 | 
 |  |  |     pkScore = playerInfoDict["pkScore"] # 当前积分
 | 
 |  |  | 
 |  |  |     pkPlayer.playerJob = job
 | 
 |  |  |     pkPlayer.playerLV = playerLV
 | 
 |  |  |     pkPlayer.maxHP = maxHP
 | 
 |  |  |     pkPlayer.maxProDef = maxProDef
 | 
 |  |  |     pkPlayer.pkScore = pkScore
 | 
 |  |  |     pkPlayer.danLV = danLV
 | 
 |  |  |     pkPlayer.fightPower = fightPower
 | 
 |  |  | 
 |  |  |     zoneMatchPlayerList.append(playerID)
 | 
 |  |  |     PyGameData.g_crossPKZoneMatchPlayerDict[pkZoneID] = zoneMatchPlayerList
 | 
 |  |  |     
 | 
 |  |  |     GameWorld.Log("玩家加入匹配: seasonID=%s,pkZoneID=%s,serverGroupID=%s,accID=%s,playerID=%s,pkScore=%s,fightPower=%s,cWinCount=%s,len(zoneMatchPlayerList)=%s"  | 
 |  |  |                   % (seasonID, pkZoneID, serverGroupID, accID, playerID, pkScore, fightPower, cWinCount, len(zoneMatchPlayerList)))
 | 
 |  |  |     GameWorld.DebugLog("玩家加入匹配: seasonID=%s,pkZoneID=%s,serverGroupID=%s,accID=%s,playerID=%s,pkScore=%s,fightPower=%s,cWinCount=%s,len(zoneMatchPlayerList)=%s"  | 
 |  |  |                        % (seasonID, pkZoneID, serverGroupID, accID, playerID, pkScore, fightPower, cWinCount, len(zoneMatchPlayerList)))
 | 
 |  |  |     
 | 
 |  |  |     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKMatchReqRet, [playerID, 1], [serverGroupID])
 | 
 |  |  |     return
 | 
 |  |  | 
 |  |  |             GameWorld.Log("跨服对战房间已经开启了线路,或者双方数据都已传输完毕,不可再取消匹配!vsRoomID=%s" % vsRoomID)
 | 
 |  |  |             return
 | 
 |  |  |         
 | 
 |  |  |     GameWorld.Log("玩家取消匹配: reason=%s,accID=%s,playerID=%s,vsRoomID=%s" % (reason, accID, playerID, vsRoomID))
 | 
 |  |  |     GameWorld.DebugLog("玩家取消匹配: reason=%s,accID=%s,playerID=%s,vsRoomID=%s" % (reason, accID, playerID, vsRoomID))
 | 
 |  |  |     
 | 
 |  |  |     pkZoneID = 0
 | 
 |  |  |     if playerID in PyGameData.g_crossPKPlayerDict:
 | 
 |  |  |         pkPlayer = PyGameData.g_crossPKPlayerDict.pop(playerID)
 | 
 |  |  |         pkZoneID = pkPlayer.pkZoneID
 | 
 |  |  |         GameWorld.Log("    移除PK玩家: pkZoneID=%s,accID=%s,playerID=%s" % (pkZoneID, accID, playerID))
 | 
 |  |  |         GameWorld.DebugLog("    移除PK玩家: pkZoneID=%s,accID=%s,playerID=%s" % (pkZoneID, accID, playerID))
 | 
 |  |  |         
 | 
 |  |  |     zoneMatchPlayerList = PyGameData.g_crossPKZoneMatchPlayerDict.get(pkZoneID, [])
 | 
 |  |  |     if playerID in zoneMatchPlayerList:
 | 
 |  |  |         zoneMatchPlayerList.remove(playerID)
 | 
 |  |  |         GameWorld.Log("    从匹配队列中删除,匹配队列剩余人数=%s" % (len(zoneMatchPlayerList)))
 | 
 |  |  |         GameWorld.DebugLog("    从匹配队列中删除,匹配队列剩余人数=%s" % (len(zoneMatchPlayerList)))
 | 
 |  |  |         
 | 
 |  |  |     #取消所有存在该玩家的房间,子服不一定知道玩家当前最新所属房间ID, 故只能通过遍历删除已经为玩家创建的房间
 | 
 |  |  |     for roomID, pkRoom in PyGameData.g_crossPKRoomDict.items():
 | 
 |  |  | 
 |  |  |         
 | 
 |  |  |         for roomPlayerID in pkRoom.roomPlayerIDList:
 | 
 |  |  |             if roomPlayerID == playerID:
 | 
 |  |  |                 GameWorld.Log("    自己不处理: roomID=%s,playerID=%s" % (roomID, playerID))
 | 
 |  |  |                 GameWorld.DebugLog("    自己不处理: roomID=%s,playerID=%s" % (roomID, playerID))
 | 
 |  |  |                 continue
 | 
 |  |  |             
 | 
 |  |  |             zoneMatchPlayerList = PyGameData.g_crossPKZoneMatchPlayerDict.get(pkZoneID, [])
 | 
 |  |  |             zoneMatchPlayerList.append(roomPlayerID)
 | 
 |  |  |             PyGameData.g_crossPKZoneMatchPlayerDict[pkZoneID] = zoneMatchPlayerList
 | 
 |  |  |             GameWorld.Log("    将之前匹配的对手重新加入匹配队列: roomID=%s,roomPlayerID=%s,当前匹配人数=%s"  | 
 |  |  |                           % (roomID, roomPlayerID, len(zoneMatchPlayerList)))
 | 
 |  |  |             GameWorld.DebugLog("    将之前匹配的对手重新加入匹配队列: roomID=%s,roomPlayerID=%s,当前匹配人数=%s"  | 
 |  |  |                                % (roomID, roomPlayerID, len(zoneMatchPlayerList)))
 | 
 |  |  |             
 | 
 |  |  |         PyGameData.g_crossPKRoomDict.pop(roomID)
 | 
 |  |  |         GameWorld.Log("    移除房间: popRoomID=%s" % (roomID))
 | 
 |  |  |         GameWorld.DebugLog("    移除房间: popRoomID=%s" % (roomID))
 | 
 |  |  |         
 | 
 |  |  |         # 记录流向
 | 
 |  |  |         dataDict = {"cancelPlayerID":playerID}
 | 
 |  |  | 
 |  |  |     if playerID not in vsRoom.readyPlayerIDList:
 | 
 |  |  |         vsRoom.readyPlayerIDList.append(playerID)
 | 
 |  |  |         
 | 
 |  |  |     GameWorld.Log("玩家跨服PK准备完毕: accID=%s,playerID=%s,vsRoomID=%s" % (accID, playerID, vsRoomID))
 | 
 |  |  |     GameWorld.DebugLog("玩家跨服PK准备完毕: accID=%s,playerID=%s,vsRoomID=%s" % (accID, playerID, vsRoomID))
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def __ReadyOKRoomPlayerProcess(tick):
 | 
 |  |  | 
 |  |  |             pkZoneID = roomPlayer.pkZoneID
 | 
 |  |  |             roomGroupIDList.append(roomPlayer.serverGroupID)
 | 
 |  |  |             readyMemberDict[roomPlayerID] = {"ServerGroupID":roomPlayer.serverGroupID, "Name":roomPlayer.playerName, "Number":num,
 | 
 |  |  |                                              "Job":roomPlayer.playerJob, "LV":roomPlayer.playerLV, "MaxHP":roomPlayer.maxHP}
 | 
 |  |  |                                              "Job":roomPlayer.playerJob, "LV":roomPlayer.playerLV, "MaxHP":roomPlayer.maxHP, "MaxProDef":roomPlayer.maxProDef}
 | 
 |  |  |                     
 | 
 |  |  |         if not isAllReady:
 | 
 |  |  |             continue
 | 
 |  |  |         vsRoom.roomState = ShareDefine.Def_VsRoom_State_PrepareFight
 | 
 |  |  |         vsRoom.readyTick = tick
 | 
 |  |  |         GameWorld.Log("    准备好的房间: pkZoneID=%s,roomID=%s,mapID=%s,readyMemberDict=%s" % (pkZoneID, roomID, vsRoom.mapID, str(readyMemberDict)))
 | 
 |  |  |         GameWorld.DebugLog("    准备好的房间: pkZoneID=%s,roomID=%s,mapID=%s,readyMemberDict=%s" % (pkZoneID, roomID, vsRoom.mapID, str(readyMemberDict)))
 | 
 |  |  |         
 | 
 |  |  |         sendReadyOKRoomList.append([roomID, readyMemberDict])
 | 
 |  |  |         serverGroupIDList += roomGroupIDList
 | 
 |  |  |         
 | 
 |  |  |     # 将已准备好的房间广播到子服
 | 
 |  |  |     if sendReadyOKRoomList:
 | 
 |  |  |         GameWorld.Log("    已准备好的对战房间数: %s" % len(sendReadyOKRoomList))
 | 
 |  |  |         GameWorld.DebugLog("    已准备好的对战房间数: %s" % len(sendReadyOKRoomList))
 | 
 |  |  |         CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKReadyOKRoomList, sendReadyOKRoomList, serverGroupIDList)
 | 
 |  |  |         
 | 
 |  |  |     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("匹配PK人数不足,不处理!pkZoneID=%s, 总人数:%s" % (pkZoneID, matchPlayerCount))
 | 
 |  |  |             continue
 | 
 |  |  |         
 | 
 |  |  |         GameWorld.Log("★★★★★★★★★★开始跨服PK匹配(pkZoneID=%s, 总人数:%s)★★★★★★★★★★" % (pkZoneID, matchPlayerCount))
 | 
 |  |  |         GameWorld.DebugLog("★★★★★★★★★★开始跨服PK匹配(pkZoneID=%s, 总人数:%s)★★★★★★★★★★" % (pkZoneID, matchPlayerCount))
 | 
 |  |  |         
 | 
 |  |  |         matchPlayerList = []
 | 
 |  |  |         for matchPlayerID in matchPlayerIDList:
 | 
 |  |  | 
 |  |  |         # 给成功匹配的玩家非配对战房间
 | 
 |  |  |         matchPlayerVSList = matchPlayerVSList[:maxGroupCnt]
 | 
 |  |  |         __DoSetVSRoom(pkZoneID, matchPlayerVSList, tick)
 | 
 |  |  |         GameWorld.Log("==========匹配结束(总匹配队伍:%s)==========" % len(matchPlayerVSList))
 | 
 |  |  |         #GameWorld.Log("crossPlayerIDList=%s" % PyGameData.g_crossPKPlayerDict.keys())
 | 
 |  |  |         #GameWorld.Log("matchPlayerIDList=%s" % PyGameData.g_crossPKZoneMatchPlayerDict[pkZoneID])
 | 
 |  |  |         GameWorld.DebugLog("==========匹配结束(总匹配队伍:%s)==========" % len(matchPlayerVSList))
 | 
 |  |  |         #GameWorld.DebugLog("crossPlayerIDList=%s" % PyGameData.g_crossPKPlayerDict.keys())
 | 
 |  |  |         #GameWorld.DebugLog("matchPlayerIDList=%s" % PyGameData.g_crossPKZoneMatchPlayerDict[pkZoneID])
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | 
 |  |  |     '''匹配超时玩家
 | 
 |  |  |         匹配中的玩家按积分排序,最后一个默认匹配上一个,第一个默认匹配下一个,其他匹配前后积分差绝对值较小的一个
 | 
 |  |  |     '''
 | 
 |  |  |     GameWorld.Log(" ==优先匹配超时等待玩家==最大等待时间:%s, tick=%s" % (outTimeTick, tick))
 | 
 |  |  |     GameWorld.Log(" scoreSortListLen=%s" % len(scoreSortList))
 | 
 |  |  |     GameWorld.DebugLog(" ==优先匹配超时等待玩家==最大等待时间:%s, tick=%s" % (outTimeTick, tick))
 | 
 |  |  |     GameWorld.DebugLog(" scoreSortListLen=%s" % len(scoreSortList))
 | 
 |  |  |     for i, matchPlayer in enumerate(matchTickSortList):        
 | 
 |  |  |         # 只有一个玩家
 | 
 |  |  |         if len(scoreSortList) <= 1:
 | 
 |  |  |             #GameWorld.Log("    当前玩家数%s<=1,不再匹配!" % len(scoreSortList))
 | 
 |  |  |             #GameWorld.DebugLog("    当前玩家数%s<=1,不再匹配!" % len(scoreSortList))
 | 
 |  |  |             break
 | 
 |  |  |         
 | 
 |  |  |         if tick - matchPlayer.matchTick < outTimeTick:
 | 
 |  |  |             #GameWorld.Log("    i=%s,玩家未超时,不再匹配!" % (i))
 | 
 |  |  |             #GameWorld.DebugLog("    i=%s,玩家未超时,不再匹配!" % (i))
 | 
 |  |  |             break
 | 
 |  |  |         
 | 
 |  |  |         GameWorld.Log("    i=%s,超时玩家, %s-%s=%s >= outTimeTick(%s)"  | 
 |  |  |                       % (i, tick, matchPlayer.matchTick, tick - matchPlayer.matchTick, outTimeTick))
 | 
 |  |  |         GameWorld.DebugLog("    i=%s,超时玩家, %s-%s=%s >= outTimeTick(%s)"  | 
 |  |  |                            % (i, tick, matchPlayer.matchTick, tick - matchPlayer.matchTick, outTimeTick))
 | 
 |  |  |         # 已经被匹配走了
 | 
 |  |  |         if matchPlayer not in scoreSortList:
 | 
 |  |  |             GameWorld.Log("        已经被匹配走了!")
 | 
 |  |  |             GameWorld.DebugLog("        已经被匹配走了!")
 | 
 |  |  |             continue
 | 
 |  |  |         
 | 
 |  |  |         outTimeIndex = scoreSortList.index(matchPlayer)
 | 
 |  |  |         # 最后一个默认匹配上一个
 | 
 |  |  |         if outTimeIndex == len(scoreSortList) - 1: 
 | 
 |  |  |             vsIndex = outTimeIndex - 1
 | 
 |  |  |             GameWorld.Log("        超时玩家积分排序索引%s,最后一个,默认匹配上一个索引%s!" % (outTimeIndex, vsIndex))
 | 
 |  |  |             GameWorld.DebugLog("        超时玩家积分排序索引%s,最后一个,默认匹配上一个索引%s!" % (outTimeIndex, vsIndex))
 | 
 |  |  |         # 第一个默认匹配下一个
 | 
 |  |  |         elif outTimeIndex == 0:
 | 
 |  |  |             vsIndex = outTimeIndex + 1
 | 
 |  |  |             GameWorld.Log("        超时玩家积分排序索引%s,第一个,默认匹配下一个索引%s!" % (outTimeIndex, vsIndex))
 | 
 |  |  |             GameWorld.DebugLog("        超时玩家积分排序索引%s,第一个,默认匹配下一个索引%s!" % (outTimeIndex, vsIndex))
 | 
 |  |  |         # 其他情况匹配积分较近的一个
 | 
 |  |  |         else:
 | 
 |  |  |             preIndex = outTimeIndex - 1
 | 
 |  |  | 
 |  |  |             preDiff = abs(prePlayer.pkScore - matchPlayer.pkScore)
 | 
 |  |  |             nextDiff = abs(matchPlayer.pkScore - nextPlayer.pkScore)
 | 
 |  |  |             vsIndex = preIndex if preDiff <= nextDiff else nextIndex
 | 
 |  |  |             GameWorld.Log("        超时玩家积分排序索引-积分(%s-%s),上一个(%s-%s),下一个(%s-%s),preDiff=%s,nextDiff=%s,vsIndex=%s"  | 
 |  |  |                           % (outTimeIndex, matchPlayer.pkScore, preIndex, prePlayer.pkScore,
 | 
 |  |  |                              nextIndex, nextPlayer.pkScore, preDiff, nextDiff, vsIndex))
 | 
 |  |  |             GameWorld.DebugLog("        超时玩家积分排序索引-积分(%s-%s),上一个(%s-%s),下一个(%s-%s),preDiff=%s,nextDiff=%s,vsIndex=%s"  | 
 |  |  |                                % (outTimeIndex, matchPlayer.pkScore, preIndex, prePlayer.pkScore,  | 
 |  |  |                                   nextIndex, nextPlayer.pkScore, preDiff, nextDiff, vsIndex))
 | 
 |  |  |             
 | 
 |  |  |         if outTimeIndex > vsIndex: 
 | 
 |  |  |             scoreSortList.pop(outTimeIndex)
 | 
 |  |  | 
 |  |  |     ''' 匹配积分分段玩家
 | 
 |  |  |             匹配中的玩家按段位积分归组,归组后,随机段位顺序,每个段位组中的玩家随机两两PK
 | 
 |  |  |     '''
 | 
 |  |  |     GameWorld.Log(" ==匹配积分分段玩家== maxGroupCnt=%s,scoreSortListLen=%s" % (maxGroupCnt, len(scoreSortList)))
 | 
 |  |  |     GameWorld.DebugLog(" ==匹配积分分段玩家== maxGroupCnt=%s,scoreSortListLen=%s" % (maxGroupCnt, len(scoreSortList)))
 | 
 |  |  |     danPlayerListDict = {} # 按积分分段列表分散玩家
 | 
 |  |  |     for matchPlayer in scoreSortList:
 | 
 |  |  |         danLV = matchPlayer.danLV
 | 
 |  |  | 
 |  |  |     danList = danPlayerListDict.keys()
 | 
 |  |  |     random.shuffle(danList) # 打乱段位顺序
 | 
 |  |  |     
 | 
 |  |  |     GameWorld.Log("    积分分段个数: %s, %s" % (len(danList), danList))
 | 
 |  |  |     GameWorld.DebugLog("    积分分段个数: %s, %s" % (len(danList), danList))
 | 
 |  |  |     
 | 
 |  |  |     # 优先匹配相同段位
 | 
 |  |  |     doCount = 0
 | 
 |  |  | 
 |  |  |         doCount += 1
 | 
 |  |  |         isMatchOK = False
 | 
 |  |  | #        # 日志输出分组明细
 | 
 |  |  | #        GameWorld.Log("    -------------")
 | 
 |  |  | #        GameWorld.DebugLog("    -------------")
 | 
 |  |  | #        for danLV in danList:
 | 
 |  |  | #            strList = []
 | 
 |  |  | #            for player in danPlayerListDict[danLV]:
 | 
 |  |  | #                strList.append((player.playerID, player.pkScore, player.fightPower))
 | 
 |  |  | #            GameWorld.Log("    积分段组, danLV=%s, %s" % (danLV, str(strList)))
 | 
 |  |  | #            GameWorld.DebugLog("    积分段组, danLV=%s, %s" % (danLV, str(strList)))
 | 
 |  |  | #        # -------------------------------
 | 
 |  |  |         
 | 
 |  |  |         for danLV in danList:
 | 
 |  |  |             danPlayerList = danPlayerListDict[danLV]
 | 
 |  |  |             danPlayerCount = len(danPlayerList)
 | 
 |  |  |             if danPlayerCount < 2:
 | 
 |  |  |                 #GameWorld.Log("    段位人数少于2个,不处理!doCount=%s,danLV=%s" % (doCount, danLV))
 | 
 |  |  |                 #GameWorld.DebugLog("    段位人数少于2个,不处理!doCount=%s,danLV=%s" % (doCount, danLV))
 | 
 |  |  |                 continue
 | 
 |  |  |             
 | 
 |  |  |             vsIndexList = random.sample(xrange(danPlayerCount), 2) # 随机取两个索引对战
 | 
 |  |  | 
 |  |  |             
 | 
 |  |  |             matchPlayerVSList.append([aPlayer, bPlayer])
 | 
 |  |  |             isMatchOK = True
 | 
 |  |  |             GameWorld.Log("    成功匹配相同段位玩家: aPlayerID=%s,aDanLV=%s VS bPlayerID=%s,bDanLV=%s" % (aPlayer.playerID, aPlayer.danLV, bPlayer.playerID, bPlayer.danLV))
 | 
 |  |  |             GameWorld.DebugLog("    成功匹配相同段位玩家: aPlayerID=%s,aDanLV=%s VS bPlayerID=%s,bDanLV=%s" % (aPlayer.playerID, aPlayer.danLV, bPlayer.playerID, bPlayer.danLV))
 | 
 |  |  |             
 | 
 |  |  |             if len(matchPlayerVSList) >= maxGroupCnt:
 | 
 |  |  |                 GameWorld.Log("    已经达到最大匹配数! 已匹配对战数=%s, 不再匹配!doCount=%s" % (len(matchPlayerVSList), doCount))
 | 
 |  |  |                 GameWorld.DebugLog("    已经达到最大匹配数! 已匹配对战数=%s, 不再匹配!doCount=%s" % (len(matchPlayerVSList), doCount))
 | 
 |  |  |                 break
 | 
 |  |  |             
 | 
 |  |  |         if not isMatchOK:
 | 
 |  |  |             GameWorld.Log("    已经没有满足匹配条件的玩家! 不再匹配!doCount=%s" % (doCount))
 | 
 |  |  |             GameWorld.DebugLog("    已经没有满足匹配条件的玩家! 不再匹配!doCount=%s" % (doCount))
 | 
 |  |  |             break
 | 
 |  |  |         
 | 
 |  |  |     # 不足再匹配范围段位
 | 
 |  |  | 
 |  |  |         doCount += 1
 | 
 |  |  |         isMatchOK = False
 | 
 |  |  | #        # 日志输出分组明细
 | 
 |  |  | #        GameWorld.Log("    -------------")
 | 
 |  |  | #        GameWorld.DebugLog("    -------------")
 | 
 |  |  | #        for danLV in danList:
 | 
 |  |  | #            strList = []
 | 
 |  |  | #            for player in danPlayerListDict[danLV]:
 | 
 |  |  | #                strList.append((player.playerID, player.pkScore, player.fightPower))
 | 
 |  |  | #            GameWorld.Log("    积分段组, danLV=%s, %s" % (danLV, str(strList)))
 | 
 |  |  | #            GameWorld.DebugLog("    积分段组, danLV=%s, %s" % (danLV, str(strList)))
 | 
 |  |  | #        # -------------------------------
 | 
 |  |  |         
 | 
 |  |  |         for danLV in danList:
 | 
 |  |  | 
 |  |  |                 danMatchPlayerList += danPlayerListDict[matchDanLV]
 | 
 |  |  |                 
 | 
 |  |  |             #matchPlayerIDList = [matchPlayer.playerID for matchPlayer in danMatchPlayerList]
 | 
 |  |  |             #GameWorld.Log("danLV=%s,danMatchRange=%s,matchPlayerIDList=%s" % (danLV, danMatchRange, matchPlayerIDList))
 | 
 |  |  |             #GameWorld.DebugLog("danLV=%s,danMatchRange=%s,matchPlayerIDList=%s" % (danLV, danMatchRange, matchPlayerIDList))
 | 
 |  |  |             matchPlayerCount = len(danMatchPlayerList)
 | 
 |  |  |             if matchPlayerCount < 2:
 | 
 |  |  |                 #GameWorld.Log("    段位范围人数少于2个,不处理!doCount=%s,danLV=%s,danMatchRange=%s" % (doCount, danLV, danMatchRange))
 | 
 |  |  |                 #GameWorld.DebugLog("    段位范围人数少于2个,不处理!doCount=%s,danLV=%s,danMatchRange=%s" % (doCount, danLV, danMatchRange))
 | 
 |  |  |                 continue
 | 
 |  |  |             
 | 
 |  |  |             vsIndexList = random.sample(xrange(matchPlayerCount), 2) # 随机取两个索引对战
 | 
 |  |  | 
 |  |  |             
 | 
 |  |  |             matchPlayerVSList.append([aPlayer, bPlayer])
 | 
 |  |  |             isMatchOK = True
 | 
 |  |  |             GameWorld.Log("    成功匹配范围段位玩家: aPlayerID=%s,aDanLV=%s VS bPlayerID=%s,bDanLV=%s | danLV=%s,danMatchRange=%s"  | 
 |  |  |                           % (aPlayer.playerID, aPlayer.danLV, bPlayer.playerID, bPlayer.danLV, danLV, danMatchRange))
 | 
 |  |  |             GameWorld.DebugLog("    成功匹配范围段位玩家: aPlayerID=%s,aDanLV=%s VS bPlayerID=%s,bDanLV=%s | danLV=%s,danMatchRange=%s"  | 
 |  |  |                                % (aPlayer.playerID, aPlayer.danLV, bPlayer.playerID, bPlayer.danLV, danLV, danMatchRange))
 | 
 |  |  |             
 | 
 |  |  |             if len(matchPlayerVSList) >= maxGroupCnt:
 | 
 |  |  |                 GameWorld.Log("    已经达到最大匹配数! 已匹配对战数=%s, 不再匹配!doCount=%s" % (len(matchPlayerVSList), doCount))
 | 
 |  |  |                 GameWorld.DebugLog("    已经达到最大匹配数! 已匹配对战数=%s, 不再匹配!doCount=%s" % (len(matchPlayerVSList), doCount))
 | 
 |  |  |                 break
 | 
 |  |  |             
 | 
 |  |  |         if not isMatchOK:
 | 
 |  |  |             GameWorld.Log("    已经没有满足匹配条件的玩家! 不再匹配! doCount=%s" % (doCount))
 | 
 |  |  |             GameWorld.DebugLog("    已经没有满足匹配条件的玩家! 不再匹配! doCount=%s" % (doCount))
 | 
 |  |  |             break
 | 
 |  |  |         
 | 
 |  |  |     return
 | 
 |  |  | 
 |  |  |     zoneMatchPlayerList = PyGameData.g_crossPKZoneMatchPlayerDict.get(pkZoneID, [])
 | 
 |  |  |     
 | 
 |  |  |     mapIDList = IpyGameDataPY.GetFuncCfg("CrossRealmPKMatch", 4)
 | 
 |  |  |     GameWorld.Log("===给配对的玩家开房间(pkZoneID=%s,配对数:%s)===" % (pkZoneID, len(matchPlayerVSList)))
 | 
 |  |  |     GameWorld.DebugLog("===给配对的玩家开房间(pkZoneID=%s,配对数:%s)===" % (pkZoneID, len(matchPlayerVSList)))
 | 
 |  |  |     for aPlayer, bPlayer in matchPlayerVSList:
 | 
 |  |  |         
 | 
 |  |  |         if not aPlayer or not bPlayer:
 | 
 |  |  | 
 |  |  |         PyGameData.g_crossPKRoomDict[roomID] = newRoom
 | 
 |  |  |         
 | 
 |  |  |         aServerGroupID, bServerGroupID = aPlayer.serverGroupID, bPlayer.serverGroupID
 | 
 |  |  |         GameWorld.Log("    开房:pkZoneID=%s,mapID=%s,roomID=%s,aPlayerID=%s,bPlayerID=%s" % (pkZoneID, mapID, roomID, aPlayerID, bPlayerID))
 | 
 |  |  |         GameWorld.DebugLog("    开房:pkZoneID=%s,mapID=%s,roomID=%s,aPlayerID=%s,bPlayerID=%s" % (pkZoneID, mapID, roomID, aPlayerID, bPlayerID))
 | 
 |  |  |         vsRoomDict[roomID] = [mapID, [[aServerGroupID, aPlayerID], [bServerGroupID, bPlayerID]]]
 | 
 |  |  |         
 | 
 |  |  |         # 记录流向
 | 
 |  |  | 
 |  |  | def MapServer_CrossPKOver(infoList, tick):
 | 
 |  |  |     ## 收到MapServer副本跨服PK结果同步
 | 
 |  |  |     
 | 
 |  |  |     GameWorld.Log("收到MapServer_跨服PK战斗结果: %s" % str(infoList))
 | 
 |  |  |     GameWorld.DebugLog("收到MapServer_跨服PK战斗结果: %s" % str(infoList))
 | 
 |  |  |     
 | 
 |  |  |     roomID, winnerID, loserID, roundWinnerIDList, overType = infoList
 | 
 |  |  |     
 | 
 |  |  | 
 |  |  |     winnerDanLV, loserDanLV = winner.danLV, loser.danLV
 | 
 |  |  |     winnerDayScore, loserDayScore = max(0, winnerScore - winner.ondayScore), max(0, loserScore - loser.ondayScore) # 今日已获得积分,正积分
 | 
 |  |  |     
 | 
 |  |  |     GameWorld.Log("winnerDayScore=%s,winnerScore=%s,winnerDanLV=%s,cWinCount=%s" % (winnerDayScore, winnerScore, winnerDanLV, cWinCount))
 | 
 |  |  |     GameWorld.Log("loserDayScore=%s,loserScore=%s,loserDanLV=%s" % (loserDayScore, loserScore, loserDanLV))
 | 
 |  |  |     GameWorld.DebugLog("winnerDayScore=%s,winnerScore=%s,winnerDanLV=%s,cWinCount=%s" % (winnerDayScore, winnerScore, winnerDanLV, cWinCount))
 | 
 |  |  |     GameWorld.DebugLog("loserDayScore=%s,loserScore=%s,loserDanLV=%s" % (loserDayScore, loserScore, loserDanLV))
 | 
 |  |  |     
 | 
 |  |  |     winIpyData = IpyGameDataPY.GetIpyGameData("CrossRealmPKDan", winnerDanLV)
 | 
 |  |  |     loseIpyData = IpyGameDataPY.GetIpyGameData("CrossRealmPKDan", loserDanLV)
 | 
 |  |  | 
 |  |  |     if loseIpyData and loseIpyData.GetLVUpScore() and loser.pkScore >= loseIpyData.GetLVUpScore():
 | 
 |  |  |         loser.danLV += 1
 | 
 |  |  |         
 | 
 |  |  |     GameWorld.Log("wBaseScore=%s,wExScore=%s,winnerAddScore=%s,updScore=%s,updDanLV=%s,updCWinCount=%s" % (wBaseScore, wExScore, winnerAddScore, winner.pkScore, winner.danLV, winner.cWinCount))
 | 
 |  |  |     GameWorld.Log("lBaseScore=%s,lExScore=%s,loserAddScore=%s,updScore=%s,updDanLV=%s,updCWinCount=%s" % (lBaseScore, lExScore, loserAddScore, loser.pkScore, loser.danLV, loser.cWinCount))
 | 
 |  |  |     GameWorld.DebugLog("wBaseScore=%s,wExScore=%s,winnerAddScore=%s,updScore=%s,updDanLV=%s,updCWinCount=%s" % (wBaseScore, wExScore, winnerAddScore, winner.pkScore, winner.danLV, winner.cWinCount))
 | 
 |  |  |     GameWorld.DebugLog("lBaseScore=%s,lExScore=%s,loserAddScore=%s,updScore=%s,updDanLV=%s,updCWinCount=%s" % (lBaseScore, lExScore, loserAddScore, loser.pkScore, loser.danLV, loser.cWinCount))
 | 
 |  |  |     
 | 
 |  |  |     # 更新排行榜
 | 
 |  |  |     UpdateCrossPKBillboard(zoneID, seasonID, winner, loser)
 | 
 |  |  | 
 |  |  |         overPack.TagNameLen = len(overPack.TagName)
 | 
 |  |  |         NetPackCommon.SendFakePack(player, overPack)
 | 
 |  |  |         
 | 
 |  |  |         GameWorld.Log("同步玩家PK结果: serverGroupID=%s,roomID=%s,addScore=%s,pkScore=%s,danLV=%s,cWinCount=%s,tagPlayerID=%s"  | 
 |  |  |                       % (serverGroupID, roomID, addScore, pkScore, danLV, cWinCount, tagPlayerID), playerID)
 | 
 |  |  |         GameWorld.DebugLog("同步玩家PK结果: serverGroupID=%s,roomID=%s,addScore=%s,pkScore=%s,danLV=%s,cWinCount=%s,tagPlayerID=%s"  | 
 |  |  |                            % (serverGroupID, roomID, addScore, pkScore, danLV, cWinCount, tagPlayerID), playerID)
 | 
 |  |  |         
 | 
 |  |  |     serverGroupIDList = [winner.serverGroupID, loser.serverGroupID]
 | 
 |  |  |     GameWorld.Log("同步子服战斗结果: seasonID=%s,timeStr=%s,roomID=%s,overType=%s,winnerID=%s,roundWinnerIDList=%s"  | 
 |  |  |                   % (seasonID, timeStr, roomID, overType, winnerID, roundWinnerIDList))
 | 
 |  |  |     GameWorld.DebugLog("同步子服战斗结果: seasonID=%s,timeStr=%s,roomID=%s,overType=%s,winnerID=%s,roundWinnerIDList=%s"  | 
 |  |  |                        % (seasonID, timeStr, roomID, overType, winnerID, roundWinnerIDList))
 | 
 |  |  |     # 同步子服
 | 
 |  |  |     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKOverInfo, playerOverDict, serverGroupIDList)
 | 
 |  |  |     
 | 
 |  |  | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | ##================================== 以下是子服逻辑 ==========================================
 | 
 |  |  | 
 | 
 |  |  | def OnGameServerInitOK():
 | 
 |  |  |      | 
 |  |  |     if GameWorld.IsCrossServer():
 | 
 |  |  |         return
 | 
 |  |  |      | 
 |  |  |     dbZoneID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
 | 
 |  |  |     dbSeasonID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID)
 | 
 |  |  |     dbSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState)
 | 
 |  |  |     GameWorld.Log("OnGameServerInitOK dbZoneID=%s,dbSeasonID=%s,dbSeasonState=%s" % (dbZoneID, dbSeasonID, dbSeasonState))
 | 
 |  |  |      | 
 |  |  |     gameWorld = GameWorld.GetGameWorld()
 | 
 |  |  |     zoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
 | 
 |  |  |     if not zoneID:
 | 
 |  |  |         gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID, dbZoneID)
 | 
 |  |  |         gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID, dbSeasonID)
 | 
 |  |  |         gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState, dbSeasonState)
 | 
 |  |  |         GameWorld.Log("    服务器启动取DB值设置本服赛区赛季信息: ")
 | 
 |  |  |          | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def OnMapServerInitOK():
 | 
 |  |  |     # 通知地图服务器状态
 | 
 |  |  | 
 |  |  |     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)
 | 
 |  |  |     
 | 
 |  |  | 
 |  |  |     gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID, seasonID)
 | 
 |  |  |     gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState, seasonState)
 | 
 |  |  |     gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK, matchState)
 | 
 |  |  |      | 
 |  |  |     # 强制覆盖存DB
 | 
 |  |  |     dbZoneID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
 | 
 |  |  |     dbSeasonID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID)
 | 
 |  |  |     dbSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState)
 | 
 |  |  |     GameWorld.Log("    before dbZoneID=%s,dbSeasonID=%s,dbSeasonState=%s" % (dbZoneID, dbSeasonID, dbSeasonState))
 | 
 |  |  |      | 
 |  |  |     PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID, zoneID)
 | 
 |  |  |     PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID, seasonID)
 | 
 |  |  |     PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState, seasonState)
 | 
 |  |  |     dbZoneID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
 | 
 |  |  |     dbSeasonID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID)
 | 
 |  |  |     dbSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState)
 | 
 |  |  |     GameWorld.Log("    update dbZoneID=%s,dbSeasonID=%s,dbSeasonState=%s" % (dbZoneID, dbSeasonID, dbSeasonState))
 | 
 |  |  |     
 | 
 |  |  |     if curSeasonState == 1 and seasonState == 2:
 | 
 |  |  |         pass
 | 
 |  |  | 
 |  |  |     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)
 | 
 |  |  | 
 |  |  | def CrossServerMsg_PKMatchResult(vsRoomDict):
 | 
 |  |  |     ## 跨服PK匹配结果
 | 
 |  |  |     curServerGroupID = GameWorld.GetServerGroupID()
 | 
 |  |  |     actionType = ShareDefine.Def_CrossAction_PK
 | 
 |  |  |     mapPosList = IpyGameDataPY.GetFuncEvalCfg("CrossRealmPKMatch", 5)
 | 
 |  |  |     GameWorld.Log("=== 收到PK匹配结果处理  === curServerGroupID=%s" % curServerGroupID)
 | 
 |  |  |     GameWorld.DebugLog("=== 收到PK匹配结果处理  === curServerGroupID=%s" % curServerGroupID)
 | 
 |  |  |     if not mapPosList:
 | 
 |  |  |         GameWorld.ErrLog("没有配置对战地图进入坐标!")
 | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  |     for roomID, roomInfo in vsRoomDict.items():
 | 
 |  |  |         mapID, playerList = roomInfo
 | 
 |  |  |         GameWorld.Log("    roomID=%s,playerList=%s" % (roomID, playerList))
 | 
 |  |  |         GameWorld.DebugLog("    roomID=%s,playerList=%s" % (roomID, playerList))
 | 
 |  |  |         for i, playerInfo in enumerate(playerList):
 | 
 |  |  |             serverGroupID, playerID = playerInfo
 | 
 |  |  |             if serverGroupID != curServerGroupID:
 | 
 |  |  | 
 |  |  |             PlayerControl.SetVsRoomId(player, roomID, True)
 | 
 |  |  |             # 通知地图玩家匹配成功, 上传数据, 准备进入跨服服务器
 | 
 |  |  |             posX, posY = mapPosList[i] if len(mapPosList) > i else mapPosList[0]
 | 
 |  |  |             CrossRealmPlayer.SendCrossRealmReg(player, actionType, mapID, mapID, 0, posX, posY)
 | 
 |  |  |             CrossRealmPlayer.SendCrossRealmReg(player, ChConfig.Def_FBMapID_CrossRealmPK, mapID, mapID, 0, posX, posY)
 | 
 |  |  |             
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | 
 |  |  |     ## 子服接收玩家已准备好的PK房间信息, 此房间里的玩家可传送进入跨服
 | 
 |  |  |     
 | 
 |  |  |     curServerGroupID = GameWorld.GetServerGroupID()
 | 
 |  |  |     GameWorld.Log("===收到跨服服务器通知已准备好的对战PK房间信息处理=== curServerGroupID=%s" % curServerGroupID)
 | 
 |  |  |     GameWorld.DebugLog("===收到跨服服务器通知已准备好的对战PK房间信息处理=== curServerGroupID=%s" % curServerGroupID)
 | 
 |  |  |     # serverGroupID, playerName, playerJob
 | 
 |  |  |      | 
 |  |  |     if not CrossRealmPlayer.IsCrossServerOpen():
 | 
 |  |  |         GameWorld.Log("跨服服务器维护中,不处理!")
 | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  |     for roomID, readyMemberDict in readyOKRoomList:
 | 
 |  |  |         for playerID, playerInfo in readyMemberDict.items():
 | 
 |  |  | 
 |  |  |                     matchPlayer.Job = readyPlayerInfo["Job"]
 | 
 |  |  |                     matchPlayer.LV = readyPlayerInfo["LV"]
 | 
 |  |  |                     matchPlayer.MaxHP = readyPlayerInfo["MaxHP"]
 | 
 |  |  |                     matchPlayer.MaxProDef = readyPlayerInfo["MaxProDef"]
 | 
 |  |  |                     break
 | 
 |  |  |                 
 | 
 |  |  |             PlayerControl.SetCrossRealmState(player, 1)
 | 
 |  |  |             PlayerControl.SetCrossMapID(player, ChConfig.Def_FBMapID_CrossRealmPK)
 | 
 |  |  |             SetIsCrossPKMatching(player, 0)
 | 
 |  |  |             
 | 
 |  |  |             # 通知匹配成功,可进入跨服
 | 
 |  |  | 
 |  |  |             matchOKPack.MatchPlayer = [matchPlayer]
 | 
 |  |  |             matchOKPack.MatchPlayerCount = len(matchOKPack.MatchPlayer)
 | 
 |  |  |             NetPackCommon.SendFakePack(player, matchOKPack)
 | 
 |  |  |             GameWorld.Log("    通知玩家进入跨服PK对战房间! roomID=%s,playerID=%s,matchPlayerID=%s" % (roomID, playerID, matchPlayer.PlayerID))
 | 
 |  |  |             GameWorld.DebugLog("    通知玩家进入跨服PK对战房间! roomID=%s,playerID=%s,matchPlayerID=%s" % (roomID, playerID, matchPlayer.PlayerID))
 | 
 |  |  |             
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | 
 |  |  |     ## 子服接收已超时的PK房间信息, 此房间里的玩家重置跨服状态
 | 
 |  |  |     
 | 
 |  |  |     curServerGroupID = GameWorld.GetServerGroupID()
 | 
 |  |  |     GameWorld.Log("===收到跨服服务器通知已超时的对战PK房间信息处理=== curServerGroupID=%s" % curServerGroupID)
 | 
 |  |  |     GameWorld.DebugLog("===收到跨服服务器通知已超时的对战PK房间信息处理=== curServerGroupID=%s" % curServerGroupID)
 | 
 |  |  |     
 | 
 |  |  |     for roomID, roomPlayerInfo in timeoutRoomDict.items():
 | 
 |  |  |         if not roomPlayerInfo:
 | 
 |  |  | 
 |  |  |             GameWorld.DebugLog("    房间ID不同, playerID=%s" % (playerID))
 | 
 |  |  |             continue
 | 
 |  |  |         player.SetDict(ChConfig.Def_PlayerKey_IsLoginToMergeServer, 0)
 | 
 |  |  |         PlayerControl.SetCrossRealmState(player, 0)
 | 
 |  |  |         PlayerControl.SetCrossMapID(player, 0)
 | 
 |  |  |         
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | 
 |  |  |     ## 子服接收跨服PK结果信息
 | 
 |  |  |     
 | 
 |  |  |     curServerGroupID = GameWorld.GetServerGroupID()
 | 
 |  |  |     GameWorld.Log("===收到跨服服务器同步的跨服PK结果=== curServerGroupID=%s" % curServerGroupID)
 | 
 |  |  |     GameWorld.DebugLog("===收到跨服服务器同步的跨服PK结果=== curServerGroupID=%s" % curServerGroupID)
 | 
 |  |  |     
 | 
 |  |  |     for playerID, overInfo in playerOverDict.items():
 | 
 |  |  |         roomID, zoneID, seasonID, timeStr, overType, winnerID, roundWinnerIDList, \
 | 
 |  |  | 
 |  |  |         
 | 
 |  |  |         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.Log("    玩家不在线 或脱机中,先缓存,玩家上线后再同步,playerID=%s" % (playerID))
 | 
 |  |  |             GameWorld.DebugLog("    玩家不在线 或脱机中,先缓存,玩家上线后再同步,playerID=%s" % (playerID))
 | 
 |  |  |             overInfoData = PyGameDataStruct.tagDBCrossPKUnNotifyOverInfo()
 | 
 |  |  |             overInfoData.clear()
 | 
 |  |  |             overInfoData.ZoneID = zoneID
 | 
 |  |  | 
 |  |  |         PlayerControl.SetVsRoomId(player, 0)
 | 
 |  |  |         sysMsg = str(sendMapOverInfo)
 | 
 |  |  |         player.MapServer_QueryPlayerResult(0, 0, "CrossPKOverInfo", sysMsg, len(sysMsg))
 | 
 |  |  |         GameWorld.Log("通知地图跨服PK结算: roomID=%s,zoneID=%s,seasonID=%s,timeStr=%s,overType=%s,winnerID=%s,roundWinnerIDList=%s, pkScore=%s,danLV=%s,cWinCount=%s,addScore=%s,tagPlayerID=%s,notifyState=%s,mapID=%s"  | 
 |  |  |                       % (roomID, zoneID, seasonID, timeStr, overType, winnerID, roundWinnerIDList, pkScore, danLV, cWinCount, addScore, tagPlayerID, notifyState, player.GetMapID()), playerID)
 | 
 |  |  |         GameWorld.DebugLog("通知地图跨服PK结算: roomID=%s,zoneID=%s,seasonID=%s,timeStr=%s,overType=%s,winnerID=%s,roundWinnerIDList=%s, pkScore=%s,danLV=%s,cWinCount=%s,addScore=%s,tagPlayerID=%s,notifyState=%s,mapID=%s"  | 
 |  |  |                            % (roomID, zoneID, seasonID, timeStr, overType, winnerID, roundWinnerIDList, pkScore, danLV, cWinCount, addScore, tagPlayerID, notifyState, player.GetMapID()), playerID)
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def __OnLoginNotifyPKOverInfo(curPlayer):
 | 
 |  |  | 
 |  |  |     overInfoData = PyDataManager.GetCrossPKUnNotifyOverInfoManager().GetPlayerUnNotifyOverInfo(playerID)
 | 
 |  |  |     if not overInfoData:
 | 
 |  |  |         return
 | 
 |  |  |     PlayerControl.SetCrossRealmState(curPlayer, 0)
 | 
 |  |  |     PlayerControl.SetCrossMapID(curPlayer, 0)
 | 
 |  |  |     PlayerControl.SetVsRoomId(curPlayer, 0)
 | 
 |  |  |     
 | 
 |  |  |     zoneID = overInfoData.ZoneID
 | 
 |  |  | 
 |  |  |     sendMapOverInfo = [roomID, zoneID, seasonID, timeStr, overType, winnerID, roundWinnerIDList, pkScore, danLV, cWinCount, addScore, tagPlayerID, tagPlayerName, notifyState]
 | 
 |  |  |     sysMsg = str(sendMapOverInfo)
 | 
 |  |  |     curPlayer.MapServer_QueryPlayerResult(0, 0, "CrossPKOverInfo", sysMsg, len(sysMsg))
 | 
 |  |  |     GameWorld.Log("玩家上线通知地图未结算的跨服PK结算: roomID=%s,zoneID=%s,seasonID=%s,timeStr=%s,overType=%s,winnerID=%s,roundWinnerIDList=%s, pkScore=%s,danLV=%s,cWinCount=%s,addScore=%s,tagPlayerID=%s,notifyState=%s,mapID=%s"  | 
 |  |  |                   % (roomID, zoneID, seasonID, timeStr, overType, winnerID, roundWinnerIDList, pkScore, danLV, cWinCount, addScore, tagPlayerID, notifyState, curPlayer.GetMapID()), playerID)
 | 
 |  |  |     GameWorld.DebugLog("玩家上线通知地图未结算的跨服PK结算: roomID=%s,zoneID=%s,seasonID=%s,timeStr=%s,overType=%s,winnerID=%s,roundWinnerIDList=%s, pkScore=%s,danLV=%s,cWinCount=%s,addScore=%s,tagPlayerID=%s,notifyState=%s,mapID=%s"  | 
 |  |  |                        % (roomID, zoneID, seasonID, timeStr, overType, winnerID, roundWinnerIDList, pkScore, danLV, cWinCount, addScore, tagPlayerID, notifyState, curPlayer.GetMapID()), playerID)
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def DR_CrossReamlPK(eventName, dataDict={}):
 |