hxp
2022-07-29 b55a8f02a5e1dd8cddb56452a163cb9244803c6e
9387 【主干】【越南】【bt7】【后端】支持跨服协助

# Conflicts:
# ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
5个文件已修改
459 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py 398 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
@@ -17,6 +17,7 @@
import GameWorld
import ShareDefine
import PlayerAssist
import PlayerControl
import CrossLuckyCloudBuy
import IPY_GameServer
@@ -120,6 +121,9 @@
            
        elif msgType == ShareDefine.ClientServerMsg_AddBuff:
            MapServer_CrossAddBuff(msgData)
        elif msgType == ShareDefine.ClientServerMsg_CrossAssist:
            PlayerAssist.ClientServerMsg_CrossAssist(serverGroupID, msgData, tick)
            
        elif msgType == ShareDefine.ClientServerMsg_BattlefieldBuyOpen:
            CrossBattlefield.ClientServerMsg_BattlefieldBuyOpen(serverGroupID, msgData)
@@ -323,6 +327,9 @@
        elif msgType == ShareDefine.CrossServerMsg_CrossBossState:
            CrossBoss.CrossServerMsg_CrossBossState(msgData)
            
        elif msgType == ShareDefine.CrossServerMsg_CrossAssist:
            PlayerAssist.CrossServerMsg_CrossAssist(msgData, tick)
        elif msgType == ShareDefine.CrossServerMsg_CrossActInfo:
            CrossActionControl.CrossServerMsg_CrossActInfo(msgData)
            
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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
@@ -857,7 +857,7 @@
                    todayGiftCount = assistPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GetThanksGiftCount % liheItemID)
                    assistAwardPlayerDict[assistPlayerID] = {"PlayerName":assistPlayer.GetPlayerName(), "Job":assistPlayer.GetJob(), 
                                                             "LV":assistPlayer.GetLV(), "RealmLV":assistPlayer.GetOfficialRank(),
                                                             "TodayGiftCount":todayGiftCount}
                                                             "TodayGiftCount":todayGiftCount, "AssistMoney":assistMoney, "IsFriend":isFriend}
                    
                    notifyParam = [assistPlayer.GetPlayerName(), noAssistPlayer.GetPlayerName(), mapID, self.curNPC.GetLV(), self.npcID]
                    PlayerControl.FamilyNotify(assistPlayer.GetFamilyID(), "AssistBossFinish", notifyParam)
@@ -866,8 +866,9 @@
                GameWorld.DebugLog("发布方离线或无有效协助玩家在线,不给感谢礼盒奖励: playerID=%s" % playerID, self.npcID, self.lineID)
                continue
            
            GameWorld.DebugLog("发布方给感谢礼盒奖励: playerID=%s" % playerID, self.npcID, self.lineID)
            ItemControler.GivePlayerItemOrMail(noAssistPlayer, [[liheItemID, 1, 0]])
            if not GameWorld.IsCrossServer():
                GameWorld.DebugLog("发布方给感谢礼盒奖励: playerID=%s" % playerID, self.npcID, self.lineID)
                ItemControler.GivePlayerItemOrMail(noAssistPlayer, [[liheItemID, 1, 0]])
            self.__assistAwardResult[playerID] = assistAwardPlayerDict
            
        return
@@ -959,6 +960,15 @@
def OnPlayerLeaveMap(curPlayer):
    ## 玩家离开地图处理
    
    if GameWorld.IsCrossServer():
        playerID = curPlayer.GetPlayerID()
        for hurtList in PyGameData.g_npcHurtDict.values():
            if hurtList.IsNoAssistPlayer(playerID) or hurtList.IsAssistPlayer(playerID):
                GameWorld.DebugLog("玩家离开跨服, 删除boss伤血玩家!npcID=%s" % (hurtList.npcID), playerID)
                hurtList.DelHurtPlayer(playerID, "LeaveCross")
                break
        return
    mapID = curPlayer.GetMapID()
    mapType = GameWorld.GetMap().GetMapFBType()
    changeMapID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ChangeMapID)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
@@ -25,6 +25,7 @@
import ShareDefine
import ChConfig
import FBLogic
import PlayerAssist
# 获取玩家跨服服务器上的名字
def GetCrossPlayerName(curPlayer):
@@ -133,6 +134,9 @@
    
    FBLogic.DoPlayerLeaveFB(curPlayer, tick)
    
    # 离开地图
    PlayerAssist.OnPlayerLeaveMap(curPlayer)
    PlayerExitCrossServer(curPlayer)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
@@ -71,13 +71,11 @@
    objID = clientData.ObjID
    npcID = clientData.NPCID
    
    if GameWorld.IsCrossServer():
        return
    if not curPlayer.GetFamilyID():
        GameWorld.DebugLog("没有仙盟不能请求协助!", playerID)
        return
    if not GameWorld.IsCrossServer():
        if not curPlayer.GetFamilyID():
            GameWorld.DebugLog("本服boss没有仙盟不能请求协助!", playerID)
            return
    curNPC = GameWorld.FindNPCByNPCID(npcID)
    if not curNPC:
        GameWorld.DebugLog("协助NPC不存在无法协助!npcID=%s" % npcID, playerID)
@@ -103,7 +101,8 @@
    npcLV = curNPC.GetLV()
    mapID = curPlayer.GetMapID()
    lineID = NPCHurtManager.GetBossLineID(npcID)
    queryData = [mapID, lineID, npcID, objID, npcLV]
    serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
    queryData = [mapID, lineID, npcID, objID, npcLV, serverGroupID]
    QueryGameServer_PlayerAssist(playerID, "RequestAssistBoss", queryData)
    return
@@ -206,6 +205,17 @@
                awardItemID, awardItemCount = ipyData.GetAssistPlayerAward()
                ItemControler.GivePlayerItemOrMail(curPlayer, [[awardItemID, awardItemCount, 0]])
                
    # 跨服发布协助玩家奖励
    elif queryType == "CrossNoAssistPlayerAward":
        assistAwardItemID = queryData[0]
        ItemControler.GivePlayerItemOrMail(curPlayer, [[assistAwardItemID, 1, 0]])
    # 跨服协助玩家奖励
    elif queryType == "CrossAssistPlayerAward":
        assistMoney, isFriend = queryData
        assistMoneyType = ShareDefine.TYPE_Price_FamilyActivity
        AddTodayAssistMoney(curPlayer, assistMoneyType, assistMoney, isFriend)
    return
def GameServer_AssistBossMsg(assistData):
@@ -217,13 +227,13 @@
    
    # 开始协助
    if msgType == "Start":
        assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID = assistData[1:]
        assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID, serverGroupID = assistData[1:]
        npchurtList = NPCHurtManager.GetPlayerHurtListEx(lineID, objID, npcID)
        if not npchurtList:
            return
        
        npchurtList.AddAssistPlayer(assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID)
        QueryGameServer_PlayerAssist(0, "AddAssistBossPlayerOK", [assistGUID, assistPlayerID])
        QueryGameServer_PlayerAssist(0, "AddAssistBossPlayerOK", [assistGUID, assistPlayerID, tagPlayerID, serverGroupID])
        
    # 取消协助
    elif msgType == "Cancel":
@@ -366,7 +376,9 @@
        socialEx = int(addValue * friendAddAssistMoneyPer / 100.0)
        
    realAdd = addValue + socialEx
    PlayerControl.GiveMoney(curPlayer, moneyType, realAdd)
    if not GameWorld.IsCrossServer():
        PlayerControl.GiveMoney(curPlayer, moneyType, realAdd)
    
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TodayAssistMoney, todayAssistMoney + addValue)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TodayAssistMoneySocial, socialMoney + socialEx)