Example #1
0
    void JustReachedHome() override
    {
        if (m_pInstance)
            m_pInstance->SetData(TYPE_IONAR, FAIL);

        DespawnSpark();
    }
Example #2
0
    void JustDied(Unit* killer)
    {
        DoScriptText(SAY_DEATH, m_creature);
        DespawnSpark();

        if (m_pInstance)
            m_pInstance->SetData(TYPE_IONAR, DONE);
    }
Example #3
0
    void UpdateAI(const uint32 uiDiff)
    {
        // Splitted
        if (m_creature->GetVisibility() == VISIBILITY_OFF)
        {
            if (!m_creature->getVictim())
            {
                Reset();
                return;
            }

            if (m_uiSplit_Timer < uiDiff)
            {
                m_uiSplit_Timer = 2500;

                // Return sparks to where Ionar splitted
                if (m_bIsSplitPhase)
                {
                    CallBackSparks();
                    m_bIsSplitPhase = false;
                }
                // Lightning effect and restore Ionar
                else if (m_uiSparkAtHomeCount == MAX_SPARKS)
                {
                    m_creature->SetVisibility(VISIBILITY_ON);
                    m_creature->CastSpell(m_creature, SPELL_SPARK_DESPAWN, false);

                    DespawnSpark();

                    m_uiSparkAtHomeCount = 0;
                    m_uiSplit_Timer = 25000;
                    m_bIsSplitPhase = true;

                    if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != TARGETED_MOTION_TYPE)
                    {
                        if (m_creature->getVictim())
                            m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                    }
                }
            }
            else
                m_uiSplit_Timer -= uiDiff;

            return;
        }

        //Return since we have no target
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (m_uiStaticOverload_Timer < uiDiff)
        {
            if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
                DoCast(pTarget, m_bIsRegularMode ? SPELL_STATIC_OVERLOAD_N : SPELL_STATIC_OVERLOAD_H);

            m_uiStaticOverload_Timer = urand(5000, 6000);
        }
        else
            m_uiStaticOverload_Timer -= uiDiff;

        if (m_uiBallLightning_Timer < uiDiff)
        {
            DoCast(m_creature->getVictim(), m_bIsRegularMode ? SPELL_BALL_LIGHTNING_N : SPELL_BALL_LIGHTNING_H);
            m_uiBallLightning_Timer = urand(10000, 11000);
        }
        else
            m_uiBallLightning_Timer -= uiDiff;

        // Health check
        if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < (100-(20*m_uiHealthAmountModifier)))
        {
            ++m_uiHealthAmountModifier;

            DoScriptText(urand(0, 1) ? SAY_SPLIT_1 : SAY_SPLIT_2, m_creature);

            if (m_creature->IsNonMeleeSpellCasted(false))
                m_creature->InterruptNonMeleeSpells(false);

            DoCast(m_creature, SPELL_DISPERSE);
        }

        DoMeleeAttackIfReady();
    }
Example #4
0
    void UpdateAI(const uint32 uiDiff)
    {
        // Splitted
        if (m_creature->GetVisibility() == VISIBILITY_OFF)
        {
            if (!m_creature->isInCombat())
            {
                Reset();
                return;
            }

            if (m_uiSplit_Timer < uiDiff)
            {
                m_uiSplit_Timer = 2500;

                // Return sparks to where Ionar splitted
                if (m_bIsSplitPhase)
                {
                    CallBackSparks();
                    m_bIsSplitPhase = false;
                }
                // Lightning effect and restore Ionar
                else 
                {
                    m_creature->SetVisibility(VISIBILITY_ON);
                    m_creature->CastSpell(m_creature, SPELL_SPARK_DESPAWN, false);

                    DespawnSpark();

                    m_uiSparkAtHomeCount = 0;
                    m_uiSplit_Timer = 25000;
                    m_bIsSplitPhase = true;

                    if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
                    {
                        if (m_creature->getVictim())
                            m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                    }
                }
            }
            else
                m_uiSplit_Timer -= uiDiff;

            return;
        }

        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (m_uiStaticOverload_Timer < uiDiff)
        {
            if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0))
                DoCastSpellIfCan(pTarget, m_bIsRegularMode ? SPELL_STATIC_OVERLOAD_N : SPELL_STATIC_OVERLOAD_H);

            m_uiStaticOverload_Timer = urand(5000, 6000);
        }
        else
            m_uiStaticOverload_Timer -= uiDiff;

        if (m_uiBallLightning_Timer < uiDiff)
        {
            if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0))
                m_creature->CastSpell(pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), m_bIsRegularMode ? SPELL_BALL_LIGHTNING_N : SPELL_BALL_LIGHTNING_H, false, NULL, NULL, m_creature->GetObjectGuid());
            m_uiBallLightning_Timer = urand(10000, 11000);
        }
        else
            m_uiBallLightning_Timer -= uiDiff;

        // Health check
        if (m_creature->GetHealthPercent() < float(100 - 20*m_uiHealthAmountModifier))
        {
            ++m_uiHealthAmountModifier;

            DoScriptText(urand(0, 1) ? SAY_SPLIT_1 : SAY_SPLIT_2, m_creature);

            if (m_creature->IsNonMeleeSpellCasted(false))
                m_creature->InterruptNonMeleeSpells(false);

            DoCastSpellIfCan(m_creature, SPELL_DISPERSE);
        }

        DoMeleeAttackIfReady();
    }