| | |
| | | # @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 BaseAttack
|
| | | import PlayerState
|
| | | import SkillCommon
|
| | | import PyGameData
|
| | | import BuffSkill
|
| | | import GameObj
|
| | |
|
| | |
| | | npcControl.DoHPPerLogic(ChConfig.Def_NPCHurtTypeAll, 0)
|
| | | return
|
| | |
|
| | | def __RefreshDropOwner(curNPC, tick, refreshInterval=3000):
|
| | | def __RefreshDropOwner(curNPC, tick, refreshInterval=3000, isDead=False):
|
| | | ## 刷新boss掉落归属
|
| | | # @return: 可攻击的掉落归属目标玩家
|
| | |
|
| | |
| | | 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:
|
| | | 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):
|
| | |
| | | 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]:
|
| | |
| | | % (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()):
|
| | |
| | | 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):
|
| | |
| | | PlayerState.SetBossStateTick(curPlayer, tick)
|
| | |
|
| | | #被击杀时强制刷新归属
|
| | | __RefreshDropOwner(curNPC, tick, 0)
|
| | | __RefreshDropOwner(curNPC, tick, 0, True)
|
| | | return
|
| | |
|
| | | ## NPC死亡处理
|