From 74ba276f01c50ea8cd757a136cd6474777b45c17 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 24 五月 2021 15:21:57 +0800
Subject: [PATCH] 8585 【港台】【BT】【长尾】【后端】竞技场(主干功能ID从189改为195,与bt2一致)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py |   88 ++++++++++++++++++++++++++++++++-----------
 1 files changed, 65 insertions(+), 23 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
index e7b0983..20be5af 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
@@ -20,7 +20,7 @@
 import IpyGameDataPY
 import ChPyNetSendPack
 import CrossRealmPlayer
-import DataRecordPack
+#import DataRecordPack
 import PlayerControl
 import NetPackCommon
 import CrossRealmMsg
@@ -197,16 +197,20 @@
     if not zoneID:
         return
     
-    __SetCrossBossIsAlive(zoneID, bossID, isAlive)
-    
-    if isAlive:
-        # 广播子服跨服boss复活
-        zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(mapID, zoneID)
-        if zoneIpyData != None:
-            serverGroupIDList = zoneIpyData.GetServerGroupIDList()
-            stateInfo = [zoneID, bossID, isAlive]
-            CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossState, stateInfo, serverGroupIDList)
-            
+    if __GetCrossBossIsAlive(zoneID, bossID) != isAlive:
+        __SetCrossBossIsAlive(zoneID, bossID, isAlive)
+        if isAlive:
+            # 广播子服跨服boss复活
+            SendClientServerCrossBossState(mapID, zoneID, {bossID:isAlive})
+    return
+
+def SendClientServerCrossBossState(mapID, zoneID, bossStateDict={}):
+    # 广播子服跨服boss复活
+    zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(mapID, zoneID)
+    if zoneIpyData != None:
+        serverGroupIDList = zoneIpyData.GetServerGroupIDList()
+        stateInfo = [zoneID, bossStateDict]
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossState, stateInfo, serverGroupIDList)
     return
 
 def __SetKilledRecord(bossRecData, killedTime, playerName):
@@ -261,6 +265,9 @@
             mapID = ipyData.GetMapID()
             if mapID not in ChConfig.Def_CrossZoneTypeName:
                 continue
+            refreshTimeStr = ipyData.GetRefreshTime()
+            if not refreshTimeStr or refreshTimeStr == "0":
+                continue
             zoneTypeName = ChConfig.Def_CrossZoneTypeName[mapID]
             if not hasattr(ipyDataMgr, "Get%sCount" % zoneTypeName):
                 continue
@@ -272,13 +279,13 @@
                 bossRecData = __GetCrossBossRecData(zoneID, bossID)
                 killedTime = GetRecKilledTime(bossRecData)
                 refreshTime = GetRecRefreshTime(bossRecData)
-                PyGameData.g_sortBOSSRefreshList.append([bossID, killedTime, refreshTime, zoneID])
+                PyGameData.g_sortBOSSRefreshList.append([bossID, killedTime, refreshTime, zoneID, mapID])
         PyGameData.g_sortBOSSRefreshList.sort(key=lambda asd:max(0, asd[2] - (curTime - asd[1])))
         
     #GameWorld.DebugLog("检查boss复活: PyGameData.g_sortBOSSRefreshList=%s" % PyGameData.g_sortBOSSRefreshList)
-    syncBOSSIDList = []
+    zoneMapBossStateDict = {}
     for bossInfo in PyGameData.g_sortBOSSRefreshList:
-        bossID, killedTime, refreshTime, zoneID = bossInfo
+        bossID, killedTime, refreshTime, zoneID, mapID = bossInfo
         isAlive = __GetCrossBossIsAlive(zoneID, bossID)
         if isAlive:
             #GameWorld.DebugLog("    zoneID=%s,bossID=%s,未被击杀!" % (zoneID, bossID))
@@ -289,12 +296,21 @@
             #GameWorld.DebugLog("    zoneID=%s,bossID=%s,refreshTime=%s,curTime=%s,killedTime=%s,重生倒计时秒(%s)!" % (zoneID, bossID, refreshTime, curTime, killedTime, rebornSecond))
             break
         
-        __SetCrossBossIsAlive(zoneID, bossID, 1)
-        syncBOSSIDList.append(bossID)
+        isAlive = 1
+        __SetCrossBossIsAlive(zoneID, bossID, isAlive)
+        
+        key = (mapID, zoneID)
+        if key not in zoneMapBossStateDict:
+            zoneMapBossStateDict[key] = {}
+        bossStateDict = zoneMapBossStateDict[key]
+        bossStateDict[bossID] = isAlive
         
         GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_GameWorldBossRebornCross % (zoneID, bossID), 1)
         GameWorld.DebugLog("    通知MapServer重生: zoneID=%s,bossID=%s,killedTime=%s,rebornSecond=%s" % (zoneID, bossID, killedTime, rebornSecond))
         
+    for key, bossStateDict in zoneMapBossStateDict.items():
+        mapID, zoneID = key
+        SendClientServerCrossBossState(mapID, zoneID, bossStateDict)
     return
 
 def GetCrossBossIsAliveOrCanReborn(zoneID, bossID):
@@ -341,6 +357,7 @@
 
 def OnPlayerLogin(curPlayer):
     Sync_CrossBossInfo(curPlayer)
+    __LoginNotifyKillCrossBoss(curPlayer)
     return
 
 def CrossServerMsg_CrossBossInfo(bossInfoDict):
@@ -376,8 +393,10 @@
         for playerID in killerIDList:
             killer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
             if not killer:
-                GameWorld.ErrLog("击杀跨服boss时主服玩家不在线, playerID=%s,mapID=%s,bossID=%s" % (playerID, mapID, bossID))
-                DataRecordPack.SendEventPack("CrossBoss_Error", {"PlayerID":playerID, "Error":"MainServerOffline"})
+                #GameWorld.ErrLog("击杀跨服boss时主服玩家不在线, playerID=%s,mapID=%s,bossID=%s" % (playerID, mapID, bossID))
+                #DataRecordPack.SendEventPack("CrossBoss_Error", {"PlayerID":playerID, "Error":"MainServerOffline"})
+                killTime = int(time.time())
+                PyGameData.g_unNotifyKillCrossBossDict[playerID] = [killTime, mapID, bossID]
                 continue
             msgInfo = str([mapID, bossID])
             killer.MapServer_QueryPlayerResult(0, 0, "CrossKillBoss", msgInfo, len(msgInfo))
@@ -385,16 +404,36 @@
     Sync_CrossBossInfo(None, syncBOSSIDList)
     return
 
+def __LoginNotifyKillCrossBoss(curPlayer):
+    ## 登录时通知未通知到的击杀跨服boss
+    playerID = curPlayer.GetPlayerID()
+    if playerID not in PyGameData.g_unNotifyKillCrossBossDict:
+        return
+    killTime, mapID, bossID = PyGameData.g_unNotifyKillCrossBossDict.pop(playerID)
+    curTime = int(time.time())
+    passSeconds = curTime - killTime
+    if passSeconds >= 120:
+        GameWorld.DebugLog("超过120秒上线不处理,主要为了防刷上线捡物品!", playerID)
+        return
+    msgInfo = str([mapID, bossID])
+    curPlayer.MapServer_QueryPlayerResult(0, 0, "CrossKillBoss", msgInfo, len(msgInfo))
+    GameWorld.Log("上线补通知击杀跨服boss: passSeconds=%s, mapID=%s, bossID=%s" % (passSeconds, mapID, bossID), playerID)
+    return
+
 def CrossServerMsg_CrossBossState(msgInfo):
     ## 收到跨服服务器同步的跨服boss状态
     
-    zoneID, bossID, isAlive = msgInfo
-    GameWorld.DebugLog("收到跨服服务器同步的跨服boss状态: zoneID=%s, bossID=%s, isAlive=%s" % (zoneID, bossID, isAlive))
+    zoneID, bossStateDict = msgInfo
+    GameWorld.DebugLog("收到跨服服务器同步的跨服boss状态: zoneID=%s, bossStateDict=%s" % (zoneID, bossStateDict))
     
-    __SetCrossBossIsAlive(zoneID, bossID, isAlive)
+    aliveBossIDList = []
+    for bossID, isAlive in bossStateDict.items():
+        __SetCrossBossIsAlive(zoneID, bossID, isAlive)
+        if isAlive:
+            aliveBossIDList.append(bossID)
     
-    if isAlive:
-        Sync_CrossBossInfo(None, [bossID])
+    if aliveBossIDList:
+        Sync_CrossBossInfo(None, aliveBossIDList)
         
     return
 
@@ -427,6 +466,9 @@
         bossInfoObj.RefreshCD = refreshTime
         bossInfo.BossInfoList.append(bossInfoObj)
         
+    if not bossInfo.BossInfoList:
+        return
+    
     bossInfo.BossCnt = len(bossInfo.BossInfoList)
     if not curPlayer:
         # 全服广播在线玩家

--
Gitblit v1.8.0