hch
2020-09-30 403b9cc018af79f3fd0870a37bfea7b0d65c38a5
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
@@ -15,9 +15,12 @@
#"""Version = 2019-12-06 21:00"""
#-------------------------------------------------------------------------------
import PlayerFriend
import PyDataManager
import IpyGameDataPY
import NetPackCommon
import PyGameDataStruct
import PlayerFBHelpBattle
import ChPyNetSendPack
import PlayerControl
import PlayerFamily
@@ -39,6 +42,8 @@
def OnPlayerLogin(curPlayer, isTJ=False):
    ## 玩家上线
    # @param isTJ: 是否脱机上线
    SyncCanGetAssistThanksGiftCount(curPlayer)
    
    familyID = curPlayer.GetFamilyID()
    playerID = curPlayer.GetPlayerID()
@@ -140,6 +145,25 @@
        
    return
def OnPlayerTeamChange(curPlayer):
    ## 玩家队伍变更
    if curPlayer.GetTeamID():
        return
    playerID = curPlayer.GetPlayerID()
    assistMgr = PyDataManager.GetPlayerAssistPyManager()
    if playerID not in assistMgr.playerNoSaveDBAssistDict:
        return
    playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
    for assistObj in playerAssistList[::-1]:
        gameMap = GameWorld.GetMap(assistObj.MapID)
        if gameMap and gameMap.GetMapFBType() == ChConfig.fbtTeam:
            OnCancelPlayerRequestAssist(assistObj, "LeaveTeam", True)
    return
def OnInitAssistData(dbData, isSaveDB):
    ## 加载协助数据额外处理
    setattr(dbData, "IsSaveDB", isSaveDB) # 是否保存数据库,离线可协助的需要存库,如挖矿类
@@ -155,6 +179,39 @@
            assistType = AssistType_TeamFB
    setattr(dbData, "AssistType", assistType) # 协助类型
    setattr(dbData, "AssistPlayerIDList", []) # 协助中的玩家ID列表
    return
def OnInitAssistThanksData(thanksMgr, dbData):
    ## 初始化协助感谢数据额外处理
    setattr(dbData, "AssistPlayerDict", {})
    if dbData.AssistPlayer and dbData.AssistPlayer.startswith("{") and dbData.AssistPlayer.endswith("}"):
        dbData.AssistPlayerDict = eval(dbData.AssistPlayer)
    thanksMgr.allAssistThanksList.append(dbData)
    # 未感谢的
    if not dbData.ThanksState:
        playerID = dbData.PlayerID
        if playerID not in thanksMgr.playerThanksDict:
            thanksMgr.playerThanksDict[playerID] = []
        playerThanksList = thanksMgr.playerThanksDict[playerID]
        playerThanksList.append(dbData)
    for assistPlayerID, assistPlayerInfo in dbData.AssistPlayerDict.items():
        if "IsGet" in assistPlayerInfo:
            # 已经接受感谢奖励的不再处理
            continue
        if assistPlayerID not in thanksMgr.assistPlayerThanksDict:
            thanksMgr.assistPlayerThanksDict[assistPlayerID] = []
        assistPlayerThanksList = thanksMgr.assistPlayerThanksDict[assistPlayerID]
        assistPlayerThanksList.append(dbData)
    return
def OnSaveAssistThanksData(dbData):
    ## 协助感谢保存数据额外处理
    dbData.AssistPlayer = str(dbData.AssistPlayerDict)
    dbData.AssistPlayerLen = len(dbData.AssistPlayer)
    return
#// B0 12 开始协助Boss #tagCGStartAssistBoss
@@ -184,21 +241,27 @@
        GameWorld.DebugLog("非同盟玩家不能协助!")
        return
    
    playerMapID = curPlayer.GetMapID()
    mapID = assistObj.MapID
    lineID = assistObj.LineID
    gameMap = GameWorld.GetMap(mapID)
    if not gameMap:
    playerMap = GameWorld.GetMap(playerMapID)
    if not playerMap:
        return
    if gameMap.GetMapFBType() != ChConfig.fbtNull:
        playerMapID = curPlayer.GetMapID()
        playerLineID = PlayerControl.GetFBFuncLineID(curPlayer)
    if playerMap.GetMapFBType() != ChConfig.fbtNull:
        if mapID == ChConfig.Def_FBMapID_SealDemon:
            playerLineID = PlayerControl.GetFBFuncLineID(curPlayer)
        else:
            playerLineID = curPlayer.GetFBID()
        if playerMapID != mapID or playerLineID != lineID:
            #副本中无法协助
            PlayerControl.NotifyCode(curPlayer, "AssistFBLimit")
            return
        
    # 设定协助必须离开队伍
    if gameMap.GetMapFBType() != ChConfig.fbtTeam:
    tagMap = GameWorld.GetMap(mapID)
    if not tagMap:
        return
    if tagMap.GetMapFBType() != ChConfig.fbtTeam:
        curTeam = curPlayer.GetTeam()
        if curTeam:
            PlayerTeam.DoPlayerLeaveTeam(curPlayer, curTeam, tick)
@@ -277,7 +340,8 @@
    
    tagPlayerName = tagPlayer.GetName()
    tagTeamID = tagPlayer.GetTeamID()
    assistData = [mapID, "Start", assistGUID, assistPlayerID, assistPlayerName, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID]
    isFriend = PlayerFriend.IsFriend(assistPlayerID, tagPlayerID)
    assistData = [mapID, "Start", assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID]
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AssistBoss, assistData)
    return
@@ -291,13 +355,6 @@
    assistPack = ChPyNetSendPack.tagGCAssistingInfo()
    assistPack.AssistGUID = assistGUID
    NetPackCommon.SendFakePack(assistPlayer, assistPack)
    return
def SetPlayerStartAssistTeamFB(curPlayer, queryData):
    ## 开始协助组队副本 - 玩家进入副本后才真正进入协助状态
    #mapID, lineID, tagPlayerID = queryData
    return
def MapServer_PlayerAssistLogic(curPlayer, msgList, tick):
@@ -322,17 +379,16 @@
    
    # 取消boss协助发布
    elif queryType == "OnCancelBossRequestAssist":
        mapID, lineID, npcID, objID, reason, cancelPlayerIDList = queryData
        mapID, lineID, npcID, objID, reason = queryData
        assistMgr = PyDataManager.GetPlayerAssistPyManager()
        for cancelPlayerID in cancelPlayerIDList:
            if cancelPlayerID in assistMgr.playerNoSaveDBAssistDict:
                playerAssistList = assistMgr.playerNoSaveDBAssistDict[cancelPlayerID]
                for assistObj in playerAssistList:
                    if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID:
                        OnCancelPlayerRequestAssist(assistObj, reason, False)
                        break
        if playerID in assistMgr.playerNoSaveDBAssistDict:
            playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
            for assistObj in playerAssistList:
                if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID:
                    OnCancelPlayerRequestAssist(assistObj, reason, False)
                    break
        return
    # 取消协助Boss
    elif queryType == "OnCancelBossAssist":
        mapID, lineID, npcID, objID, reason = queryData
@@ -341,6 +397,16 @@
            assistObj = assistMgr.playerAssistingDict[playerID]
            if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID:
                OnCancelPlayerAssist(curPlayer, playerID, assistObj, reason, False)
        return
    # boss协助结束
    elif queryType == "OnBossAssistOver":
        __DoBossAssistOver(queryData)
        return
    # 副本协助结束
    elif queryType == "OnFBAssistOver":
        __DoFBAssistOver(queryData)
        return
    
    ## -------------------------------------------------------------------------------------------
@@ -352,19 +418,30 @@
    
    # 开始协助组队副本
    elif queryType == "OnStartAssistTeamFB":
        SetPlayerStartAssistTeamFB(curPlayer, queryData)
        mapID, lineID, tagPlayerID = queryData
        GameWorld.DebugLog("    开始协助副本: mapID=%s,lineID=%s,tagPlayerID=%s" % (mapID, lineID, tagPlayerID), playerID)
        # 副本协助暂时只处理设置协助目标ID
        PlayerControl.SetAssistTagPlayerID(curPlayer, tagPlayerID)
        return
    # 取消协助组队副本
    elif queryType == "OnCancelAssistTeamFB":
        mapID, lineID, reason = queryData
        GameWorld.DebugLog("    开始协助副本: mapID=%s,lineID=%s,reason=%s" % (mapID, lineID, reason), playerID)
        # 副本协助暂时只处理设置协助目标ID
        PlayerControl.SetAssistTagPlayerID(curPlayer, 0)
        return
    
    #QueryPlayerResult_PlayerAssist(curPlayer, queryType, queryData, result)
    return
#def QueryPlayerResult_PlayerAssist(curPlayer, queryType, queryData, result=[]):
#    if not curPlayer:
#        return
#    resultMsg = str([queryType, queryData, result])
#    curPlayer.MapServer_QueryPlayerResult(0, 0, "PlayerAssist", resultMsg, len(resultMsg))
#    GameWorld.DebugLog("协助信息发送 MapServer: playerID=%s,queryType=%s,queryData=%s" % (curPlayer.GetPlayerID(), queryType, queryData))
#    return
def QueryPlayerResult_PlayerAssist(curPlayer, queryType, queryData, result=[]):
    if not curPlayer:
        return
    resultMsg = str([queryType, queryData, result])
    curPlayer.MapServer_QueryPlayerResult(0, 0, "PlayerAssist", resultMsg, len(resultMsg))
    GameWorld.DebugLog("协助信息发送 MapServer: playerID=%s,queryType=%s,queryData=%s" % (curPlayer.GetPlayerID(), queryType, queryData))
    return
def __DoRequestAssistBoss(curPlayer, queryData):
    ## 请求协助Boss
@@ -372,12 +449,12 @@
    familyID = curPlayer.GetFamilyID()
    if not familyID:
        return
    mapID, lineID, npcID, objID = queryData
    mapID, lineID, npcID, objID, npcLV = queryData
    
    playerID = curPlayer.GetPlayerID()
    
    assistObj = None
    addNewAssist = True
    reqAssistObj = None
    addNewAssist = False
    assistMgr = PyDataManager.GetPlayerAssistPyManager()
    if playerID in assistMgr.playerNoSaveDBAssistDict:
        playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
@@ -387,19 +464,28 @@
            if npcID != assistObj.NPCID or lineID != assistObj.LineID or objID != assistObj.ObjID:
                OnCancelPlayerRequestAssist(assistObj, "RequestNewAssistBoss", True)
            else:
                addNewAssist = False
                reqAssistObj = assistObj
            break
        
    if addNewAssist:
        assistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID, objID)
    if not reqAssistObj:
        addNewAssist = True
        reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID, objID)
        
    if not assistObj:
    if not reqAssistObj:
        return
    
    # 通知本仙盟玩家
    PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([assistObj]))
    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])
    return
def __DoRequestAssistTeamFB(curPlayer, queryData):
@@ -412,7 +498,7 @@
    
    playerID = curPlayer.GetPlayerID()
    
    assistObj = None
    reqAssistObj = None
    addNewAssist = False
    assistMgr = PyDataManager.GetPlayerAssistPyManager()
    if playerID in assistMgr.playerNoSaveDBAssistDict:
@@ -422,21 +508,28 @@
                continue
            if mapID != assistObj.MapID or lineID != assistObj.LineID:
                OnCancelPlayerRequestAssist(assistObj, "RequestNewAssistTeamFB", True)
                addNewAssist = True
                break
    else:
            else:
                reqAssistObj = assistObj
            break
    if not reqAssistObj:
        addNewAssist = True
        reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID)
        
    if addNewAssist:
        assistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID)
    if not assistObj:
    if not reqAssistObj:
        return
    
    # 通知本仙盟玩家
    PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([assistObj]))
    PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([reqAssistObj]))
    # 求助信息已发送,请等待盟友支援
    PlayerControl.NotifyCode(curPlayer, "AssistRequestOK")
    # 广播仙盟请求
    requestCount = 1
    if not addNewAssist:
        requestCount = min(curPlayer.GetDictByKey("AssistFBRequestCount") + 1, 999)
    curPlayer.SetDict("AssistFBRequestCount", requestCount)
    notifyNum = (requestCount - 1) % 3
    PlayerControl.FamilyNotify(familyID, "AssistFBRequest%s" % notifyNum, [curPlayer.GetName(), mapID])
    return
def __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID=0, objID=0, exData="", isSaveDB=0):
@@ -485,6 +578,7 @@
    for assistObj in familyAssistList:
        assistInfo = ChPyNetSendPack.tagGCAssistInfo()
        assistInfo.AssistGUID = assistObj.GUID
        assistInfo.PlayerID = assistObj.PlayerID
        assistInfo.PlayerName = assistObj.PlayerName
        assistInfo.Job = assistObj.Job
        assistInfo.LV = assistObj.LV
@@ -540,8 +634,6 @@
        if assistObj in playerAssistList:
            playerAssistList.remove(assistObj)
            
    SyncFamilyClearAssist(familyID, assistGUID)
    # 取消boss协助
    if assistType == AssistType_Boss:
        
@@ -562,6 +654,8 @@
        # 暂不需要处理
        pass
    
    # 放最后
    SyncFamilyClearAssist(familyID, assistGUID)
    return
def OnCancelPlayerAssist(cancelPlayer, cancelPlayerID, assistObj, reason, isGameServer, isNotify=True):
@@ -597,7 +691,14 @@
        assistObj.AssistPlayerIDList.remove(cancelPlayerID)
        
    if cancelPlayer:
        isTagPlayerReason = reason.startswith("RequestPlayerCancel_")
        PlayerControl.SetAssistTagPlayerID(cancelPlayer, 0)
        overPack = ChPyNetSendPack.tagGCAssistOver()
        overPack.IsTagPlayerReason = isTagPlayerReason
        overPack.Reason = reason[len("RequestPlayerCancel_"):] if isTagPlayerReason else reason
        overPack.ReasonLen = len(overPack.Reason)
        overPack.AssistGUID = assistGUID
        NetPackCommon.SendFakePack(cancelPlayer, overPack)
        
    # 取消boss协助
    if assistObj.AssistType == AssistType_Boss:
@@ -619,6 +720,83 @@
    
    return
def __DoBossAssistOver(queryData):
    ## boss协助结束,一般是boss被击杀 或 被系统
    mapID, lineID, npcID, objID, noAssistPlayerIDList, assistAwardItemID, assistAwardResult = queryData
    assistMgr = PyDataManager.GetPlayerAssistPyManager()
    for noAssistPlayerID in noAssistPlayerIDList:
        if noAssistPlayerID not in assistMgr.playerNoSaveDBAssistDict:
            continue
        playerAssistList = assistMgr.playerNoSaveDBAssistDict[noAssistPlayerID]
        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 not assistAwardItemID or not assistAwardResult:
        return
    # 新增感谢数据
    playerMgr = GameWorld.GetPlayerManager()
    for playerID, assistPlayerDict in assistAwardResult.items():
        curPlayer = playerMgr.FindPlayerByID(playerID)
        if not curPlayer:
            continue
        AddNewAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict, npcID)
    return
def __DoFBAssistOver(queryData):
    ## 副本协助结束
    mapID, lineID, noAssistPlayerID, assistAwardItemID, assistPlayerDict = queryData
    assistMgr = PyDataManager.GetPlayerAssistPyManager()
    if noAssistPlayerID not in assistMgr.playerNoSaveDBAssistDict:
        return
    playerAssistList = assistMgr.playerNoSaveDBAssistDict[noAssistPlayerID]
    for assistObj in playerAssistList:
        if assistObj.MapID == mapID and assistObj.LineID == lineID:
            OnCancelPlayerRequestAssist(assistObj, "FBAssistOver", False)
            break
    if not assistAwardItemID or not assistPlayerDict:
        return
    # 新增感谢数据
    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(noAssistPlayerID)
    if curPlayer:
        AddNewAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict)
    return
def AddNewAssistThanks(curPlayer, itemID, mapID, lineID, assistPlayerDict, npcID=0, exData=""):
    ## 添加协助感谢数据
    playerID = curPlayer.GetPlayerID()
    newThanks = PyGameDataStruct.tagDBAssistThanks()
    newThanks.GUID = str(uuid.uuid1())
    newThanks.ItemID = itemID
    newThanks.FamilyID = curPlayer.GetFamilyID()
    newThanks.PlayerID = playerID
    newThanks.PlayerName = curPlayer.GetName()
    newThanks.Job = curPlayer.GetJob()
    newThanks.LV = curPlayer.GetLV()
    newThanks.RealmLV = curPlayer.GetOfficialRank()
    newThanks.MapID = mapID
    newThanks.LineID = lineID
    newThanks.NPCID = npcID
    newThanks.ExData = exData
    newThanks.ExDataLen = len(exData)
    newThanks.DailyDateStr = GameWorld.GetDailyDateStr()
    newThanks.TimeStr = GameWorld.GetCurrentDataTimeStr()
    newThanks.AssistPlayer = str(assistPlayerDict)
    newThanks.AssistPlayerLen = len(newThanks.AssistPlayer)
    assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
    OnInitAssistThanksData(assistThanksMgr, newThanks)
    GameWorld.DebugLog("增加协助感谢: itemID=%s,mapID=%s,lineID=%s,npcID=%s,exData=%s" % (itemID, mapID, lineID, npcID, exData), playerID)
    return
#// B0 14 使用协助感谢礼盒 #tagCGUseAssistThanksGift
#
#struct    tagCGUseAssistThanksGift
@@ -626,27 +804,188 @@
#{
#    tagHead        Head;
#    DWORD        ItemID;
#    char        GiftGUID[40];    //预览时GUID不发,确认使用时需发送预览返回的GUID
#    BYTE        IsPreview;    //是否预览,非预览即确认使用
#};
def OnUseAssistThanksGift(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    itemID = clientData.ItemID
    giftGUID = clientData.GiftGUID
    isPreview = clientData.IsPreview
    playerID = curPlayer.GetPlayerID()
    assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
    if playerID not in assistThanksMgr.playerThanksDict:
        GameWorld.ErrLog("玩家没有可使用的协助感谢礼盒!", playerID)
        return
    useThanks = None
    playerThanksList = assistThanksMgr.playerThanksDict[playerID]
    for thanks in playerThanksList:
        if itemID == thanks.ItemID:
            useThanks = thanks
            break
    if not useThanks:
        GameWorld.ErrLog("玩家没有该协助感谢礼盒!itemID=%s" % (itemID), playerID)
        return
    GameWorld.DebugLog("玩家使用协助感谢礼盒!itemID=%s,isPreview=%s" % (itemID, isPreview), playerID)
    # 预览
    if isPreview:
        previewPack = ChPyNetSendPack.tagGCUseAssistThanksGiftPreview()
        previewPack.ItemID = useThanks.ItemID
        previewPack.MapID = useThanks.MapID
        previewPack.LineID = useThanks.LineID
        previewPack.NPCID = useThanks.NPCID
        previewPack.ExData = useThanks.ExData
        previewPack.ExDataLen = useThanks.ExDataLen
        previewPack.AssistPlayerList = []
        for assistPlayerID, assistPlayerInfoDict in useThanks.AssistPlayerDict.items():
            if "PlayerName" not in assistPlayerInfoDict:
                continue
            assistPlayerInfo = ChPyNetSendPack.tagGCAssistPlayerInfo()
            assistPlayerInfo.PlayerID = assistPlayerID
            assistPlayerInfo.PlayerName = assistPlayerInfoDict["PlayerName"]
            assistPlayerInfo.Job = assistPlayerInfoDict["Job"]
            assistPlayerInfo.LV = assistPlayerInfoDict["LV"]
            assistPlayerInfo.RealmLV = assistPlayerInfoDict["RealmLV"]
            previewPack.AssistPlayerList.append(assistPlayerInfo)
        previewPack.AssistPlayerCount = len(previewPack.AssistPlayerList)
        NetPackCommon.SendFakePack(curPlayer, previewPack)
        return
    ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID)
    if not ipyData:
        return
    useThanks.ThanksState = 1 # 设置为已感谢
    playerThanksList.remove(useThanks) # 移除已感谢
    queryData = [itemID]
    QueryPlayerResult_PlayerAssist(curPlayer, "UseAssistThanksGift", queryData)
    # 通知协助玩家可接收的感谢个数
    playerMgr = GameWorld.GetPlayerManager()
    for assistPlayerID in useThanks.AssistPlayerDict.keys():
        assistPlayer = playerMgr.FindPlayerByID(assistPlayerID)
        if assistPlayer:
            SyncCanGetAssistThanksGiftCount(assistPlayer)
    return
#// B0 15 领取协助感谢礼物 #tagCGGetAssistThanksGift
#// B0 15 接收协助感谢礼物 #tagCGGetAssistThanksGift
#
#struct    tagCGGetAssistThanksGift
#
#{
#    tagHead        Head;
#    char        GiftGUID[40];    //礼盒GUID
#    BYTE        IsPreview;    //是否预览,非预览即确认领取,无额外奖励确认时也需要回复领取包代表已读
#};
def OnGetAssistThanksGift(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    giftGUID = clientData.GiftGUID
    isPreview = clientData.IsPreview
    playerID = curPlayer.GetPlayerID()
    assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
    if playerID not in assistThanksMgr.assistPlayerThanksDict:
        GameWorld.ErrLog("玩家没有可接收感谢的协助感谢礼盒!", playerID)
        return
    assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[playerID]
    getThanks = None
    for thanks in assistPlayerThanksList:
        if thanks.ThanksState:
            getThanks = thanks
            break
    if not getThanks:
        GameWorld.ErrLog("找不到玩家可接收感谢的协助感谢礼盒!", playerID)
        return
    itemID = getThanks.ItemID
    ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID)
    if not ipyData:
        return
    if playerID not in getThanks.AssistPlayerDict:
        return
    assistPlayerInfoDict = getThanks.AssistPlayerDict[playerID]
    todayGiftCount = assistPlayerInfoDict.get("TodayGiftCount", 0) # 该礼盒当日已领取额外奖励次数
    isExtraAward = 1 if todayGiftCount < ipyData.GetAssistAwardCount() else 0
    GameWorld.DebugLog("接收协助感谢礼物: itemID=%s,isPreview=%s,isExtraAward=%s,DailyDateStr=%s"
                       % (itemID, isPreview, isExtraAward, getThanks.DailyDateStr), playerID)
    # 预览
    if isPreview:
        previewPack = ChPyNetSendPack.tagGCGetAssistThanksGiftPreview()
        previewPack.ItemID = getThanks.ItemID
        previewPack.PlayerID = getThanks.PlayerID
        previewPack.PlayerName = getThanks.PlayerName
        previewPack.Job = getThanks.Job
        previewPack.LV = getThanks.LV
        previewPack.RealmLV = getThanks.RealmLV
        previewPack.MapID = getThanks.MapID
        previewPack.LineID = getThanks.LineID
        previewPack.NPCID = getThanks.NPCID
        previewPack.ExData = getThanks.ExData
        previewPack.ExDataLen = len(getThanks.ExData)
        previewPack.TimeStr = getThanks.TimeStr
        previewPack.ExtraAward = isExtraAward
        NetPackCommon.SendFakePack(curPlayer, previewPack)
        return
    assistPlayerInfoDict["IsGet"] = 1
    isAllGet = True
    for playerDict in getThanks.AssistPlayerDict.values():
        if "IsGet" not in playerDict:
            isAllGet = False
            break
    # 所有人都接收感谢了,删除该协助感谢数据
    if isAllGet:
        GameWorld.DebugLog("    所有人都感谢了,移除该协助感谢!", playerID)
        if getThanks in assistThanksMgr.allAssistThanksList:
            assistThanksMgr.allAssistThanksList.remove(getThanks)
    assistPlayerThanksList.remove(getThanks) # 移除
    updateTodayGiftCount = todayGiftCount + 1
    # 更新当天该礼盒ID已领取次数
    for thanks in assistPlayerThanksList:
        if getThanks.DailyDateStr != thanks.DailyDateStr or getThanks.ItemID != thanks.ItemID:
            continue
        if playerID not in thanks.AssistPlayerDict:
            continue
        assistPlayerInfoDict = thanks.AssistPlayerDict[playerID]
        assistPlayerInfoDict["TodayGiftCount"] = updateTodayGiftCount
    SyncCanGetAssistThanksGiftCount(curPlayer, True)
    isCurDailyDate = getThanks.DailyDateStr == GameWorld.GetDailyDateStr()
    # 如果是镜像协助的,更新今日接收感谢礼盒次数
    if isCurDailyDate:
        if IpyGameDataPY.GetIpyGameDataNotLog("FBHelpBattle", getThanks.MapID, getThanks.LineID):
            PlayerFBHelpBattle.UpdateGetThanksGiftCountDict(curPlayer, itemID, updateTodayGiftCount)
    # 通知地图
    queryData = [itemID, isExtraAward, isCurDailyDate, updateTodayGiftCount]
    QueryPlayerResult_PlayerAssist(curPlayer, "GetAssistThanksGift", queryData)
    return
def SyncCanGetAssistThanksGiftCount(curPlayer, isForce=False):
    ## 通知可接收协助感谢礼物个数
    playerID = curPlayer.GetPlayerID()
    assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
    if playerID not in assistThanksMgr.assistPlayerThanksDict:
        return
    assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[playerID]
    canGetCount = 0
    for thanks in assistPlayerThanksList:
        if thanks.ThanksState:
            canGetCount += 1
    if not canGetCount and not isForce:
        return
    countPack = ChPyNetSendPack.tagGCCanGetAssistThanksGiftCount()
    countPack.CanGetCount = canGetCount
    NetPackCommon.SendFakePack(curPlayer, countPack)
    return
def SyncFamilyAssist(curPlayer):
    ## 同步当前仙盟所有协助请求信息
    familyID = curPlayer.GetFamilyID()