void UpdateAI(const uint32 uiDiff) override { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim() || m_bExploding) { return; } if (m_uiSeparationCheckTimer < uiDiff) { #if defined (WOTLK) if (!m_pInstance) return; #endif // Distance guesswork, but should be ok Creature* pGarr = m_pInstance->GetSingleCreatureFromStorage(NPC_GARR); if (pGarr && pGarr->IsAlive() && !m_creature->IsWithinDist2d(pGarr->GetPositionX(), pGarr->GetPositionY(), 50.0f)) { DoCastSpellIfCan(m_creature, SPELL_SEPARATION_ANXIETY, CAST_TRIGGERED); } m_uiSeparationCheckTimer = 5000; } else { m_uiSeparationCheckTimer -= uiDiff; } #if defined (WOTLK) // Cast Erruption and let them die if (m_creature->GetHealthPercent() <= 10.0f) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_ERUPTION); m_creature->SetDeathState(JUST_DIED); m_creature->RemoveCorpse(); } #endif // Immolate_Timer if (m_uiImmolateTimer < uiDiff) { if (Unit* pTarget = SelectAttackTarget(ATTACKING_TARGET_RANDOM, 0, SPELL_IMMOLATE)) { if (DoCastSpellIfCan(pTarget, SPELL_IMMOLATE, CAST_TRIGGERED) == CAST_OK) { m_uiImmolateTimer = urand(5 * IN_MILLISECONDS, 10 * IN_MILLISECONDS); } } } else { m_uiImmolateTimer -= uiDiff; } DoMeleeAttackIfReady(); }
void SimpleCharmedPlayerAI::UpdateAI(const uint32 /*diff*/) { Creature* charmer = me->GetCharmer() ? me->GetCharmer()->ToCreature() : nullptr; if (!charmer) return; //kill self if charm aura has infinite duration if (charmer->IsInEvadeMode()) { Player::AuraEffectList const& auras = me->GetAuraEffectsByType(SPELL_AURA_MOD_CHARM); for (Player::AuraEffectList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter) if ((*iter)->GetCasterGUID() == charmer->GetGUID() && (*iter)->GetBase()->IsPermanent()) { me->KillSelf(); return; } } if (charmer->IsInCombat()) { Unit* target = me->GetVictim(); if (!target || !charmer->IsValidAttackTarget(target) || target->HasBreakableByDamageCrowdControlAura()) { target = SelectAttackTarget(); if (!target) return; if (IsRangedAttacker()) AttackStartCaster(target, 28.0f); else AttackStart(target); } DoAutoAttackIfReady(); } else { me->AttackStop(); me->CastStop(); me->StopMoving(); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); } }