void PetAI::DoAttack(Unit* target, bool chase) { // Handles attack with or without chase and also resets flags // for next update / creature kill if (me->Attack(target, true)) { if (Unit* owner = me->GetOwner()) owner->SetInCombatWith(target); // Play sound to let the player know the pet is attacking something it picked on its own if (me->HasReactState(REACT_AGGRESSIVE) && !me->GetCharmInfo()->IsCommandAttack()) me->SendPetAIReaction(me->GetGUID()); if (chase) { ClearCharmInfoFlags(); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(target); } else // (Stay && ((Aggressive || Defensive) && In Melee Range))) { ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsAtStay(true); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveIdle(); } } }
void PetAI::MovementInform(uint32 moveType, uint32 data) { // Receives notification when pet reaches stay or follow owner switch (moveType) { case POINT_MOTION_TYPE: { // Pet is returning to where stay was clicked. data should be // pet's GUIDLow since we set that as the waypoint ID if (data == me->GetGUIDLow() && me->GetCharmInfo()->IsReturning()) { ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsAtStay(true); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveIdle(); } break; } case FOLLOW_MOTION_TYPE: { // If data is owner's GUIDLow then we've reached follow point, // otherwise we're probably chasing a creature if (me->GetCharmerOrOwner() && me->GetCharmInfo() && data == me->GetCharmerOrOwner()->GetGUIDLow() && me->GetCharmInfo()->IsReturning()) { ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsFollowing(true); } break; } default: break; } }
void PetAI::DoAttack(Unit* target, bool chase) { // Handles attack with or without chase and also resets flags // for next update / creature kill if (me->Attack(target, true)) { // Play sound to let the player know the pet is attacking something it picked on its own if (me->HasReactState(REACT_AGGRESSIVE) && !me->GetCharmInfo()->IsCommandAttack()) me->SendPetAIReaction(me->GetGUID()); 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 me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(target); } else // (Stay && ((Aggressive || Defensive) && In Melee Range))) { ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsAtStay(true); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveIdle(); } } }
/// Receives notification when pet reaches stay or follow owner void PetAI::MovementInform(uint32 moveType, uint32 data) { if (!me->GetCharmInfo()) return; switch (moveType) { case POINT_MOTION_TYPE: { // Pet is returning to where stay was clicked. data should be // pet's GUIDLow since we set that as the waypoint ID if (data == me->GetGUIDLow() && me->GetCharmInfo()->IsReturning()) { ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsAtStay(true); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveIdle(); } break; } case FOLLOW_MOTION_TYPE: { // If data is owner's GUIDLow then we've reached follow point if (me->GetCharmerOrOwner() && data == me->GetCharmerOrOwner()->GetGUIDLow() && me->GetCharmInfo()->IsReturning()) { ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsFollowing(true); me->AddUnitState(UNIT_STATE_FOLLOW); } break; } default: break; } }
void PetAI::HandleReturnMovement() { // Handles moving the pet back to stay or owner // Prevent activating movement when under control of spells // such as "Eyes of the Beast" if (me->isCharmed()) return; if (me->GetCharmInfo()->HasCommandState(COMMAND_STAY)) { if (!me->GetCharmInfo()->IsAtStay() && !me->GetCharmInfo()->IsReturning()) { float x, y, z; me->GetCharmInfo()->GetStayPosition(x, y, z); ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsReturning(true); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(me->GetGUIDLow(), x, y, z); } } else // COMMAND_FOLLOW { if (!me->GetCharmInfo()->IsFollowing() && !me->GetCharmInfo()->IsReturning()) { ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsReturning(true); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveFollow(me->GetCharmerOrOwner(), PET_FOLLOW_DIST, me->GetFollowAngle()); } } }
void PetAI::DoAttack(Unit* target, bool chase) { // Handles attack with or without chase and also resets flags // for next update / creature kill if (me->Attack(target, true)) { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT); // on player pets, this flag indicates we're actively going after a target - that's what we're doing, so set it // Play sound to let the player know the pet is attacking something it picked on its own if (me->HasReactState(REACT_AGGRESSIVE) && !me->GetCharmInfo()->IsCommandAttack()) me->SendPetAIReaction(me->GetGUID()); 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 (me->HasUnitState(UNIT_STATE_FOLLOW)) me->GetMotionMaster()->Remove(FOLLOW_MOTION_TYPE); me->GetMotionMaster()->MoveChase(target, me->GetPetChaseDistance(), float(M_PI)); } else // (Stay && ((Aggressive || Defensive) && In Melee Range))) { ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsAtStay(true); if (me->HasUnitState(UNIT_STATE_FOLLOW)) me->GetMotionMaster()->Remove(FOLLOW_MOTION_TYPE); me->GetMotionMaster()->MoveIdle(); } } }
void PetAI::HandleReturnMovement() { // Handles moving the pet back to stay or owner // Prevent activating movement when under control of spells // such as "Eyes of the Beast" if (me->isPossessed()) return; if (me->GetCharmInfo()->HasCommandState(COMMAND_STAY)) { if (!me->GetCharmInfo()->IsAtStay() && !me->GetCharmInfo()->IsReturning()) { if (me->GetCharmInfo()->HasStayPosition()) { // Return to previous position where stay was clicked if (me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE) { float x, y, z; me->GetCharmInfo()->GetStayPosition(x, y, z); ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsReturning(true); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(me->GetUInt32Value(OBJECT_FIELD_GUID), x, y, z); } } } } else // COMMAND_FOLLOW { if (!me->GetCharmInfo()->IsFollowing() && !me->GetCharmInfo()->IsReturning()) { if (me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE) { ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsReturning(true); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveFollow(me->GetCharmerOrOwner(), PET_FOLLOW_DIST, me->GetFollowAngle()); } } } me->GetCharmInfo()->SetForcedSpell(0); me->GetCharmInfo()->SetForcedTargetGUID(0); // xinef: remember that npcs summoned by npcs can also be pets me->DeleteThreatList(); me->ClearInPetCombat(); }
void PetAI::HandleReturnMovement() { // Handles moving the pet back to stay or owner // Prevent activating movement when under control of spells // such as "Eyes of the Beast" if (me->IsCharmed()) return; if (me->GetCharmInfo()->HasCommandState(COMMAND_STAY)) { if (!me->GetCharmInfo()->IsAtStay() && !me->GetCharmInfo()->IsReturning()) { // Return to previous position where stay was clicked float x, y, z; me->GetCharmInfo()->GetStayPosition(x, y, z); ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsReturning(true); if (me->HasUnitState(UNIT_STATE_CHASE)) me->GetMotionMaster()->Remove(CHASE_MOTION_TYPE); me->GetMotionMaster()->MovePoint(me->GetGUID().GetCounter(), x, y, z); } } else // COMMAND_FOLLOW { if (!me->GetCharmInfo()->IsFollowing() && !me->GetCharmInfo()->IsReturning()) { ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsReturning(true); if (me->HasUnitState(UNIT_STATE_CHASE)) me->GetMotionMaster()->Remove(CHASE_MOTION_TYPE); me->GetMotionMaster()->MoveFollow(me->GetCharmerOrOwner(), PET_FOLLOW_DIST, me->GetFollowAngle()); } } me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT); // on player pets, this flag indicates that we're actively going after a target - we're returning, so remove it }
void PetAI::DoAttack(Unit* target, bool chase) { // Handles attack with or without chase and also resets flags // for next update / creature kill if (chase) { if (me->Attack(target, true)) { 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 me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(target); } } else // (Stay && ((Aggressive || Defensive) && In Melee Range))) { ClearCharmInfoFlags(); me->GetCharmInfo()->SetIsAtStay(true); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveIdle(); } }
void PetAI::StopAttack() { if (!me->IsAlive()) { me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveIdle(); me->CombatStop(); return; } me->AttackStop(); me->InterruptNonMeleeSpells(false); me->GetCharmInfo()->SetIsCommandAttack(false); ClearCharmInfoFlags(); HandleReturnMovement(); }
void PetAI::_stopAttack() { if (!me->IsAlive()) { ;//sLog->outStaticDebug("Creature stoped attacking cuz his dead [guid=%u]", me->GetGUIDLow()); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveIdle(); me->CombatStop(); me->getHostileRefManager().deleteReferences(); return; } me->AttackStop(); me->InterruptNonMeleeSpells(false); me->GetCharmInfo()->SetIsCommandAttack(false); ClearCharmInfoFlags(); HandleReturnMovement(); }
void PetAI::_stopAttack() { if (!m_creature->isAlive()) { m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveIdle(); m_creature->CombatStop(); m_creature->getHostileRefManager().deleteReferences(); return; } m_creature->AttackStop(); m_creature->InterruptNonMeleeSpells(false); //m_creature->SendMeleeAttackStop(); // Should stop pet's attack button from flashing m_creature->GetCharmInfo()->SetIsCommandAttack(false); ClearCharmInfoFlags(); HandleReturnMovement(); }
void PetAI::_stopAttack() { if (!me->IsAlive()) { TC_LOG_DEBUG("misc", "Creature stoped attacking cuz his dead [%s]", me->GetGUID().ToString().c_str()); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveIdle(); me->CombatStop(); me->getHostileRefManager().deleteReferences(); return; } me->AttackStop(); me->InterruptNonMeleeSpells(false); me->SendMeleeAttackStop(); // Should stop pet's attack button from flashing me->GetCharmInfo()->SetIsCommandAttack(false); ClearCharmInfoFlags(); HandleReturnMovement(); }
void PetAI::_stopAttack() { if (!me->isAlive()) { sLog->outDebug(LOG_FILTER_GENERAL, "Creature stoped attacking cuz his dead [guid=%u]", me->GetGUIDLow()); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveIdle(); me->CombatStop(); me->getHostileRefManager().deleteReferences(); return; } me->AttackStop(); me->InterruptNonMeleeSpells(false); me->SendMeleeAttackStop(); // Should stop pet's attack button from flashing me->GetCharmInfo()->SetIsCommandAttack(false); ClearCharmInfoFlags(); HandleReturnMovement(); }