diff --git a/utils/sql/git/optional/2015_02_15_UpdatePetTypes.sql b/utils/sql/git/optional/2015_02_15_UpdatePetTypes.sql new file mode 100644 index 000000000..29ba3b03e --- /dev/null +++ b/utils/sql/git/optional/2015_02_15_UpdatePetTypes.sql @@ -0,0 +1,50 @@ +-- Updates live pets who should be type (5) - Pet locks onto target until dead. +UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword99Rk3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword99Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword99Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword94Rk3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword94Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword94Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword89Rk3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword89Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword89Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_79_Rk3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_79_Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_79_Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_74_"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_67_"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "SumSword"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "SUMHammer4"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "SUMHammer3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "SUMHammer2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "SUMHammer1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "SumHammer"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "Burnout"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "SumSword"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "SumHammer"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_67_"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_73_"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_73_Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_73_Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_73_Rk3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_78_Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_78_Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_78_Rk3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_83_Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_83_Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_83_Rk3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_88_Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_88_Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_88_Rk3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_94_Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_94_Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_94_Rk3"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_99_Rk1"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_99_Rk2"; +UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_99_Rk3"; diff --git a/zone/attack.cpp b/zone/attack.cpp index bfd4a5cc2..f757778ec 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); @@ -2380,6 +2383,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 199e37356..331c50435 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -9862,6 +9862,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