From 4c9451d54c885df3fac4be875728425ca0defa45 Mon Sep 17 00:00:00 2001 From: MrSmite Date: Fri, 21 Dec 2012 20:57:22 -0500 Subject: Fix pet stopping approach when attacked by another creature Fix pet placed on stay after "attack" not attacking new attackers Closes #8735 --- src/server/game/AI/CoreAI/PetAI.cpp | 4 ++++ src/server/game/Entities/Unit/Unit.cpp | 5 ++++- src/server/game/Entities/Unit/Unit.h | 18 ++++++++++++++---- 3 files changed, 22 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 78c22e74f44..47cc4d12501 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -106,8 +106,12 @@ void PetAI::UpdateAI(const uint32 diff) // Check before attacking to prevent pets from leaving stay position if (me->GetCharmInfo()->HasCommandState(COMMAND_STAY)) { + // Case where pet was put on stay after "attack" was clicked and it gets attacked by + // another creature. Pet can switch target if victim is out of range. if (me->GetCharmInfo()->IsCommandAttack() || (me->GetCharmInfo()->IsAtStay() && me->IsWithinMeleeRange(me->getVictim()))) DoMeleeAttackIfReady(); + else if (me->GetCharmInfo()->IsCommandAttack() || (me->GetCharmInfo()->IsAtStay() && me->IsWithinMeleeRange(me->getAttackerForHelper()))) + DoAttack(me->getAttackerForHelper(), false); } else DoMeleeAttackIfReady(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d4b276fd2db..4252bf1cb1f 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12136,7 +12136,10 @@ void Unit::CombatStart(Unit* target, bool initialAggro) if (!target->isInCombat() && target->GetTypeId() != TYPEID_PLAYER && !target->ToCreature()->HasReactState(REACT_PASSIVE) && target->ToCreature()->IsAIEnabled) { - target->ToCreature()->AI()->AttackStart(this); + if (target->isPet()) + target->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart() + else + target->ToCreature()->AI()->AttackStart(this); } SetInCombatWith(target); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 3053d0018d4..8cb0f434907 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1261,12 +1261,22 @@ class Unit : public WorldObject } Unit* getAttackerForHelper() const // If someone wants to help, who to give them { - if (getVictim() != NULL) - return getVictim(); + if (isPet()) + { + if (!m_attackers.empty()) + return *(m_attackers.begin()); - if (!m_attackers.empty()) - return *(m_attackers.begin()); + if (getVictim() != NULL) + return getVictim(); + } + else + { + if (getVictim() != NULL) + return getVictim(); + if (!m_attackers.empty()) + return *(m_attackers.begin()); + } return NULL; } bool Attack(Unit* victim, bool meleeAttack); -- cgit v1.2.3