From ecc0fff10c9e6a5d510e1f97370a5fa29233746e Mon Sep 17 00:00:00 2001 From: hch <305670599@qq.com> Date: 星期四, 13 九月 2018 23:10:06 +0800 Subject: [PATCH] 1 buff减层导致buff消失时 添加刷NPC属性 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_186.py | 74 +++++++++++++++++++++++++++++++++---- 1 files changed, 66 insertions(+), 8 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 1978c26..2c5e032 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 @@ -25,17 +25,19 @@ # @change: "2014-12-31 14:40" Alee 降低NPCAI消耗 # @change: "2016-11-22 21:00" hxp 支持添加最大仇恨buff #------------------------------------------------------------------------------ -"""Version = 2016-11-22 21:00""" +#"""Version = 2016-11-22 21:00""" #------------------------------------------------------------------------------- import ChConfig import NPCCommon import AICommon import IPY_GameWorld +import FamilyRobBoss import AttackCommon import GameWorld import BaseAttack import PlayerState import SkillCommon +import PyGameData import BuffSkill import GameObj @@ -92,7 +94,7 @@ npcControl.DoHPPerLogic(ChConfig.Def_NPCHurtTypeAll, 0) return -def __RefreshDropOwner(curNPC, tick, refreshInterval=3000): +def __RefreshDropOwner(curNPC, tick, refreshInterval=3000, isDead=False): ## 刷新boss掉落归属 # @return: 可攻击的掉落归属目标玩家 @@ -109,6 +111,12 @@ elif ownerType == ChConfig.Def_NPCHurtTypePlayer: tagObj = GameWorld.GetObj(ownerID, IPY_GameWorld.gotPlayer) + elif dropOwnerType == ChConfig.DropOwnerType_Family: + ownerInfo = FamilyRobBoss.RefreshFamilyOwnerNPCHurt(npcControl, curNPC, tick, refreshInterval) + if ownerInfo: + tagObj, ownerFamilyID = ownerInfo + ownerType, ownerID = ChConfig.Def_NPCHurtTypeFamily, ownerFamilyID + # 没有攻击目标,则刷新仇恨,支持主动怪 if not tagObj: angryObjType, maxAngryObj = None, None @@ -121,13 +129,13 @@ maxAngryObj = GameWorld.GetObj(angryID, angryObjType) tagObj = maxAngryObj - if dropOwnerType == ChConfig.DropOwnerType_MaxAngry and angryObjType == IPY_GameWorld.gotPlayer and maxAngryObj: + if angryObjType == IPY_GameWorld.gotPlayer and maxAngryObj and not ownerType: 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) + __RefreshBossDropOwnerObjBuff(curNPC, npcControl, tick, ownerType, ownerID, isDead) return tagObj def __GetMaxHurtTeamPlayer(curNPC, npcControl, teamID): @@ -145,10 +153,10 @@ return curTeamPlayer return -def __RefreshBossDropOwnerObjBuff(curNPC, npcControl, tick, ownerType=0, ownerID=0): +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]: + if dropOwnerType not in [ChConfig.DropOwnerType_MaxHurt, ChConfig.DropOwnerType_MaxAngry, ChConfig.DropOwnerType_Family]: #GameWorld.DebugLog("不需要展示掉落归属的NPC! npcID=%s,dropOwnerType=%s" % (npcID, dropOwnerType)) return @@ -160,6 +168,8 @@ % (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) @@ -168,12 +178,18 @@ 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()): @@ -185,12 +201,43 @@ 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())) + + elif ownerType == ChConfig.Def_NPCHurtTypeFamily: + + hurtType, hurtID = ChConfig.Def_NPCHurtTypeFamily, ownerID + refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex()) + copyPlayerMgr = GameWorld.GetMapCopyPlayerManager() + for index in xrange(copyPlayerMgr.GetPlayerCount()): + player = copyPlayerMgr.GetPlayerByIndex(index) + if not player: + continue + + # 归属仙盟 且 在boss区域内 + if player.GetFamilyID() == ownerID and npcControl.GetIsInRefreshPoint(player.GetPosX(), player.GetPosY(), refreshPoint): + __AddBossDropOwnerPlayerBuff(player, tick, curNPC) + + else: + isOk = BuffSkill.DelBuffBySkillID(player, ChConfig.Def_SkillID_DropOwnerBuff, tick, buffOwner=curNPC) + if isOk: + GameWorld.DebugLog("删除非归属仙盟成员buff: teamID=%s,playerID=%s" % (ownerID, player.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 + elif ownerType == ChConfig.Def_NPCHurtTypeFamily: + PyGameData.g_npcKillerInfo[key] = {}, None, hurtType, hurtID + + GameWorld.Log("Boss被击杀: npcID=%s,key=%s,playerIDList=%s,teamID=%s,hurtType=%s,hurtID=%s" + % (npcID, key, killerDict.keys(), teamID, hurtType, hurtID)) return def __AddBossDropOwnerPlayerBuff(curPlayer, tick, curNPC): @@ -242,6 +289,14 @@ if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0: continue __SetBossDropOwnerBuffDisappearTime(curTeamPlayer, curNPC) + elif ownerType == ChConfig.Def_NPCHurtTypeFamily: + copyPlayerMgr = GameWorld.GetMapCopyPlayerManager() + for index in xrange(copyPlayerMgr.GetPlayerCount()): + player = copyPlayerMgr.GetPlayerByIndex(index) + if not player: + continue + __SetBossDropOwnerBuffDisappearTime(player, curNPC) + return def __SetBossDropOwnerBuffDisappearTime(curPlayer, curNPC): @@ -296,7 +351,7 @@ PlayerState.SetBossStateTick(curPlayer, tick) #被击杀时强制刷新归属 - __RefreshDropOwner(curNPC, tick, 0) + __RefreshDropOwner(curNPC, tick, 0, True) return ## NPC死亡处理 @@ -307,9 +362,12 @@ # @return None def OnDie(curNPC, HurtType, HurtID): AICommon.DoNPCUseSkillOnDie(curNPC) + return + +def OnNPCSetDead(curNPC): __DelayBossDropOwnerBuff(curNPC) return - + ## npc攻击逻辑 # @param curNPC 当前npc # @param tagID curNPCAngryID -- Gitblit v1.8.0