From a5a3fae74222495868ae0bcd8483954cf2a4a712 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期日, 03 二月 2019 16:46:54 +0800
Subject: [PATCH] 2906 【1.5.0】【1.5.100】跨服及子服启动未完成优化

---
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                                  |   60 ++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossRealmReg.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py                                |    1 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py                                                      |    6 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py                                    |  104 ++++++---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py                                       |   97 +++++----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                             |   40 +++-
 ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py                                                       |    8 
 PySysDB/PySysDBPY.h                                                                                              |   14 +
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py                                              |    2 
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                                    |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                               |    1 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py                                             |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py                      |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py                   |   34 ++-
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py                                   |    2 
 ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py                                        |   69 +++++-
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py                                   |   52 ++++-
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py                                |   12 +
 ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py                                                     |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Boss.py                          |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                             |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py                                 |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py                 |    4 
 PySysDB/PySysDBG.h                                                                                               |   20 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                  |    6 
 26 files changed, 384 insertions(+), 174 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index b89b279..e501b42 100644
--- a/PySysDB/PySysDBG.h
+++ b/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
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index eaf0828..35e2da1 100644
--- a/PySysDB/PySysDBPY.h
+++ b/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
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index c96a5cf..b5e3c80 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/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
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
index d8bc871..6bfea6e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
+++ b/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: 区服名
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
index f2dec64..283cdf3 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
+++ b/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)()):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
index 8291317..b67d031 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
+++ b/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()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
index 928b0f9..b53441b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
+++ b/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 = []
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
index 0ce2b8d..b8430ba 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
+++ b/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()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index 4a71a97..caec13b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/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()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index ecae682..6646cd1 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/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
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
index ec033a1..e00d086 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
+++ b/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)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index bac4ef9..9cece86 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/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()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
index b782be2..d7aa654 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
+++ b/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()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
index c4dd49f..bf021c6 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
+++ b/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, ...}
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index bd11a02..e7bac34 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/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当前赛季
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index fac890e..3fd16fa 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/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",
+                             }
 
 #副本关闭时未拾取的物品邮件发放给玩家
 #这里只有需要的副本才配置,不做默认逻辑,防止某些副本实际不能给导致刷物品,如麒麟之府
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Boss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Boss.py
index 03e5d59..950f6b9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Boss.py
+++ b/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)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
index 6895204..51e2f23 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
+++ b/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年起
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 6b31701..96c7cf6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index a642e49..f6214b7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/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)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
index 1717fd8..2d0836a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
+++ b/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)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
index e3a2c70..ec3f786 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
+++ b/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)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index a13bec7..6ea266d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/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:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossRealmReg.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossRealmReg.py
index 70aff26..f0bdca9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossRealmReg.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index 1c0ef76..92997c0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/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, ...}, ...}
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index bd11a02..e7bac34 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/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当前赛季

--
Gitblit v1.8.0