diff --git a/zone/attack.cpp b/zone/attack.cpp index 25dc88688..280eda918 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -1508,6 +1508,9 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, SkillUseTypes att } } } + + if (killerMob && killerMob->IsPet() && killerMob->GetPetType() == petTargetLock && killerMob->GetID() != GetID()) + killerMob->Kill(); } entity_list.RemoveFromTargets(this); @@ -2378,6 +2381,9 @@ bool NPC::Death(Mob* killerMob, int32 damage, uint16 spell, SkillUseTypes attack } } + if (killerMob && killerMob->IsPet() && killerMob->GetPetType() == petTargetLock && killerMob->GetID() != GetID()) + killerMob->Kill(); + WipeHateList(); p_depop = true; if(killerMob && killerMob->GetTarget() == this) //we can kill things without having them targeted diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index a3062891b..6f307c2d9 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -9863,6 +9863,9 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) return; } + if (mypet->GetPetType() == petTargetLock && (pet->command != PET_HEALTHREPORT && pet->command != PET_GETLOST)) + return; + if (mypet->GetPetType() == petAnimation && (pet->command != PET_HEALTHREPORT && pet->command != PET_GETLOST) && !GetAA(aaAnimationEmpathy)) return; diff --git a/zone/common.h b/zone/common.h index 19237d99c..20d19e94d 100644 --- a/zone/common.h +++ b/zone/common.h @@ -505,7 +505,7 @@ typedef enum { petOther, petCharmed, petNPCFollow, - petHatelist //remain active as long something is on the hatelist. Don't listen to any commands + petTargetLock //remain active as long something is on the hatelist. Don't listen to any commands } PetType; typedef enum { diff --git a/zone/mob.h b/zone/mob.h index 9641a2ffb..c2f57ff9c 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -675,6 +675,7 @@ public: bool IsFamiliar() const { return(typeofpet == petFamiliar); } bool IsAnimation() const { return(typeofpet == petAnimation); } bool IsCharmed() const { return(typeofpet == petCharmed); } + bool IsTargetLockPet() const { return(typeofpet == petTargetLock); } void SetOwnerID(uint16 NewOwnerID); inline uint16 GetOwnerID() const { return ownerid; } inline virtual bool HasOwner() { if(GetOwnerID()==0){return false;} return( entity_list.GetMob(GetOwnerID()) != 0); } diff --git a/zone/pets.cpp b/zone/pets.cpp index 117b466a7..38cd16a2a 100644 --- a/zone/pets.cpp +++ b/zone/pets.cpp @@ -426,6 +426,19 @@ void Mob::MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, entity_list.AddNPC(npc, true, true); SetPetID(npc->GetID()); // We need to handle PetType 5 (petHatelist), add the current target to the hatelist of the pet + + + if (record.petcontrol == petTargetLock) + { + Mob* target = GetTarget(); + + if (target){ + npc->AddToHateList(target, 1); + npc->SetSpecialAbility(IMMUNE_AGGRO, 1); + } + else + npc->Kill(); //On live casts spell 892 Unsummon (Kayen - Too limiting to use that for emu since pet can have more than 20k HP) + } } /* This is why the pets ghost - pets were being spawned too far away from its npc owner and some into walls or objects (+10), this sometimes creates the "ghost" effect. I changed to +2 (as close as I