hxp
2019-02-03 a5a3fae74222495868ae0bcd8483954cf2a4a712
2906 【1.5.0】【1.5.100】跨服及子服启动未完成优化
26个文件已修改
558 ■■■■■ 已修改文件
PySysDB/PySysDBG.h 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Boss.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossRealmReg.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBG.h
@@ -459,10 +459,20 @@
    BYTE        IsDayReset;    //是否每天重置
};
//跨服竞技场赛区表
//跨服分区表通用
struct tagCrossRealmPKZone
struct tagCrossZoneComm
{
    char        _CrossZoneName;    //跨服分区名
    BYTE        _ZoneID;    //赛区ID
    list        ServerGroupIDList;    //赛区服务器组ID列表
};
//跨服分区表竞技场
struct tagCrossZonePK
{
    char        _CrossZoneName;    //跨服分区名
    BYTE        _ZoneID;    //赛区ID
    char        ZoneName;    //赛区名字
    list        ServerGroupIDList;    //赛区服务器组ID列表
@@ -472,6 +482,7 @@
struct tagCrossRealmPKSeason
{
    char        _CrossZoneName;    //跨服分区名
    BYTE        _ZoneID;    //赛区ID
    BYTE        SeasonID;    //赛季ID
    char        StartDate;    //开始日期    yyyy-MM-dd
@@ -488,12 +499,11 @@
    list        MatchRange;    //可匹配到的玩家段位区间 [从段位A, 到段位B],配[]代表只匹配本段位的
};
//跨服Boss蓬莱仙境分区表
//跨服Boss蓬莱仙境分区地图表
struct tagCrossPenglaiZone
struct tagCrossPenglaiZoneMap
{
    BYTE        ZoneID;    //分区ID
    list        ServerGroupIDList;    //服务器组ID列表
    DWORD        _MapID;    //场景地图ID
    DWORD        _DataMapID;    //数据地图ID
    BYTE        _CopyMapID;    //虚拟线路ID
PySysDB/PySysDBPY.h
@@ -1482,12 +1482,20 @@
    list        SeasonDanLVAwardList;    //赛季段位奖励物品列表
};
//跨服Boss蓬莱仙境分区表
//跨服分区表通用
struct tagCrossPenglaiZone
struct tagCrossZoneComm
{
    char        _CrossZoneName;    //跨服分区名
    BYTE        _ZoneID;    //赛区ID
    list        ServerGroupIDList;    //赛区服务器组ID列表
};
//跨服Boss蓬莱仙境分区地图表
struct tagCrossPenglaiZoneMap
{
    BYTE        ZoneID;    //分区ID
    list        ServerGroupIDList;    //服务器组ID列表
    DWORD        _MapID;    //场景地图ID
    DWORD        _DataMapID;    //数据地图ID
    BYTE        _CopyMapID;    //虚拟线路ID
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -372,7 +372,7 @@
Def_WorldKey_OperationActionState = "OperationActState_%s"   #运营活动状态,参数为运营活动名
Def_WorldKey_BossRebornNeedPoint = "BossRebornNeedPoint"     #boss复活需要总点数
Def_WorldKey_CrossBossIsAlive = 'CrossBossIsAlive_%s_%s'     #跨服boss是否活着,参数(zoneID, bossID)
Def_WorldKey_IsGameWorldInit = 'IsGameWorldInit'             #GameWold是否初始化完成
Def_WorldKey_GameWorldInitOK = 'GameWorldInitOK'             #GameWold是否初始化完成OK
Def_WorldKey_CrossPKZoneSeasonID = "CrossPKZoneSeasonID_%s"  #跨服PK赛区对应赛季,跨服服务器控制,参数(zoneID)
Def_WorldKey_CrossPKZoneSeasonState = "CrossPKZoneSeasonState_%s" #跨服PK赛区赛季状态,跨服服务器控制,参数(zoneID)0-未开启,1-开启中,2-已结束
Def_WorldKey_CrossPKBillboardSyncTick = "CrossPKBillboardSyncTick_%s_%s" #跨服PK本赛季排行榜同步tick,参数(zoneID, seasonID)
@@ -694,9 +694,9 @@
WorldBossFBMapIDList = [Def_FBMapID_SealDemon, Def_FBMapID_ZhuXianBoss]
#跨服地图
Def_CrossMapIDList = [Def_FBMapID_CrossRealmPK, Def_FBMapID_CrossPenglai]
#跨服对应分区配置表名
Def_CrossZoneTableName = {Def_FBMapID_CrossPenglai:"CrossPenglaiZone",
                          }
#跨服分区对应地图配置表名
Def_CrossZoneMapTableName = {Def_FBMapID_CrossPenglai:"CrossPenglaiZoneMap",
                             }
#同系职业枚举
JOB_TYPY_COUNT = 5
ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -844,6 +844,12 @@
    ## 是否开启跨服活动
    return ReadChConfig.GetPyMongoConfig("Merge", "MergeServerIP") or IsCrossServer()
def GetCrossZoneName():
    ## 跨服服务器分区名,标记一起跨服分区的名字,配置在跨服服务器,子服不用配置,由跨服服务器同步
    if IsCrossServer():
        return ReadChConfig.GetPyMongoConfig("Merge", "CrossZoneName")
    return PyGameData.g_crossZoneName
## 获取玩家的区服名,仅在跨服有效
#  @param curPlayer 玩家实例
#  @return: 区服名
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
@@ -51,15 +51,18 @@
g_bossRecDataDict = {} # boss对应rec记录缓存 {(zoneID, bossID):recData, ...}
def GetCrossBossZoneIpyData(realMapID, dataMapID, copyMapID):
def GetCrossBossZoneID(realMapID, dataMapID, copyMapID):
    ## 获取地图跨服boss所属分区
    if dataMapID not in ChConfig.Def_CrossMapIDList:
        return
    if dataMapID not in ChConfig.Def_CrossZoneTableName:
        return 0
    if dataMapID not in ChConfig.Def_CrossZoneMapTableName:
        GameWorld.ErrLog("跨服boss没有分区表!dataMapID=%s" % dataMapID)
        return
    tableName = ChConfig.Def_CrossZoneTableName[dataMapID]
    return IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
        return 0
    tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID]
    zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
    if not zoneIpyData:
        return 0
    return zoneIpyData.GetZoneID()
def __GetCrossBossRecData(zoneID, bossID):
    ## 获取跨服Boss Rec数据
@@ -99,37 +102,47 @@
    ## 获取跨服世界boss是否活着
    return GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_CrossBossIsAlive % (zoneID, bossID))
def ClientServerMsg_ServerInitOK(serverGroupID):
    ## 子服连接成功
def Sync_CrossBossInitDataToClientServer(serverGroupID=0):
    ''' 同步跨服Boss活动数据到子服务器
    @param serverGroupID: 为0时同步所有子服
    '''
    
    bossInfoList = []
    GameWorld.Log("同步给子服跨服boss信息: syncServerGroupID=%s" % (serverGroupID))
    zoneIpyDataList = CrossRealmPlayer.GetCrossCommZoneIpyDataListByServerGroupID(serverGroupID)
    if not zoneIpyDataList:
        GameWorld.Log("    没有跨服boss分区信息!")
        return
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyDataMgr.GetBOSSInfoCount()):
        ipyData = ipyDataMgr.GetBOSSInfoByIndex(i)
        mapID = ipyData.GetMapID()
        zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(mapID, serverGroupID)
        if not zoneIpyData:
            continue
    for zoneIpyData in zoneIpyDataList:
        zoneID = zoneIpyData.GetZoneID()
        bossID = ipyData.GetNPCID()
        bossRecData = __GetCrossBossRecData(zoneID, bossID)
        killedTime = GetRecKilledTime(bossRecData)
        refreshTime = GetRecRefreshTime(bossRecData)
        killedRecord = GetRecKilledRecord(bossRecData)
        isAlive = __GetCrossBossIsAlive(zoneID, bossID)
        killerExInfo = [] # 重连成功的信息同步不发送击杀者信息
        bossInfoList.append([zoneID, bossID, killedTime, refreshTime, killedRecord, isAlive, killerExInfo])
    if bossInfoList:
        bossInfoDict = {"BossInfoType":"InitOK", "BossInfoList":bossInfoList}
        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossInfo, bossInfoDict, [serverGroupID])
        bossInfoList = []
        for i in xrange(ipyDataMgr.GetBOSSInfoCount()):
            ipyData = ipyDataMgr.GetBOSSInfoByIndex(i)
            mapID = ipyData.GetMapID()
            if mapID not in ChConfig.Def_CrossMapIDList:
                continue
            bossID = ipyData.GetNPCID()
            bossRecData = __GetCrossBossRecData(zoneID, bossID)
            killedTime = GetRecKilledTime(bossRecData)
            refreshTime = GetRecRefreshTime(bossRecData)
            killedRecord = GetRecKilledRecord(bossRecData)
            isAlive = __GetCrossBossIsAlive(zoneID, bossID)
            killerExInfo = [] # 重连成功的信息同步不发送击杀者信息
            bossInfoList.append([zoneID, bossID, killedTime, refreshTime, killedRecord, isAlive, killerExInfo])
        if bossInfoList:
            serverGroupIDList = [serverGroupID] if serverGroupID else zoneIpyData.GetServerGroupIDList()
            bossInfoDict = {"BossInfoType":"InitOK", "BossInfoList":bossInfoList}
            CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossInfo, bossInfoDict, serverGroupIDList)
        else:
            GameWorld.Log("没有跨服boss信息! zoneID=%s" % zoneID)
    return
def DoCrossBossOnKilled(bossID, killPlayerName, realMapID, dataMapID, copyMapID, killerIDList):
    ## 跨服boss被杀
    zoneIpyData = GetCrossBossZoneIpyData(realMapID, dataMapID, copyMapID)
    zoneID = 0 if not zoneIpyData else zoneIpyData.GetZoneID()
    zoneID = GetCrossBossZoneID(realMapID, dataMapID, copyMapID)
    GameWorld.Log("击杀跨服boss: zoneID=%s,bossID=%s,realMapID=%s,dataMapID=%s,copyMapID=%s,killerIDList=%s" 
                  % (zoneID, bossID, realMapID, dataMapID, copyMapID, killerIDList))
    if not zoneID:
@@ -146,6 +159,9 @@
    refreshTime = SetBossRefreshTime(zoneID, bossID, killedTime, bossRecData)
    
    # 广播子服跨服boss被击杀
    zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByZoneID(zoneID)
    if zoneIpyData == None:
        return
    serverGroupIDList = zoneIpyData.GetServerGroupIDList()
    killedRecord = GetRecKilledRecord(bossRecData)
    killerExInfo = [killerIDList, dataMapID]
@@ -156,8 +172,7 @@
def DoCrossBossStateChange(bossID, isAlive, dataMapID, realMapID, copyMapID):
    ## 跨服boss状态变更
    zoneIpyData = GetCrossBossZoneIpyData(realMapID, dataMapID, copyMapID)
    zoneID = 0 if not zoneIpyData else zoneIpyData.GetZoneID()
    zoneID = GetCrossBossZoneID(realMapID, dataMapID, copyMapID)
    GameWorld.Log("跨服boss状态变更: zoneID=%s,bossID=%s,isAlive=%s,realMapID=%s,dataMapID=%s,copyMapID=%s" 
                  % (zoneID, bossID, isAlive, realMapID, dataMapID, copyMapID))
    if not zoneID:
@@ -167,10 +182,12 @@
    
    if isAlive:
        # 广播子服跨服boss复活
        serverGroupIDList = zoneIpyData.GetServerGroupIDList()
        stateInfo = [zoneID, bossID, isAlive]
        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossState, stateInfo, serverGroupIDList)
        zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByZoneID(zoneID)
        if zoneIpyData != None:
            serverGroupIDList = zoneIpyData.GetServerGroupIDList()
            stateInfo = [zoneID, bossID, isAlive]
            CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossState, stateInfo, serverGroupIDList)
    return
def __SetKilledRecord(bossRecData, killedTime, playerName):
@@ -222,9 +239,9 @@
            ipyData = ipyDataMgr.GetBOSSInfoByIndex(i)
            bossID = ipyData.GetNPCID()
            mapID = ipyData.GetMapID()
            if mapID not in ChConfig.Def_CrossZoneTableName:
            if mapID not in ChConfig.Def_CrossZoneMapTableName:
                continue
            tableName = ChConfig.Def_CrossZoneTableName[mapID]
            tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
            if not hasattr(ipyDataMgr, "Get%sCount" % tableName):
                continue
            for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()):
@@ -269,9 +286,9 @@
        ipyData = IpyGameDataPY.IPY_Data().GetBOSSInfoByIndex(i)
        bossID = ipyData.GetNPCID()
        mapID = ipyData.GetMapID()
        if mapID not in ChConfig.Def_CrossZoneTableName:
        if mapID not in ChConfig.Def_CrossZoneMapTableName:
            continue
        tableName = ChConfig.Def_CrossZoneTableName[mapID]
        tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
        if not hasattr(ipyDataMgr, "Get%sCount" % tableName):
            continue
        for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()):
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
@@ -38,6 +38,9 @@
    if not dataMsg:
        return
    sendMsg = str({"MsgType":msgType, "Data":dataMsg, "ServerGroupID":GameWorld.GetServerGroupID()})
    if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
        GameWorld.ErrLog("服务器未启动好,不允许向跨服服务器发送数据! %s" % (sendMsg))
        return
    GameWorld.Log("SendMsgToCrossServer => %s" % (sendMsg))   
    GameWorld.GetGameWorld().SendMergerChildToCenterStringData(sendMsg, len(sendMsg))
    return
@@ -45,7 +48,10 @@
def OnCrossServerReceiveMsg(recvMsg, tick):
    ## 跨服服务器收到信息处理
    try:
        #GameWorld.Log("OnCrossServerReceiveMsg: %s" % recvMsg)
        GameWorld.Log("OnCrossServerReceiveMsg: %s" % recvMsg)
        if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
            GameWorld.Log("服务器未启动好,不处理子服信息!")
            return
        msgDict = eval(recvMsg)
        
        msgType = msgDict.get("MsgType", -1)    
@@ -71,7 +77,7 @@
            GMShell.ClientServerMsg_GMCMD(msgData, tick)
            
        elif msgType == ShareDefine.ClientServerMsg_ServerInitOK:
            ClientServerMsg_ServerInitOK(serverGroupID, msgData, tick)
            ClientServerMsg_ServerInitOK(serverGroupID, tick)
            
        elif msgType == ShareDefine.ClientServerMsg_ViewPlayerCache:
            CrossRealmPlayer.ClientServerMsg_ViewPlayerCache(serverGroupID, msgData)
@@ -95,14 +101,25 @@
            raise BaseException(str(traceback.format_exc()))
    return
def ClientServerMsg_ServerInitOK(serverGroupID, msgData, tick):
def ClientServerMsg_ServerInitOK(serverGroupID, tick):
    ''' 收到子服连接成功通知 
         当子服启动成功后,可同步一次跨服服务器活动状态及活动数据给子服
    '''
    GameWorld.Log("收到跨服子服连接成功通知!")
    CrossRealmPlayer.ClientServerMsg_ServerInitOK(serverGroupID)
    CrossRealmPK.ClientServerMsg_ServerInitOK(serverGroupID, tick)
    CrossBoss.ClientServerMsg_ServerInitOK(serverGroupID)
    GameWorld.Log("收到跨服子服连接成功通知! serverGroupID=%s" % serverGroupID)
    Sync_CrossServerInitDataToClientServer(tick, serverGroupID)
    return
def Sync_CrossServerInitDataToClientServer(tick, serverGroupID=0):
    ''' 同步跨服功能数据到子服服务器
        本函数调用时机:
        1.跨服服务器启动成功,主动广播同步所有子服,此时设置 serverGroupID 为 0
        2.子服启动成功,由子服主动发起请求同步最新数据,此时有指定子服 serverGroupID
        3.子服重新连接跨服服务器成功,逻辑同2
        @param serverGroupID: 子服服务器组ID,为0时为全部子服务器组
    '''
    CrossRealmPlayer.Sync_CrossCommInitDataToClientServer(serverGroupID)
    CrossRealmPK.Sync_CrossPKInitDataToClientServer(tick, serverGroupID)
    CrossBoss.Sync_CrossBossInitDataToClientServer(serverGroupID)
    return
def MapServer_CrossServerReceiveMsg(msgType, msgData, serverGroupID):
@@ -141,6 +158,9 @@
    if not dataMsg:
        return
    sendMsg = str({"MsgType":msgType, "Data":dataMsg})
    if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
        GameWorld.ErrLog("跨服服务器未启动好,不允许向子服发送数据! serverGroupIDList=%s, sendMsg=%s" % (serverGroupIDList, sendMsg))
        return
    GameWorld.Log("SendMsgToClientServer => serverGroupIDList=%s, sendMsg=%s" % (serverGroupIDList, sendMsg))
    if not serverGroupIDList:
        GameWorld.GetGameWorld().SendBroadcastMergeClient(sendMsg)
@@ -156,9 +176,13 @@
    ## 子服收到跨服服务器信息
    dataPack = IPY_GameServer.IPY_MGBroadcastMergeClient()
    dataMsg = dataPack.GetData()
    #GameWorld.Log("OnClientServerReceiveMsg: %s" % dataMsg)
    
    try:
        GameWorld.Log("OnClientServerReceiveMsg: %s" % dataMsg)
        if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
            GameWorld.Log("服务器未启动好,不处理跨服信息!")
            return
        msgDict = eval(dataMsg)
        msgType = msgDict.get("MsgType", -1)    
        msgData = msgDict.get("Data", "")
@@ -256,12 +280,12 @@
    GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerConnState, connState)
    
    if result != 1:
        GameWorld.Log("--OnClientServerReceiveMsg  disconn")
        GameWorld.Log("===与跨服服务器断开连接!")
        CrossRealmPlayer.CrossServerMsg_CrossServerState({"isOpen":0})
        return
    
    GameWorld.Log("OnConnCorossServer conn success!!!")
    if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_IsGameWorldInit):
    GameWorld.Log("===与跨服服务器连接成功!")
    if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
        GameWorld.Log("    服务器还未启动好,暂不处理! 等服务器启动好后再处理!")
        return
    
@@ -274,8 +298,12 @@
    return
def OnGameServerInitOK():
    ## 子服启动成功
    ## 服务器启动成功
    tick = GameWorld.GetGameWorld().GetTick()
    if GameWorld.IsCrossServer():
        Sync_CrossServerInitDataToClientServer(tick, serverGroupID=0) # 这里设置为0,广播所有子服务器组
        return
    
    serverGroupID = GameWorld.GetServerGroupID()
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
@@ -307,7 +307,8 @@
    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)
@@ -366,7 +367,8 @@
        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()
@@ -535,18 +537,19 @@
    
    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()
@@ -604,8 +607,9 @@
    
    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
        
@@ -667,9 +671,12 @@
        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赛季状态变更
@@ -682,31 +689,47 @@
        
    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):
    # 跨服登录处理
@@ -731,19 +754,21 @@
        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()
@@ -1048,8 +1073,11 @@
#    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 = []
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
@@ -550,7 +550,7 @@
        # 同步到玩家对应子服
        if not serverGroupID:
            return
        zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(mapID, serverGroupID)
        zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
        if not zoneIpyData:
            return
        serverGroupIDList = zoneIpyData.GetServerGroupIDList()
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -1211,7 +1211,6 @@
        #记录首次开发时间(现实时间戳)
        PlayerDBGSEvent.SetInitOpenServerTime(initOpenServerTime if initOpenServerTime else int(time.time()))
        
    CrossRealmMsg.OnGameServerInitOK()
    #初始化家族数量
    GameWorld.GetFamilyManager().SetFamilyUpperLimitCount(ChConfig.Def_Family_MaxCnt)
    #排序元宝交易平台
@@ -1243,15 +1242,23 @@
    #世界boss被杀次数重置
    #GameWorldBoss.CheckResetBossKilledCntOnServerInit()
    #GameWorldActionTeHui.OnGameServerInitOK() # 特惠活动初始化
    __Func_HighPrecisionProcess(tick) # 主动触发一次高精度的调用,确保服务器启动后一些功能活动等的数据会被加载
    GameWorld.Log("=============================== 服务器启动成功 ===================================")
    isCrossServer = GameWorld.IsCrossServer()
    if isCrossServer:
        isServerClose = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossServerClose)
        isServerOpen = 0 if isServerClose else 1
        GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isServerOpen)
        GameWorld.Log("跨服服务器启动成功: isServerOpen=%s" % isServerOpen)
        GameWorld.Log("跨服服务器启动成功: isServerOpen=%s,crossZoneName=%s" % (isServerOpen, GameWorld.GetCrossZoneName()))
    else:
        serverGroupID = GameWorld.GetServerGroupID()
        GameWorld.Log("服务器启动成功: ServerGroupID=%s" % serverGroupID)
    GameWorld.GetGameWorld().SetDict(ChConfig.Def_WorldKey_GameWorldInitOK, 1)
    # 注意:跨服相关信息的调用需放在最后,不然可能导致服务器未启动功能或者功能未加载成功导致跨服服务器与子服之间的数据同步可能出现异常的情况
    CrossRealmMsg.OnGameServerInitOK()
    return
def DoCheckNewServerOpen(tick):
@@ -1414,6 +1421,7 @@
    # 跨服服务器状态
    isCrossServerOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isCrossServerOpen)
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossZoneName, PyGameData.g_crossZoneName)
    
    # 跨服PK
    CrossRealmPK.OnMapServerInitOK()
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -392,13 +392,21 @@
                        ("BYTE", "IsDayReset", 0),
                        ),
                "CrossRealmPKZone":(
                "CrossZoneComm":(
                        ("char", "CrossZoneName", 1),
                        ("BYTE", "ZoneID", 1),
                        ("list", "ServerGroupIDList", 0),
                        ),
                "CrossZonePK":(
                        ("char", "CrossZoneName", 1),
                        ("BYTE", "ZoneID", 1),
                        ("char", "ZoneName", 0),
                        ("list", "ServerGroupIDList", 0),
                        ),
                "CrossRealmPKSeason":(
                        ("char", "CrossZoneName", 1),
                        ("BYTE", "ZoneID", 1),
                        ("BYTE", "SeasonID", 0),
                        ("char", "StartDate", 0),
@@ -412,9 +420,8 @@
                        ("list", "MatchRange", 0),
                        ),
                "CrossPenglaiZone":(
                "CrossPenglaiZoneMap":(
                        ("BYTE", "ZoneID", 0),
                        ("list", "ServerGroupIDList", 0),
                        ("DWORD", "MapID", 1),
                        ("DWORD", "DataMapID", 1),
                        ("BYTE", "CopyMapID", 1),
@@ -1239,15 +1246,30 @@
    def GetNotifyInfoLoop(self): return self.NotifyInfoLoop # 全服提示信息 - 循环广播[间隔分钟, 广播key]
    def GetIsDayReset(self): return self.IsDayReset # 是否每天重置
# 跨服竞技场赛区表
class IPY_CrossRealmPKZone():
# 跨服分区表通用
class IPY_CrossZoneComm():
    
    def __init__(self):
        self.CrossZoneName = ""
        self.ZoneID = 0
        self.ServerGroupIDList = []
        return
    def GetCrossZoneName(self): return self.CrossZoneName # 跨服分区名
    def GetZoneID(self): return self.ZoneID # 赛区ID
    def GetServerGroupIDList(self): return self.ServerGroupIDList # 赛区服务器组ID列表
# 跨服分区表竞技场
class IPY_CrossZonePK():
    def __init__(self):
        self.CrossZoneName = ""
        self.ZoneID = 0
        self.ZoneName = ""
        self.ServerGroupIDList = []
        return
        
    def GetCrossZoneName(self): return self.CrossZoneName # 跨服分区名
    def GetZoneID(self): return self.ZoneID # 赛区ID
    def GetZoneName(self): return self.ZoneName # 赛区名字
    def GetServerGroupIDList(self): return self.ServerGroupIDList # 赛区服务器组ID列表
@@ -1256,6 +1278,7 @@
class IPY_CrossRealmPKSeason():
    
    def __init__(self):
        self.CrossZoneName = ""
        self.ZoneID = 0
        self.SeasonID = 0
        self.StartDate = ""
@@ -1263,6 +1286,7 @@
        self.EndTime = ""
        return
        
    def GetCrossZoneName(self): return self.CrossZoneName # 跨服分区名
    def GetZoneID(self): return self.ZoneID # 赛区ID
    def GetSeasonID(self): return self.SeasonID # 赛季ID
    def GetStartDate(self): return self.StartDate # 开始日期    yyyy-MM-dd
@@ -1282,19 +1306,17 @@
    def GetLVUpScore(self): return self.LVUpScore # 升段位所需积分
    def GetMatchRange(self): return self.MatchRange # 可匹配到的玩家段位区间 [从段位A, 到段位B],配[]代表只匹配本段位的
# 跨服Boss蓬莱仙境分区表
class IPY_CrossPenglaiZone():
# 跨服Boss蓬莱仙境分区地图表
class IPY_CrossPenglaiZoneMap():
    
    def __init__(self):
        self.ZoneID = 0
        self.ServerGroupIDList = []
        self.MapID = 0
        self.DataMapID = 0
        self.CopyMapID = 0
        return
        
    def GetZoneID(self): return self.ZoneID # 分区ID
    def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器组ID列表
    def GetMapID(self): return self.MapID # 场景地图ID
    def GetDataMapID(self): return self.DataMapID # 数据地图ID
    def GetCopyMapID(self): return self.CopyMapID # 虚拟线路ID
@@ -1522,14 +1544,16 @@
        self.ipyActWishingWellLen = len(self.ipyActWishingWellCache)
        self.ipyActTotalRechargeCache = self.__LoadFileData("ActTotalRecharge", IPY_ActTotalRecharge)
        self.ipyActTotalRechargeLen = len(self.ipyActTotalRechargeCache)
        self.ipyCrossRealmPKZoneCache = self.__LoadFileData("CrossRealmPKZone", IPY_CrossRealmPKZone)
        self.ipyCrossRealmPKZoneLen = len(self.ipyCrossRealmPKZoneCache)
        self.ipyCrossZoneCommCache = self.__LoadFileData("CrossZoneComm", IPY_CrossZoneComm)
        self.ipyCrossZoneCommLen = len(self.ipyCrossZoneCommCache)
        self.ipyCrossZonePKCache = self.__LoadFileData("CrossZonePK", IPY_CrossZonePK)
        self.ipyCrossZonePKLen = len(self.ipyCrossZonePKCache)
        self.ipyCrossRealmPKSeasonCache = self.__LoadFileData("CrossRealmPKSeason", IPY_CrossRealmPKSeason)
        self.ipyCrossRealmPKSeasonLen = len(self.ipyCrossRealmPKSeasonCache)
        self.ipyCrossRealmPKDanCache = self.__LoadFileData("CrossRealmPKDan", IPY_CrossRealmPKDan)
        self.ipyCrossRealmPKDanLen = len(self.ipyCrossRealmPKDanCache)
        self.ipyCrossPenglaiZoneCache = self.__LoadFileData("CrossPenglaiZone", IPY_CrossPenglaiZone)
        self.ipyCrossPenglaiZoneLen = len(self.ipyCrossPenglaiZoneCache)
        self.ipyCrossPenglaiZoneMapCache = self.__LoadFileData("CrossPenglaiZoneMap", IPY_CrossPenglaiZoneMap)
        self.ipyCrossPenglaiZoneMapLen = len(self.ipyCrossPenglaiZoneMapCache)
        self.ipyActWeekPartyCache = self.__LoadFileData("ActWeekParty", IPY_ActWeekParty)
        self.ipyActWeekPartyLen = len(self.ipyActWeekPartyCache)
        self.ipyActLoginAwardCache = self.__LoadFileData("ActLoginAward", IPY_ActLoginAward)
@@ -1772,14 +1796,16 @@
    def GetActWishingWellByIndex(self, index): return self.ipyActWishingWellCache[index]
    def GetActTotalRechargeCount(self): return self.ipyActTotalRechargeLen
    def GetActTotalRechargeByIndex(self, index): return self.ipyActTotalRechargeCache[index]
    def GetCrossRealmPKZoneCount(self): return self.ipyCrossRealmPKZoneLen
    def GetCrossRealmPKZoneByIndex(self, index): return self.ipyCrossRealmPKZoneCache[index]
    def GetCrossZoneCommCount(self): return self.ipyCrossZoneCommLen
    def GetCrossZoneCommByIndex(self, index): return self.ipyCrossZoneCommCache[index]
    def GetCrossZonePKCount(self): return self.ipyCrossZonePKLen
    def GetCrossZonePKByIndex(self, index): return self.ipyCrossZonePKCache[index]
    def GetCrossRealmPKSeasonCount(self): return self.ipyCrossRealmPKSeasonLen
    def GetCrossRealmPKSeasonByIndex(self, index): return self.ipyCrossRealmPKSeasonCache[index]
    def GetCrossRealmPKDanCount(self): return self.ipyCrossRealmPKDanLen
    def GetCrossRealmPKDanByIndex(self, index): return self.ipyCrossRealmPKDanCache[index]
    def GetCrossPenglaiZoneCount(self): return self.ipyCrossPenglaiZoneLen
    def GetCrossPenglaiZoneByIndex(self, index): return self.ipyCrossPenglaiZoneCache[index]
    def GetCrossPenglaiZoneMapCount(self): return self.ipyCrossPenglaiZoneMapLen
    def GetCrossPenglaiZoneMapByIndex(self, index): return self.ipyCrossPenglaiZoneMapCache[index]
    def GetActWeekPartyCount(self): return self.ipyActWeekPartyLen
    def GetActWeekPartyByIndex(self, index): return self.ipyActWeekPartyCache[index]
    def GetActLoginAwardCount(self): return self.ipyActLoginAwardLen
ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
@@ -56,20 +56,19 @@
    
    return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
def GetServerCrossZoneIpyData(mapID, serverGroupID=0):
    ## 获取本服对应跨服玩法分区地图信息
    if mapID not in ChConfig.Def_CrossZoneTableName:
def GetCrossCommZoneIpyDataByZoneID(zoneID):
    ## 获取跨服常规分区
    crossZoneName = GameWorld.GetCrossZoneName()
    ipyData = IpyGameDataPY.GetIpyGameDataNotLog("CrossZoneComm", crossZoneName, zoneID)
    return ipyData
def GetCrossCommZoneIpyDataByServerGroupID(serverGroupID):
    ## 获取跨服常规分区
    crossZoneName = GameWorld.GetCrossZoneName()
    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZoneComm", {"CrossZoneName":crossZoneName}, True)
    if not ipyDataList:
        return
    if not serverGroupID:
        serverGroupID = GameWorld.GetServerGroupID()
    tableName = ChConfig.Def_CrossZoneTableName[mapID]
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    if not hasattr(ipyDataMgr, "Get%sCount" % tableName):
        return
    for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()):
        ipyData = getattr(ipyDataMgr, "Get%sByIndex" % tableName)(i)
    for ipyData in ipyDataList:
        serverGroupIDList = ipyData.GetServerGroupIDList()
        for serverGroupIDInfo in serverGroupIDList:
            if (isinstance(serverGroupIDInfo, tuple) and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]) \
@@ -77,15 +76,47 @@
                return ipyData
    return
def GetCrossCommZoneIpyDataListByServerGroupID(serverGroupID):
    ## 获取跨服常规分区列表
    if serverGroupID:
        ipyData = GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
        if not ipyData:
            return
        ipyDataList = [ipyData]
    else:
        crossZoneName = GameWorld.GetCrossZoneName()
        ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZoneComm", {"CrossZoneName":crossZoneName}, True)
    return ipyDataList
def GetServerCrossZoneMapIpyData(mapID, serverGroupID=0):
    ## 获取本服对应跨服玩法分区地图信息
    if mapID not in ChConfig.Def_CrossZoneMapTableName:
        return
    tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
    if not serverGroupID:
        if GameWorld.IsCrossServer():
            return
        serverGroupID = GameWorld.GetServerGroupID()
    zoneIpyData = GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
    if not zoneIpyData:
        return
    commZoneID = zoneIpyData.GetZoneID()
    return IpyGameDataPY.GetIpyGameDataByCondition(tableName, {"ZoneID":commZoneID})
def IsCrossServerOpen():
    ## 跨服服务器是否开放中
    return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
def ClientServerMsg_ServerInitOK(serverGroupID):
    ## 子服连接成功
def Sync_CrossCommInitDataToClientServer(serverGroupID=0):
    ''' 同步跨服常规通用数据到子服务器
    @param serverGroupID: 为0时同步所有子服
    '''
    isOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
    GameWorld.Log("子服连接成功,通知当前跨服服务器状态: isOpen=%s" % isOpen)
    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossServerState, {"isOpen":isOpen}, [serverGroupID])
    crossZoneName = GameWorld.GetCrossZoneName()
    GameWorld.Log("通知当前跨服服务器状态: isOpen=%s,crossZoneName=%s,syncServerGroupID=%s" % (isOpen, crossZoneName, serverGroupID))
    serverGroupIDList = [serverGroupID] if serverGroupID else []
    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossServerState, {"isOpen":isOpen, "crossZoneName":crossZoneName}, serverGroupIDList)
    return
def DoChangeCrossServerState(isOpen):
@@ -110,6 +141,10 @@
def CrossServerMsg_CrossServerState(msgData):
    ## 子服收到跨服服务器状态变更,子服不存DB,默认跨服维护中,连接跨服成功后由跨服同步状态直接更新到字典即可,没连上就默认维护中
    if "crossZoneName" in msgData:
        PyGameData.g_crossZoneName = msgData["crossZoneName"]
        GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossZoneName, PyGameData.g_crossZoneName)
    isOpen = msgData["isOpen"]
    isOpen = 1 if isOpen else 0
    GameWorld.Log("收到跨服服务器状态变更: 是否正常开放中=%s" % isOpen)
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -340,7 +340,7 @@
    ## 收到子服请求查看跨服地图NPC个数信息
    
    mapID = msgData["MapID"]
    zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(mapID, serverGroupID)
    zoneIpyData = CrossRealmPlayer.GetServerCrossZoneMapIpyData(mapID, serverGroupID)
    if not zoneIpyData:
        return
    realMapID = zoneIpyData.GetMapID()
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
@@ -184,7 +184,7 @@
def ClientServerMsg_ChatCrossWorld(serverGroupID, msgData, tick):
    ## 收到子服跨服世界频道聊天
    zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(ChConfig.Def_FBMapID_CrossPenglai, serverGroupID)
    zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
    if not zoneIpyData:
        return
    serverGroupIDList = zoneIpyData.GetServerGroupIDList()
ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
@@ -85,6 +85,8 @@
g_autoViceleaderDict = {}#自动安排副盟主的玩家记录{familyID:[]}
g_forbidAutoViceleaderFamily = [] #禁止自动安排副盟主的仙盟[familyID,..]
g_crossZoneName = "" # 跨服分区名
g_crossPlayerViewCache = {} # 查看跨服玩家信息 {playerID:[cacheInfo, updTick], ...}
g_crossPKPlayerDict = {} # 跨服PK玩家字典  {playerID:PKPlayer, ...}
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -169,6 +169,7 @@
Def_Notify_WorldKey_CrossServerConnState = "CrossServerConnState"  # 跨服服务器链接状态
Def_Notify_WorldKey_CrossServerOpen = "CrossServerOpen"  # 跨服服务器是否开启中
Def_Notify_WorldKey_CrossZoneName = "CrossZoneName"  # 跨服分区名
Def_Notify_WorldKey_CrossPKZoneID = "CrossPKZoneID"  # 本服跨服PK所属赛区
Def_Notify_WorldKey_CrossPKSeasonID = "CrossPKSeasonID"  # 本服跨服PK当前赛季
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1824,9 +1824,9 @@
RegisterEnter_CrossServerMapIDList = [Def_FBMapID_CrossPenglai]
#跨服地图
Def_CrossMapIDList = [Def_FBMapID_CrossRealmPK, Def_FBMapID_CrossPenglai]
#跨服对应分区配置表名
Def_CrossZoneTableName = {Def_FBMapID_CrossPenglai:"CrossPenglaiZone",
                          }
#跨服分区对应地图配置表名
Def_CrossZoneMapTableName = {Def_FBMapID_CrossPenglai:"CrossPenglaiZoneMap",
                             }
#副本关闭时未拾取的物品邮件发放给玩家
#这里只有需要的副本才配置,不做默认逻辑,防止某些副本实际不能给导致刷物品,如麒麟之府
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Boss.py
@@ -47,8 +47,8 @@
            if not bossID:
                continue
            
            if mapID in ChConfig.Def_CrossZoneTableName:
                tableName = ChConfig.Def_CrossZoneTableName[mapID]
            if mapID in ChConfig.Def_CrossZoneMapTableName:
                tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
                realMapID = GameWorld.GetGameWorld().GetRealMapID()
                copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
                zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, mapID, copyMapID)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
@@ -54,6 +54,7 @@
import time
import copy
import ConfigParser
import PyGameData
import md5
#---------------------------------------------------------------------
@@ -1576,6 +1577,12 @@
    ## 是否跨服服务器
    return ToIntDef(ReadChConfig.GetPyMongoConfig("Merge", "IsMergeServer"), 0)
def GetCrossZoneName():
    ## 跨服服务器分区名,标记一起跨服分区的名字,配置在跨服服务器,子服不用配置,由跨服服务器同步
    if IsCrossServer():
        return ReadChConfig.GetPyMongoConfig("Merge", "CrossZoneName")
    return PyGameData.g_crossZoneName
## 时间格式转换成数值时间,可参考datetime.datetime.fromtimestamp(102645645)
#  @param timeNum
#  @return 时间数值 1970年起
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1173,9 +1173,14 @@
                        ("list", "SeasonDanLVAwardList", 0),
                        ),
                "CrossPenglaiZone":(
                        ("BYTE", "ZoneID", 0),
                "CrossZoneComm":(
                        ("char", "CrossZoneName", 1),
                        ("BYTE", "ZoneID", 1),
                        ("list", "ServerGroupIDList", 0),
                        ),
                "CrossPenglaiZoneMap":(
                        ("BYTE", "ZoneID", 0),
                        ("DWORD", "MapID", 1),
                        ("DWORD", "DataMapID", 1),
                        ("BYTE", "CopyMapID", 1),
@@ -3729,12 +3734,24 @@
    def GetDanLVAwardList(self): return self.DanLVAwardList # 段位达标奖励物品列表
    def GetSeasonDanLVAwardList(self): return self.SeasonDanLVAwardList # 赛季段位奖励物品列表
# 跨服Boss蓬莱仙境分区表
class IPY_CrossPenglaiZone():
# 跨服分区表通用
class IPY_CrossZoneComm():
    def __init__(self):
        self.CrossZoneName = ""
        self.ZoneID = 0
        self.ServerGroupIDList = []
        return
    def GetCrossZoneName(self): return self.CrossZoneName # 跨服分区名
    def GetZoneID(self): return self.ZoneID # 赛区ID
    def GetServerGroupIDList(self): return self.ServerGroupIDList # 赛区服务器组ID列表
# 跨服Boss蓬莱仙境分区地图表
class IPY_CrossPenglaiZoneMap():
    
    def __init__(self):
        self.ZoneID = 0
        self.ServerGroupIDList = []
        self.MapID = 0
        self.DataMapID = 0
        self.CopyMapID = 0
@@ -3743,7 +3760,6 @@
        return
        
    def GetZoneID(self): return self.ZoneID # 分区ID
    def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器组ID列表
    def GetMapID(self): return self.MapID # 场景地图ID
    def GetDataMapID(self): return self.DataMapID # 数据地图ID
    def GetCopyMapID(self): return self.CopyMapID # 虚拟线路ID
@@ -4317,8 +4333,10 @@
        self.ipyGodWeaponEffectLen = len(self.ipyGodWeaponEffectCache)
        self.ipyCrossRealmPKDanCache = self.__LoadFileData("CrossRealmPKDan", IPY_CrossRealmPKDan)
        self.ipyCrossRealmPKDanLen = len(self.ipyCrossRealmPKDanCache)
        self.ipyCrossPenglaiZoneCache = self.__LoadFileData("CrossPenglaiZone", IPY_CrossPenglaiZone)
        self.ipyCrossPenglaiZoneLen = len(self.ipyCrossPenglaiZoneCache)
        self.ipyCrossZoneCommCache = self.__LoadFileData("CrossZoneComm", IPY_CrossZoneComm)
        self.ipyCrossZoneCommLen = len(self.ipyCrossZoneCommCache)
        self.ipyCrossPenglaiZoneMapCache = self.__LoadFileData("CrossPenglaiZoneMap", IPY_CrossPenglaiZoneMap)
        self.ipyCrossPenglaiZoneMapLen = len(self.ipyCrossPenglaiZoneMapCache)
        self.ipyGatherSoulCache = self.__LoadFileData("GatherSoul", IPY_GatherSoul)
        self.ipyGatherSoulLen = len(self.ipyGatherSoulCache)
        self.ipyGatherSoulCompoundCache = self.__LoadFileData("GatherSoulCompound", IPY_GatherSoulCompound)
@@ -4739,8 +4757,10 @@
    def GetGodWeaponEffectByIndex(self, index): return self.ipyGodWeaponEffectCache[index]
    def GetCrossRealmPKDanCount(self): return self.ipyCrossRealmPKDanLen
    def GetCrossRealmPKDanByIndex(self, index): return self.ipyCrossRealmPKDanCache[index]
    def GetCrossPenglaiZoneCount(self): return self.ipyCrossPenglaiZoneLen
    def GetCrossPenglaiZoneByIndex(self, index): return self.ipyCrossPenglaiZoneCache[index]
    def GetCrossZoneCommCount(self): return self.ipyCrossZoneCommLen
    def GetCrossZoneCommByIndex(self, index): return self.ipyCrossZoneCommCache[index]
    def GetCrossPenglaiZoneMapCount(self): return self.ipyCrossPenglaiZoneMapLen
    def GetCrossPenglaiZoneMapByIndex(self, index): return self.ipyCrossPenglaiZoneMapCache[index]
    def GetGatherSoulCount(self): return self.ipyGatherSoulLen
    def GetGatherSoulByIndex(self, index): return self.ipyGatherSoulCache[index]
    def GetGatherSoulCompoundCount(self): return self.ipyGatherSoulCompoundLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -2126,8 +2126,8 @@
    GameWorld.DebugLog("Boss状态变更: bossID=%s,isAlive=%s,dataMapID=%s,realMapID=%s,copyMapID=%s" 
                       % (bossID, isAlive, dataMapID, realMapID, copyMapID))
    if not isAlive:
        if dataMapID in ChConfig.Def_CrossZoneTableName:
            tableName = ChConfig.Def_CrossZoneTableName[dataMapID]
        if dataMapID in ChConfig.Def_CrossZoneMapTableName:
            tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID]
            realMapID = GameWorld.GetGameWorld().GetRealMapID()
            copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
            zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
@@ -556,9 +556,9 @@
    if not bossID and not stoneNPCID:
        return
    
    if mapID not in ChConfig.Def_CrossZoneTableName:
    if mapID not in ChConfig.Def_CrossZoneMapTableName:
        return
    tableName = ChConfig.Def_CrossZoneTableName[mapID]
    tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
    realMapID = GameWorld.GetGameWorld().GetRealMapID()
    copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
    zoneIpyData = IpyGameDataPY.GetIpyGameDataNotLog(tableName, realMapID, mapID, copyMapID)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
@@ -36,20 +36,13 @@
    
    return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
def GetServerCrossZoneIpyData(mapID, serverGroupID=0):
    ## 获取本服对应跨服玩法分区地图信息
    if mapID not in ChConfig.Def_CrossZoneTableName:
def GetCrossCommZoneIpyDataByServerGroupID(serverGroupID):
    ## 获取跨服常规分区
    crossZoneName = GameWorld.GetCrossZoneName()
    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZoneComm", {"CrossZoneName":crossZoneName}, True)
    if not ipyDataList:
        return
    if not serverGroupID:
        serverGroupID = GameWorld.GetServerGroupID()
    tableName = ChConfig.Def_CrossZoneTableName[mapID]
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    if not hasattr(ipyDataMgr, "Get%sCount" % tableName):
        return
    for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()):
        ipyData = getattr(ipyDataMgr, "Get%sByIndex" % tableName)(i)
    for ipyData in ipyDataList:
        serverGroupIDList = ipyData.GetServerGroupIDList()
        for serverGroupIDInfo in serverGroupIDList:
            if (isinstance(serverGroupIDInfo, tuple) and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]) \
@@ -57,6 +50,21 @@
                return ipyData
    return
def GetServerCrossZoneMapIpyData(mapID, serverGroupID=0):
    ## 获取本服对应跨服玩法分区地图信息
    if mapID not in ChConfig.Def_CrossZoneMapTableName:
        return
    tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
    if not serverGroupID:
        if GameWorld.IsCrossServer():
            return
        serverGroupID = GameWorld.GetServerGroupID()
    zoneIpyData = GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
    if not zoneIpyData:
        return
    commZoneID = zoneIpyData.GetZoneID()
    return IpyGameDataPY.GetIpyGameDataByCondition(tableName, {"ZoneID":commZoneID})
def IsCrossServerOpen():
    ## 跨服服务器是否开放中
    return GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -1323,6 +1323,10 @@
                
            return
        
        if key == ShareDefine.Def_Notify_WorldKey_CrossZoneName:
            PyGameData.g_crossZoneName = msgValue
            return
        if msgValue.isdigit():
            value = int(msgValue)
        else:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossRealmReg.py
@@ -70,7 +70,7 @@
    
    zoneID = 0
    if not mapID:
        zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(registerMap)
        zoneIpyData = CrossRealmPlayer.GetServerCrossZoneMapIpyData(registerMap)
        if not zoneIpyData:
            GameWorld.ErrLog("找不到该服务器对应跨服分区: registerMap=%s" % (registerMap))
            return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -81,6 +81,7 @@
g_gathersoulfbAwardDict = {} #聚魂副本奖励记录{playerID:[[itemID,itemCnt]]}
g_crossZoneName = "" # 跨服分区名
g_crossRegPlayerAttrDict = {} #跨服注册时登记的会影响战力的属性值 {playerID:[value, ...], ...}
g_crossSyncTickDict = {} #需要同步跨服数据的玩家同步tick字典 {playerID:tick, ...}
g_crossPlayerDictChangeInfo = {} #跨服玩家字典变化信息 {playerID:{(key, dType):value, ...}, ...}
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -169,6 +169,7 @@
Def_Notify_WorldKey_CrossServerConnState = "CrossServerConnState"  # 跨服服务器链接状态
Def_Notify_WorldKey_CrossServerOpen = "CrossServerOpen"  # 跨服服务器是否开启中
Def_Notify_WorldKey_CrossZoneName = "CrossZoneName"  # 跨服分区名
Def_Notify_WorldKey_CrossPKZoneID = "CrossPKZoneID"  # 本服跨服PK所属赛区
Def_Notify_WorldKey_CrossPKSeasonID = "CrossPKSeasonID"  # 本服跨服PK当前赛季