void EnterCombat(Unit *who)
 {
     DoAttackerAreaInCombat(who, 100);
     Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
     if(target)
         SendAttacker(target);
 }
 void DoAggroPuls(const uint32 diff)
 {
     if(AreaInCombat_Timer <= diff)
     {
         DoAttackerAreaInCombat(me->getVictim(), 100);
         AreaInCombat_Timer = 5000;
     }else AreaInCombat_Timer -= diff;
 }
Example #3
0
        void EnterCombat(Unit* who)
        {
            DoScriptText(SAY_AGGRO, me);
            Phase = PHASE_1;
            events.ScheduleEvent(EVENT_CRYSTAL,30000);
            events.ScheduleEvent(EVENT_SUMMON,1000);

            me->RemoveAllAuras();
            DoCast(SPELL_ARCANE_FIELD);
            if (instance)
            {
                for (std::list<uint64>::const_iterator itr = luiCrystals.begin(); itr != luiCrystals.end(); ++itr)
                {
                    if (GameObject* temp = instance->instance->GetGameObject(*itr))
                        temp->SetGoState(GO_STATE_ACTIVE);
                }
                instance->SetData(DATA_NOVOS_EVENT, IN_PROGRESS);
            }
            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);

            DoAttackerAreaInCombat(who,100);
        }
        void UpdateAI(const uint32 diff)
        {
            if (!UpdateVictim())
                return;

            if(pulse_Timer < diff)
            {
                DoAttackerAreaInCombat(me->getVictim(),50);
                pulse_Timer = 10000;
            }else pulse_Timer -= diff;

            if(TidalShieldTimer < diff)
            {
                if(TryDoCast(me, SPELL_TIDAL_SHIELD, true))
                {
                    ResetTimer(45000);
                    TidalShieldTimer = 60000;
                }
            }else TidalShieldTimer -= diff;

            if(!me->HasAura(SPELL_BERSERK,0))
            {
                if(EnrageTimer < diff)
                {
                    DoScriptText(SAY_ENRAGE2, me);
                    DoCast(me, SPELL_BERSERK, true);
                }else EnrageTimer -= diff;
            }

            if(SpecialYellTimer < diff)
            {
                switch(rand()%2)
                {
                case 0: DoScriptText(SAY_SPECIAL1, me); break;
                case 1: DoScriptText(SAY_SPECIAL2, me); break;
                }
                SpecialYellTimer = 25000 + (rand()%76)*1000;
            }else SpecialYellTimer -= diff;

            if(ImpalingSpineTimer < diff)
            {
                if(!me->IsNonMeleeSpellCasted(false))
                {
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 80,true);
                    if(!target) target = me->getVictim();
                    if(target)
                    {
                        DoCast(target, SPELL_IMPALING_SPINE);
                        SpineTargetGUID = target->GetGUID();
                        //must let target summon, otherwise you cannot click the spine
                        target->SummonGameObject(GOBJECT_SPINE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), me->GetOrientation(), 0, 0, 0, 0, 0);

                        switch(rand()%2)
                        {
                        case 0: DoScriptText(SAY_NEEDLE1, me); break;
                        case 1: DoScriptText(SAY_NEEDLE2, me); break;
                        }
                        ImpalingSpineTimer = 21000;
                    }
                }
            }else ImpalingSpineTimer -= diff;

            if(NeedleSpineTimer < diff)
            {
                if(TryDoCast(me, SPELL_NEEDLE_SPINE, true))
                {
                    //std::list<Unit*> target;
                    //SelectUnitList(target, 3, SELECT_TARGET_RANDOM, 100, true);
                    //for(std::list<Unit*>::iterator i = target.begin(); i != target.end(); ++i)
                    //    me->CastSpell(*i, 39835, true);
                    NeedleSpineTimer = 3000;
                }
            }else NeedleSpineTimer -= diff;


            DoMeleeAttackIfReady();
        }
Example #5
0
        void UpdateAI(const uint32 diff)
        {
            if(!UpdateVictim())
                return;
        
            if(Phase1)
            {
                if(pulse_Timer < diff)
                {
                    if(me->GetPositionZ() > (COORD_Z_HOME+15))
                    {
                        EnterEvadeMode();
                        return;
                    }

                    DoAttackerAreaInCombat(me->getVictim(),50);
                    pulse_Timer = 10000;
                }else pulse_Timer -= diff;
            }

            if(!me->HasAura(SPELL_BERSERK, 0))
            {
                if(EnrageTimer < diff)
                {
                    DoCast(me, SPELL_BERSERK);
                    switch(rand()%2)
                    {
                    case 0: DoScriptText(SAY_ENRAGE1, me); break;
                    case 1: DoScriptText(SAY_ENRAGE2, me); break;
                    }
                }else EnrageTimer -= diff;
            }

            if(ArcingSmashTimer < diff)
            {
                DoCast(me->getVictim(),Phase1 ? SPELL_ARCING_SMASH_1 : SPELL_ARCING_SMASH_2);
                ArcingSmashTimer = 10000;
            }else ArcingSmashTimer -= diff;

            if(FelBreathTimer < diff)
            {
                DoCast(me->getVictim(),Phase1 ? SPELL_FELBREATH_1 : SPELL_FELBREATH_2);
                FelBreathTimer = 25000;
            }else FelBreathTimer -= diff;

            if(EjectTimer < diff)
            {
                DoCast(me->getVictim(),Phase1 ? SPELL_EJECT_1 : SPELL_EJECT_2);
                EjectTimer = 15000;
            }else EjectTimer -= diff;


            if(Charge_Timer < diff)
            {
                if(me->GetDistance2d(me->getVictim()) > 15)
                    DoCast(me->getVictim(),SPELL_CHARGE);
                Charge_Timer = 10000;
            }else Charge_Timer -= diff;

            if(Phase1)
            {
                if(BewilderingStrikeTimer < diff)
                {
                    DoCast(me->getVictim(), SPELL_BEWILDERING_STRIKE);
                    //float mt_threat = DoGetThreat(me->getVictim());
                    //if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1))
                    //    me->AddThreat(target, mt_threat);
                    BewilderingStrikeTimer = 20000;
                }else BewilderingStrikeTimer -= diff;

                //if(EjectTimer < diff)
                //{
                //    DoCast(me->getVictim(), SPELL_EJECT1);
                //    DoModifyThreatPercent(me->getVictim(), -40);
                //    EjectTimer = 15000;
                //}else EjectTimer -= diff;

                //if(AcidicWoundTimer < diff)
                //{
                //    DoCast(me->getVictim(), SPELL_ACIDIC_WOUND);
                //    AcidicWoundTimer = 10000;
                //}else AcidicWoundTimer -= diff;

                if(BloodboilTimer < diff)
                {
                    if(BloodboilCount < 5)                      // Only cast it five times.
                    {
                        CastBloodboil(); // Causes issues on windows, so is commented out.
                        //DoCast(me->getVictim(), SPELL_BLOODBOIL);
                        ++BloodboilCount;
                        BloodboilTimer = 10000;
                    }
                }else BloodboilTimer -= diff;
            }

            if(!Phase1)
            {
                //if(FelGeyserTimer < diff)
                //{
                //    DoCast(me->getVictim(), SPELL_FEL_GEYSER,true);
                //    FelGeyserTimer = 30000;
                //}else FelGeyserTimer -= diff;

                if(me->getVictim() && me->getVictim()->IsImmunedToDamage(SPELL_SCHOOL_MASK_ALL))
                    me->getThreatManager().modifyThreatPercent(me->getVictim(),-100);
            }

            if(PhaseChangeTimer < diff)
            {
                if(Phase1)
                {
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0,100,true);
                    if(target && target->isAlive())
                    {
                        Phase1 = false;

                        TargetThreat = DoGetThreat(target);
                        TargetGUID = target->GetGUID();
                        if(DoGetThreat(target))
                            DoModifyThreatPercent(target, -100);
                        me->AddThreat(target, 50000000.0f);
                        target->CastSpell(me, SPELL_TAUNT_GURTOGG, true);
                        me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
                        me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);

                        // If VMaps are disabled, this spell can call the whole instance
                        DoCast(me, SPELL_INSIGNIFIGANCE, true);
                        DoCast(target,SPELL_FEL_RAGE_1, true);
                        DoCast(target,SPELL_FEL_RAGE_2, true);
                        DoCast(target,SPELL_FEL_RAGE_3, true);
                        DoCast(target,SPELL_FEL_RAGE_SCALE, true);
                        DoCast(target,SPELL_FEL_GEYSER,true);

                        //Cast this without triggered so that it appears in combat logs and shows visual.
                        DoCast(me, SPELL_FEL_RAGE_SELF);

                        switch(rand()%2)
                        {
                        case 0: DoScriptText(SAY_SPECIAL1, me); break;
                        case 1: DoScriptText(SAY_SPECIAL2, me); break;
                        }

                        FelGeyserTimer = 1;
                        PhaseChangeTimer = 30000;
                    }
                }else                                           // Encounter is a loop pretty much. Phase 1 -> Phase 2 -> Phase 1 -> Phase 2 till death or enrage
                {
                    if(TargetGUID)
                        RevertThreatOnTarget(TargetGUID);
                    TargetGUID = 0;
                    Phase1 = true;
                    BloodboilTimer = 10000;
                    BloodboilCount = 0;
                    /*AcidicWoundTimer += 2000;*/
                    ArcingSmashTimer += 2000;
                    FelBreathTimer += 2000;
                    EjectTimer += 2000;
                    PhaseChangeTimer = 65000;
                    me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
                    me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
                }
            }else PhaseChangeTimer -= diff;

            DoMeleeAttackIfReady();
        }
Example #6
0
        void UpdateAI(const uint32 diff)
        {
            if(!UpdateVictim())
                return;

            if(pulse_Timer < diff)
            {
                DoAttackerAreaInCombat(me->getVictim(),50);
                pulse_Timer = 10000;
            }else pulse_Timer -= diff;

            if(((me->GetHealth()*100 / me->GetMaxHealth()) < 10) && !Enraged)
            {
                Enraged = true;
                DoCast(me, SPELL_ENRAGE, true);
                DoScriptText(SAY_ENRAGE, me);
            }

            CastBeam(diff);
            //if(BeamTimer < diff)
            //{
            //    if(!me->IsNonMeleeSpellCasted(false))
            //    {
            //        switch(CurrentBeam)
            //        {
            //            case 0:
            //                DoCast(me, SPELL_BEAM_SINISTER_TRIGGER);
            //                break;
            //            case 1:
            //                DoCast(me, SPELL_BEAM_VILE_TRIGGER);
            //                break;
            //            case 2:
            //                DoCast(me, SPELL_BEAM_WICKED_TRIGGER);
            //                break;
            //            case 3:
            //                DoCast(me, SPELL_BEAM_SINFUL_TRIGGER);
            //                break;
            //        }
            //        uint32 Beam = CurrentBeam;
            //        while(CurrentBeam == Beam)
            //            CurrentBeam = rand()%4;

            //        BeamTimer = 30000;
            //    }
            //}else BeamTimer -= diff;



            // Select 3 random targets (can select same target more than once), teleport to a random location then make them cast explosions until they get away from each other.
            if(FatalAttractionTimer < diff)
            {
                TeleportPlayers();

                switch(rand()%2)
                {
                case 0: DoScriptText(SAY_SPELL2, me); break;
                case 1: DoScriptText(SAY_SPELL3, me); break;
                }
                FatalAttractionExplodeTimer = 2000;
                FatalAttractionTimer = 30000;
            }else FatalAttractionTimer -= diff;

            if(FatalAttractionExplodeTimer < diff)
            {
                Player* targets[3];
                for(uint8 i = 0; i < 3; ++i)
                {
                    if(TargetGUID[i])
                        targets[i] = Unit::GetPlayer(*me,TargetGUID[i]);
                    else
                        targets[i] = NULL;
                }

                if(targets[0] && targets[0]->isAlive())
                {
                    bool isNear = false;
                    if(targets[1] && targets[1]->isAlive() && targets[0]->GetDistance2d(targets[1]) < 25)
                        isNear = true;

                    if(!isNear)
                        if(targets[2] && targets[2]->isAlive() && targets[0]->GetDistance2d(targets[2]) < 25)
                            isNear = true;
                
                    if(isNear)
                        targets[0]->CastSpell(targets[0],SPELL_ATTRACTION,true);
                    else
                    {
                        targets[0]->RemoveAurasDueToSpell(SPELL_ATTRACTION_VIS);
                        TargetGUID[0] = 0;
                        targets[0] = NULL;
                    }
                }

            
                if(targets[1] && targets[1]->isAlive())
                {
                    bool isNear = false;
                    if(targets[0] && targets[0]->isAlive() && targets[1]->GetDistance2d(targets[0]) < 25)
                        isNear = true;

                    if(!isNear)
                        if(targets[2] && targets[2]->isAlive() && targets[1]->GetDistance2d(targets[2]) < 25)
                            isNear = true;
                
                    if(isNear)
                        targets[1]->CastSpell(targets[1],SPELL_ATTRACTION,true);
                    else
                    {
                        targets[1]->RemoveAurasDueToSpell(SPELL_ATTRACTION_VIS);
                        TargetGUID[1] = 0;
                        targets[1] = NULL;
                    }
                }

                if(targets[2] && targets[2]->isAlive())
                {
                    bool isNear = false;
                    if(targets[0] && targets[0]->isAlive() && targets[2]->GetDistance2d(targets[0]) < 25)
                        isNear = true;

                    if(!isNear)
                        if(targets[1] && targets[1]->isAlive() && targets[2]->GetDistance2d(targets[1]) < 25)
                            isNear = true;

                    if(isNear)
                        targets[2]->CastSpell(targets[1],SPELL_ATTRACTION,true);
                    else
                    {
                        targets[2]->RemoveAurasDueToSpell(SPELL_ATTRACTION_VIS);
                        TargetGUID[2] = 0;
                        targets[2] = NULL;
                    }
                }

                bool allClear = true;
                for(uint8 i = 0; i < 3; i++)
                {
                    if(TargetGUID[i] != 0)
                        allClear = false;
                }

                if(allClear)
                    FatalAttractionExplodeTimer = 60000;
                else
                    FatalAttractionExplodeTimer = 1000;

            }else FatalAttractionExplodeTimer -= diff;

            if(ShriekTimer < diff)
            {
                if(TryDoCast(me->getVictim(), SPELL_SILENCING_SHRIEK))
                    ShriekTimer = 20000;
            }else ShriekTimer -= diff;

            //if(SaberTimer < diff)
            //{
            //    if(TryDoCast(me->getVictim(), SPELL_SABER_LASH))
            //        SaberTimer = 10000;
            //}else SaberTimer -= diff;

            //Enrage
            if(!me->HasAura(SPELL_BERSERK, 0))
                if(EnrageTimer < diff)
                {
                    DoCast(me, SPELL_BERSERK);
                    DoScriptText(SAY_ENRAGE, me);
                }else EnrageTimer -= diff;

            //Random taunts
            if(RandomYellTimer < diff)
            {
                switch(rand()%3)
                {
                case 0: DoScriptText(SAY_TAUNT1, me); break;
                case 1: DoScriptText(SAY_TAUNT2, me); break;
                case 2: DoScriptText(SAY_TAUNT3, me); break;
                }
            }else RandomYellTimer -= diff;

            DoMeleeAttackIfReady();
        }
        void UpdateAI(const uint32 diff)
        {
            if(Intro)
            {
                if(AggroTimer < diff)
                {
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                    DoScriptText(SAY_AGGRO, me);
                    me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
                    Intro = false;
                    if(AggroTargetGUID)
                    {
                        Unit* pUnit = Unit::GetUnit((*me), AggroTargetGUID);
                        if(pUnit)
                            AttackStart(pUnit);

                        DoZoneInCombat();
                    }
                    else
                    {
                        EnterEvadeMode();
                        return;
                    }
                }else AggroTimer -= diff;
            }

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

            if(pulse_Timer < diff)
            {
                DoAttackerAreaInCombat(me->getVictim(),50);
                pulse_Timer = 10000;
            }else pulse_Timer -= diff;

            //if(SummonShadowsTimer < diff)
            //{
            //    MindControlGhost();

            //    for(uint8 i = 0; i < 2; ++i)
            //    {
            //        Creature* Shadow = NULL;
            //        float X = CalculateRandomLocation(me->GetPositionX(), 10);
            //        //Shadow = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, X, me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0);
            //        if(Shadow)
            //        {
            //            Unit *ptarget = SelectTarget(SELECT_TARGET_RANDOM, 1);
            //            if(!ptarget)
            //                ptarget = me->getVictim();

            //            if(ptarget)
            //                Shadow->AI()->AttackStart(ptarget);
            //        }
            //    }
            //    SummonShadowsTimer = 60000;
            //}else SummonShadowsTimer -= diff;

            if(SummonDoomBlossomTimer < diff)
            {
                if (Unit *ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
                {
                    if(TryDoCast(ptarget,SPELL_SUMMON_DOOM_BLOSSOM))
                        SummonDoomBlossomTimer = 35000;
                }
            }else SummonDoomBlossomTimer -= diff;

            if(IncinerateTimer < diff)
            {
                Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 300, true);
                if(!target)
                    target = me->getVictim();

                if(target)
                {
                    if(TryDoCast(target, SPELL_INCINERATE))
                    {
                        switch(rand()%2)
                        {
                        case 0: DoScriptText(SAY_SPECIAL1, me); break;
                        case 1: DoScriptText(SAY_SPECIAL2, me); break;
                        }
                        IncinerateTimer = 10000 + (rand()%10) * 1000;
                    }
                }
            }else IncinerateTimer -= diff;

            if(CrushingShadowsTimer < diff)
            {
                if(!me->IsNonMeleeSpellCasted(false))
                {
                    SpellEntry *spellInfo;
                    spellInfo = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_CRUSHING_SHADOWS);
                    if(spellInfo)
                    {
                        spellInfo->MaxAffectedTargets = 5;
                        me->CastSpell(me,spellInfo,false);
                    }
                    CrushingShadowsTimer = 10000 + rand()%5000;
                }
            }else CrushingShadowsTimer -= diff;

            if(ShadowOfDeathTimer < diff)
            {
                if(!me->IsNonMeleeSpellCasted(false))
                {
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 300, true);

                    if(!target)
                       target = me->getVictim();

                    if(target && target->isAlive() && target->GetTypeId() == TYPEID_PLAYER && !target->HasAura(SPELL_SHADOW_OF_DEATH,1) )
                    {
                        // Custom ... becaus Effekt is not needed
                        SpellEntry *spellInfo;
                        spellInfo = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_SHADOW_OF_DEATH);
                        if(spellInfo)
                        {
                            spellInfo->Effect[0] = 0;
                            me->CastSpell(target,spellInfo,false);
                        }

                        //DoCast(target, SPELL_SHADOW_OF_DEATH);
                    
                        //me->CastCustomSpell(target,SPELL_SHADOW_OF_DEATH,NULL,NULL,NULL,false);
                        /*GhostGUID = target->GetGUID();*/
                        ShadowOfDeathTimer = 30000;
                        //SummonShadowsTimer = 53000; // Make it VERY close but slightly less so that we can check if the aura is still on the player
                    }
                }
            }else ShadowOfDeathTimer -= diff;

            if(SummonShadowsTimer < diff)
            {
                if(!shadowtargets.empty())
                {

                    std::list<uint64> del_player;
                    del_player.clear();
                    for(std::list<uint64>::iterator itr = shadowtargets.begin(); itr != shadowtargets.end(); ++itr)
                    {
                        Player* temp = Unit::GetPlayer(*me,*itr);
                        if(temp)
                        {
                            if(temp->isDead() || !temp->HasAuraEffect(SPELL_SHADOW_OF_DEATH,1))
                            {
                                float x,y,z;
                                temp->GetPosition(x,y,z);
                                Unit *ptarget;
                                Creature* c_temp;

                                c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x+3 ,y+3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0);
                                ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
                                if(!ptarget) ptarget = me->getVictim();
                                if(ptarget) c_temp->Attack(ptarget,true);

                                c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x-3 ,y+3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0);
                                ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
                                if(!ptarget) ptarget = me->getVictim();
                                if(ptarget) c_temp->Attack(ptarget,true);

                                c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x+3 ,y-3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0);
                                ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
                                if(!ptarget) ptarget = me->getVictim();
                                if(ptarget) c_temp->Attack(ptarget,true);

                                c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x-3 ,y-3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0);
                                ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
                                if(!ptarget) ptarget = me->getVictim();
                                if(ptarget) c_temp->Attack(ptarget,true);

                                del_player.push_back(*itr);
                            }
                        }/*else
                            del_player.push_back(*itr);*/
                        //Auskommentieren fixt ALT+F4 Exploit 
                    }
                    for(std::list<uint64>::iterator itr = del_player.begin(); itr != del_player.end(); ++itr)
                    {
                        shadowtargets.remove(*itr);
                        Player* sacrifice = Unit::GetPlayer(*me,*itr);
                        if(sacrifice && sacrifice->isAlive())
                        {
                            me->DealDamage(sacrifice,sacrifice->GetHealth());
                        }
                    }
                }
                SummonShadowsTimer = 1000;
            }else SummonShadowsTimer -= diff;

            if(RandomYellTimer < diff)
            {
                switch(rand()%2)
                {
                case 0: DoScriptText(SAY_SPELL1, me); break;
                case 1: DoScriptText(SAY_SPELL2, me); break;
                }
                RandomYellTimer = 50000 + rand()%51 * 1000;
            }else RandomYellTimer -= diff;

            if(!me->HasAura(SPELL_BERSERK, 0))
            {
                if(EnrageTimer < diff)
                {
                    DoCast(me, SPELL_BERSERK);
                    DoScriptText(SAY_ENRAGE, me);
                }else EnrageTimer -= diff;
            }

            DoMeleeAttackIfReady();
        }
Example #8
0
        void UpdateAI(const uint32 diff)
        {
            if (!UpdateVictim())
                return;

            if(pulse_Timer < diff)
            {
                if(me->getVictim() && me->getVictim()->GetTypeId() == TYPEID_PLAYER)
                    DoAttackerGroupInCombat(((Player*)me->getVictim()));
                else 
                    DoAttackerAreaInCombat(me->getVictim(),50);
                pulse_Timer = 5000;
            }else pulse_Timer -= diff;

            if(!me->HasAura(SPELL_BERSERK, 0))
            {
                if(BerserkTimer < diff)
                    DoCast(me, SPELL_BERSERK);
                else BerserkTimer -= diff;
            }

            if(SummonFlameTimer < diff)
            {
                DoCast(me, SPELL_MOLTEN_PUNCH);
                SummonFlameTimer = 10000;
            }else SummonFlameTimer -= diff;

            if(Phase1)
            {
                if(HatefulStrikeTimer < diff)
                {
                    if(Unit* target = CalculateHatefulStrikeTarget())
                    {
                        DoCast(target, SPELL_HATEFUL_STRIKE);
                        HatefulStrikeTimer = 5000;
                    }
                }else HatefulStrikeTimer -= diff;
            }

            if(!Phase1)
            {
                if(SwitchTargetTimer < diff)
                {
                    if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
                    {
                        if(me->GetDistance2d(me->getVictim()) < 40)
                            me->CastSpell(me->getVictim(),SPELL_CHARGE,false);

                        DoResetThreat();
                        me->AddThreat(target, 5000000.0f);
                        DoScriptText(EMOTE_NEW_TARGET, me);
                        SwitchTargetTimer = 10000;
                    }
                }else SwitchTargetTimer -= diff;

                if(SummonVolcanoTimer < diff)
                {
                    if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true))
                    {
                        DoCast(target, SPELL_VOLCANIC_SUMMON);
                        DoScriptText(EMOTE_GROUND_CRACK, me);
                        SummonVolcanoTimer = 10000;
                    }
                }else SummonVolcanoTimer -= diff;
            }

            if(PhaseSwitchTimer < diff)
            {
                if(!Phase1)
                {
                    Phase1 = true;
                    DoResetThreat();
                    PhaseSwitchTimer = 60000;
                    me->SetSpeed(MOVE_RUN, 1.2f);
                    DoZoneInCombat();
                    me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
                    me->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, false);
                }
                else
                {
                    Phase1 = false;
                    DoResetThreat();
                    SwitchTargetTimer = 10000;
                    SummonVolcanoTimer = 2000;
                    PhaseSwitchTimer = 60000;
                    me->SetSpeed(MOVE_RUN, 0.9f);
                    DoZoneInCombat();
                    me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
                    me->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
                }
            }else PhaseSwitchTimer -= diff;

            DoMeleeAttackIfReady();
        }