Example #1
0
        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();
        }
Example #2
0
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);
    }
}