aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMrSmite <mrsmite@att.net>2012-12-21 20:57:22 -0500
committerMrSmite <mrsmite@att.net>2012-12-21 20:57:22 -0500
commit4c9451d54c885df3fac4be875728425ca0defa45 (patch)
tree362df3058e1e20780159b5e544a72f7b07c47a5e /src
parent63ea4b1056dd6fc8b25f580331307d14bdcc26d2 (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.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp5
-rw-r--r--src/server/game/Entities/Unit/Unit.h18
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);