From 9f13daf65e0f6acc43ffab6462b737a70879f5cc Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 29 八月 2018 20:17:08 +0800
Subject: [PATCH] Add: 2961 【后端】仙盟抢Boss活动;

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py |   78 +++++++++++++++++++++++++++++++++++++--
 1 files changed, 74 insertions(+), 4 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 7224177..4ce8874 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -52,6 +52,7 @@
 import PlayerMagicWeapon
 import PlayerBossReborn
 import PlayerFairyCeremony
+import FamilyRobBoss
 import IpyGameDataPY
 import PyGameData
 import PlayerTeam
@@ -1946,11 +1947,14 @@
             #因为存在boss分流,所以用gameFB字典,但是存活状态还是用GameWorld字典
             GameWorld.GetGameFB().SetGameFBDict(ChConfig.Map_NPC_WorldBossDeadTick % npcid, GameWorld.GetGameWorld().GetTick())
         
+            if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
+                FamilyRobBoss.ClearFamilyOwnerBossHurt(curNPC)
+        
     
     # 清除队伍成员伤血列表
     AttackCommon.ClearTeamPlayerHurtValue(curNPC)
     # 清除自定义伤血列表
-    BossHurtMng.ClearHurtValueList(curNPC)
+    #BossHurtMng.ClearHurtValueList(curNPC)
 
     # C++设置npc死亡
     curNPC.SetDead(curNPC.GetDictByKey(ChConfig.Def_NPCDead_Reason),
@@ -1984,6 +1988,9 @@
         self.__Killer = None # 击杀者, 由各种规则得出, 一般也是物品归属的代表, 用于广播、记录等确保与归属一致
         self.__AllKillerDict = {} # 所有击杀的玩家ID对应字典, 非队伍, 一般也是归属的拥有者
         self.__FeelPlayerList = [] # 所有摸怪玩家列表,处理任务及某些逻辑用
+        
+        self.__OwnerHurtType = 0
+        self.__OwnerHurtID = 0
         return
     #---------------------------------------------------------------------
     ## 移动到某一个点的附近点
@@ -3359,6 +3366,9 @@
                 GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'GameWorldBossState',
                                                             '%s' % (msgList), len(str(msgList)))
                 
+                if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
+                    FamilyRobBoss.FamilyOwnerBossOnReborn(curNPC)
+                    
         # 检查是否有光环, 在重生时处理,不然可能导致有些无战斗逻辑的怪物无法套上光环buff
         skillManager = curNPC.GetSkillManager()
         for index in xrange(skillManager.GetSkillCount()):
@@ -3736,7 +3746,7 @@
         #=====================================================================================================
         
         #boss伤血排行榜击杀逻辑
-        BossHurtMng.BossOnKilled(curNPC)
+        #BossHurtMng.BossOnKilled(curNPC)
         
         #掉落需要用到摸怪,所以在处理掉落奖励之前设置
         self.__SetFeelNPCPlayerList()
@@ -3752,6 +3762,8 @@
         # 记录boss击杀信息的NPC
         bossIpyData = IpyGameDataPY.GetIpyGameDataListNotLog('BOSSInfo', npcID)
         if bossIpyData:
+            if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
+                killerName = FamilyRobBoss.FamilyOwnerBossOnKilled(curNPC, self.__OwnerHurtID)
             #KillerJob = 0 if not self.__Killer else self.__Killer.GetJob()
             GameServer_KillGameWorldBoss(curNPC.GetNPCID(), killerName, 0)
         #===========================================================================================
@@ -4197,7 +4209,8 @@
         self.__MaxHurtPlayer = self.__FindBossMaxHurtObj() # py自定义伤血所得到的Boss最大伤血玩家
         
         self.__AllKillerDict, curTeam, hurtType, hurtID = self.__FindNPCKillerInfo()
-                    
+        self.__OwnerHurtType, self.__OwnerHurtID = hurtType, hurtID
+        
         #最后一击处理
         self.__DoLastTimeHurtLogic()
         
@@ -4227,6 +4240,10 @@
         elif curTeam != None:
             self.__KilledByTeamSetPrize(curTeam, hurtType, hurtID)
         
+        #被仙盟杀死
+        elif hurtType == ChConfig.Def_NPCHurtTypeFamily:
+            self.__KilledByFamilySetPrize(hurtType, hurtID)
+            
         else:
             GameWorld.ErrLog("NPC归属异常:npcID=%s,hurtType=%s,hurtID=%s" % (npcID, hurtType, hurtID))
             
@@ -4621,7 +4638,60 @@
         self.__NPCDropItem(dropPlayer, hurtType, hurtID, ownerPlayerList)
         #GameWorld.Log("队伍杀死怪物奖励,逻辑成功结束")
         return
-
+    
+    def __KilledByFamilySetPrize(self, hurtType, hurtID):
+        ## 仙盟杀死NPC奖励逻辑
+        curNPC = self.__Instance
+        
+        maxLV = 0
+        dropPlayer = None
+        ownerPlayerList = []
+        refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
+        copyPlayerMgr = GameWorld.GetMapCopyPlayerManager()
+        for index in xrange(copyPlayerMgr.GetPlayerCount()):
+            player = copyPlayerMgr.GetPlayerByIndex(index)
+            if not player:
+                continue
+            
+            if player.GetFamilyID() != hurtID or not self.GetIsInRefreshPoint(player.GetPosX(), player.GetPosY(), refreshPoint):
+                continue
+            
+            curPlayerLV = player.GetLV()
+            if maxLV < curPlayerLV:
+                maxLV = curPlayerLV
+                dropPlayer = player
+            ownerPlayerList.append(player)
+            
+        if not ownerPlayerList:
+            GameWorld.Log("奖励归属仙盟,但是不存在可获得该奖励的成员!npcID=%s,hurtType=%s,hurtID=%s" 
+                          % (curNPC.GetNPCID(), hurtType, hurtID))
+            
+        # 因为仙盟归属boss归属伤血第一的仙盟,仙盟伤血有保护,可能存在伤血第一仙盟在boss死亡的时候都不在
+        # 此时掉落计算玩家算最后一击玩家,归属还是算伤血第一仙盟的
+        if not dropPlayer:
+            dropPlayer = self.__LastHurtPlayer
+            
+        if not dropPlayer:
+            GameWorld.ErrLog("奖励归属仙盟,找不到掉落玩家!npcID=%s,hurtType=%s,hurtID=%s" 
+                             % (curNPC.GetNPCID(), hurtType, hurtID))
+            return
+        
+        # 赶时间,先简单处理直接取最大等级的,之后可按实际情况来
+        if not self.__LastHurtPlayer:
+            self.__LastHurtPlayer = dropPlayer
+        if not self.__MaxHurtPlayer:
+            self.__MaxHurtPlayer = dropPlayer
+        if not self.__Killer:
+            self.__Killer = dropPlayer
+        maxHurtID = dropPlayer.GetPlayerID()
+        
+        for curPlayer in ownerPlayerList:
+            self.__KillNPCFuncEx(curPlayer, curNPC, maxHurtID, False)
+            
+        #调用物品掉落
+        self.__NPCDropItem(dropPlayer, hurtType, hurtID, ownerPlayerList)
+        return
+    
     ## 队伍或自己击杀NPC扩展功能
     #  @param curPlayer
     #  @return None

--
Gitblit v1.8.0