hxp
2019-12-10 bd6221811f055ff6fb6c3a58b308d48fbca2465a
8346 【恺英】【后端】协助系统(感谢系统)
10个文件已修改
471 ■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Assist.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py 282 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py 90 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Assist.py
@@ -31,6 +31,7 @@
#  @remarks 函数详细说明.
def OnExec(curPlayer, gmList):
    
    isShowThanks = gmList[0] if len(gmList) > 0 else 0
    assistMgr = PyDataManager.GetPlayerAssistPyManager()
    GameWorld.Log("---------- 当前总协助条数: %s" % len(assistMgr.allAssistDict))
    for assist in assistMgr.allAssistDict.values():
@@ -55,5 +56,23 @@
        GameWorld.DebugLog("玩家协助中的: %s, %s" % (playerID, assist.GUID))
        
    GameWorld.DebugLog("-----------------------------------------")
    if not isShowThanks:
        return
    assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
    GameWorld.Log("---------- 未完结总感谢条数: %s" % len(assistThanksMgr.allAssistThanksList))
    for playerID, thanksList in assistThanksMgr.playerThanksDict.items():
        GameWorld.DebugLog("玩家未发送感谢数: %s, %s" % (playerID, len(thanksList)))
        for i, thanks in enumerate(thanksList):
            GameWorld.DebugLog("    i=%s, %s" % (i, thanks.outputString()))
            GameWorld.DebugLog("    %s" % thanks.AssistPlayerDict)
    for playerID, thanksList in assistThanksMgr.assistPlayerThanksDict.items():
        GameWorld.DebugLog("玩家未接收感谢数: %s, %s" % (playerID, len(thanksList)))
        for i, thanks in enumerate(thanksList):
            GameWorld.DebugLog("    i=%s, %s" % (i, thanks.outputString()))
            GameWorld.DebugLog("    %s" % thanks.AssistPlayerDict)
    GameWorld.DebugLog("-----------------------------------------")
    return
ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -848,6 +848,14 @@
def GetDatetimeBySubDays(diffDays):
    return datetime.datetime.today() - datetime.timedelta(days = diffDays)
def GetDailyDateStr():
    ## 获取日常日期 yyyy-MM-dd
    curDate = GetServerTime()
    if curDate.hour >= ShareDefine.Def_OnEventHour:
        return "%d-%s-%s" % (curDate.year, curDate.month, curDate.day)
    preDate = curDate - datetime.timedelta(days = -1) # 属于前一天
    return "%s-%s-%s" % (preDate.year, preDate.month, preDate.day)
def IsCrossServer():
    ## 是否跨服服务器
    return ToIntDef(ReadChConfig.GetPyMongoConfig("Merge", "IsMergeServer"), 0)
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
@@ -15,7 +15,9 @@
#"""Version = 2019-12-06 21:00"""
#-------------------------------------------------------------------------------
import PlayerFriend
import PyDataManager
import IpyGameDataPY
import NetPackCommon
import PyGameDataStruct
import ChPyNetSendPack
@@ -39,6 +41,8 @@
def OnPlayerLogin(curPlayer, isTJ=False):
    ## 玩家上线
    # @param isTJ: 是否脱机上线
    SyncCanGetAssistThanksGiftCount(curPlayer)
    
    familyID = curPlayer.GetFamilyID()
    playerID = curPlayer.GetPlayerID()
@@ -155,6 +159,41 @@
            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)
    # 已经感谢的
    else:
        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
@@ -277,7 +316,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
@@ -322,11 +362,10 @@
    
    # 取消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]
        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)
@@ -341,6 +380,11 @@
            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
    
    ## -------------------------------------------------------------------------------------------
@@ -358,13 +402,13 @@
    #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
@@ -619,6 +663,61 @@
    
    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 assistAwardResult:
        return
    # 新增感谢数据
    playerMgr = GameWorld.GetPlayerManager()
    for playerID, assistPlayerDict in assistAwardResult.items():
        curPlayer = playerMgr.FindPlayerByID(playerID)
        if not curPlayer:
            continue
        __AddAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict, npcID)
    return
def __AddAssistThanks(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("增加协助感谢: mapID=%s,lineID=%s,npcID=%s,exData=%s" % (mapID, lineID, npcID, exData), playerID)
    return
#// B0 14 使用协助感谢礼盒 #tagCGUseAssistThanksGift
#
#struct    tagCGUseAssistThanksGift
@@ -626,25 +725,174 @@
#{
#    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
#// B0 15 领取协助感谢礼物 #tagCGGetAssistThanksGift
    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():
        if assistPlayerID not in assistThanksMgr.assistPlayerThanksDict:
            assistThanksMgr.assistPlayerThanksDict[assistPlayerID] = []
        assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[assistPlayerID]
        assistPlayerThanksList.append(useThanks)
        assistPlayer = playerMgr.FindPlayerByID(assistPlayerID)
        if assistPlayer:
            SyncCanGetAssistThanksGiftCount(assistPlayer, len(assistPlayerThanksList))
    return
#// 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]
    if not assistPlayerThanksList:
        return
    getThanks = assistPlayerThanksList[0] # 默认接收第一个
    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.pop(0) # 移除
    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, len(assistPlayerThanksList))
    # 通知地图
    isCurDailyDate = getThanks.DailyDateStr == GameWorld.GetDailyDateStr()
    queryData = [itemID, isExtraAward, isCurDailyDate, updateTodayGiftCount]
    QueryPlayerResult_PlayerAssist(curPlayer, "GetAssistThanksGift", queryData)
    return
def SyncCanGetAssistThanksGiftCount(curPlayer, canGetCount=None):
    ## 通知可接收协助感谢礼物个数
    if canGetCount == None:
        playerID = curPlayer.GetPlayerID()
        assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
        if playerID not in assistThanksMgr.assistPlayerThanksDict:
            return
        assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[playerID]
        if not assistPlayerThanksList:
            return
        canGetCount = len(assistPlayerThanksList)
    countPack = ChPyNetSendPack.tagGCCanGetAssistThanksGiftCount()
    countPack.CanGetCount = canGetCount
    NetPackCommon.SendFakePack(curPlayer, countPack)
    return
def SyncFamilyAssist(curPlayer):
ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
@@ -47,8 +47,9 @@
class PlayerAssistThanksPyManager(object):
    
    def __init__(self):
        self.assistThanksDict = {} # 所有感谢 {GUID:tagDBAssistThanks, ...}
        self.allAssistThanksList = [] # 所有感谢 [tagDBAssistThanks, ...]
        self.playerThanksDict = {} # 玩家未感谢的 {playerID:[tagDBAssistThanks, ...], ...}
        self.assistPlayerThanksDict = {} # 协助玩家未接受感谢的协助 {assistPlayerID:[tagDBAssistThanks, ...], ...}
        return
    
    # 保存数据 存数据库和realtimebackup
@@ -57,8 +58,9 @@
        cntData = ""
        cnt = 0
        
        for dbData in self.assistThanksDict.values():
        for dbData in self.allAssistThanksList:
            cnt += 1
            PlayerAssist.OnSaveAssistThanksData(dbData)
            savaData += dbData.getBuffer()
            
        GameWorld.Log("Save DBAssistThanks count :%s" % cnt)
@@ -73,13 +75,7 @@
            dbData = PyGameDataStruct.tagDBAssistThanks()
            dbData.clear()
            pos += dbData.readData(datas, pos, dataslen)
            self.assistThanksDict[dbData.GUID] = dbData
            playerID = dbData.PlayerID
            if playerID not in self.playerThanksDict:
                self.playerThanksDict[playerID] = []
            playerThanksList = self.playerThanksDict[playerID]
            playerThanksList.append(dbData)
            PlayerAssist.OnInitAssistThanksData(self, dbData)
            
        return pos
    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3984,6 +3984,10 @@
#五行专精
Def_PDict_SkillElementID = "SkillElementID%s" #主技能选择的专精技能 参数主技能ID
Def_PDict_SkillElementLV = "SkillElementLV%s" #专精技能技能等级  参数技能ID
#协助
Def_PDict_GetThanksGiftCount = "GetThanksGiftCount_%s" # 协助方今日接收该感谢礼盒次数,参数(礼盒物品ID)
#-------------------------------------------------------------------------------
#可以从07 41封包购买的背包类型,和对应字典{背包类型:[字典key, 默认格子数]}
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -1039,8 +1039,8 @@
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_Honor, itemCount)
        elif itemID == ChConfig.Def_ItemID_GoldMoney:
            PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, itemCount)
        elif itemID == ChConfig.Def_ItemID_XianyuanCoin:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, itemCount)
        #elif itemID == ChConfig.Def_ItemID_XianyuanCoin:
        #    PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, itemCount)
        return True
    
    def __CrossServerPutInItem(self, packIndex, tagItem, event=["", False, {}]):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
@@ -30,6 +30,7 @@
import ShareDefine
import PlayerTeam
import NPCCommon
import FBCommon
import ChConfig
import time
@@ -44,6 +45,7 @@
        self.__hurtType = ChConfig.Def_NPCHurtTypePlayer # 均默认是玩家
        self.__hurtName = ""
        self.__hurtValue = 0
        self.__isFriend = 0
        return
    
    def GetValueID(self): return self.__hurtID
@@ -54,6 +56,8 @@
    def SetHurtName(self, hurtName): self.__hurtName = hurtName
    def GetHurtValue(self): return self.__hurtValue
    def SetHurtValue(self, hurtValue): self.__hurtValue = hurtValue
    def GetIsFriend(self): return self.__isFriend
    def SetIsFriend(self, isFriend): self.__isFriend = isFriend
    
class PlayerHurtList():
    ''' 伤血列表, 类似 IPY_GameObj.IPY_PlayerHurtList
@@ -71,6 +75,9 @@
        
        self.__hurtSortList = []
        self.__hurtDict = {} # 伤血列表实例字典,实际的NPC伤血列表实例,可能不是玩家{(hurtID, hurtType):HurtValueObj, ...}
        self.__assistAwardItemID = 0 # 协助奖励礼盒ID
        self.__assistAwardResult = {} # {playerID:{assistPlayerID:{协助玩家信息数据字典}, ...}}
        return
    
    def Clear(self):
@@ -87,11 +94,11 @@
    def OnDelete(self):
        # 删除伤血列表,NPC死亡调用
        
        cancelPlayerIDList = self.__noAssitPlayerIDDict.keys()
        if cancelPlayerIDList:
        noAssistPlayerIDList = self.__noAssitPlayerIDDict.keys()
        if noAssistPlayerIDList:
            mapID = GameWorld.GetMap().GetMapID()
            queryData = [mapID, self.lineID, self.npcID, self.objID, "OnBossDead", cancelPlayerIDList]
            PlayerAssist.QueryGameServer_PlayerAssist(0, "OnCancelBossRequestAssist", queryData)
            queryData = [mapID, self.lineID, self.npcID, self.objID, noAssistPlayerIDList, self.__assistAwardItemID, self.__assistAwardResult]
            PlayerAssist.QueryGameServer_PlayerAssist(0, "OnBossAssistOver", queryData)
            
        return
    
@@ -124,7 +131,7 @@
            hurtPlayer.SetHurtName(playerName)
        return hurtPlayer
    
    def AddAssistPlayer(self, assistPlayerID, assistPlayerName, tagPlayerID, tagPlayerName, tagTeamID):
    def AddAssistPlayer(self, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID):
        ## 添加助战玩家
        # @param assistPlayerID: 协助玩家ID
        # @param tagPlayerID: 目标玩家ID,即发布协助的玩家ID
@@ -138,8 +145,8 @@
                             % (assistPlayerID, tagPlayerID), self.npcID, self.lineID)
            return
        
        GameWorld.DebugLog("新增协助玩家: assistPlayerID=%s,tagPlayerID=%s,tagTeamID=%s"
                           % (assistPlayerID, tagPlayerID, tagTeamID), self.npcID, self.lineID)
        GameWorld.DebugLog("新增协助玩家: assistPlayerID=%s,tagPlayerID=%s,tagTeamID=%s,isFriend=%s"
                           % (assistPlayerID, tagPlayerID, tagTeamID, isFriend), self.npcID, self.lineID)
        
        if assistPlayerID in self.__noAssitPlayerIDDict:
            GameWorld.DebugLog("原来为常规玩家,需要先删除!", self.npcID, self.lineID)
@@ -150,6 +157,8 @@
            assistPlayerIDList.append(assistPlayerID)
        self.__assistPlayerIDDict[assistPlayerID] = tagPlayerID
        
        assistHurtPlayer = self.__GetHurtPlayer(assistPlayerID, assistPlayerName)
        assistHurtPlayer.SetIsFriend(isFriend)
        GameWorld.DebugLog("    self.__noAssitPlayerIDDict=%s" % (self.__noAssitPlayerIDDict), self.npcID, self.lineID)
        GameWorld.DebugLog("    self.__assistPlayerIDDict=%s" % (self.__assistPlayerIDDict), self.npcID, self.lineID)
        return
@@ -177,9 +186,8 @@
            # 地图删除的同步GameServer
            if isMapServerDel:
                mapID = GameWorld.GetMap().GetMapID()
                cancelPlayerIDList = [playerID]
                queryData = [mapID, self.lineID, self.npcID, self.objID, reason, cancelPlayerIDList]
                PlayerAssist.QueryGameServer_PlayerAssist(0, "OnCancelBossRequestAssist", queryData)
                queryData = [mapID, self.lineID, self.npcID, self.objID, reason]
                PlayerAssist.QueryGameServer_PlayerAssist(playerID, "OnCancelBossRequestAssist", queryData)
                
        # 协助玩家
        elif playerID in self.__assistPlayerIDDict:
@@ -710,33 +718,71 @@
        ''' 执行协助奖励逻辑
        '''
        
        liheItemID = 2244 # 感谢礼盒物品ID,暂山寨,感谢系统再修改
        self.__assistAwardResult = {}
        
        liheItemID, assistMoney = 0, 0
        mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {})
        mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
        if mapID in mapAssistGiftDict:
            liheItemID, assistMoney = mapAssistGiftDict[mapID]
        else:
            killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit')
            index = GameWorld.GetDictValueByKey(killBossCntLimitDict, self.npcID)
            if index == None:
                return
            bossAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 1, {})
            if index not in bossAssistGiftDict:
                GameWorld.DebugLog("该boss没有协助额外奖励!index=%s" % index, self.npcID)
                return
            liheItemID, assistMoney = bossAssistGiftDict[index]
        if not liheItemID or not assistMoney:
            GameWorld.DebugLog("该副本或boss没有协助额外奖励!mapID=%s" % (mapID), self.npcID)
            return
        self.__assistAwardItemID = liheItemID
        friendAddAssistMoneyPer = IpyGameDataPY.GetFuncCfg("AssistAward", 3)
        GameWorld.DebugLog("执行协助奖励逻辑", self.npcID, self.lineID)
        copyPlayerManager = GameWorld.GetMapCopyPlayerManager()
        for playerID, assistPlayerIDList in self.__noAssitPlayerIDDict.items():
            if not assistPlayerIDList:
                GameWorld.DebugLog("发布方没有发布协助,不给奖励: playerID=%s" % playerID, self.npcID, self.lineID)
                GameWorld.DebugLog("发布方没有发布协助,不处理: playerID=%s" % playerID, self.npcID, self.lineID)
                continue
            
            player = copyPlayerManager.FindPlayerByID(playerID)
            if player:
                GameWorld.DebugLog("发布方给感谢礼盒奖励: playerID=%s" % playerID, self.npcID, self.lineID)
                ItemControler.GivePlayerItemOrMail(player, [[liheItemID, 1, 0]])
            else:
                GameWorld.DebugLog("发布方离线或不在本地图,不给感谢礼盒奖励: playerID=%s" % playerID, self.npcID, self.lineID)
            noAssistPlayer = copyPlayerManager.FindPlayerByID(playerID)
                
            assistAwardPlayerDict = {}
            # 即使发布方不在线,协助方完成后也可获得活跃令奖励,只是不一定获得礼盒感谢奖励(礼盒感谢奖励需双方都在线)
            for assistPlayerID in assistPlayerIDList:
                assistHurtPlayer = self.__GetHurtPlayer(assistPlayerID)
                if not assistHurtPlayer.GetHurtValue():
                    GameWorld.DebugLog("协助方没有输出,不给奖励: assistPlayerID=%s" % assistPlayerID, self.npcID, self.lineID)
                    continue
                assPlayer = copyPlayerManager.FindPlayerByID(assistPlayerID)
                if not assPlayer:
                assistPlayer = copyPlayerManager.FindPlayerByID(assistPlayerID)
                if not assistPlayer:
                    GameWorld.DebugLog("协助方离线或不在本地图,不给活跃令奖励: assistPlayerID=%s" % assistPlayerID, self.npcID, self.lineID)
                    continue
                GameWorld.DebugLog("协助方给活跃令奖励: assistPlayerID=%s" % assistPlayerID, self.npcID, self.lineID)
                PlayerControl.GiveMoney(assPlayer, ShareDefine.TYPE_Price_FamilyActivity, 35)
                isFriend = assistHurtPlayer.GetIsFriend()
                addAssistMoney = assistMoney
                if isFriend and friendAddAssistMoneyPer:
                    addAssistMoney += int(assistMoney * friendAddAssistMoneyPer / 100.0)
                GameWorld.DebugLog("协助方给活跃令奖励: assistPlayerID=%s,assistMoney=%s,isFriend=%s,addAssistMoney=%s"
                                   % (assistPlayerID, assistMoney, isFriend, addAssistMoney), self.npcID, self.lineID)
                PlayerControl.GiveMoney(assistPlayer, ShareDefine.TYPE_Price_XianyuanCoin, addAssistMoney) # 给活跃令无视发布方是否在线
                if noAssistPlayer:
                    todayGiftCount = assistPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GetThanksGiftCount % liheItemID)
                    assistAwardPlayerDict[assistPlayerID] = {"PlayerName":assistPlayer.GetPlayerName(), "Job":assistPlayer.GetJob(),
                                                             "LV":assistPlayer.GetLV(), "RealmLV":assistPlayer.GetOfficialRank(),
                                                             "TodayGiftCount":todayGiftCount}
            if not noAssistPlayer or not assistAwardPlayerDict:
                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]])
            self.__assistAwardResult[playerID] = assistAwardPlayerDict
                
        return
    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
@@ -20,8 +20,19 @@
import PlayerControl
import NPCHurtManager
import IPY_GameWorld
import ItemControler
import ItemCommon
import ChConfig
def DoPlayerOnDay(curPlayer):
    ## 过天处理
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in xrange(ipyDataMgr.GetAssistThanksGiftCount()):
        ipyData = ipyDataMgr.GetAssistThanksGiftByIndex(index)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GetThanksGiftCount % ipyData.GetGiftID(), 0)
    return
#// B0 10 请求协助Boss #tagCMRequestAssistBoss
#
@@ -117,7 +128,32 @@
    ## 协助信息GameServer返回处理
    if len(resultList) != 3:
        return
    #queryType, queryData, result = resultList
    queryType, queryData, result = resultList
    # 使用协助感谢礼盒给奖励
    if queryType == "UseAssistThanksGift":
        itemID = queryData[0]
        giftItem = ItemCommon.FindItemInPackByItemID(curPlayer, itemID, IPY_GameWorld.rptItem)
        if not giftItem:
            return
        ItemCommon.DelItem(curPlayer, giftItem, 1)
        ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID)
        if ipyData:
            awardItemID, awardItemCount = ipyData.GetRequestPlayerAward()
            ItemControler.GivePlayerItemOrMail(curPlayer, [[awardItemID, awardItemCount, 0]])
    # 接收协助感谢礼盒奖励给奖励
    elif queryType == "GetAssistThanksGift":
        itemID, isExtraAward, isCurDailyDate, updateTodayGiftCount = queryData
        if isCurDailyDate:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GetThanksGiftCount % itemID, updateTodayGiftCount)
        if isExtraAward:
            ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID)
            if ipyData:
                awardItemID, awardItemCount = ipyData.GetAssistPlayerAward()
                ItemControler.GivePlayerItemOrMail(curPlayer, [[awardItemID, awardItemCount, 0]])
    
    return
@@ -130,12 +166,12 @@
    
    # 开始协助
    if msgType == "Start":
        assistGUID, assistPlayerID, assistPlayerName, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID = assistData[1:]
        assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID = assistData[1:]
        npchurtList = NPCHurtManager.GetPlayerHurtListEx(lineID, objID, npcID)
        if not npchurtList:
            return
        
        npchurtList.AddAssistPlayer(assistPlayerID, assistPlayerName, tagPlayerID, tagPlayerName, tagTeamID)
        npchurtList.AddAssistPlayer(assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID)
        QueryGameServer_PlayerAssist(0, "AddAssistBossPlayerOK", [assistGUID, assistPlayerID])
        
    # 取消协助
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -3172,9 +3172,9 @@
        GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_GiveMoney, msgInfo, [serverGroupID])
        return True
    
    ## 恺英版去除了仙缘币,改为直接获得绑玉灵石
    ## 恺英版去除了仙缘币,改为获得仙盟活跃令
    if priceType == ShareDefine.TYPE_Price_XianyuanCoin:
        priceType = IPY_GameWorld.TYPE_Price_Gold_Paper
        priceType = ShareDefine.TYPE_Price_FamilyActivity
        
    if priceType == IPY_GameWorld.TYPE_Price_Gold_Money:
        if curPlayer.GetGold() + value > ChConfig.Def_PlayerTotalMoney_Gold:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -553,6 +553,8 @@
        PlayerFairyDomain.OnDay(curPlayer)
        #仙盟宴会
        GameLogic_FamilyParty.OnDayFamilyPartyPlayer(curPlayer)
        #协助
        PlayerAssist.DoPlayerOnDay(curPlayer)
        
    PlayerTJG.TJGOnDay(curPlayer, onEventType)
    # 以下为支持两种重置模式切换配置的