From ad158391ff62df48198a5411e5950e578dc3c43c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 11 四月 2019 14:42:21 +0800
Subject: [PATCH] 6459 【后端】【2.0】缥缈仙域开发单(可进入跨服妖王地图支持分区,增加竞争归属逻辑)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py |   59 ++++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 42 insertions(+), 17 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
index 283cdf3..bdf7df7 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
@@ -55,14 +55,22 @@
     ## 获取地图跨服boss所属分区
     if dataMapID not in ChConfig.Def_CrossMapIDList:
         return 0
-    if dataMapID not in ChConfig.Def_CrossZoneMapTableName:
-        GameWorld.ErrLog("跨服boss没有分区表!dataMapID=%s" % dataMapID)
+    # 固定线路分配的
+    if dataMapID in ChConfig.Def_CrossZoneMapTableName:
+        tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID]
+        zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
+        if not zoneIpyData:
+            return 0
+        return zoneIpyData.GetZoneID()
+    
+    # 动态线路分配的
+    elif dataMapID in ChConfig.Def_CrossDynamicLineMap:
+        zoneLineDict = PyGameData.g_crossDynamicLineInfo.get(dataMapID, {}) # {dataMapID:{(zoneID, funcLineID):[mapID, copyMapID], ...}, ...}
+        for zoneLineInfo, mapCopyInfo in zoneLineDict.items():
+            if realMapID == mapCopyInfo[0] and copyMapID == mapCopyInfo[1]:
+                return zoneLineInfo[0]
         return 0
-    tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID]
-    zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
-    if not zoneIpyData:
-        return 0
-    return zoneIpyData.GetZoneID()
+    return 0
 
 def __GetCrossBossRecData(zoneID, bossID):
     ## 获取跨服Boss Rec数据
@@ -234,18 +242,21 @@
     
     curTime = int(time.time())
     if not PyGameData.g_sortBOSSRefreshList:
+        crossZoneName = GameWorld.GetCrossZoneName()
         ipyDataMgr = IpyGameDataPY.IPY_Data()
         for i in xrange(ipyDataMgr.GetBOSSInfoCount()):
             ipyData = ipyDataMgr.GetBOSSInfoByIndex(i)
             bossID = ipyData.GetNPCID()
             mapID = ipyData.GetMapID()
-            if mapID not in ChConfig.Def_CrossZoneMapTableName:
+            if mapID not in ChConfig.Def_CrossZoneTypeName:
                 continue
-            tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
-            if not hasattr(ipyDataMgr, "Get%sCount" % tableName):
+            zoneTypeName = ChConfig.Def_CrossZoneTypeName[mapID]
+            if not hasattr(ipyDataMgr, "Get%sCount" % zoneTypeName):
                 continue
-            for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()):
-                zoneIpyData = getattr(ipyDataMgr, "Get%sByIndex" % tableName)(i)
+            for i in xrange(getattr(ipyDataMgr, "Get%sCount" % zoneTypeName)()):
+                zoneIpyData = getattr(ipyDataMgr, "Get%sByIndex" % zoneTypeName)(i)
+                if zoneIpyData.GetCrossZoneName() != crossZoneName:
+                    continue
                 zoneID = zoneIpyData.GetZoneID()
                 bossRecData = __GetCrossBossRecData(zoneID, bossID)
                 killedTime = GetRecKilledTime(bossRecData)
@@ -275,24 +286,38 @@
         
     return
 
+def GetCrossBossIsAliveOrCanReborn(zoneID, bossID):
+    ##BOSS是否活着或者可重生
+    if __GetCrossBossIsAlive(zoneID, bossID):
+        return True
+    bossRecData = __GetCrossBossRecData(zoneID, bossID)
+    killedTime = GetRecKilledTime(bossRecData)
+    refreshTime = GetRecRefreshTime(bossRecData)    
+    curTime = int(time.time())
+    rebornSecond = max(0, refreshTime - (curTime - killedTime))
+    return rebornSecond == 0
+
 def OnCrossMapServerInitOK():
     __SendMapServerAliveCrossBoss()
     return
 
 def __SendMapServerAliveCrossBoss():
     ## 同步当前还活着的boss,防止地图重启后已经刷新的boss不刷新
+    crossZoneName = GameWorld.GetCrossZoneName()
     ipyDataMgr = IpyGameDataPY.IPY_Data()
     for i in xrange(IpyGameDataPY.IPY_Data().GetBOSSInfoCount()):
         ipyData = IpyGameDataPY.IPY_Data().GetBOSSInfoByIndex(i)
         bossID = ipyData.GetNPCID()
         mapID = ipyData.GetMapID()
-        if mapID not in ChConfig.Def_CrossZoneMapTableName:
+        if mapID not in ChConfig.Def_CrossZoneTypeName:
             continue
-        tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
-        if not hasattr(ipyDataMgr, "Get%sCount" % tableName):
+        zoneTypeName = ChConfig.Def_CrossZoneTypeName[mapID]
+        if not hasattr(ipyDataMgr, "Get%sCount" % zoneTypeName):
             continue
-        for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()):
-            zoneIpyData = getattr(ipyDataMgr, "Get%sByIndex" % tableName)(i)
+        for i in xrange(getattr(ipyDataMgr, "Get%sCount" % zoneTypeName)()):
+            zoneIpyData = getattr(ipyDataMgr, "Get%sByIndex" % zoneTypeName)(i)
+            if zoneIpyData.GetCrossZoneName() != crossZoneName:
+                continue
             zoneID = zoneIpyData.GetZoneID()
             isAlive = __GetCrossBossIsAlive(zoneID, bossID)
             if not isAlive:

--
Gitblit v1.8.0