diff options
author | MrSmite <mrsmite@att.net> | 2012-12-21 20:57:22 -0500 |
---|---|---|
committer | MrSmite <mrsmite@att.net> | 2012-12-21 20:57:22 -0500 |
commit | 4c9451d54c885df3fac4be875728425ca0defa45 (patch) | |
tree | 362df3058e1e20780159b5e544a72f7b07c47a5e /src | |
parent | 63ea4b1056dd6fc8b25f580331307d14bdcc26d2 (diff) |
Fix pet stopping approach when attacked by another creature
Fix pet placed on stay after "attack" not attacking new attackers
Closes #8735
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/CoreAI/PetAI.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 18 |
3 files changed, 22 insertions, 5 deletions
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); |