From caef63ce5d50ef1456a2dd82926833027a40dc1c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 23 十二月 2019 20:56:48 +0800
Subject: [PATCH] 8346 【恺英】【后端】协助系统(修复同地图有伤害队员不在boss区域无法获得归属bug;修复第一名伤血无归属玩家时,会默认给其他玩家归属bug)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py |  131 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 125 insertions(+), 6 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
index cff77fa..ba4025e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
@@ -47,12 +47,21 @@
 import PyGameData
 import PlayerGeTui
 import IPY_GameServer
+import PlayerTeam
 import CrossBoss
 import PlayerFB
 
 import time
 
+''' boss首杀
+ShareDefine.Def_UniversalGameRecType_BossFirstKill
+value1:bossID
+StrValue2:killedTimeStr
+StrValue3:playerName,playerName,...
 '''
+
+
+''' boss击杀信息
 ShareDefine.Def_UniversalGameRecType_BossInfo
 value1:bossID
 value2:killedTime
@@ -140,6 +149,9 @@
     horsePetRobBossIDList = IpyGameDataPY.GetFuncEvalCfg("FairyGrabBossID", 1)
     if bossID in horsePetRobBossIDList:
         OnFamilyKillHorsePetRobBoss(killPlayerName)
+        
+    # boss首杀
+    OnBossFirstKill(bossID, killerIDList)
     return
 
 def __UpdateBossRefreshList(bossID, killedTime=0, refreshTime=0):
@@ -548,9 +560,9 @@
 
 def OnKillBossDropGoodItem(msgList, tick):
     # playerName, mapID, npcID, itemID, userData
-    if len(msgList) != 8:
+    if len(msgList) != 10:
         return
-    playerID, killerName, mapID, npcID, itemID, userData, weightValue, serverGroupID = msgList
+    playerID, killerName, mapID, lineID, npcID, itemID, userData, weightValue, serverGroupID, playerLV = msgList
     GameWorld.DebugLog("击杀Boss掉落好物品: mapID=%s,npcID=%s,killerName=%s,itemID=%s, userData=%s, weightValue=%s, serverGroupID=%s" 
                        % (mapID, npcID, killerName, itemID, userData, weightValue, serverGroupID))
     maxRecordCnt = IpyGameDataPY.GetFuncCfg('DropRecordNum')
@@ -595,10 +607,10 @@
             if commonList and commonList[0][0] != -1:
                 recordList.Delete(commonList[0][0])
         
-    PlayerUniversalGameRec.MapServer_UniversalGameRec(None, recType, [mapID, npcID, itemID, playerID, weightValue],
-                                                      [killerName, "", userData])
+    PlayerUniversalGameRec.MapServer_UniversalGameRec(None, recType, [mapID*100+lineID, npcID, itemID, playerID, weightValue],
+                                                      [killerName, '%s|%s'%(serverGroupID, playerLV), userData])
     
-    msgList = [killerName, playerID, mapID, npcID, itemID, userData]
+    msgList = [killerName, playerID, mapID, npcID, itemID, userData, serverGroupID, playerLV, lineID]
     PlayerControl.WorldNotify(0, 'DropRecord' , msgList)
     return
 
@@ -677,7 +689,7 @@
 
 def SetBossRefreshTime(bossid, killedTime):
     '''设置boss刷新时间'''
-    ipyData = IpyGameDataPY.GetIpyGameData('BOSSInfo', bossid)
+    ipyData = IpyGameDataPY.GetIpyGameDataNotLog('BOSSInfo', bossid)
     if not ipyData:
         return
     onlineCnt = __GetBossOnlineHeroCnt(bossid)[0]
@@ -1249,3 +1261,110 @@
     PlayerControl.FamilyNotify(curFamily.GetID(), "FairyGrabBossHelp", [curPlayer.GetName(), npcID])
     return
 
+## -------------------------------------- boss 首杀 ------------------------------------------------
+def __GetBossFirstKillRecDataList():
+    ## 获取boss首杀记录信息列表
+    return GameWorld.GetUniversalRecMgr() .GetTypeList(ShareDefine.Def_UniversalGameRecType_BossFirstKill)
+
+def __GetBossFirstKillRecDataByID(bossID):
+    ## 获取boss首杀记录信息数据
+    
+    recTypeListData = __GetBossFirstKillRecDataList()
+    # 查找是否已有记录
+    bossFirstKillRec = None
+    for index in xrange(recTypeListData.Count()):
+        universalRecData = recTypeListData.At(index)
+        if universalRecData.GetValue1() == bossID:
+            bossFirstKillRec = universalRecData
+            break
+        
+    if bossFirstKillRec == None:
+        #还未记录,则添加一个记录对象
+        bossFirstKillRec = recTypeListData.AddRec()        
+        bossFirstKillRec.SetValue1(bossID)
+        
+    return bossFirstKillRec
+
+def OnBossFirstKill(bossID, killerIDList):
+    ## 处理boss首杀逻辑
+    
+    maxOSDay = IpyGameDataPY.GetFuncCfg("OSCBossFirstKill", 1)
+    openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
+    if openServerDay > maxOSDay:
+        GameWorld.DebugLog("超过开服天(%s), 不开放首杀活动!" % maxOSDay)
+        return
+    
+    if not bossID or not killerIDList:
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSFirstKill", bossID)
+    if not ipyData:
+        return
+    
+    fkRecData = __GetBossFirstKillRecDataByID(bossID)
+    if not fkRecData:
+        return
+    
+    firstKillTimeStr = fkRecData.GetStrValue2()
+    if firstKillTimeStr:
+        GameWorld.DebugLog("已经首杀过了! bossID=%s, %s" % (bossID, firstKillTimeStr))
+        return
+    
+    killPlayerList = []
+    playerMgr = GameWorld.GetPlayerManager()
+    for playerID in killerIDList:
+        player = playerMgr.FindPlayerByID(playerID)
+        if not player:
+            continue
+        teamMemLV = PlayerTeam.__GetPlayerTeamLV(player)
+        killPlayerList.append([teamMemLV, player.GetName()])
+    if not killPlayerList:
+        return
+    
+    killPlayerList.sort(reverse=True)
+    fkPlayerNameList = [nameInfo[1] for nameInfo in killPlayerList]
+    
+    fkRecData.SetStrValue2(GameWorld.GetCurrentDataTimeStr())
+    fkRecData.SetStrValue3(",".join(fkPlayerNameList))
+    
+    # 首杀奖励邮件
+    PlayerCompensation.SendMailByKey("BossFirstKillMail", killerIDList, ipyData.GetServerFirstKillPlayerAward(), [bossID])
+    
+    ## 主动广播全服玩家
+    PlayerUniversalGameRec.SendUniversalGameRecSingle(None, fkRecData)
+    return
+
+
+#// A9 01 获取Boss首杀奖励 #tagCGGetBossFirstKillAward
+#
+#struct    tagCGGetBossFirstKillAward
+#{
+#    tagHead    Head;
+#    DWORD    NPCID;
+#    BYTE    AwardType;    // 0-首杀红包奖励;1-个人首杀奖励
+#};
+def OnGetBossFirstKillAward(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    bossID = clientData.NPCID
+    awardType = clientData.AwardType
+    
+    ipyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSFirstKill", bossID)
+    if not ipyData:
+        return
+    
+    if awardType == 0:
+        fkRecData = __GetBossFirstKillRecDataByID(bossID)
+        if not fkRecData:
+            return
+        
+        firstKillTimeStr = fkRecData.GetStrValue2()
+        if not firstKillTimeStr:
+            GameWorld.DebugLog("Boss还未首杀,不能领取boss首杀公共红包奖励! bossID=%s" % (bossID), curPlayer.GetPlayerID())
+            return
+        
+    msgInfo = str([bossID, awardType])
+    curPlayer.MapServer_QueryPlayerResult(0, 0, "BossFirstKill", msgInfo, len(msgInfo))
+    return
+
+## ------------------------------------------------------------------------------------------------
+

--
Gitblit v1.8.0