diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 8b8106cd9..8f9d496fb 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -593,16 +593,12 @@ void PetAI::DoAttack(Unit* target, bool chase) if (me->HasReactState(REACT_AGGRESSIVE) && !me->GetCharmInfo()->IsCommandAttack()) me->SendPetAIReaction(me->GetGUID()); - if (CharmInfo* ci = me->GetCharmInfo()) - { - ci->SetIsAtStay(false); - ci->SetIsCommandFollow(false); - ci->SetIsFollowing(false); - ci->SetIsReturning(false); - } - if (chase) { + bool oldCmdAttack = me->GetCharmInfo()->IsCommandAttack(); // This needs to be reset after other flags are cleared + ClearCharmInfoFlags(); + me->GetCharmInfo()->SetIsCommandAttack(oldCmdAttack); // For passive pets commanded to attack so they will use spells + if (_canMeleeAttack()) { float angle = combatRange == 0.f && target->GetTypeId() != TYPEID_PLAYER && !target->IsPet() ? float(M_PI) : 0.f; @@ -612,6 +608,8 @@ void PetAI::DoAttack(Unit* target, bool chase) } else // (Stay && ((Aggressive || Defensive) && In Melee Range))) { + ClearCharmInfoFlags(); + me->GetCharmInfo()->SetIsAtStay(true); me->GetMotionMaster()->MovementExpiredOnSlot(MOTION_SLOT_ACTIVE, false); me->GetMotionMaster()->MoveIdle(); diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index acc86d073..fffcf8c7b 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -727,6 +727,8 @@ void Pet::Update(uint32 diff) GetMotionMaster()->Clear(false); GetMotionMaster()->MoveIdle(); + bool oldCmdAttack = GetCharmInfo()->IsCommandAttack(); + GetCharmInfo()->SetIsCommandAttack(false); GetCharmInfo()->SetIsAtStay(true); GetCharmInfo()->SetIsCommandFollow(false); @@ -734,6 +736,8 @@ void Pet::Update(uint32 diff) GetCharmInfo()->SetIsReturning(false); GetCharmInfo()->SaveStayPosition(true); + GetCharmInfo()->SetIsCommandAttack(oldCmdAttack); + AddSpellCooldown(tempspell, 0, spellInfo->IsCooldownStartedOnEvent() ? infinityCooldownDelay : 0); CastSpell(tempspellTarget, tempspell, false); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c213f37d1..af7239de2 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -19652,7 +19652,7 @@ void Unit::PetSpellFail(const SpellInfo* spellInfo, Unit* target, uint32 result) { AttackStop(); charmInfo->SetIsAtStay(false); - charmInfo->SetIsCommandAttack(!ToCreature()->HasReactState(REACT_PASSIVE)); + charmInfo->SetIsCommandAttack(true); charmInfo->SetIsReturning(false); charmInfo->SetIsFollowing(false); @@ -19662,7 +19662,7 @@ void Unit::PetSpellFail(const SpellInfo* spellInfo, Unit* target, uint32 result) { AttackStop(); charmInfo->SetIsAtStay(false); - charmInfo->SetIsCommandAttack(!ToCreature()->HasReactState(REACT_PASSIVE)); + charmInfo->SetIsCommandAttack(true); charmInfo->SetIsReturning(false); charmInfo->SetIsFollowing(false); diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 797631540..3ff04da7c 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -369,7 +369,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe // Clear the flags as if owner clicked 'attack'. AI will reset them // after AttackStart, even if spell failed charmInfo->SetIsAtStay(false); - charmInfo->SetIsCommandAttack(!pet->ToCreature()->HasReactState(REACT_PASSIVE)); + charmInfo->SetIsCommandAttack(true); charmInfo->SetIsReturning(false); charmInfo->SetIsFollowing(false);