From bd6221811f055ff6fb6c3a58b308d48fbca2465a Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 10 十二月 2019 21:32:18 +0800
Subject: [PATCH] 8346 【恺英】【后端】协助系统(感谢系统)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py                                      |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py        |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py       |   44 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py        |   92 +++++++--
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Assist.py                             |   19 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py      |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py |    2 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py                            |  292 ++++++++++++++++++++++++++++++--
 ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py                                  |   14 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                  |    4 
 10 files changed, 421 insertions(+), 62 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Assist.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Assist.py
index d9ead76..2a212f9 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Assist.py
+++ b/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
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
index 6e70a9c..ae54f4e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
+++ b/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)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
index 91db9e4..d1dba0a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
+++ b/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,17 +362,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 +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,27 +725,176 @@
 #{
 #    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():
+        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
+#// 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):
     ## 同步当前仙盟所有协助请求信息
     familyID = curPlayer.GetFamilyID()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py b/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
index 15f575f..5e225a8 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
+++ b/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
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 90856b2..464e1a3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/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, 默认格子数]}
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
index c90a941..b482b0e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/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, {}]):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
index 7e39069..2af4573 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
+++ b/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,34 +718,72 @@
         ''' 执行协助奖励逻辑
         '''
         
-        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
     
     def __CmpHurtValue(self, hurtObjA, hurtObjB):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
index 3f0e579..fae0769 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
+++ b/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,8 +128,33 @@
     ## 协助信息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
 
 def GameServer_AssistBossMsg(assistData):
@@ -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])
         
     # 取消协助
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 1b8199b..f7d7a80 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/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:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index a68cb25..149b771 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/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)
     # 以下为支持两种重置模式切换配置的

--
Gitblit v1.8.0