From 2399e4420a0309193839d4355886c9540983af8f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 23 五月 2019 20:14:54 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.0.87:10010/r/SnxxServerCode

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_186.py |  234 +++++----------------------------------------------------
 1 files changed, 23 insertions(+), 211 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_186.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_186.py
index a460007..16c23cb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_186.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_186.py
@@ -31,13 +31,9 @@
 import NPCCommon
 import AICommon
 import IPY_GameWorld
-import AttackCommon
 import GameWorld
 import BaseAttack
 import PlayerState
-import SkillCommon
-import PyGameData
-import BuffSkill
 import GameObj
 
 ## 初始化
@@ -79,7 +75,8 @@
         AICommon.NormalNPCFast_Move(curNPC, tick)
         return
     
-    tagObj = __RefreshDropOwner(curNPC, tick)
+    #默认攻击归属者
+    tagObj = npcControl.RefreshDropOwner(tick)
     
     if not curNPC.GetIsNeedProcess() or not tagObj:
         # 先回血,等回满再做其他事情
@@ -93,209 +90,6 @@
     npcControl.DoHPPerLogic(ChConfig.Def_NPCHurtTypeAll, 0)
     return
 
-def __RefreshDropOwner(curNPC, tick, refreshInterval=3000, isDead=False):
-    ## 刷新boss掉落归属
-    # @return: 可攻击的掉落归属目标玩家
-    
-    npcControl = NPCCommon.NPCControl(curNPC)
-    tagObj = None # 即将攻击的目标, 归属最大伤血取最大伤血玩家或队伍队员,其他取最大仇恨
-    ownerType, ownerID = 0, 0
-    dropOwnerType = NPCCommon.GetDropOwnerType(curNPC)
-    if dropOwnerType == ChConfig.DropOwnerType_MaxHurt:
-        maxHurtObj = npcControl.RefreshHurtList(tick, refreshInterval)
-        if maxHurtObj:
-            ownerType, ownerID = maxHurtObj.GetValueType(), maxHurtObj.GetValueID()
-            if ownerType == ChConfig.Def_NPCHurtTypeTeam:
-                tagObj = __GetMaxHurtTeamPlayer(curNPC, npcControl, ownerID)
-            elif ownerType == ChConfig.Def_NPCHurtTypePlayer:
-                tagObj = GameWorld.GetObj(ownerID, IPY_GameWorld.gotPlayer)
-                
-    # 没有攻击目标,则刷新仇恨,支持主动怪
-    if not tagObj:
-        angryObjType, maxAngryObj = None, None
-        npcControl.RefreshAngryList(tick, refreshInterval, isUpdAngry=True)
-        maxAngry = npcControl.GetMaxAngryTag()
-        if maxAngry:
-            angryID = maxAngry.GetObjID()
-            angryObjType = maxAngry.GetObjType()
-            #GameWorld.DebugLog("最大仇恨目标: ID=%s, Type=%s" % (angryID, angryObjType))
-            maxAngryObj = GameWorld.GetObj(angryID, angryObjType)
-            
-        tagObj = maxAngryObj
-        if angryObjType == IPY_GameWorld.gotPlayer and maxAngryObj:
-            teamID = maxAngryObj.GetTeamID()
-            if teamID:
-                ownerType, ownerID = ChConfig.Def_NPCHurtTypeTeam, teamID
-            else:
-                ownerType, ownerID = ChConfig.Def_NPCHurtTypePlayer, maxAngryObj.GetPlayerID()
-    __RefreshBossDropOwnerObjBuff(curNPC, npcControl, tick, ownerType, ownerID, isDead)
-    return tagObj
-
-def __GetMaxHurtTeamPlayer(curNPC, npcControl, teamID):
-    ## 获取最大伤血队伍中攻击的目标队员
-    curTeam = GameWorld.GetTeamManager().FindTeam(teamID)
-    if curTeam:
-        refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
-        for i in xrange(curTeam.GetMemberCount()):
-            curTeamPlayer = curTeam.GetMember(i)
-            if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0:
-                continue
-            if curTeamPlayer.GetHP() <= 0:
-                continue
-            if npcControl.GetIsInRefreshPoint(curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), refreshPoint):
-                return curTeamPlayer
-    return
-
-def __RefreshBossDropOwnerObjBuff(curNPC, npcControl, tick, ownerType=0, ownerID=0, isDead=False):
-    npcID = curNPC.GetNPCID()
-    dropOwnerType = NPCCommon.GetDropOwnerType(curNPC)
-    if dropOwnerType not in [ChConfig.DropOwnerType_MaxHurt, ChConfig.DropOwnerType_MaxAngry]:
-        #GameWorld.DebugLog("不需要展示掉落归属的NPC! npcID=%s,dropOwnerType=%s" % (npcID, dropOwnerType))
-        return
-    
-    lastDropOwnerID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_LastDropOwnerID)
-    lastDropOwnerType = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_LastDropOwnerType)
-    
-    if lastDropOwnerID and (lastDropOwnerType != ownerType or lastDropOwnerID != ownerID):
-        GameWorld.DebugLog("归属变更, 清除旧归属! ownerType=%s,ownerID=%s,lastDropOwnerType=%s,lastDropOwnerID=%s" 
-                           % (ownerType, ownerID, lastDropOwnerType, lastDropOwnerID))
-        __DelBossDropOwnerBuff(curNPC, lastDropOwnerType, lastDropOwnerID, tick)
-    
-    killerDict, curTeam, hurtType, hurtID = {}, None, 0, 0
-    
-    # 更新归属
-    curNPC.SetDict(ChConfig.Def_NPC_Dict_LastDropOwnerID, ownerID)
-    curNPC.SetDict(ChConfig.Def_NPC_Dict_LastDropOwnerType, ownerType)
-    
-    # 刷新归属
-    if ownerType == ChConfig.Def_NPCHurtTypePlayer:
-        curPlayer = GameWorld.GetObj(ownerID, IPY_GameWorld.gotPlayer)
-        if curPlayer:
-            playerID = curPlayer.GetPlayerID()
-            hurtType, hurtID = ChConfig.Def_NPCHurtTypePlayer, playerID
-            killerDict[playerID] = curPlayer
-            __AddBossDropOwnerPlayerBuff(curPlayer, tick, curNPC)
-            
-    elif ownerType == ChConfig.Def_NPCHurtTypeTeam:
-        curTeam = GameWorld.GetTeamManager().FindTeam(ownerID)
-        if not curTeam:
-            return
-        
-        # 因为有击杀次数限制,所以不是所有的队员都可以获得归属,所以这里设置为特殊指定玩家掉落
-        hurtType, hurtID = ChConfig.Def_NPCHurtTypeSpecial, 0
-        
-        refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
-        for i in xrange(curTeam.GetMemberCount()):
-            curTeamPlayer = curTeam.GetMember(i)
-            if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0:
-                continue
-            
-            if curTeamPlayer.GetCopyMapID() == GameWorld.GetGameWorld().GetCopyMapID() \
-                and npcControl.GetIsInRefreshPoint(curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), refreshPoint) \
-                and AttackCommon.CheckKillNPCByCnt(curTeamPlayer, curNPC, False):
-                __AddBossDropOwnerPlayerBuff(curTeamPlayer, tick, curNPC)
-                killerDict[curTeamPlayer.GetPlayerID()] = curTeamPlayer
-                
-            # 不同线、或者距离超出boss范围的队员不加归属buff
-            else:
-                isOk = BuffSkill.DelBuffBySkillID(curTeamPlayer, ChConfig.Def_SkillID_DropOwnerBuff, tick, buffOwner=curNPC)
-                if isOk:
-                    GameWorld.DebugLog("删除归属队员buff: teamID=%s,playerID=%s" % (ownerID, curTeamPlayer.GetPlayerID()))
-                    
-    if isDead:
-        key = (GameWorld.GetGameWorld().GetLineID(), curNPC.GetID(), npcID)
-        teamID = curTeam.GetTeamID() if curTeam else 0
-        if killerDict:
-            PyGameData.g_npcKillerInfo[key] = killerDict, curTeam, hurtType, hurtID
-        GameWorld.Log("Boss被击杀: npcID=%s,key=%s,playerIDList=%s,teamID=%s" % (npcID, key, killerDict.keys(), teamID))
-    return
-
-def __AddBossDropOwnerPlayerBuff(curPlayer, tick, curNPC):
-    findBuff = SkillCommon.FindBuffByID(curPlayer, ChConfig.Def_SkillID_DropOwnerBuff)[0]
-    if not findBuff:
-        SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, ChConfig.Def_SkillID_DropOwnerBuff, tick, buffOwner=curNPC)
-        GameWorld.DebugLog("添加归属buff: playerID=%s" % curPlayer.GetPlayerID())
-    return
-
-def __DelBossDropOwnerBuff(curNPC, ownerType, ownerID, tick):
-    
-    if ownerType == ChConfig.Def_NPCHurtTypePlayer:
-        curPlayer = GameWorld.GetObj(ownerID, IPY_GameWorld.gotPlayer)
-        if not curPlayer:
-            return
-        GameWorld.DebugLog("删除归属玩家buff: playerID=%s" % (ownerID))
-        BuffSkill.DelBuffBySkillID(curPlayer, ChConfig.Def_SkillID_DropOwnerBuff, tick, buffOwner=curNPC)
-        
-    elif ownerType == ChConfig.Def_NPCHurtTypeTeam:
-        curTeam = GameWorld.GetTeamManager().FindTeam(ownerID)
-        if not curTeam:
-            return
-        GameWorld.DebugLog("删除归属队伍buff: teamID=%s" % (ownerID))
-        for i in xrange(curTeam.GetMemberCount()):
-            curTeamPlayer = curTeam.GetMember(i)
-            if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0:
-                continue
-            BuffSkill.DelBuffBySkillID(curTeamPlayer, ChConfig.Def_SkillID_DropOwnerBuff, tick, buffOwner=curNPC)
-    return
-
-def __DelayBossDropOwnerBuff(curNPC):
-    ''' 延迟boss掉落归属buff消失时间 '''
-    
-    ownerID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_LastDropOwnerID)
-    ownerType = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_LastDropOwnerType)
-    
-    if ownerType == ChConfig.Def_NPCHurtTypePlayer:
-        curPlayer = GameWorld.GetObj(ownerID, IPY_GameWorld.gotPlayer)
-        if not curPlayer:
-            return
-        __SetBossDropOwnerBuffDisappearTime(curPlayer, curNPC)
-        
-    elif ownerType == ChConfig.Def_NPCHurtTypeTeam:
-        curTeam = GameWorld.GetTeamManager().FindTeam(ownerID)
-        if not curTeam:
-            return
-        for i in xrange(curTeam.GetMemberCount()):
-            curTeamPlayer = curTeam.GetMember(i)
-            if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0:
-                continue
-            __SetBossDropOwnerBuffDisappearTime(curTeamPlayer, curNPC)
-    return
-
-def __SetBossDropOwnerBuffDisappearTime(curPlayer, curNPC):
-    
-    findSkill = GameWorld.GetGameData().GetSkillBySkillID(ChConfig.Def_SkillID_DropOwnerBuff)
-    if not findSkill:
-        return
-    
-    buffType = SkillCommon.GetBuffType(findSkill)
-    buffTuple = SkillCommon.GetBuffManagerByBuffType(curPlayer, buffType)
-    if buffTuple == ():
-        return
-    
-    RemainTime = 10000 # 延迟10秒消失
-    tick = GameWorld.GetGameWorld().GetTick()
-    
-    buffStateManager = buffTuple[0]
-    for index in xrange(buffStateManager.GetBuffCount()):
-        curBuff = buffStateManager.GetBuff(index)
-        buffSkill = curBuff.GetSkill()
-        
-        if buffSkill.GetSkillTypeID() != ChConfig.Def_SkillID_DropOwnerBuff:
-            continue
-        
-        if curNPC.GetID() != curBuff.GetOwnerID():
-            #GameWorld.DebugLog("非buff归属着,不设置消失时间!", curPlayer.GetPlayerID())
-            break
-        
-        curBuff.SetCalcStartTick(tick) 
-        curBuff.SetRemainTime(RemainTime)
-        
-        # 通知buff刷新
-        buffStateManager.Sync_RefreshBuff(index, curBuff.GetRemainTime())
-        #GameWorld.DebugLog("掉落归属buff消失时间: RemainTime=%s" % (RemainTime), curPlayer.GetPlayerID())
-        break
-    return
-
 ## 每次被攻击处理结果
 #  @param atkObj 攻击发起者
 #  @param defObj 被攻击者
@@ -307,13 +101,27 @@
         PlayerState.SetBossStateTick(atkObj, tick)
     return
 
+def OnCheckCanDie(atkObj, curNPC, skill, tick):
+    ## 检查NPC是否可死亡
+    dropOwnerType = NPCCommon.GetDropOwnerType(curNPC)
+    if dropOwnerType not in [ChConfig.DropOwnerType_MaxHurt]:
+        return True
+    npcControl = NPCCommon.NPCControl(curNPC)
+    tagObj = npcControl.RefreshDropOwner(tick, 0)
+    if not atkObj or not tagObj:
+        GameObj.SetHP(curNPC, 1)
+        GameWorld.ErrLog("Boss当前状态下不可以死亡!npcID=%s" % curNPC.GetNPCID())
+        return False
+    return True
+
 ## NPC被玩家杀死
 def OnAttackDieByPlayer(curNPC, curPlayer, skill):
     tick = GameWorld.GetGameWorld().GetTick()
     PlayerState.SetBossStateTick(curPlayer, tick)
     
     #被击杀时强制刷新归属
-    __RefreshDropOwner(curNPC, tick, 0, True)
+    npcControl = NPCCommon.NPCControl(curNPC)
+    npcControl.RefreshDropOwner(tick, 0, True)
     return
 
 ## NPC死亡处理
@@ -324,9 +132,13 @@
 #  @return None
 def OnDie(curNPC, HurtType, HurtID):
     AICommon.DoNPCUseSkillOnDie(curNPC)
-    __DelayBossDropOwnerBuff(curNPC)
     return
-    
+
+def OnNPCSetDead(curNPC):
+    npcControl = NPCCommon.NPCControl(curNPC)
+    npcControl.DelayDropOwnerBuffDisappearTime()
+    return
+
 ## npc攻击逻辑
 #  @param curNPC 当前npc
 #  @param tagID curNPCAngryID

--
Gitblit v1.8.0