From 545986a8fdde345b28cf3004be84c6cfe79a3dc1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 19 四月 2019 11:29:12 +0800
Subject: [PATCH] 6459 【后端】【2.0】缥缈仙域开发单(跨服分区逻辑优化,支持跨服妖王分区状态同步)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py |  121 ++++++++++++++++++++++-----------------
 1 files changed, 68 insertions(+), 53 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
index 390ae32..e7b0983 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
@@ -52,21 +52,21 @@
 
 g_bossRecDataDict = {} # boss对应rec记录缓存 {(zoneID, bossID):recData, ...}
 
-def GetCrossBossZoneID(realMapID, dataMapID, copyMapID):
+def GetCrossBossZoneID(mapID, realMapID, copyMapID):
     ## 获取地图跨服boss所属分区
-    if dataMapID not in ChConfig.Def_CrossMapIDList:
+    if mapID not in ChConfig.Def_CrossMapIDList:
         return 0
     # 固定线路分配的
-    if dataMapID in ChConfig.Def_CrossZoneMapTableName:
-        tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID]
-        zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
+    if mapID in ChConfig.Def_CrossZoneMapTableName:
+        tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
+        zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, mapID, copyMapID)
         if not zoneIpyData:
             return 0
         return zoneIpyData.GetZoneID()
     
     # 动态线路分配的
-    elif dataMapID in ChConfig.Def_CrossDynamicLineMap:
-        return PlayerFB.GetCrossDynamicLineZoneID(dataMapID, realMapID, copyMapID)
+    elif mapID in ChConfig.Def_CrossDynamicLineMap:
+        return PlayerFB.GetCrossDynamicLineZoneID(mapID, realMapID, copyMapID)
     return 0
 
 def __GetCrossBossRecData(zoneID, bossID):
@@ -112,44 +112,58 @@
     @param serverGroupID: 为0时同步所有子服
     '''
     
-    GameWorld.Log("同步给子服跨服boss信息: syncServerGroupID=%s" % (serverGroupID))
-    zoneIpyDataList = CrossRealmPlayer.GetCrossCommZoneIpyDataListByServerGroupID(serverGroupID)
-    if not zoneIpyDataList:
-        GameWorld.Log("    没有跨服boss分区信息!")
-        return
-    
+    crossMapBossIDListDict = {}
     ipyDataMgr = IpyGameDataPY.IPY_Data()
-    for zoneIpyData in zoneIpyDataList:
-        zoneID = zoneIpyData.GetZoneID()
-        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:
+    for i in xrange(ipyDataMgr.GetBOSSInfoCount()):
+        ipyData = ipyDataMgr.GetBOSSInfoByIndex(i)
+        mapID = ipyData.GetMapID()
+        bossID = ipyData.GetNPCID()
+        if mapID not in ChConfig.Def_CrossZoneTypeName:
+            continue
+        if mapID not in crossMapBossIDListDict:
+            crossMapBossIDListDict[mapID] = []
+        bossIDList = crossMapBossIDListDict[mapID]
+        bossIDList.append(bossID)
+    
+    crossZoneName = GameWorld.GetCrossZoneName()
+    GameWorld.Log("同步给子服跨服boss信息: crossZoneName=%s,syncServerGroupID=%s" % (crossZoneName, serverGroupID))
+    
+    # 由于不同功能的跨服boss分区可能不一样,同步子服就需要按分区分步同步,所以需先发送一条初始化的信息类型先清空子服保存的跨服boss数据,再根据功能所属分区推送
+    serverGroupIDList = [serverGroupID] if serverGroupID else []
+    bossInfoDict = {"BossInfoType":"InitOK"}
+    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossInfo, bossInfoDict, serverGroupIDList)
+    
+    for mapID, bossIDList in crossMapBossIDListDict.items():
+        GameWorld.Log("    mapID=%s, bossIDList=%s" % (mapID, bossIDList))
+        zoneIpyDataList = CrossRealmPlayer.GetCrossZoneIpyDataListByServerGroupID(mapID, serverGroupID)
+        if not zoneIpyDataList:
+            continue
+        for zoneIpyData in zoneIpyDataList:
+            zoneID = zoneIpyData.GetZoneID()
             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)
-            
+            bossInfoList = []
+            for bossID in bossIDList:
+                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 = {"BossInfoList":bossInfoList}
+                CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossInfo, bossInfoDict, serverGroupIDList)
+            else:
+                GameWorld.Log("没有跨服boss信息! mapID=%s,zoneID=%s" % (mapID, zoneID))
+                
     return
 
-def DoCrossBossOnKilled(bossID, killPlayerName, realMapID, dataMapID, copyMapID, killerIDList):
+def DoCrossBossOnKilled(bossID, killPlayerName, mapID, realMapID, copyMapID, killerIDList):
     ## 跨服boss被杀
-    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))
+    zoneID = GetCrossBossZoneID(mapID, realMapID, copyMapID)
+    GameWorld.Log("击杀跨服boss: zoneID=%s,bossID=%s,mapID=%s,realMapID=%s,copyMapID=%s,killerIDList=%s" 
+                  % (zoneID, bossID, mapID, realMapID, copyMapID, killerIDList))
     if not zoneID:
         return
     
@@ -164,22 +178,22 @@
     refreshTime = SetBossRefreshTime(zoneID, bossID, killedTime, bossRecData)
     
     # 广播子服跨服boss被击杀
-    zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByZoneID(zoneID)
+    zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(mapID, zoneID)
     if zoneIpyData == None:
         return
     serverGroupIDList = zoneIpyData.GetServerGroupIDList()
     killedRecord = GetRecKilledRecord(bossRecData)
-    killerExInfo = [killerIDList, dataMapID]
+    killerExInfo = [killerIDList, mapID]
     bossInfoList = [[zoneID, bossID, killedTime, refreshTime, killedRecord, isAlive, killerExInfo]]
     bossInfoDict = {"BossInfoType":"OnKilled", "BossInfoList":bossInfoList}
     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossInfo, bossInfoDict, serverGroupIDList)
     return
 
-def DoCrossBossStateChange(bossID, isAlive, dataMapID, realMapID, copyMapID):
+def DoCrossBossStateChange(bossID, isAlive, mapID, realMapID, copyMapID):
     ## 跨服boss状态变更
-    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))
+    zoneID = GetCrossBossZoneID(mapID, realMapID, copyMapID)
+    GameWorld.Log("跨服boss状态变更: zoneID=%s,bossID=%s,isAlive=%s,mapID=%s,realMapID=%s,copyMapID=%s" 
+                  % (zoneID, bossID, isAlive, mapID, realMapID, copyMapID))
     if not zoneID:
         return
     
@@ -187,7 +201,7 @@
     
     if isAlive:
         # 广播子服跨服boss复活
-        zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByZoneID(zoneID)
+        zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(mapID, zoneID)
         if zoneIpyData != None:
             serverGroupIDList = zoneIpyData.GetServerGroupIDList()
             stateInfo = [zoneID, bossID, isAlive]
@@ -333,8 +347,8 @@
     ## 收到跨服服务器同步的跨服boss信息 {"BossInfoType":"InitOK", "BossInfoList":bossInfoList}
     global g_bossRecDataDict
     
-    bossInfoType = bossInfoDict["BossInfoType"]
-    bossInfoList = bossInfoDict["BossInfoList"]
+    bossInfoType = bossInfoDict.get("BossInfoType", "")
+    bossInfoList = bossInfoDict.get("BossInfoList", [])
     
     GameWorld.DebugLog("收到跨服同步的跨服boss信息: bossInfoType=%s" % (bossInfoType))
     
@@ -343,7 +357,8 @@
         recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_CrossBossInfo)
         recTypeListData.Clear()
         g_bossRecDataDict = {}
-        
+        return
+    
     syncBOSSIDList = []
     for bossInfo in bossInfoList:
         zoneID, bossID, killedTime, refreshTime, killedRecord, isAlive, killerExInfo = bossInfo
@@ -357,14 +372,14 @@
         if not killerExInfo:
             continue
         
-        killerIDList, dataMapID = killerExInfo
+        killerIDList, mapID = killerExInfo
         for playerID in killerIDList:
             killer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
             if not killer:
-                GameWorld.ErrLog("击杀跨服boss时主服玩家不在线, playerID=%s,dataMapID=%s,bossID=%s" % (playerID, dataMapID, bossID))
+                GameWorld.ErrLog("击杀跨服boss时主服玩家不在线, playerID=%s,mapID=%s,bossID=%s" % (playerID, mapID, bossID))
                 DataRecordPack.SendEventPack("CrossBoss_Error", {"PlayerID":playerID, "Error":"MainServerOffline"})
                 continue
-            msgInfo = str([dataMapID, bossID])
+            msgInfo = str([mapID, bossID])
             killer.MapServer_QueryPlayerResult(0, 0, "CrossKillBoss", msgInfo, len(msgInfo))
             
     Sync_CrossBossInfo(None, syncBOSSIDList)

--
Gitblit v1.8.0