Example #1
0
    void Aggro(Unit* /*pWho*/) override
    {
        if (m_pInstance)
        {
            m_pInstance->SetData(TYPE_HALION, IN_PROGRESS);
            m_pInstance->SendEncounterFrame(ENCOUNTER_FRAME_ENGAGE, m_creature->GetObjectGuid(), 1);
        }

        DoScriptText(SAY_AGGRO, m_creature);
        DoCastSpellIfCan(m_creature, SPELL_TWILIGHT_PRECISION, CAST_TRIGGERED);
    }
Example #2
0
    void JustReachedHome() override
    {
        DoRemoveTwilightPhaseAura();

        if (m_pInstance)
            m_pInstance->SetData(TYPE_HALION, FAIL);
    }
Example #3
0
    void JustDied(Unit* /*pKiller*/) override
    {
        if (m_pInstance)
            m_pInstance->SetData(TYPE_HALION, DONE);

        DoScriptText(SAY_DEATH, m_creature);
    }
    void Aggro(Unit* /*pWho*/) override
    {
        DoScriptText(SAY_AGGRO, m_creature);

        if (m_pInstance)
            m_pInstance->SetData(TYPE_ZARITHRIAN, IN_PROGRESS);
    }
Example #5
0
    void Aggro(Unit* /*pWho*/) override
    {
        if (m_pInstance)
            m_pInstance->SendEncounterFrame(ENCOUNTER_FRAME_ENGAGE, m_creature->GetObjectGuid(), 2);

        DoCastSpellIfCan(m_creature, SPELL_DUSK_SHROUD, CAST_TRIGGERED);
        DoCastSpellIfCan(m_creature, SPELL_TWILIGHT_PRECISION, CAST_TRIGGERED);
    }
Example #6
0
    void Aggro(Unit* /*pWho*/) override
    {
        if (m_pInstance)
            m_pInstance->SetData(TYPE_HALION, IN_PROGRESS);

        DoScriptText(SAY_AGGRO, m_creature);
        DoCastSpellIfCan(m_creature, SPELL_TWILIGHT_PRECISION, CAST_TRIGGERED);
    }
Example #7
0
 void JustReachedHome() override
 {
     // Allow real Halion to evade
     if (m_pInstance)
     {
         if (Creature* pHalion = m_pInstance->GetSingleCreatureFromStorage(NPC_HALION_REAL))
             pHalion->AI()->EnterEvadeMode();
     }
 }
Example #8
0
    void JustDied(Unit* /*pKiller*/) override
    {
        // ToDo: handle the damage sharing!

        DoScriptText(SAY_DEATH, m_creature);

        // Allow real Halion to remove all phase aura from player.
        if (m_pInstance)
        {
            if (Creature* pHalion = m_pInstance->GetSingleCreatureFromStorage(NPC_HALION_REAL))
                m_creature->AI()->SendAIEvent(AI_EVENT_CUSTOM_A, m_creature, pHalion);
        }
    }
    void UpdateAI(const uint32 uiDiff) override
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (m_uiCleaveArmorTimer < uiDiff)
        {
            if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE_ARMOR) == CAST_OK)
                m_uiCleaveArmorTimer = 15000;
        }
        else
            m_uiCleaveArmorTimer -= uiDiff;

        if (m_uiIntimidatingRoarTimer < uiDiff)
        {
            if (DoCastSpellIfCan(m_creature, SPELL_INTIMIDATING_ROAR) == CAST_OK)
                m_uiIntimidatingRoarTimer = 32000;
        }
        else
            m_uiIntimidatingRoarTimer -= uiDiff;

        if (m_uiCallFlamecallerTimer < uiDiff)
        {
            if (!m_pInstance)
            {
                script_error_log("Instance Ruby Sanctum: ERROR Failed to load instance data for this instace.");
                return;
            }

            GuidList m_lStalkersGuidList;
            m_pInstance->GetSpawnStalkersGuidList(m_lStalkersGuidList);

            for (GuidList::const_iterator itr = m_lStalkersGuidList.begin(); itr != m_lStalkersGuidList.end(); ++itr)
            {
                if (Creature* pStalker = m_creature->GetMap()->GetCreature(*itr))
                    pStalker->CastSpell(pStalker, SPELL_SUMMON_FLAMECALLER, true, NULL, NULL, m_creature->GetObjectGuid());
            }

            DoScriptText(SAY_SUMMON, m_creature);
            m_uiCallFlamecallerTimer = 45000;
        }
        else
            m_uiCallFlamecallerTimer -= uiDiff;

        DoMeleeAttackIfReady();

        EnterEvadeIfOutOfCombatArea(uiDiff);
    }
Example #10
0
    void DoPrepareTwilightPhase()
    {
        if (!m_pInstance)
            return;

        // Spawn the orbs and the carriers. Use the twilight Halion version to preserve the phase
        if (Creature* pHalion = m_pInstance->GetSingleCreatureFromStorage(NPC_HALION_TWILIGHT))
        {
            // Set current Halion hp
            pHalion->SetHealth(m_creature->GetHealth());

            // NOTE: the spawn coords seem to be totally off, compared to the actual map layout - requires additional research!!!

            // Spawn the rotation focus first
            // pHalion->SummonCreature(NPC_ORB_ROTATION_FOCUS, aRotationFocusPosition[0], aRotationFocusPosition[1], aRotationFocusPosition[2], aRotationFocusPosition[3], TEMPSPAWN_DEAD_DESPAWN, 0);

            // Then spawn the orb carriers and the shadow orbs. ToDo: research if it's possible to make this dynamic
            // pHalion->SummonCreature(NPC_ORB_CARRIER, aOrbCarrierPosition1[0], aOrbCarrierPosition1[1], aOrbCarrierPosition1[2], 0, TEMPSPAWN_DEAD_DESPAWN, 0);
            // pHalion->SummonCreature(NPC_ORB_CARRIER, aOrbCarrierPosition2[0], aOrbCarrierPosition2[1], aOrbCarrierPosition2[2], 0, TEMPSPAWN_DEAD_DESPAWN, 0);
            // pHalion->SummonCreature(NPC_SHADOW_ORB_1, aOrbCarrierPosition1[0], aOrbCarrierPosition1[1], aOrbCarrierPosition1[2], 0, TEMPSPAWN_DEAD_DESPAWN, 0);
            // pHalion->SummonCreature(NPC_SHADOW_ORB_2, aOrbCarrierPosition2[0], aOrbCarrierPosition2[1], aOrbCarrierPosition2[2], 0, TEMPSPAWN_DEAD_DESPAWN, 0);
        }
    }
Example #11
0
    void UpdateAI(const uint32 uiDiff) override
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        switch (m_uiPhase)
        {
            case PHASE_PHISYCAL_REALM:
                // nothing here - phase not handled by this npc
                break;
            case PHASE_BOTH_REALMS:
            // ToDo: handle corporeality
            // no break;
            case PHASE_TWILIGHT_REALM:

                if (m_uiTailLashTimer < uiDiff)
                {
                    if (DoCastSpellIfCan(m_creature, SPELL_TAIL_LASH) == CAST_OK)
                        m_uiTailLashTimer = urand(15000, 25000);
                }
                else
                    m_uiTailLashTimer -= uiDiff;

                if (m_uiCleaveTimer < uiDiff)
                {
                    if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE) == CAST_OK)
                        m_uiCleaveTimer = urand(10000, 15000);
                }
                else
                    m_uiCleaveTimer -= uiDiff;

                if (m_uiDarkBreathTimer < uiDiff)
                {
                    if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_DARK_BREATH) == CAST_OK)
                        m_uiDarkBreathTimer = urand(15000, 20000);
                }
                else
                    m_uiDarkBreathTimer -= uiDiff;

                if (m_uiSoulConsumptionTimer < uiDiff)
                {
                    if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0, SPELL_SOUL_CONSUMPTION, SELECT_FLAG_PLAYER))
                    {
                        if (DoCastSpellIfCan(pTarget, SPELL_SOUL_CONSUMPTION) == CAST_OK)
                            m_uiSoulConsumptionTimer = 25000;
                    }
                }
                else
                    m_uiSoulConsumptionTimer -= uiDiff;

                // Switch to phase 3
                if (m_creature->GetHealthPercent() < 50.0f && m_uiPhase == PHASE_TWILIGHT_REALM)
                {
                    if (DoCastSpellIfCan(m_creature, SPELL_TWILIGHT_DIVISION, CAST_INTERRUPT_PREVIOUS) == CAST_OK)
                    {
                        if (m_pInstance)
                        {
                            // ToDo: Update world states and spawn the exit portals

                            // Set the real Halion health, so it can also begin phase 3
                            if (Creature* pHalion = m_pInstance->GetSingleCreatureFromStorage(NPC_HALION_REAL))
                                pHalion->SetHealth(m_creature->GetHealth());
                        }

                        DoScriptText(SAY_PHASE_3, m_creature);
                        m_uiPhase = PHASE_BOTH_REALMS;
                    }
                }

                break;
        }

        DoMeleeAttackIfReady();
    }
Example #12
0
    void UpdateAI(const uint32 uiDiff) override
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (m_uiBerserkTimer)
        {
            if (m_uiBerserkTimer <= uiDiff)
            {
                if (DoCastSpellIfCan(m_creature, SPELL_BERSERK) == CAST_OK)
                {
                    // Do the same for the Twilight halion
                    if (m_pInstance)
                    {
                        if (Creature* pHalion = m_pInstance->GetSingleCreatureFromStorage(NPC_HALION_TWILIGHT, true))
                            pHalion->CastSpell(pHalion, SPELL_BERSERK, TRIGGERED_OLD_TRIGGERED);
                    }

                    DoScriptText(SAY_BERSERK, m_creature);
                    m_uiBerserkTimer = 0;
                }
            }
            else
                m_uiBerserkTimer -= uiDiff;
        }

        switch (m_uiPhase)
        {
            case PHASE_BOTH_REALMS:
            // ToDo: handle corporeality
            // no break;
            case PHASE_PHISYCAL_REALM:

                if (m_uiTailLashTimer < uiDiff)
                {
                    if (DoCastSpellIfCan(m_creature, SPELL_TAIL_LASH) == CAST_OK)
                        m_uiTailLashTimer = urand(15000, 25000);
                }
                else
                    m_uiTailLashTimer -= uiDiff;

                if (m_uiCleaveTimer < uiDiff)
                {
                    if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE) == CAST_OK)
                        m_uiCleaveTimer = urand(10000, 15000);
                }
                else
                    m_uiCleaveTimer -= uiDiff;

                if (m_uiFlameBreathTimer < uiDiff)
                {
                    if (DoCastSpellIfCan(m_creature, SPELL_FLAME_BREATH) == CAST_OK)
                        m_uiFlameBreathTimer = urand(15000, 20000);
                }
                else
                    m_uiFlameBreathTimer -= uiDiff;

                if (m_uiFieryCombustionTimer < uiDiff)
                {
                    if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0, SPELL_FIERY_COMBUSTION, SELECT_FLAG_PLAYER))
                    {
                        if (DoCastSpellIfCan(pTarget, SPELL_FIERY_COMBUSTION) == CAST_OK)
                            m_uiFieryCombustionTimer = 25000;
                    }
                }
                else
                    m_uiFieryCombustionTimer -= uiDiff;

                if (m_uiMeteorTimer < uiDiff)
                {
                    if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1))
                    {
                        if (DoCastSpellIfCan(pTarget, SPELL_METEOR_SUMMON) == CAST_OK)
                        {
                            DoScriptText(SAY_FIREBALL, m_creature);
                            m_uiMeteorTimer = 40000;
                        }
                    }
                }
                else
                    m_uiMeteorTimer -= uiDiff;

                // Switch to phase 2
                if (m_creature->GetHealthPercent() < 75.0f && m_uiPhase == PHASE_PHISYCAL_REALM)
                {
                    if (DoCastSpellIfCan(m_creature, SPELL_TWILIGHT_PHASING, CAST_INTERRUPT_PREVIOUS) == CAST_OK)
                    {
                        DoCastSpellIfCan(m_creature, SPELL_SUMMON_PORTAL, CAST_TRIGGERED);
                        DoScriptText(SAY_PHASE_2, m_creature);
                        DoPrepareTwilightPhase();
                        m_uiPhase = PHASE_TWILIGHT_REALM;
                    }
                }

                break;
            case PHASE_TWILIGHT_REALM:

                // Switch to phase 3
                if (m_creature->GetHealthPercent() < 50.0f)
                {
                    m_creature->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING);
                    DoScriptText(SAY_PHASE_3, m_creature);
                    m_uiPhase = PHASE_BOTH_REALMS;
                }

                break;
        }

        DoMeleeAttackIfReady();
    }
Example #13
0
 void JustReachedHome() override
 {
     if (m_pInstance)
         m_pInstance->SetData(TYPE_HALION, FAIL);
 }
Example #14
0
 void JustReachedHome() override
 {
     if (m_pInstance)
         m_pInstance->SetData(TYPE_ZARITHRIAN, FAIL);
 }