void ExecuteEvent(uint32 eventId) override
            {
                if (eventId == EVENT_SPECIAL_ABILITY)
                {
                    if (CurrentStage == MAX_STAGES)
                        GenerateStageSequence();

                    switch (Stage[CurrentStage])
                    {
                        case STAGE_DARK_VORTEX:
                            if (Creature* sister = GetSister())
                                sister->AI()->DoAction(ACTION_VORTEX);
                            break;
                        case STAGE_DARK_PACT:
                            if (Creature* sister = GetSister())
                                sister->AI()->DoAction(ACTION_PACT);
                            break;
                        case STAGE_LIGHT_VORTEX:
                            DoAction(ACTION_VORTEX);
                            break;
                        case STAGE_LIGHT_PACT:
                            DoAction(ACTION_PACT);
                            break;
                        default:
                            break;
                    }
                    ++CurrentStage;
                    events.ScheduleEvent(EVENT_SPECIAL_ABILITY, 45 * IN_MILLISECONDS);
                }
                else
                    boss_twin_baseAI::ExecuteEvent(eventId);
            }
Ejemplo n.º 2
0
    void JustDied(Unit* /*killer*/)
    {
        DoScriptText(SAY_DEATH, me);

        HandleAuraOnRaidTwinValkyr(me, SPELL_POWER_UP, true, false, 0);
        HandleAuraOnRaidTwinValkyr(me, SPELL_LIGHT_ESSENCE, true, false, 0);
        HandleAuraOnRaidTwinValkyr(me, SPELL_DARK_ESSENCE, true, false, 0);

        if (m_instance)
        {
            m_instance->SetData(DATA_HEALTH_TWIN_SHARED, 0);

            if (Creature* pSister = GetSister())
            {
                if (!pSister->isAlive())
                {
                    m_instance->SetData(TYPE_VALKIRIES, DONE);
                }
                else
                    m_instance->SetData(TYPE_VALKIRIES, SPECIAL);
            }
            else
                m_instance->SetData(TYPE_VALKIRIES, DONE); // In case we cannot find sister, set done by default
        }

        Summons.DespawnAll();
    }
Ejemplo n.º 3
0
    void DamageTaken(Unit* pDoneBy, uint32 &uiDamage)
    {
        if (!me || !me->isAlive())
            return;

        if (pDoneBy->GetGUID() == me->GetGUID())
            return;

        if (pDoneBy->ToPlayer())
        {
            if (pDoneBy->HasAura(m_uiOtherEssenceSpellId))
                uiDamage += uiDamage/2;
            if (pDoneBy->HasAura(m_uiEmpoweredWeaknessSpellId))
                uiDamage += uiDamage;
            else
                if (pDoneBy->HasAura(m_uiMyEssenceSpellId))
                    uiDamage /= 2;
        }

        if (m_pInstance)
        {
            if (Creature* pSister = GetSister())
            {
                pSister->DealDamage(pSister, uiDamage);
                pSister->LowerPlayerDamageReq(uiDamage);
            }
        }
    }
Ejemplo n.º 4
0
    void JustDied(Unit* /*pKiller*/)
    {
        DoScriptText(SAY_DEATH, me);
        if(pInstance)
        {
            pInstance->SetData(DATA_HEALTH_TWIN_SHARED, 0);
            if(Creature* pSister = GetSister())
            {
                if(!pSister->isAlive())
                {
                    me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
                    pSister->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
                    pInstance->SetData(TYPE_VALKIRIES, DONE);
                    Summons.DespawnAll();
                } else {
                    pInstance->SetData(TYPE_VALKIRIES, SPECIAL);
                    me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
                }
            }
        }
        Summons.DespawnAll();

        if(fight_Timer <= 180000) //3 min
            pInstance->DoCompleteAchievement(RAID_MODE(3799, 3815, 3799, 3815)); //Salt and Pepper
    }
Ejemplo n.º 5
0
 void SpellHit(Unit* caster, const SpellEntry* spell)
 {
     if (caster->GetGUID() == me->GetGUID())
         if (spell->Effect[0] == 136) // Effect Heal
             if (m_pInstance)
             {
                 if (Creature* pSister = GetSister())
                     pSister->DealHeal(pSister, spell->EffectBasePoints[0]);
             }
 }
Ejemplo n.º 6
0
    void EnterCombat(Unit* /*who*/) override
    {
        me->SetInCombatWithZone();
        if (Creature* pSister = GetSister())
        {
            me->AddAura(MyEmphatySpellId, pSister);
            pSister->SetInCombatWithZone();
        }
        instance->SetBossState(BOSS_VALKIRIES, IN_PROGRESS);

        Talk(SAY_AGGRO);
        DoCast(me, SurgeSpellId);
    }
Ejemplo n.º 7
0
 void JustDied(Unit* /*pKiller*/) {
     DoScriptText(SAY_DEATH, me);
     if (m_pInstance) {
         m_pInstance->SetData(DATA_HEALTH_TWIN_SHARED, 0);
         if (Creature* pSister = GetSister()) {
             if (!pSister->isAlive()) {
                 m_pInstance->SetData(TYPE_VALKIRIES, DONE);
                 Summons.DespawnAll();
             } else
                 m_pInstance->SetData(TYPE_VALKIRIES, SPECIAL);
         }
     }
     Summons.DespawnAll();
 }
Ejemplo n.º 8
0
    void JustReachedHome()
    {
        if (m_instance)
        {
            m_instance->SetData(TYPE_VALKIRIES, FAIL);
            m_instance->SetData(DATA_HEALTH_TWIN_SHARED, me->GetMaxHealth());
        }

        me->DespawnOrUnsummon();

        if (Creature* Sister = GetSister())
        {
            Sister->DespawnOrUnsummon();
        }
    }
Ejemplo n.º 9
0
    void EnterCombat(Unit* /*who*/)
    {
        me->SetInCombatWithZone();
        if (m_pInstance)
        {
            if (Creature* pSister = GetSister())
            {
                me->AddAura(m_uiMyEmphatySpellId, pSister);
                pSister->SetInCombatWithZone();
            }
            m_pInstance->SetData(TYPE_VALKIRIES, IN_PROGRESS);
        }

        DoScriptText(SAY_AGGRO, me);
        DoCast(me, m_uiSurgeSpellId);
    }
Ejemplo n.º 10
0
    void EnterCombat(Unit* /*who*/)
    {
        if (m_instance)
        {
            m_instance->SetData(TYPE_VALKIRIES, IN_PROGRESS);
            m_instance->SetData(DATA_HEALTH_TWIN_SHARED, me->GetMaxHealth());
        }

        DoZoneInCombat();

        if (Creature* Sister = GetSister())
        {
            DoZoneInCombat(Sister);
        }

        DoScriptText(SAY_AGGRO, me);
        DoCast(me, m_uiSurgeSpellId);
    }
Ejemplo n.º 11
0
    void EnterCombat(Unit* /*who*/)
    {
        me->SetInCombatWithZone();
        if (m_pInstance)
        {
            if (Creature* pSister = GetSister())
                me->AddAura(m_uiMyEmphatySpellId, pSister);

            m_pInstance->SetData(TYPE_VALKIRIES, IN_PROGRESS);
        }
        if (me->isAlive())
        {
            me->SummonCreature(m_uiEssenceNpcId, EssenceLocation[0].GetPositionX(), EssenceLocation[0].GetPositionY(), EssenceLocation[0].GetPositionZ());
            me->SummonCreature(m_uiEssenceNpcId, EssenceLocation[1].GetPositionX(), EssenceLocation[1].GetPositionY(), EssenceLocation[1].GetPositionZ());
        }
        DoScriptText(SAY_AGGRO, me);
        DoCast(me, m_uiSurgeSpellId);
    }
Ejemplo n.º 12
0
    void EnterCombat(Unit* /*who*/) override
    {
        me->SetInCombatWithZone();
        if (Creature* pSister = GetSister())
        {
            me->AddAura(MyEmphatySpellId, pSister);
            pSister->SetInCombatWithZone();
        }
        instance->SetBossState(BOSS_VALKIRIES, IN_PROGRESS);

        Talk(SAY_AGGRO);
        DoCast(me, SurgeSpellId);

        events.ScheduleEvent(EVENT_TWIN_SPIKE, 20 * IN_MILLISECONDS);
        events.ScheduleEvent(EVENT_BERSERK, IsHeroic() ? 6 * MINUTE*IN_MILLISECONDS : 10 * MINUTE*IN_MILLISECONDS);
        if (IsHeroic())
            events.ScheduleEvent(EVENT_TOUCH, urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS));
    }
Ejemplo n.º 13
0
 void JustDied(Unit* /*killer*/) override
 {
     Talk(SAY_DEATH);
     if (Creature* pSister = GetSister())
     {
         if (!pSister->IsAlive())
         {
             me->SetFlag(OBJECT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
             pSister->SetFlag(OBJECT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
             _JustDied();
         }
         else
         {
             me->RemoveFlag(OBJECT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
             instance->SetBossState(BOSS_VALKIRIES, SPECIAL);
         }
     }
     summons.DespawnAll();
 }
Ejemplo n.º 14
0
 void DoAction(int32 action) override
 {
     switch (action)
     {
         case ACTION_VORTEX:
             Talk(EMOTE_VORTEX);
             DoCastAOE(VortexSpellId);
             break;
         case ACTION_PACT:
             Talk(EMOTE_TWIN_PACT);
             Talk(SAY_TWIN_PACT);
             if (Creature* sister = GetSister())
                 sister->CastSpell(sister, SPELL_POWER_TWINS, false);
             DoCast(me, ShieldSpellId);
             DoCast(me, TwinPactSpellId);
             break;
         default:
             break;
     }
 }
    void JustEngagedWith(Unit* /*who*/) override
    {
        DoZoneInCombat();
        if (Creature* pSister = GetSister())
        {
            me->AddAura(MyEmphatySpellId, pSister);
            DoZoneInCombat(pSister);
        }
        instance->SetBossState(DATA_TWIN_VALKIRIES, IN_PROGRESS);

        Talk(SAY_AGGRO);
        DoCast(me, SurgeSpellId);
        me->SetCombatPulseDelay(5);
        me->setActive(true);

        events.ScheduleEvent(EVENT_TWIN_SPIKE, 20s);
        events.ScheduleEvent(EVENT_BERSERK, IsHeroic() ? 6min : 8min);
        if (IsHeroic())
            events.ScheduleEvent(EVENT_TOUCH, 10s, 15s);
    }
 void JustDied(Unit* /*killer*/) override
 {
     Talk(SAY_DEATH);
     if (Creature* pSister = GetSister())
     {
         if (!pSister->IsAlive())
         {
             me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
             pSister->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
             events.Reset();
             summons.DespawnAll();
             HandleRemoveAuras();
             instance->SetBossState(DATA_TWIN_VALKIRIES, DONE);
         }
         else
         {
             me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
             instance->SetBossState(DATA_TWIN_VALKIRIES, SPECIAL);
         }
     }
     summons.DespawnAll();
 }
Ejemplo n.º 17
0
    void JustDied(Unit* /*killer*/)
    {
        DoScriptText(SAY_DEATH, me);
        if (m_pInstance)
        {
            if (Creature* pSister = GetSister())
            {
                if (!pSister->isAlive())
                {
                    me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
                    pSister->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);

                    m_pInstance->SetData(TYPE_VALKIRIES, DONE);
                    Summons.DespawnAll();
                }
                else
                {
                    me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
                    m_pInstance->SetData(TYPE_VALKIRIES, SPECIAL);
                }
            }
        }
        Summons.DespawnAll();
    }
Ejemplo n.º 18
0
    void UpdateAI(const uint32 uiDiff)
    {
        if (!m_pInstance || !UpdateVictim())
            return;

        switch (m_uiStage)
        {
        case 0:
            break;
        case 1: // Vortex
            if (m_uiSpecialAbilityTimer <= uiDiff)
            {
                if (Creature* pSister = GetSister())
                    pSister->AI()->DoAction(ACTION_VORTEX);
                DoScriptText(m_uiVortexEmote, me);
                DoScriptText(m_uiVortexSay, me);
                DoCastAOE(m_uiVortexSpellId);
                m_uiStage = 0;
                m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS;
            }
            else
                m_uiSpecialAbilityTimer -= uiDiff;
            break;
        case 2: // Shield+Pact
            if (m_uiSpecialAbilityTimer <= uiDiff)
            {
                DoScriptText(EMOTE_SHIELD, me);
                DoScriptText(SAY_SHIELD, me);
                if (Creature* pSister = GetSister())
                {
                    pSister->AI()->DoAction(ACTION_PACT);
                    pSister->CastSpell(pSister, SPELL_POWER_TWINS, false);
                }
                DoCast(me, m_uiShieldSpellId);
                DoCast(me, m_uiTwinPactSpellId);
                m_uiStage = 0;
                m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS;
            }
            else
                m_uiSpecialAbilityTimer -= uiDiff;
            break;
        default:
            break;
        }

        if (m_uiSpikeTimer <= uiDiff)
        {
            DoCastVictim(m_uiSpikeSpellId);
            m_uiSpikeTimer = 20*IN_MILLISECONDS;
        }
        else
            m_uiSpikeTimer -= uiDiff;

        if (IsHeroic() && m_uiTouchTimer <= uiDiff)
        {
            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true, m_uiOtherEssenceSpellId))
                me->CastCustomSpell(m_uiTouchSpellId, SPELLVALUE_MAX_TARGETS, 1, target, false);
            m_uiTouchTimer = urand(10, 15)*IN_MILLISECONDS;
        }
        else
            m_uiTouchTimer -= uiDiff;

        if (!m_bIsBerserk && m_uiBerserkTimer <= uiDiff)
        {
            DoCast(me, SPELL_BERSERK);
            DoScriptText(SAY_BERSERK, me);
            m_bIsBerserk = true;
        }
        else
            m_uiBerserkTimer -= uiDiff;

        DoMeleeAttackIfReady();
    }
Ejemplo n.º 19
0
    void UpdateAI(const uint32 diff)
    {
        if(me->isInCombat())
            fight_Timer += diff;

        if(!pInstance || !UpdateVictim())
            return;

        if(pInstance->GetData(DATA_HEALTH_TWIN_SHARED) != 0)
            me->SetHealth(pInstance->GetData(DATA_HEALTH_TWIN_SHARED));
        else
            me->SetHealth(1);

        switch(m_uiStage)
        {
            case 0:
                break;
            case 1: // Vortex
                if(m_uiSpecialAbilityTimer <= diff)
                {
                    if(Creature* pSister = GetSister())
                        pSister->AI()->DoAction(ACTION_VORTEX);
                    DoScriptText(m_uiVortexEmote, me);
                    DoScriptText(m_uiVortexSay, me);
                    DoCastAOE(m_uiVortexSpellId);
                    m_uiStage = 0;
                    m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS;
                }
                else
                    m_uiSpecialAbilityTimer -= diff;
                break;
            case 2: // Shield+Pact
                if(m_uiSpecialAbilityTimer <= diff)
                {
                    if(Creature* pSister = GetSister())
                        pSister->AI()->DoAction(ACTION_PACT);
                    DoScriptText(EMOTE_SHIELD, me);
                    DoScriptText(SAY_SHIELD, me);
                    DoCast(me, m_uiShieldSpellId);
                    DoCast(me, m_uiTwinPactSpellId);
                    m_uiStage = 0;
                    m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS;
                }
                else
                    m_uiSpecialAbilityTimer -= diff;
                break;
            default:
                break;
        }

        if(m_uiSpikeTimer <= diff)
        {
            DoCastVictim(m_uiSpikeSpellId);
            m_uiSpikeTimer = 20*IN_MILLISECONDS;
        }
        else
            m_uiSpikeTimer -= diff;

        if(IsHeroic() && m_uiTouchTimer <= diff)
        {
            if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true, m_uiOtherEssenceSpellId))
                me->CastCustomSpell(m_uiTouchSpellId, SPELLVALUE_MAX_TARGETS, 1, target, false);
            m_uiTouchTimer = urand(10, 15)*IN_MILLISECONDS;
        }
        else
            m_uiTouchTimer -= diff;

        if(m_uiColorballsTimer <= diff)
        {
            if(m_uiWaveCount >= 2)
            {
                SummonColorballs(12);
                m_uiWaveCount = 0;
            }
            else
            {
                SummonColorballs(2);
                m_uiWaveCount++;
            }
            m_uiColorballsTimer = 15*IN_MILLISECONDS;
        }
        else
            m_uiColorballsTimer -= diff;

        if(!m_bIsBerserk && m_uiBerserkTimer <= diff)
        {
            DoCast(me, SPELL_BERSERK);
            DoScriptText(SAY_BERSERK, me);
            m_bIsBerserk = true;
        }
        else
            m_uiBerserkTimer -= diff;

        if(me->HasUnitState(UNIT_STAT_CASTING))
            return;

        DoMeleeAttackIfReady();
    }
Ejemplo n.º 20
0
    void UpdateAI(uint32 diff)
    {
        if (!instance || !UpdateVictim())
            return;

        if (me->HasUnitState(UNIT_STATE_CASTING))
            return;

        switch (Stage)
        {
            case 0:
                break;
            case 1: // Vortex
                if (SpecialAbilityTimer <= diff)
                {
                    if (Creature* pSister = GetSister())
                        pSister->AI()->DoAction(ACTION_VORTEX);
                    Talk(VortexEmote);
                    DoCastAOE(VortexSpellId);
                    Stage = 0;
                    SpecialAbilityTimer = 1*MINUTE*IN_MILLISECONDS;
                }
                else
                    SpecialAbilityTimer -= diff;
                break;
            case 2: // Shield + Pact
                if (SpecialAbilityTimer <= diff)
                {
                    Talk(EMOTE_TWINK_PACT);
                    Talk(SAY_TWINK_PACT);
                    if (Creature* pSister = GetSister())
                    {
                        pSister->AI()->DoAction(ACTION_PACT);
                        pSister->CastSpell(pSister, SPELL_POWER_TWINS, false);
                    }
                    DoCast(me, ShieldSpellId);
                    DoCast(me, TwinPactSpellId);
                    Stage = 0;
                    SpecialAbilityTimer = 1*MINUTE*IN_MILLISECONDS;
                }
                else
                    SpecialAbilityTimer -= diff;
                break;
            default:
                break;
        }

        if (SpikeTimer <= diff)
        {
            DoCastVictim(SpikeSpellId);
            SpikeTimer = 20*IN_MILLISECONDS;
        }
        else
            SpikeTimer -= diff;

        if (IsHeroic() && TouchTimer <= diff)
        {
            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, OtherEssenceSpellId))
                me->CastCustomSpell(TouchSpellId, SPELLVALUE_MAX_TARGETS, 1, target, false);
            TouchTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS);
        }
        else
            TouchTimer -= diff;

        if (!IsBerserk && BerserkTimer <= diff)
        {
            DoCast(me, SPELL_BERSERK);
            Talk(SAY_BERSERK);
            IsBerserk = true;
        }
        else
            BerserkTimer -= diff;

        DoMeleeAttackIfReady();
    }
Ejemplo n.º 21
0
    void UpdateAI(const uint32 uiDiff)
    {
        if (!m_instance || !UpdateVictim())
            return;

        if (m_instance->GetData(DATA_HEALTH_TWIN_SHARED) != 0)
            me->SetHealth(m_instance->GetData(DATA_HEALTH_TWIN_SHARED));
        else if (me->getVictim())
        {
            me->LowerPlayerDamageReq(me->GetMaxHealth());
            me->getVictim()->Kill(me);
            return;
        }
        else
            me->SetHealth(1);

        if (m_uiSpecialAbilityTimer <= uiDiff)
        {
            me->InterruptNonMeleeSpells(false);

            if (urand(0, 1))
            {
                DoScriptText(m_uiVortexEmote, me);
                DoScriptText(m_uiVortexSay, me);
                DoCastAOE(m_uiVortexSpellId);

                std::list<Unit*> targetList;

                SelectTargetList(targetList, 100, SELECT_TARGET_NEAREST, 150.0f, true, m_uiMyEssenceSpellId);
                if (!targetList.empty())
                {
                    for (std::list<Unit* >::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
                    {
                        Unit* pUnit = (*itr);
                        if (pUnit && pUnit->isAlive())
                        {
                            if (!pUnit->HasAura(SPELL_POWER_UP))
                                pUnit->AddAura(SPELL_POWER_UP, pUnit);

                            if (Aura* aur = pUnit->GetAura(SPELL_POWER_UP))
                            {
                                if (aur->GetStackAmount() + 30 > 100)
                                {
                                    pUnit->RemoveAurasDueToSpell(SPELL_POWER_UP);
                                    pUnit->CastSpell(pUnit, me->GetEntry() == NPC_LIGHTBANE ? SPELL_EMPOWERED_LIGHT : SPELL_EMPOWERED_DARK, true);
                                }
                                else
                                {
                                    if (urand(0, 100) <= 15)
                                        pUnit->CastSpell(pUnit, SPELL_SPEED, true);

                                    aur->SetStackAmount(aur->GetStackAmount() + 30);
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                DoScriptText(EMOTE_SHIELD, me);
                DoScriptText(SAY_SHIELD, me);

                if (Creature* Sister = GetSister())
                    Sister->CastSpell(Sister, SPELL_TWIN_POWER, true);

                DoCast(me, m_uiShieldSpellId);
                me->CastCustomSpell(me, m_uiTwinPactSpellId, 0, 0, 0, false);
            }

            m_uiSpecialAbilityTimer = 80000;

        } else m_uiSpecialAbilityTimer -= uiDiff;

        if (m_uiSpikeTimer <= uiDiff)
        {
            DoCastVictim(m_uiSpikeSpellId);
            m_uiSpikeTimer = 20*1000;
        } else m_uiSpikeTimer -= uiDiff;

        if (IsHeroic())
        {
            if (m_uiTouchTimer <= uiDiff)
            {
                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, m_uiOtherEssenceSpellId))
                {
                    if (!target->HasAura(m_uiTouchSpellId))
                    {
                        target->AddAura(m_uiTouchSpellId, target);
                    }
                }
                m_uiTouchTimer = urand(10, 15)*1000;
            } else m_uiTouchTimer -= uiDiff;
        }

        if (m_uiColorballsTimer <= uiDiff)
        {
            if (m_uiWaveCount >= 2)
            {
                SummonColorballs(15);
                m_uiWaveCount = 0;
            } 
            else
            {
                SummonColorballs(2);
                m_uiWaveCount++;
            }
            m_uiColorballsTimer = 15*1000;
        } else m_uiColorballsTimer -= uiDiff;

        if (m_uiBerserkTimer <= uiDiff)
        {
            if (!m_bIsBerserk)
            {
                DoCast(me, SPELL_BERSERK);
                DoScriptText(SAY_BERSERK, me);
                m_bIsBerserk = true;
            }
        } else m_uiBerserkTimer -= uiDiff;

        DoMeleeAttackIfReady();
    }
    void UpdateAI(const uint32 uiDiff)
    {
        if (!m_pInstance || !UpdateVictim())
            return;

        if (m_pInstance->GetData(DATA_HEALTH_TWIN_SHARED) != 0)
            me->SetHealth(m_pInstance->GetData(DATA_HEALTH_TWIN_SHARED));
        else
            me->SetHealth(1);

        switch (m_uiStage)
        {
            case 0:
                break;
            case 1: // Vortex
                if (m_uiSpecialAbilityTimer <= uiDiff)
                {
                    if (Creature* pSister = GetSister())
                        pSister->AI()->DoAction(ACTION_VORTEX);
                    DoScriptText(m_uiVortexEmote, me);
                    DoScriptText(m_uiVortexSay, me);
                    DoCastAOE(m_uiVortexSpellId);
                    m_uiStage = 0;
                    m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS;
                }
                else
                    m_uiSpecialAbilityTimer -= uiDiff;
                break;
            case 2: // Shield+Pact
                if (m_uiSpecialAbilityTimer <= uiDiff)
                {
                    if (Creature* pSister = GetSister())
                        pSister->AI()->DoAction(ACTION_PACT);
                    DoScriptText(EMOTE_SHIELD, me);
                    DoScriptText(SAY_SHIELD, me);
                    DoCast(me, m_uiShieldSpellId);
                    DoCast(me, m_uiTwinPactSpellId);
                    m_uiStage = 0;
                    m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS;
                }
                else
                    m_uiSpecialAbilityTimer -= uiDiff;
                break;
            default:
                break;
        }

        if (m_uiSpikeTimer <= uiDiff)
        {
            DoCastVictim(m_uiSpikeSpellId);
            m_uiSpikeTimer = 20*IN_MILLISECONDS;
        }
        else
            m_uiSpikeTimer -= uiDiff;

        if (IsHeroic() && m_uiTouchTimer <= uiDiff)
        {
            if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true, m_uiOtherEssenceSpellId))
                if (pTarget->isAlive()) 
                {
                    me->AddAura(m_uiTouchSpellId,pTarget);    
                    m_uiTouchTimer = 20*IN_MILLISECONDS;
                }
                else
                    m_uiTouchTimer = 0;
            else
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM,0,200,true))
                    if (pTarget->isAlive() && !pTarget->HasAura(m_uiMyEssenceSpellId)) 
                    {
                        me->AddAura(m_uiTouchSpellId,pTarget);  
                        m_uiTouchTimer = 20*IN_MILLISECONDS;
                    }
                    else
                        m_uiTouchTimer = 0;
        }
        else
            m_uiTouchTimer -= uiDiff;               

        if (m_uiColorballsTimer <= uiDiff)
        {
            if (m_uiWaveCount >= 2)
            {
                SummonColorballs(12);
                m_uiWaveCount = 0;
            }
            else
            {
                SummonColorballs(2);
                m_uiWaveCount++;
            }
            m_uiColorballsTimer = 15*IN_MILLISECONDS;
        }
        else
            m_uiColorballsTimer -= uiDiff;

        if (!m_bIsBerserk && m_uiBerserkTimer <= uiDiff)
        {
            DoCast(me, SPELL_BERSERK);
            DoScriptText(SAY_BERSERK, me);
            m_bIsBerserk = true;
        }
        else
            m_uiBerserkTimer -= uiDiff;

        DoMeleeAttackIfReady();
    }