From b55a8f02a5e1dd8cddb56452a163cb9244803c6e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 02 八月 2022 14:35:09 +0800
Subject: [PATCH] 9387 【主干】【越南】【bt7】【后端】支持跨服协助

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py |  398 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 367 insertions(+), 31 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
index 2348d7e..011f3d4 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
@@ -19,6 +19,7 @@
 import PyDataManager
 import IpyGameDataPY
 import NetPackCommon
+import CrossRealmMsg
 import PyGameDataStruct
 import PlayerFBHelpBattle
 import ChPyNetSendPack
@@ -192,12 +193,14 @@
     if leavePlayerID in assistMgr.playerNoSaveDBAssistDict:
         playerAssistList = assistMgr.playerNoSaveDBAssistDict[leavePlayerID]
         for assistObj in playerAssistList[::-1]:
-            OnCancelPlayerRequestAssist(assistObj, "LeaveFamily", True)
+            if assistObj.FamilyID:
+                OnCancelPlayerRequestAssist(assistObj, "LeaveFamily", True)
             
     # 玩家协助中的
     if leavePlayerID in assistMgr.playerAssistingDict:
         assistObj = assistMgr.playerAssistingDict[leavePlayerID]
-        OnCancelPlayerAssist(leavePlayer, leavePlayerID, assistObj, "LeaveFamily", True)
+        if assistObj.FamilyID:
+            OnCancelPlayerAssist(leavePlayer, leavePlayerID, assistObj, "LeaveFamily", True)
         
     return
 
@@ -220,10 +223,11 @@
             
     return
 
-def OnInitAssistData(dbData, isSaveDB):
+def OnInitAssistData(dbData, isSaveDB, serverGroupID=0):
     ## 加载协助数据额外处理
     setattr(dbData, "IsSaveDB", isSaveDB) # 是否保存数据库,离线可协助的需要存库,如挖矿类
     setattr(dbData, "ObjID", 0) # NPC实例ID
+    setattr(dbData, "ServerGroupID", serverGroupID)
     
     assistType = AssistType_Unknown
     if dbData.NPCID:
@@ -293,10 +297,14 @@
         GameWorld.DebugLog("不能协助自己!")
         return
     
-    if assistObj.FamilyID != curPlayer.GetFamilyID():
-        GameWorld.DebugLog("非同盟玩家不能协助!")
-        return
-    
+    isCrossBoss = assistObj.MapID in ChConfig.Def_CrossMapIDList
+    if isCrossBoss:
+        pass
+    else:
+        if assistObj.FamilyID != curPlayer.GetFamilyID():
+            GameWorld.DebugLog("非同盟玩家不能协助!")
+            return
+        
     playerMapID = curPlayer.GetMapID()
     mapID = assistObj.MapID
     lineID = assistObj.LineID
@@ -313,6 +321,15 @@
             PlayerControl.NotifyCode(curPlayer, "AssistFBLimit")
             return
         
+    if isCrossBoss:
+        tagPlayerID = assistObj.PlayerID
+        assistPlayerID = curPlayer.GetPlayerID()
+        assistPlayerName = curPlayer.GetName()
+        isFriend = PlayerFriend.IsFriend(assistPlayerID, tagPlayerID)
+        sendMsg = {"queryType":"StartAssistBoss", "queryData":[assistGUID, assistPlayerID, assistPlayerName, isFriend]}
+        CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_CrossAssist, sendMsg)
+        return
+    
     # 设定协助必须离开队伍
     tagMap = GameWorld.GetMap(mapID)
     if not tagMap:
@@ -383,7 +400,8 @@
     if playerID not in assistObj.AssistPlayerIDList:
         assistObj.AssistPlayerIDList.append(playerID)
         
-    GameWorld.DebugLog("开始协助: tagPlayerID=%s,mapID=%s,lineID=%s,npcID=%s,objID=%s" % (tagPlayerID, mapID, lineID, npcID, objID), playerID)
+    GameWorld.DebugLog("开始协助: tagPlayerID=%s,mapID=%s,lineID=%s,npcID=%s,objID=%s" 
+                       % (tagPlayerID, mapID, lineID, npcID, objID), playerID)
     
     # 设置协助
     PlayerControl.SetAssistTagPlayerID(curPlayer, tagPlayerID)
@@ -397,16 +415,117 @@
     tagPlayerName = tagPlayer.GetName()
     tagTeamID = tagPlayer.GetTeamID()
     isFriend = PlayerFriend.IsFriend(assistPlayerID, tagPlayerID)
-    assistData = [mapID, "Start", assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID]
+    serverGroupID = GameWorld.GetServerGroupID()
+    assistData = [mapID, "Start", assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID, serverGroupID]
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AssistBoss, assistData)
+    return
+
+def ClientServerMsg_StartAssistBoss(serverGroupID, queryType, queryData):
+    ## 收到子服消息 - 开始协助boss
+    ## @return: 是否同步删除GUID
+    assistGUID, assistPlayerID, assistPlayerName, isFriend = queryData
+    
+    assistMgr = PyDataManager.GetPlayerAssistPyManager()
+    if assistGUID not in assistMgr.allAssistDict:
+        GameWorld.Log("不存在该协助!assistGUID=%s" % assistGUID)
+        reason, isGameServer = "AssistGUIDNotExist", True
+        sendMsg = {"queryType":"CancelPlayerRequestAssist", "queryData":[assistGUID, reason, isGameServer]}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID])
+        return
+    assistObj = assistMgr.allAssistDict[assistGUID]
+    if assistObj.AssistType != AssistType_Boss:
+        return
+    if assistObj.PlayerID == assistPlayerID:
+        GameWorld.DebugLog("不能协助自己!")
+        return
+    
+    assistPlayer = GameWorld.GetPlayerManager().FindPlayerByID(assistPlayerID)
+    # 如果是在跨服服务器
+    if assistPlayer:
+        playerMapID = assistPlayer.GetMapID()
+        mapID = assistObj.MapID
+        lineID = assistObj.LineID
+        playerMap = GameWorld.GetMap(playerMapID)
+        if not playerMap:
+            return
+        if playerMap.GetMapFBType() != ChConfig.fbtNull:
+            playerLineID = assistPlayer.GetFBID()
+            if playerMapID != mapID or playerLineID != lineID:
+                #副本中无法协助
+                PlayerControl.NotifyCode(assistPlayer, "AssistFBLimit")
+                return
+            
+    tagPlayerID = assistObj.PlayerID
+    mapID = assistObj.MapID
+    lineID = assistObj.LineID
+    npcID = assistObj.NPCID
+    objID = assistObj.ObjID
+    
+    tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)
+    if not tagPlayer:
+        GameWorld.Log("玩家已离线,无法协助!tagPlayerID=%s" % (tagPlayerID))
+        OnCancelPlayerRequestAssist(assistObj, "CrossPlayerOffline", True)
+        return
+    
+    if tagPlayer.GetMapID() != mapID:
+        GameWorld.DebugLog("目标玩家已不在请求协助的地图,无法协助!tagPlayerID=%s" % (tagPlayerID))
+        return
+    
+    # 设置新协助之前需要先取消正在进行中的协助
+    if assistPlayerID in assistMgr.playerAssistingDict:
+        assistingObj = assistMgr.playerAssistingDict[assistPlayerID]
+        if assistGUID != assistingObj.GUID:
+            OnCancelPlayerAssist(assistPlayer, assistPlayerID, assistingObj, "StartNewAssistBoss", True)
+    assistMgr.playerAssistingDict[assistPlayerID] = assistObj
+    
+    if assistPlayerID not in assistObj.AssistPlayerIDList:
+        assistObj.AssistPlayerIDList.append(assistPlayerID)
+        
+    GameWorld.DebugLog("开始协助: tagPlayerID=%s,mapID=%s,lineID=%s,npcID=%s,objID=%s" 
+                       % (tagPlayerID, mapID, lineID, npcID, objID), assistPlayerID)
+    
+    # 设置协助
+    if assistPlayer:
+        PlayerControl.SetAssistTagPlayerID(assistPlayer, tagPlayerID)
+        
+    # 通知目标玩家
+    # xxx开始协助你
+    PlayerControl.NotifyCode(tagPlayer, "AssistStart", [assistPlayerName])
+    
+    tagPlayerName = tagPlayer.GetName()
+    tagTeamID = tagPlayer.GetTeamID()
+    assistData = [mapID, "Start", assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID, serverGroupID]
     GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AssistBoss, assistData)
     return
 
 def OnAddAssistBossPlayerOK(queryData):
     ## 添加协助Boss的玩家成功,通知协助玩家可以前往
-    assistGUID, assistPlayerID = queryData
+    assistGUID, assistPlayerID, tagPlayerID, serverGroupID = queryData
+    
+    if GameWorld.IsCrossServer():
+        sendMsg = {"queryType":"AddAssistBossPlayerOK", "queryData":[assistGUID, assistPlayerID, tagPlayerID]}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID])
+        return
+    
     assistPlayer = GameWorld.GetPlayerManager().FindPlayerByID(assistPlayerID)
     if not assistPlayer:
         return
+    
+    assistPack = ChPyNetSendPack.tagGCAssistingInfo()
+    assistPack.AssistGUID = assistGUID
+    NetPackCommon.SendFakePack(assistPlayer, assistPack)
+    return
+
+def CrossServerMsg_AddAssistBossPlayerOK(queryType, queryData):
+    ## 收到跨服服务器 - 添加协助boss成功
+    assistGUID, assistPlayerID, tagPlayerID = queryData
+    
+    assistPlayer = GameWorld.GetPlayerManager().FindPlayerByID(assistPlayerID)
+    if not assistPlayer:
+        return
+    
+    # 设置协助
+    PlayerControl.SetAssistTagPlayerID(assistPlayer, tagPlayerID)
     
     assistPack = ChPyNetSendPack.tagGCAssistingInfo()
     assistPack.AssistGUID = assistGUID
@@ -502,10 +621,11 @@
 def __DoRequestAssistBoss(curPlayer, queryData):
     ## 请求协助Boss
     
+    isCrossServer = GameWorld.IsCrossServer()
     familyID = curPlayer.GetFamilyID()
-    if not familyID:
+    if not familyID and not isCrossServer:
         return
-    mapID, lineID, npcID, objID, npcLV = queryData
+    mapID, lineID, npcID, objID, npcLV, serverGroupID = queryData
     
     playerID = curPlayer.GetPlayerID()
     
@@ -525,23 +645,125 @@
         
     if not reqAssistObj:
         addNewAssist = True
-        reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID, objID)
+        reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID, objID, serverGroupID=serverGroupID)
         
     if not reqAssistObj:
         return
     
-    # 通知本仙盟玩家
-    PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([reqAssistObj]))
     # 求助信息已发送,请等待盟友支援
     PlayerControl.NotifyCode(curPlayer, "AssistRequestOK")
     
-    # 广播仙盟请求
     requestCount = 1
     if not addNewAssist:
         requestCount = min(curPlayer.GetDictByKey("AssistBossRequestCount") + 1, 999)
     curPlayer.SetDict("AssistBossRequestCount", requestCount)
     notifyNum = (requestCount - 1) % 3
-    PlayerControl.FamilyNotify(familyID, "AssistBossRequest%s" % notifyNum, [curPlayer.GetName(), mapID, npcLV, npcID])
+    
+    if isCrossServer:
+        GUID = reqAssistObj.GUID
+        sendMsg = {"queryType":"RequestAssistBoss", "queryData":[mapID, lineID, npcID, objID, npcLV, playerID, notifyNum, GUID]}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID])
+    else:
+        # 通知本仙盟玩家
+        PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([reqAssistObj]))
+        # 广播仙盟请求
+        PlayerControl.FamilyNotify(familyID, "AssistBossRequest%s" % notifyNum, [curPlayer.GetName(), mapID, npcLV, npcID])
+        
+    return
+
+def CrossServerMsg_RequestAssistBoss(queryType, queryData):
+    
+    mapID, lineID, npcID, objID, npcLV, playerID, notifyNum, GUID = queryData
+    
+    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+    if not curPlayer:
+        return
+    
+    reqAssistObj = None
+    addNewAssist = False
+    assistMgr = PyDataManager.GetPlayerAssistPyManager()
+    if playerID in assistMgr.playerNoSaveDBAssistDict:
+        playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+        for assistObj in playerAssistList:
+            if assistObj.AssistType != AssistType_Boss:
+                continue
+            if npcID != assistObj.NPCID or lineID != assistObj.LineID or objID != assistObj.ObjID:
+                OnCancelPlayerRequestAssist(assistObj, "RequestNewAssistBoss", True)
+            else:
+                reqAssistObj = assistObj
+            break
+        
+    if not reqAssistObj:
+        addNewAssist = True
+        reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID, objID, assistGUID=GUID)
+        
+    GameWorld.Log("收到跨服请求协助boss: %s mapID=%s,lineID=%s,npcID=%s,objID=%s,addNewAssist=%s,GUID=%s" 
+                  % (queryType, mapID, lineID, npcID, objID, addNewAssist, GUID), playerID)
+    if not reqAssistObj:
+        return
+    
+    # 通知本服玩家
+    funcLimitLV = PlayerControl.GetFuncLimitLV(ShareDefine.GameFuncID_PenglaiBoss)
+    clientPack = GetAssistInfoListPack([reqAssistObj])
+    playerManager = GameWorld.GetPlayerManager()
+    for i in xrange(playerManager.GetActivePlayerCount()):
+        player = playerManager.GetActivePlayerAt(i)
+        if player == None:
+            continue
+        if player.GetLV() < funcLimitLV:
+            continue
+        if PlayerControl.GetIsTJG(player):
+            continue
+        NetPackCommon.SendFakePack(player, clientPack)
+        
+    # 广播请求
+    PlayerControl.WorldNotify(0, "AssistBossRequest%s" % notifyNum, [curPlayer.GetName(), mapID, npcLV, npcID])
+    return
+
+def CrossServerMsg_CrossAssist(msgData, tick):
+    ## 收到跨服服务器消息 - 协助信息
+    
+    queryType = msgData["queryType"]
+    queryData = msgData["queryData"]
+    
+    # 请求协助boss
+    if queryType == "RequestAssistBoss":
+        CrossServerMsg_RequestAssistBoss(queryType, queryData)
+        return
+    
+    # 添加协助boss成功
+    if queryType == "AddAssistBossPlayerOK":
+        CrossServerMsg_AddAssistBossPlayerOK(queryType, queryData)
+        return
+    
+    # 取消协助请求
+    if queryType == "CancelPlayerRequestAssist":
+        CrossServerMsg_CancelPlayerRequestAssist(queryType, queryData)
+        return
+    
+    # 取消协助
+    if queryType == "CancelPlayerAssist":
+        CrossServerMsg_CancelPlayerAssist(queryType, queryData)
+        return
+    
+    # boss协助结束
+    if queryType == "BossAssistOver":
+        CrossServerMsg_BossAssistOver(queryType, queryData)
+        return
+    
+    return
+
+def ClientServerMsg_CrossAssist(serverGroupID, msgData, tick):
+    ## 收到子服服务器消息 - 协助信息
+    
+    queryType = msgData["queryType"]
+    queryData = msgData["queryData"]
+    
+    # 开始协助boss
+    if queryType == "StartAssistBoss":
+        ClientServerMsg_StartAssistBoss(serverGroupID, queryType, queryData)
+        return
+    
     return
 
 def __DoRequestAssistTeamFB(curPlayer, queryData):
@@ -550,7 +772,7 @@
     familyID = curPlayer.GetFamilyID()
     if not familyID:
         return
-    mapID, lineID  = queryData
+    mapID, lineID = queryData
     
     playerID = curPlayer.GetPlayerID()
     
@@ -588,10 +810,12 @@
     PlayerControl.FamilyNotify(familyID, "AssistFBRequest%s" % notifyNum, [curPlayer.GetName(), mapID])
     return
 
-def __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID=0, objID=0, exData="", isSaveDB=0):
+def __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID=0, objID=0, exData="", isSaveDB=0, assistGUID="", serverGroupID=0):
     ## 添加新协助请求
-    assistGUID = str(uuid.uuid1())
-    familyID = curPlayer.GetFamilyID()
+    if not assistGUID:
+        assistGUID = str(uuid.uuid1())
+    crossAssist = mapID in ChConfig.Def_CrossMapIDList
+    familyID = 0 if crossAssist else curPlayer.GetFamilyID()
     playerID = curPlayer.GetPlayerID()
     assistObj = PyGameDataStruct.tagDBAssist()
     assistObj.GUID = assistGUID
@@ -608,15 +832,16 @@
     assistObj.ExDataLen = len(exData)
     
     # 以下是非DB字段属性
-    OnInitAssistData(assistObj, isSaveDB)
+    OnInitAssistData(assistObj, isSaveDB, serverGroupID)
     assistObj.ObjID = objID
     
     #assistMgr = PyDataManager.GetPlayerAssistPyManager()
     assistMgr.allAssistDict[assistGUID] = assistObj
-    if familyID not in assistMgr.familyAssistDict:
-        assistMgr.familyAssistDict[familyID] = []
-    familyAssistList = assistMgr.familyAssistDict[familyID]
-    familyAssistList.append(assistObj)
+    if familyID:
+        if familyID not in assistMgr.familyAssistDict:
+            assistMgr.familyAssistDict[familyID] = []
+        familyAssistList = assistMgr.familyAssistDict[familyID]
+        familyAssistList.append(assistObj)
     
     if not isSaveDB:
         if playerID not in assistMgr.playerNoSaveDBAssistDict:
@@ -671,9 +896,10 @@
     lineID = assistObj.LineID
     npcID = assistObj.NPCID
     objID = assistObj.ObjID
+    serverGroupID = assistObj.ServerGroupID
     
-    GameWorld.DebugLog("取消发布的协助请求: mapID=%s,lineID=%s,npcID=%s,objID=%s,reason=%s,isGameServer=%s, %s" 
-                       % (mapID, lineID, npcID, objID, reason, isGameServer, assistGUID))
+    GameWorld.DebugLog("取消发布的协助请求: mapID=%s,lineID=%s,npcID=%s,objID=%s,reason=%s,isGameServer=%s, %s, serverGroupID=%s" 
+                       % (mapID, lineID, npcID, objID, reason, isGameServer, assistGUID, serverGroupID))
     
     assistMgr = PyDataManager.GetPlayerAssistPyManager()
     if assistGUID not in assistMgr.allAssistDict:
@@ -710,8 +936,49 @@
         # 暂不需要处理
         pass
     
-    # 放最后    
-    SyncFamilyClearAssist(familyID, assistGUID)
+    # 放最后
+    if familyID:
+        SyncFamilyClearAssist(familyID, assistGUID)
+        
+    if GameWorld.IsCrossServer() and serverGroupID:
+        sendMsg = {"queryType":"CancelPlayerRequestAssist", "queryData":[assistGUID, reason, isGameServer]}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID])
+        
+    return
+
+def CrossServerMsg_CancelPlayerRequestAssist(queryType, queryData):
+    ## 收到跨服服务器 - 取消协助请求
+    
+    assistGUID, reason, isGameServer = queryData
+    
+    assistMgr = PyDataManager.GetPlayerAssistPyManager()
+    if assistGUID not in assistMgr.allAssistDict:
+        return
+    assistObj = assistMgr.allAssistDict.pop(assistGUID)
+    playerID = assistObj.PlayerID
+    
+    GameWorld.Log("收到跨服取消协助boss请求: %s assistGUID=%s,reason=%s,isGameServer=%s" % (queryType, assistGUID, reason, isGameServer), playerID)
+    
+    if playerID in assistMgr.playerNoSaveDBAssistDict:
+        playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+        if assistObj in playerAssistList:
+            playerAssistList.remove(assistObj)
+            
+    # 通知本服玩家
+    clearPack = ChPyNetSendPack.tagGCClearAssist()
+    clearPack.AssistGUID = assistGUID
+    funcLimitLV = PlayerControl.GetFuncLimitLV(ShareDefine.GameFuncID_PenglaiBoss)
+    playerManager = GameWorld.GetPlayerManager()
+    for i in xrange(playerManager.GetActivePlayerCount()):
+        player = playerManager.GetActivePlayerAt(i)
+        if player == None:
+            continue
+        if player.GetLV() < funcLimitLV:
+            continue
+        if PlayerControl.GetIsTJG(player):
+            continue
+        NetPackCommon.SendFakePack(player, clearPack)
+        
     return
 
 def OnCancelPlayerAssist(cancelPlayer, cancelPlayerID, assistObj, reason, isGameServer, isNotify=True):
@@ -735,6 +1002,7 @@
     lineID = assistObj.LineID
     npcID = assistObj.NPCID
     objID = assistObj.ObjID
+    serverGroupID = assistObj.ServerGroupID
     
     GameWorld.DebugLog("取消协助: tagPlayerID=%s,mapID=%s,lineID=%s,npcID=%s,objID=%s,reason=%s,isGameServer=%s, %s" 
                        % (tagPlayerID, mapID, lineID, npcID, objID, reason, isGameServer, assistGUID), cancelPlayerID)
@@ -774,11 +1042,34 @@
     elif assistObj.AssistType == AssistType_TeamFB:
         pass
     
+    if GameWorld.IsCrossServer() and serverGroupID:
+        sendMsg = {"queryType":"CancelPlayerAssist", "queryData":[assistGUID, reason, isGameServer, cancelPlayerID]}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID])
+        
+    return
+
+def CrossServerMsg_CancelPlayerAssist(queryType, queryData):
+    ## 收到跨服服务器 - 取消玩家协助
+    
+    assistGUID, reason, isGameServer, cancelPlayerID = queryData
+    
+    assistMgr = PyDataManager.GetPlayerAssistPyManager()
+    if assistGUID not in assistMgr.allAssistDict:
+        return
+    
+    GameWorld.Log("收到跨服取消玩家协助: %s assistGUID=%s,reason=%s,isGameServer=%s" % (queryType, assistGUID, reason, isGameServer), cancelPlayerID)
+    
+    cancelPlayer = GameWorld.GetPlayerManager().FindPlayerByID(cancelPlayerID)
+    if not cancelPlayer:
+        return
+    
+    PlayerControl.SetAssistTagPlayerID(cancelPlayer, 0)
     return
 
 def __DoBossAssistOver(queryData):
     ## boss协助结束,一般是boss被击杀 或 被系统
     mapID, lineID, npcID, objID, noAssistPlayerIDList, assistAwardItemID, assistAwardResult = queryData
+    isCrossServer = GameWorld.IsCrossServer()
     assistMgr = PyDataManager.GetPlayerAssistPyManager()
     for noAssistPlayerID in noAssistPlayerIDList:
         if noAssistPlayerID not in assistMgr.playerNoSaveDBAssistDict:
@@ -787,9 +1078,19 @@
         for assistObj in playerAssistList:
             if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID:
                 OnCancelPlayerRequestAssist(assistObj, "BossAssistOver", False)
-                break
                 
+                # 跨服服务器同步到子服结算奖励
+                if isCrossServer and noAssistPlayerID in assistAwardResult:
+                    assistPlayerDict = assistAwardResult[noAssistPlayerID]
+                    serverGroupID = assistObj.ServerGroupID
+                    sendMsg = {"queryType":"BossAssistOver", "queryData":[mapID, lineID, npcID, noAssistPlayerID, assistAwardItemID, assistPlayerDict]}
+                    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID])
+                break
+            
     if not assistAwardItemID or not assistAwardResult:
+        return
+    
+    if isCrossServer:
         return
     
     # 新增感谢数据
@@ -802,6 +1103,41 @@
         
     return
 
+def CrossServerMsg_BossAssistOver(queryType, queryData):
+    ## 收到跨服服务器 - boss协助结束
+    
+    mapID, lineID, npcID, noAssistPlayerID, assistAwardItemID, assistPlayerDict = queryData
+    
+    GameWorld.Log("收到跨服boss协助结束: mapID=%s,lineID=%s,npcID=%s,assistAwardItemID=%s,assistPlayerDict=%s" 
+                  % (mapID, lineID, npcID, assistAwardItemID, assistPlayerDict), noAssistPlayerID)
+    
+    # 新增感谢数据
+    playerMgr = GameWorld.GetPlayerManager()
+    curPlayer = playerMgr.FindPlayerByID(noAssistPlayerID)
+    if not curPlayer:
+        return
+    
+    AddNewAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict, npcID)
+    
+    # 通知地图玩家给 协助礼盒
+    queryData = [assistAwardItemID]
+    QueryPlayerResult_PlayerAssist(curPlayer, "CrossNoAssistPlayerAward", queryData)
+    
+    # 通知地图玩家给 活跃积分
+    for assistPlayerID, assistInfo in assistPlayerDict.items():
+        assistPlayer = playerMgr.FindPlayerByID(assistPlayerID)
+        if not assistPlayer:
+            continue
+        if "AssistMoney" not in assistInfo:
+            continue
+        assistMoney = assistInfo["AssistMoney"]
+        isFriend = assistInfo["IsFriend"]
+        
+        queryData = [assistMoney, isFriend]
+        QueryPlayerResult_PlayerAssist(assistPlayer, "CrossAssistPlayerAward", queryData)
+        
+    return
+
 def __DoFBAssistOver(queryData):
     ## 副本协助结束
     mapID, lineID, noAssistPlayerID, assistAwardItemID, assistPlayerDict = queryData

--
Gitblit v1.8.0