Example #1
0
 void Aggro(Unit* /*pWho*/) override
 {
     DoScriptText(SAY_AGGRO, m_creature);
     if ((m_pTrigger1 = m_pInstance->SelectRandomPantherTrigger(true)))
         m_pTrigger1->CastSpell(m_pTrigger1, SPELL_SUMMON_ZULIAN_PROWLERS, TRIGGERED_NONE);
     if ((m_pTrigger2 = m_pInstance->SelectRandomPantherTrigger(false)))
         m_pTrigger2->CastSpell(m_pTrigger2, SPELL_SUMMON_ZULIAN_PROWLERS, TRIGGERED_NONE);
 }
Example #2
0
    void JustReachedHome() override
    {
        if (m_pInstance)
            m_pInstance->SetData(TYPE_ARLOKK, FAIL);

        // we should be summoned, so despawn
        m_creature->ForcedDespawn();
    }
Example #3
0
    void JustDied(Unit* /*pKiller*/) override
    {
        DoScriptText(SAY_DEATH, m_creature);
        // Restore visibility in case of killed by dots
        if (m_creature->GetVisibility() != VISIBILITY_ON)
            m_creature->SetVisibility(VISIBILITY_ON);

        if (m_pInstance)
            m_pInstance->SetData(TYPE_ARLOKK, DONE);
    }
Example #4
0
    void UpdateAI(const uint32 uiDiff) override
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        // Summon panters every 5 seconds
        if (m_uiSummonTimer < uiDiff)
        {
            if (m_pInstance)
            {
                if (Creature* pTrigger = m_pInstance->SelectRandomPantherTrigger(true))
                    m_creature->SummonCreature(NPC_ZULIAN_PROWLER, pTrigger->GetPositionX(), pTrigger->GetPositionY(), pTrigger->GetPositionZ(), 0, TEMPSUMMON_TIMED_OOC_DESPAWN, 30000);
                if (Creature* pTrigger = m_pInstance->SelectRandomPantherTrigger(false))
                    m_creature->SummonCreature(NPC_ZULIAN_PROWLER, pTrigger->GetPositionX(), pTrigger->GetPositionY(), pTrigger->GetPositionZ(), 0, TEMPSUMMON_TIMED_OOC_DESPAWN, 30000);
            }

            m_uiSummonTimer = 5000;
        }
        else
            m_uiSummonTimer -= uiDiff;

        if (m_uiVisibleTimer)
        {
            if (m_uiVisibleTimer <= uiDiff)
            {
                // Restore visibility
                m_creature->SetVisibility(VISIBILITY_ON);

                if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0))
                    AttackStart(pTarget);

                m_uiVisibleTimer = 0;
            }
            else
                m_uiVisibleTimer -= uiDiff;

            // Do nothing while vanished
            return;
        }

        // Troll phase
        if (!m_bIsPhaseTwo)
        {
            if (m_uiShadowWordPainTimer < uiDiff)
            {
                if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0))
                {
                    if (DoCastSpellIfCan(pTarget, SPELL_SHADOW_WORD_PAIN) == CAST_OK)
                        m_uiShadowWordPainTimer = 15000;
                }
            }
            else
                m_uiShadowWordPainTimer -= uiDiff;

            if (m_uiMarkTimer < uiDiff)
            {
                if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0, SPELL_MARK_ARLOKK, SELECT_FLAG_PLAYER))
                {
                    if (DoCastSpellIfCan(pTarget, SPELL_MARK_ARLOKK) == CAST_OK)
                    {
                        DoScriptText(SAY_FEAST_PANTHER, m_creature, pTarget);
                        m_uiMarkTimer = 30000;
                    }
                }
            }
            else
                m_uiMarkTimer -= uiDiff;

            if (m_uiGougeTimer < uiDiff)
            {
                if (DoCastSpellIfCan(m_creature, SPELL_GOUGE) == CAST_OK)
                {
                    if (Unit* pTarget = m_creature->getVictim())
                    {
                        if (m_creature->getThreatManager().getThreat(pTarget))
                            m_creature->getThreatManager().modifyThreatPercent(pTarget, -80);
                    }

                    m_uiGougeTimer = urand(17000, 27000);
                }
            }
            else
                m_uiGougeTimer -= uiDiff;

            // Transform to Panther
            if (m_uiTransformTimer < uiDiff)
            {
                if (DoCastSpellIfCan(m_creature, SPELL_PANTHER_TRANSFORM) == CAST_OK)
                {
                    m_uiTransformTimer = 80000;
                    m_bIsPhaseTwo = true;
                }
            }
            else
                m_uiTransformTimer -= uiDiff;
        }
        // Panther phase
        else
        {
            if (m_uiRavageTimer < uiDiff)
            {
                if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_RAVAGE) == CAST_OK)
                    m_uiRavageTimer = urand(10000, 15000);
            }
            else
                m_uiRavageTimer -= uiDiff;

            if (m_uiTrashTimer < uiDiff)
            {
                if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_TRASH) == CAST_OK)
                    m_uiTrashTimer = urand(13000, 15000);
            }
            else
                m_uiTrashTimer -= uiDiff;

            if (m_uiWhirlwindTimer < uiDiff)
            {
                if (DoCastSpellIfCan(m_creature, SPELL_WHIRLWIND) == CAST_OK)
                    m_uiWhirlwindTimer = 15000;
            }
            else
                m_uiWhirlwindTimer -= uiDiff;

            if (m_uiVanishTimer < uiDiff)
            {
                // Note: this is a workaround because we do not know the real vanish spell
                m_creature->SetVisibility(VISIBILITY_OFF);
                DoResetThreat();

                m_uiVanishTimer = 85000;
                m_uiVisibleTimer = 45000;
            }
            else
                m_uiVanishTimer -= uiDiff;

            // Transform back
            if (m_uiTransformTimer < uiDiff)
            {
                m_creature->RemoveAurasDueToSpell(SPELL_PANTHER_TRANSFORM);
                m_uiTransformTimer = 30000;
                m_bIsPhaseTwo = false;
            }
            else
                m_uiTransformTimer -= uiDiff;
        }

        DoMeleeAttackIfReady();
    }