Ejemplo n.º 1
0
		void UpdateAI(uint32 diff)
		{
			if( TargetGUID )
			{
				Unit* target = ObjectAccessor::GetPlayer(*me, TargetGUID);
				if( !target || !target->HasAura(SPELL_MARK) || !me->IsValidAttackTarget(target) || me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE || !me->HasUnitState(UNIT_STATE_CHASE_MOVE) )
				{
					SelectNewTarget(true);
					return;
				}
			}

			events.Update(diff);

			switch( events.GetEvent() )
			{
				case 0:
					break;
				case 1:
					me->CastSpell(me, SPELL_SPIKE_SPEED2, true);
					events.PopEvent();
					events.RescheduleEvent(2, 7000);
					break;
				case 2:
					me->CastSpell(me, SPELL_SPIKE_SPEED3, true);
					events.PopEvent();
					break;
				case 3:
					Reset();
					break;
			}
		}
Ejemplo n.º 2
0
        void UpdateAI(uint32 diff)
        {
            if (!UpdateVictim())
                return;

            events.Update(diff);

            // Special events which needs to be fired immidiately
            switch(events.GetEvent())
            {
                case EVENT_SARTHARION_SUMMON_LAVA:
                    if (!urand(0,3))
                        Talk(SAY_SARTHARION_SPECIAL);

                    SummonLavaWaves();
                    events.RepeatEvent(25000);
                    return;
                case EVENT_SARTHARION_START_LAVA:
                    SendLavaWaves(true);
                    events.PopEvent();
                    return;
                case EVENT_SARTHARION_FINISH_LAVA:
                    SendLavaWaves(false);
                    events.PopEvent();
                    return;
            }

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

            HandleSartharionAbilities();
            HandleDrakeAbilities();

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

			events.Update(diff);

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

			switch (events.GetEvent())
			{
				case EVENT_BOULDER:
				{
					if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0)) 
						me->CastSpell(target, DUNGEON_MODE(BOULDER_TOSS, BOULDER_TOSS_H), false);

					events.RepeatEvent(5000 + rand()%2000);
					break;
				}
				case EVENT_GROUND_SPIKE:
				{
					me->CastSpell(me->GetVictim(), GROUND_SPIKE_H, false); // current enemy target
					events.RepeatEvent(8000 + rand()%3000);
					break;
				}
				case EVENT_STOMP:
				{
					me->CastSpell(me, DUNGEON_MODE(STOMP, STOMP_H), false);
					events.RepeatEvent(13000 + rand()% 5000);
					break;
				}
				case EVENT_GROUND_SLAM:
				{
					events.RepeatEvent(10000 + rand()%3000);
					me->CastSpell(me->GetVictim(), GROUND_SLAM, true);
					events.DelayEvents(10000);
					events.RescheduleEvent(EVENT_SHATTER, 8000);
					break;
				}
				case EVENT_SHATTER:
				{
					me->CastSpell((Unit*)NULL, DUNGEON_MODE(SHATTER, SHATTER_H), false);
					Talk(SAY_SHATTER);
					events.RescheduleEvent(EVENT_REMOVE_STONED, 1500);
					events.PopEvent();
					break;
				}
				case EVENT_REMOVE_STONED:
				{
					RemoveStonedEffect();
					events.PopEvent();
					break;
				}
			}

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

			events.Update(diff);
			if (me->HasUnitState(UNIT_STATE_CASTING))
				return;

			switch (events.GetEvent())
			{
				case EVENT_SUMMON_FERAL_DEFENDER:
					me->MonsterTextEmote("Auriaya begins to activate Feral Defender.", 0, true);
					me->CastSpell(me, SPELL_ACTIVATE_FERAL_DEFENDER, true);
					events.PopEvent();
					me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true);
					events.ScheduleEvent(EVENT_REMOVE_IMMUNE, 3000);
					break;
				case EVENT_REMOVE_IMMUNE:
					events.PopEvent();
					me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false);
					break;
				case EVENT_TERRIFYING_SCREECH:
					me->MonsterTextEmote("Auriaya begins to cast Terrifying Screech.", 0, true);
					me->CastSpell(me, SPELL_TERRIFYING_SCREECH, false);
					events.RepeatEvent(35000);
					break;
				case EVENT_SONIC_SCREECH:
					me->CastSpell(me, SPELL_SONIC_SCREECH, false);
					events.RepeatEvent(50000);
					break;
				case EVENT_GUARDIAN_SWARM:
					me->CastSpell(me->GetVictim(), SPELL_GUARDIAN_SWARM, false);
					events.RepeatEvent(40000);
					break;
				case EVENT_SENTINEL_BLAST:
					me->CastSpell(me, SPELL_SENTINEL_BLAST, false);
					events.RepeatEvent(35000);
					events.DelayEvents(5000, 0);
					break;
				case EVENT_RESPAWN_FERAL_DEFENDER:
				{
					EntryCheckPredicate pred(NPC_FERAL_DEFENDER);
					summons.DoAction(ACTION_FERAL_RESPAWN, pred);
					events.PopEvent();
					break;
				}
				case EVENT_ENRAGE:
					me->MonsterTextEmote("You waste my time!", 0);
					me->PlayDirectSound(SOUND_BERSERK);
					me->CastSpell(me, SPELL_ENRAGE, true);
					events.PopEvent();
					break;
			}

			DoMeleeAttackIfReady();
		}
Ejemplo n.º 5
0
        void UpdateAI(uint32 diff)
        {
            events.Update(diff);
            switch (events.GetEvent())
            {
                case EVENT_GRAUF_CHECK:
                {
                    CheckPlayers();
                    events.RepeatEvent(2000);
                    break;
                }
                case EVENT_GRAUF_START:
                {
                    me->GetMotionMaster()->Clear(true);
                    me->GetMotionMaster()->MoveTakeoff(10, SkadiPosition[0].GetPositionX(), SkadiPosition[0].GetPositionY(), SkadiPosition[0].GetPositionZ(), 3.0f);

                    SpawnHelpers(0);
                    SpawnHelpers(0);
                    events.ScheduleEvent(EVENT_GRAUF_MOVE, 15000);
                    events.ScheduleEvent(EVENT_GRAUF_SUMMON_HELPERS, 20000);
                    events.PopEvent();
                    break;
                }
                case EVENT_GRAUF_MOVE:
                {
                    AchievementHitCount = 0;
                    uint8 targetPoint = SelectNextPos(currentPos);
                    me->GetMotionMaster()->MovePoint(targetPoint, SkadiPosition[targetPoint].GetPositionX(), SkadiPosition[targetPoint].GetPositionY(), SkadiPosition[targetPoint].GetPositionZ());
                    if (targetPoint <= 1)
                    {
                        SpawnFlameTriggers(targetPoint);
                        me->CastSpell(me, SPELL_FLAME_VISUAL, false);
                    }

                    if (m_pInstance) 
                        m_pInstance->SetData(SKADI_IN_RANGE, 0);

                    currentPos = targetPoint;
                    events.RepeatEvent(25000);
                    break;
                }
                case EVENT_GRAUF_SUMMON_HELPERS:
                {
                    SpawnHelpers(1);
                    events.RepeatEvent(15000);
                    break;
                }
                case EVENT_GRAUF_REMOVE_SKADI:
                {
                    RemoveSkadi(false);
                    me->DespawnOrUnsummon();
                    events.PopEvent();
                    break;
                }
            }
        }
Ejemplo n.º 6
0
        void UpdateAI(uint32 diff)
        {
            if (!UpdateVictim())
                return;

			events.Update(diff);
			if (me->HasUnitState(UNIT_STATE_CASTING))
				return;

			switch (events.GetEvent())
			{
				case EVENT_SPELL_ARCANE_VOLLEY:
					me->CastSpell(me, SPELL_ARCANE_VOLLEY_N, false);
					events.RepeatEvent(urand(7000, 12000));
					break;
				case EVENT_SPELL_POLYMORPH:
					if (Unit* target = (IsHeroic() ? SelectTarget(SELECT_TARGET_RANDOM, 0) : SelectTarget(SELECT_TARGET_TOPAGGRO, 1)))
						me->CastSpell(target, SPELL_POLYMORPH_N, false);
					events.RepeatEvent(urand(15000, 17500));
					break;
				case EVENT_SPELL_SLOW:
					me->CastSpell(me, SPELL_SLOW, false);
                    events.RepeatEvent(urand(15000, 30000));
					break;
				case EVENT_HEALTH_CHECK:
					if (me->HealthBelowPct(20))
					{
						me->CastSpell(me, SPELL_MANA_SHIELD, false);
						events.PopEvent();
						return;
					}
					events.RepeatEvent(1000);
					break;
				case EVENT_SPELL_BLINK:
					Talk(EMOTE_ARCANE_EXP);
					if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
					{
						me->CastSpell(target, SPELL_BLINK, false);
						me->NearTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation());

						DoCast(target, SPELL_BLINK_TELEPORT);
					}
					events.RepeatEvent(urand(35000, 40000));
					events.DelayEvents(500);
					events.ScheduleEvent(EVENT_SPELL_BLINK_2, 0);
					return;
				case EVENT_SPELL_BLINK_2:
					me->CastSpell(me, SPELL_ARCANE_EXPLOSION_N, false);
					me->CastSpell(me, SPELL_ARCANE_BUBBLE, true);
					events.PopEvent();
					break;
            }

            DoMeleeAttackIfReady();
        }
Ejemplo n.º 7
0
        void UpdateAI(uint32 diff)
        {
            if( pInstance && pInstance->GetData(DATA_KELESETH) != IN_PROGRESS )
            {
                if( me->IsAlive() )
                    Unit::Kill(me, me);
                return;
            }

            if (!UpdateVictim())
                return;

            events.Update(diff);

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

            switch( events.GetEvent() )
            {
                case 0:
                    break;
                case EVENT_SPELL_DECREPIFY:
                    if( !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) )
                        me->CastSpell(me->GetVictim(), SPELL_DECREPIFY, false);
                    events.RepeatEvent(urand(15000,25000));
                    break;
                case EVENT_SPELL_BONE_ARMOR:
                    if( !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) )
                        me->CastSpell((Unit*)NULL, SPELL_BONE_ARMOR, false);
                    events.RepeatEvent(urand(40000,120000));
                    break;
                case EVENT_RESURRECT:
                    events.PopEvent();
                    events.DelayEvents(3500);
                    DoCast(me, SPELL_SCOURGE_RESURRECTION, true);
                    me->SetStandState(UNIT_STAND_STATE_STAND);
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
                    me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
                    me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
                    events.RescheduleEvent(EVENT_RESURRECT_2, 3000);
                    break;
                case EVENT_RESURRECT_2:
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                    me->SetControlled(false, UNIT_STATE_ROOT);
                    me->GetMotionMaster()->MoveChase(me->GetVictim());
                    events.PopEvent();
                    break;
            }

            if( !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) )
                DoMeleeAttackIfReady();
        }
Ejemplo n.º 8
0
        void UpdateAI(uint32 diff)
        {
            if (!UpdateVictim())
                return;

            events.Update(diff);

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

            switch (events.GetEvent())
            {
                case EVENT_BALL_LIGHTNING:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
                        me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_BALL_LIGHTNING_H : SPELL_BALL_LIGHTNING_N, false);
                    
                    events.RepeatEvent(10000 + rand()%1000);
                    break;
                case EVENT_STATIC_OVERLOAD:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
                        me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_STATIC_OVERLOAD_H : SPELL_STATIC_OVERLOAD_N, false);

                    events.RepeatEvent(5000 + rand()%1000);
                    break;
                case EVENT_CHECK_HEALTH:
                    if (HealthBelowPct(HealthCheck))
                        me->CastSpell(me, SPELL_DISPERSE, false);

                    events.RepeatEvent(1000);
                    return;
                case EVENT_CALL_SPARKS:
                {
                    EntryCheckPredicate pred(NPC_SPARK_OF_IONAR);
                    summons.DoAction(ACTION_CALLBACK, pred);
                    events.PopEvent();
                    events.ScheduleEvent(EVENT_RESTORE, 2000, 0, 2);
                    return;
                }
                case EVENT_RESTORE:
                    EntryCheckPredicate pred(NPC_SPARK_OF_IONAR);
                    summons.DoAction(ACTION_SPARK_DESPAWN, pred);
                    events.PopEvent();

                    me->SetVisible(true);
                    me->SetControlled(false, UNIT_STATE_STUNNED);
                    ScheduleEvents(true);
                    return;
            }

            DoMeleeAttackIfReady();
        }
        void UpdateAI(uint32 diff)
        {
            UpdateVictim();

            events.Update(diff);

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

            switch( events.GetEvent() )
            {
                case 0:
                    break;
                case EVENT_MEMORY_SCALE:
                    me->SetObjectScale(1.0f);
                    events.ScheduleEvent(EVENT_MEMORY_START_ATTACK, 5000);
                    events.PopEvent();
                    break;
                case EVENT_MEMORY_START_ATTACK:
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                    if( Unit* target = me->SelectNearestTarget(200.0f) )
                    {
                        AttackStart(target);
                        DoZoneInCombat();
                    }
                    me->SetReactState(REACT_AGGRESSIVE);
                    events.ScheduleEvent(EVENT_SPELL_OLD_WOUNDS, 8000);
                    events.ScheduleEvent(EVENT_SPELL_SHADOWS_PAST, 4000);
                    events.ScheduleEvent(EVENT_SPELL_WAKING_NIGHTMARE, urand(20000,30000));
                    events.PopEvent();
                    break;
                case EVENT_SPELL_OLD_WOUNDS:
                    if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f, true) )
                        me->CastSpell(target, SPELL_OLD_WOUNDS, true);
                    events.RepeatEvent(12000);
                    break;
                case EVENT_SPELL_SHADOWS_PAST:
                    if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true) )
                        me->CastSpell(target, SPELL_SHADOWS_PAST, false);
                    events.RepeatEvent(urand(15000,20000));
                    break;
                case EVENT_SPELL_WAKING_NIGHTMARE:
                    me->CastSpell(me, SPELL_WAKING_NIGHTMARE, false);
                    events.RepeatEvent(35000);
                    break;
            }

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

                events.Update(diff);

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

                switch (events.GetEvent())
                {
                    case EVENT_ROCK_SHARDS:
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
                            me->CastSpell(target, SPELL_ROCK_SHARDS, false);
                        
                        events.RepeatEvent(15000);
                        break;
                    case EVENT_CHOKING_CLOUD:
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
                            me->CastSpell(target, RAID_MODE(SPELL_CRUSHING_LEAP_10, SPELL_CRUSHING_LEAP_25), true); //10y~80y, ignore range
                        
                        events.RepeatEvent(30000);
                        break;
                    case EVENT_STOMP:
                    {
                        char buffer[100];
                        sprintf(buffer, "Archavon the Stone Watcher lunges for %s!", me->GetVictim()->GetName().c_str());
                        me->MonsterTextEmote(buffer, 0);
                        me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_STOMP_10, SPELL_STOMP_25), false);
                        events.RepeatEvent(45000);
                        events.ScheduleEvent(EVENT_IMPALE, 3000);
                        break;
                    }
                    case EVENT_IMPALE:
                        me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25), false);
                        events.PopEvent();
                        break;
                    case EVENT_BERSERK:
                        me->CastSpell(me, SPELL_BERSERK, true);
                        Talk(EMOTE_BERSERK);
                        events.PopEvent();
                        break;
                    default:
                        break;
                }

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

			events.Update(diff);

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

			switch( events.GetEvent() )
			{
				case 0:
					break;
				case EVENT_SPELL_SHADOW_STRIKE:
					if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250.0f, true) )
						me->CastSpell(target, SPELL_SHADOW_STRIKE, false);
					events.RepeatEvent(urand(30000,45000));
					break;
				case EVENT_SUBMERGE:
					if( HealthBelowPct(80) && !me->HasAura(RAID_MODE(66193,67855,67856,67857)) ) // not having permafrost - allow submerge
					{
						me->GetMotionMaster()->MoveIdle();
						me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
						me->RemoveAllAuras();
						me->CastSpell(me, SPELL_EXPOSE_WEAKNESS, true);
						me->CastSpell(me, SPELL_SPIDER_FRENZY, true);
						me->CastSpell(me, SPELL_SUBMERGE, false);
						events.PopEvent();
						events.DelayEvents(15000);
						events.RescheduleEvent(EVENT_EMERGE, 10000);
					}
					else
						events.RepeatEvent(3000);
					break;
				case EVENT_EMERGE:
					me->SetHealth(me->GetMaxHealth());
					me->GetMotionMaster()->MoveChase(me->GetVictim());
					me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
					me->CastSpell(me, SPELL_EMERGE, false);
					me->RemoveAura(SPELL_SUBMERGE);
					events.PopEvent();
					events.RescheduleEvent(EVENT_SUBMERGE, 30000);
					break;
			}

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

			events.Update(diff);

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

			switch( events.GetEvent() )
			{
				case 0:
					break;
				case 1: // leap
					if (Unit* target = me->GetVictim())
						if (me->GetDistance(target) > 5.0f && me->GetDistance(target) < 30.0f)
						{
							me->CastSpell(target, SPELL_LEAP, false);
							events.PopEvent();
							break;
						}
					events.RepeatEvent(1000);
					break;
				case 2: // claw
					if (Unit* target = me->GetVictim())
						me->CastSpell(target, SPELL_CLAW_N, false);
					events.RepeatEvent(urand(6000,8000));
					break;
			}

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

            events.Update(diff);
            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            switch (events.GetEvent())
            {
                case EVENT_SPELL_NECROTIC_AURA:
                    me->CastSpell(me, SPELL_NECROTIC_AURA, true);
                    events.RepeatEvent(20000);
                    break;
                case EVENT_SPELL_DEATHBLOOM:
                    me->CastSpell(me, SPELL_SUMMON_SPORE, true);
                    me->CastSpell(me, RAID_MODE(SPELL_DEATHBLOOM_10, SPELL_DEATHBLOOM_25), false);
                    events.RepeatEvent(30000);
                    break;
                case EVENT_SPELL_INEVITABLE_DOOM:
                    me->CastSpell(me, RAID_MODE(SPELL_INEVITABLE_DOOM_10, SPELL_INEVITABLE_DOOM_25), false);
                    events.RepeatEvent(events.GetTimer() < 5*MINUTE*IN_MILLISECONDS ? 30000 : 15000);
                    break;
                case EVENT_SPELL_BERSERK:
                    me->CastSpell(me, SPELL_BERSERK, true);
                    events.PopEvent();
                    break;
            }

            DoMeleeAttackIfReady();
        }
Ejemplo n.º 14
0
        void UpdateAI(const uint32 diff)
        {
            if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
                return;

            events.Update(diff);

            while (uint32 eventId = events.GetEvent())
            {
                switch (eventId)
                {
                    case EVENT_VALIONAS_FLAME:
                        if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
                            DoCast(pTarget, SPELL_VALIONAS_FLAME);
                        events.RepeatEvent(urand(15000,25000));
                        break;
                    case EVENT_SHREDDING_SWIPE:
                        if(me->getVictim())
                            DoCastVictim(SPELL_SHREDDING_SWIPE);
                        events.RepeatEvent(urand(21000,30000));
                        break;
                    case EVENT_DEVOURING_FLAMES:
                        DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_DEVOURING_FLAMES_H);
                        events.RepeatEvent(urand(30000,35000));
                        break;
                    default:
                        events.PopEvent();
                        break;
                }
            }

            DoMeleeAttackIfReady();
        }
 void UpdateAI(uint32 diff)
 {
     events.Update(diff);
     switch (events.GetEvent())
     {
         case EVENT_CHECK_PLAYER:
         {
             Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID);
             if (!player || me->GetDistance2d(player) > 100.0f)
             {
                 EnterEvadeMode();
                 return;
             }
             events.RepeatEvent(2000);
             break;
         }
         case EVENT_SUMMON_ARCHERS:
             SummonArchers();
             events.PopEvent();
             break;
         case EVENT_SUMMON_PEASANTS:
             _spoken = false;
             SummonPeasants();
             _spoken = false;
             events.RepeatEvent(60*IN_MILLISECONDS);
             break;
     }
 }
Ejemplo n.º 16
0
		void UpdateAI(uint32 diff)
		{
			if( !UpdateVictim() )
				return;

			events.Update(diff);

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

			switch( events.GetEvent() )
			{
				case 0:
					break;
				case EVENT_ANNOUNCER_SAY_ZOMBIE:
					if( pInstance && !summons.empty() )
						if( Creature* ghoul = pInstance->instance->GetCreature(*summons.begin()) )
							ghoul->MonsterYell("[Zombie] .... . Brains ....", LANG_UNIVERSAL, 0);
					events.PopEvent();
					break;
				case EVENT_SPELL_PLAGUE_STRIKE:
					if( me->GetVictim() )
						me->CastSpell(me->GetVictim(), SPELL_PLAGUE_STRIKE, false);
					events.RepeatEvent(urand(10000,12000));
					break;
				case EVENT_SPELL_ICY_TOUCH:
					if( me->GetVictim() )
						me->CastSpell(me->GetVictim(), SPELL_ICY_TOUCH, false);
					events.RepeatEvent(urand(5000,6000));
					break;
				case EVENT_SPELL_DEATH_RESPITE:
					if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true) )
						me->CastSpell(target, SPELL_DEATH_RESPITE, false);
					events.RepeatEvent(urand(13000,15000));
					break;
				case EVENT_SPELL_OBLITERATE:
					if( me->GetVictim() )
						me->CastSpell(me->GetVictim(), SPELL_OBLITERATE, false);
					events.RepeatEvent(urand(15000,17000));
					break;
				case EVENT_SPELL_DESECRATION:
					if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true) )
						me->CastSpell(target, SPELL_DESECRATION, false);
					events.RepeatEvent(urand(14000,17000));
					break;
				case EVENT_SPELL_DEATH_BITE:
					me->CastSpell((Unit*)NULL, SPELL_DEATH_BITE, false);
					events.RepeatEvent(urand(2000,4000));
					break;
				case EVENT_SPELL_MARKED_DEATH:
					if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.000000f, true) )
						me->CastSpell(target, SPELL_MARKED_DEATH, false);
					events.RepeatEvent(9000);
					break;
			}

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

            events.Update(diff);

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

            switch( events.GetEvent() )
            {
                case 0:
                    break;
                case EVENT_YELL_DALRONN_AGGRO:
                    Talk(YELL_DALRONN_AGGRO);
                    events.PopEvent();
                    break;
                case EVENT_MATE_DIED:
                    Talk(YELL_DALRONN_SKA_DIEDFIRST);
                    events.PopEvent();
                    break;
                case EVENT_SPELL_SHADOW_BOLT:
                    if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 42.0f, true) )
                        me->CastSpell(target, SPELL_SHADOW_BOLT, false);
                    events.RepeatEvent(2500);
                    break;
                case EVENT_SPELL_DEBILITATE:
                    if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true) )
                    {
                        me->CastSpell(target, SPELL_DEBILITATE, false);
                        events.RepeatEvent(urand(5000,10000));
                    }
                    else
                        events.RepeatEvent(3000);
                    break;
                case EVENT_SPELL_SUMMON_SKELETONS:
                    me->CastSpell((Unit*)NULL, SPELL_SUMMON_SKELETONS, false);
                    events.RepeatEvent(urand(20000,30000));
                    break;
            }

            DoMeleeAttackIfReady();
        }
        void UpdateAI(uint32 diff)
        {
            if( !UpdateVictim() )
                return;

            events.Update(diff);

            if( !summoned && HealthBelowPct(25) )
            {
                me->InterruptNonMeleeSpells(true);
                Talk(TEXT_PALETRESS_MEMORY_SUMMON);
                me->CastSpell((Unit*)NULL, SPELL_HOLY_NOVA, false);
                me->CastSpell(me, SPELL_SHIELD, false);
                me->CastSpell((Unit*)NULL, SPELL_SUMMON_MEMORY, false);
                SummonMemory();
                me->CastSpell((Unit*)NULL, SPELL_CONFESS, false);
                events.ScheduleEvent(EVENT_SPELL_RENEW, urand(6000,8000));
                summoned = true;
                return;
            }

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

            switch( events.GetEvent() )
            {
                case 0:
                    break;
                case EVENT_SPELL_SMITE:
                    if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true) )
                        me->CastSpell(target, SPELL_SMITE, false);
                    events.RepeatEvent(urand(3000,4000));
                    break;
                case EVENT_SPELL_HOLY_FIRE:
                    if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) )
                        me->CastSpell(target, SPELL_HOLY_FIRE, false);
                    events.RepeatEvent(urand(9000,12000));
                    break;
                case EVENT_SPELL_RENEW:
                    if( !MemoryGUID )
                    {
                        events.PopEvent();
                        break;
                    }
                    if( urand(0,1) )
                        me->CastSpell(me, SPELL_RENEW, false);
                    else if( Creature* memory = ObjectAccessor::GetCreature(*me, MemoryGUID) )
                        if( memory->IsAlive() )
                            me->CastSpell(memory, SPELL_RENEW, false);
                    events.RepeatEvent(urand(15000,17000));
                    break;
            }

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

			events.Update(diff);

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

			DoMeleeAttackIfReady();

			switch( events.GetEvent() )
			{
				case 0:
					break;
				case EVENT_MAGIC_PULL:
					{
						Talk(SAY_PULL);
						//me->MonsterTextEmote(TEXT_MAGIC_PULL, 0, true);

						me->CastSpell(me, SPELL_MAGIC_PULL, false);
						events.RepeatEvent(urand(15000,25000));
						events.ScheduleEvent(EVENT_SUMMON_x4, 1500);
					}
					break;
				case EVENT_THUNDERING_STOMP:
					{
						Talk(SAY_STOMP);

						me->CastSpell(me, SPELL_THUNDERING_STOMP, false);
						events.RepeatEvent(urand(10000,20000));
					}
					break;
				case EVENT_SUMMON:
					{
						for( uint8 i=0; i<2; ++i )
						{
							float angle = rand_norm()*2*M_PI;
							me->SummonCreature(NPC_UNSTABLE_SPHERE, me->GetPositionX() + 5.0f*cos(angle), me->GetPositionY() + 5.0f*sin(angle), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 18000);
						}
						events.RepeatEvent(2000);
					}
					break;
				case EVENT_SUMMON_x4:
					for( uint8 i=0; i<4; ++i )
					{
						float angle = rand_norm()*2*M_PI;
						me->SummonCreature(NPC_UNSTABLE_SPHERE, me->GetPositionX() + 5.0f*cos(angle), me->GetPositionY() + 5.0f*sin(angle), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 18000);
					}
					events.PopEvent();
					break;
			}
		}
Ejemplo n.º 20
0
            void UpdateAI(uint32 diff)
            {
                if (!UpdateVictim())
                {
					checkTimer += diff;
                    if (checkTimer >= 5000)
                    {
						checkTimer = 0;
                        CheckChannelers();
						if (!me->HasUnitState(UNIT_STATE_CASTING))
                            me->CastSpell(me, SPELL_EVOCATION, false);
                        
                    }
                    return;
                }

				events.Update(diff);
				if (me->HasUnitState(UNIT_STATE_CASTING))
					return;

				switch (events.GetEvent())
				{
					case EVENT_SPELL_VOLLEY:
						me->CastSpell(me, SPELL_SHADOW_BOLT_VOLLEY, false);
						events.RepeatEvent(urand(8000, 13000));
						break;
					case EVENT_SPELL_CORRUPTION:
						me->CastSpell(me, SPELL_CORRUPTION, false);
						events.RepeatEvent(urand(30000, 50000));
						break;
					case EVENT_SPELL_BURNING_NOVA:
						Talk(SAY_NOVA);
						
						ApplyImmunities(false);
						me->AddAura(SPELL_BURNING_NOVA, me);
						ApplyImmunities(true);

						if (IsHeroic())
							DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());

						events.DelayEvents(6000, 0);
						events.RepeatEvent(urand(25000, 32000));
						events.ScheduleEvent(EVENT_SPELL_FIRE_NOVA, 5000);
						break;
					case EVENT_SPELL_FIRE_NOVA:
						me->CastSpell(me, SPELL_FIRE_NOVA, true);
						events.PopEvent();
						break;
				}

                DoMeleeAttackIfReady();
            }
Ejemplo n.º 21
0
        void UpdateAI(uint32 diff)
        {
            if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
                return;

            if(me->GetPositionX() == position[5].GetPositionX() && me->GetPositionY() == position[5].GetPositionY() &&  me->GetPositionZ() == position[5].GetPositionZ() && !HomePosition)
            {
                pDragah->GetAI()->DoAction(ACTION_DRAGAH_IS_ON_THE_GROUND);

                me->SetSpeed(MOVE_WALK, 1.0f);
                me->SetCanFly(false);
                me->SetReactState(REACT_AGGRESSIVE);
                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);

                events.ScheduleEvent(EVENT_VALIONAS_FLAME, urand(4000,7000));
                events.ScheduleEvent(EVENT_SHREDDING_SWIPE, urand(10000,13000));

                if(me->GetMap()->IsHeroic())
                   events.ScheduleEvent(EVENT_DEVOURING_FLAMES, urand(15000,17000));

                HomePosition = true;
            }

            events.Update(diff);

            while (uint32 eventId = events.GetEvent())
            {
                switch (eventId)
                {
                    case EVENT_VALIONAS_FLAME:
                        if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
                            DoCast(pTarget, SPELL_VALIONAS_FLAME);
                        events.RepeatEvent(urand(15000,25000));
                        break;
                    case EVENT_SHREDDING_SWIPE:
                        if(me->getVictim())
                            me->CastSpell(me->getVictim(), SPELL_SHREDDING_SWIPE, true);
                        events.RepeatEvent(urand(21000,30000));
                        break;
                    case EVENT_DEVOURING_FLAMES:
                        DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_DEVOURING_FLAMES_H);
                        events.RepeatEvent(urand(30000,35000));
                        break;
                    default:
                        events.PopEvent();
                        break;
                }
            }

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

			events.Update(diff);

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

			if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
				if (me->isAttackReady())
					me->SetFacingToObject(me->GetVictim());

			switch(events.GetEvent())
			{
				case 0:
					break;
				case EVENT_SPELL_SHADOW_BOLT:
					if (!me->IsWithinMeleeRange(me->GetVictim()))
						me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false);
					events.RepeatEvent(2000);
					break;
				case EVENT_SPELL_FEAR:
					if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f, true))
						me->CastCustomSpell(SPELL_FEAR, SPELLVALUE_MAX_TARGETS, 1, target, false);
					events.RepeatEvent(urand(8000, 12000));
					break;
				case EVENT_SPELL_MAGICS_BANE:
					me->CastSpell(me->GetVictim(), SPELL_MAGICS_BANE, false);
					events.RepeatEvent(urand(10000, 15000));
					break;
				case EVENT_SPELL_CORRUPT_SOUL:
					if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
					{
						Talk(SAY_CORRUPT_SOUL);
						me->CastSpell(target, SPELL_CORRUPT_SOUL, false);
					}
					events.RepeatEvent(urand(20000, 25000));
					break;
				case EVENT_START_SOULSTORM:
					Talk(SAY_SOUL_STORM);
					me->CastSpell(me, SPELL_SOULSTORM, false);
					me->CastSpell(me, SPELL_TELEPORT_VISUAL, true);
					me->CastSpell(me, SPELL_SOULSTORM_VISUAL, true);
					events.PopEvent();
					break;
			}

			DoMeleeAttackIfReady();
		}
Ejemplo n.º 23
0
        void UpdateAI(uint32 diff)
        {
            if (!UpdateVictim() && SecondPhase)
                return;

            events.Update(diff);
            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            switch (events.GetEvent())
            {
                case EVENT_SKADI_START:
                {
                    me->SetControlled(false, UNIT_STATE_ROOT);
                    if (Creature *cr = GetGrauf())
                    {
                        me->EnterVehicleUnattackable(cr, 0);
                        cr->AI()->DoAction(ACTION_START_EVENT);
                    }
                    else
                        EnterEvadeMode();

                    events.PopEvent();
                    break;
                }
                case EVENT_SKADI_CRUSH:
                {
                    me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_CRUSH_H : SPELL_CRUSH_N, false);
                    events.RepeatEvent(8000);
                    break;
                }
                case EVENT_SKADI_SPEAR:
                {
                    if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0))
                        me->CastSpell(tgt, IsHeroic() ? SPELL_POISONED_SPEAR_H : SPELL_POISONED_SPEAR_N, false);

                    events.RepeatEvent(10000);
                    break;
                }
                case EVENT_SKADI_WHIRLWIND:
                {
                    me->CastSpell(me, IsHeroic() ? SPELL_WHIRLWIND_H : SPELL_WHIRLWIND_N, false);
                    events.RepeatEvent(15000 + rand()%5000);
                    events.DelayEvents(10000);
                    break;
                }
            }

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

            events.Update(diff);
            
            if( me->HasUnitState(UNIT_STATE_CASTING) )
                return;

            switch( events.GetEvent() )
            {
                case 0:
                    break;
                case EVENT_SPELL_SHADOWBOLT:
                    me->CastSpell(me->GetVictim(), SPELL_SHADOWBOLT, false);
                    events.RepeatEvent(urand(4000,5000));
                    break;
                case EVENT_FROST_TOMB:
                    if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true) )
                        if( !target->HasAura(SPELL_FROST_TOMB_AURA) )
                        {
                            Talk(SAY_FROST_TOMB_EMOTE, target);
                            Talk(SAY_FROST_TOMB);
                            me->CastSpell(target, SPELL_FROST_TOMB, false);
                            events.RepeatEvent(15000);
                            break;
                        }
                    events.RepeatEvent(1000);
                    break;
                case EVENT_SUMMON_SKELETONS:
                    Talk(SAY_SUMMON_SKELETONS);
                    for (uint8 i = 0; i < 5; ++i)
                    {
                        float dist = rand_norm()*4+3.0f;
                        float angle = rand_norm()*2*M_PI;
                        if( Creature* c = me->SummonCreature(NPC_SKELETON, 156.2f+cos(angle)*dist, 259.1f+sin(angle)*dist, 42.9f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000) )
                            if( Unit* target = c->SelectNearestTarget(250.0f) )
                            {
                                c->AddThreat(target, 5.0f);
                                DoZoneInCombat(c);
                            }
                    }
                    events.PopEvent();
                    break;
            }

            DoMeleeAttackIfReady();
        }
        void UpdateAI(uint32 diff)
        {
            if (!UpdateVictim())
                return;

            events.Update(diff);
            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            switch (events.GetEvent())
            {
                case EVENT_CHECK_HEALTH:
                    if (HealthBelowPct(25))
                    {
                        Talk(SAY_SUMMON);
                        me->CastSpell(me, SPELL_SUMMON_AVATAR, false);
                        events.PopEvent();
                        return;
                    }
                    events.RepeatEvent(2000);
                    break;
                case EVENT_SPELL_SOUL:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
                    {
                        Talk(SAY_ROAR);
                        me->CastSpell(target, SPELL_STOLEN_SOUL, false);
                        if (Creature* summon = me->SummonCreature(ENTRY_STOLEN_SOUL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000))
                        {
                            summon->CastSpell(summon, SPELL_STOLEN_SOUL_VISUAL, false);
                            summon->SetDisplayId(target->GetDisplayId());
                            summon->AI()->DoAction(target->getClass());
                            summon->AI()->AttackStart(target);
                        }
                    }
                    events.RepeatEvent(urand(25000, 30000));
                    break;
                case EVENT_SPELL_RIBBON:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
                        me->CastSpell(target, SPELL_RIBBON_OF_SOULS, false);
                    events.RepeatEvent(urand(10000, 20000));
                    break;
                case EVENT_SPELL_FEAR:
                    me->CastSpell(me, SPELL_SOUL_SCREAM, false);
                    events.RepeatEvent(urand(15000, 25000));
                    break;
            }

            DoMeleeAttackIfReady();
        }
        void UpdateAI(uint32 diff)
        {
            if (!UpdateVictim())
                return;

            events.Update(diff);
            switch (events.GetEvent())
            {
                case EVENT_INCITE_WAIT:
                    InciteChaos = false;
                    events.PopEvent();
                    break;
                case EVENT_SPELL_INCITE:
                {
                    me->CastSpell(me, SPELL_INCITE_CHAOS, false);

                    std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
                    for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
                    {
                        Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
                        if (target && target->GetTypeId() == TYPEID_PLAYER)
                            me->CastSpell(target, SPELL_INCITE_CHAOS_B, true);
                    }

                    DoResetThreat();
                    InciteChaos = true;
                    events.DelayEvents(15000);
                    events.RepeatEvent(40000);
                    events.ScheduleEvent(EVENT_INCITE_WAIT, 15000);
                    break;
                }
                case EVENT_SPELL_CHARGE:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
                        me->CastSpell(target, SPELL_CHARGE, false);
                    events.RepeatEvent(urand(15000, 25000));
                    break;
                case EVENT_SPELL_KNOCKBACK:
                    me->CastSpell(me, SPELL_WAR_STOMP, false);
                    events.RepeatEvent(urand(18000, 24000));
                    break;
            }

            if (InciteChaos)
                return;

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

                events.Update(diff);
                if (me->HasUnitState(UNIT_STATE_CASTING))
                    return;

                switch (events.GetEvent())
                {
					case EVENT_FREEZING_GROUND:
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
							me->CastSpell(target, SPELL_FREEZING_GROUND, false);
                        events.RepeatEvent(20000);
                        break;
                    case EVENT_FROZEN_ORB_STALKER:
                        me->CastCustomSpell(SPELL_FROZEN_ORB, SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 3), me, false);
                        events.RepeatEvent(35000);
						events.ScheduleEvent(EVENT_CHECK_SUMMONS, 10000);
                        break;
					case EVENT_CHECK_SUMMONS:
						for (SummonList::iterator i = summons.begin(); i != summons.end();)
						{
							if (Creature* cr = ObjectAccessor::GetCreature(*me, *i))
							{
								if (!cr->IsAlive())
									summons.erase(i++);
								else
									++i;
							}
							else
								summons.erase(i++);
						}
						if (summons.empty())
						{
							events.PopEvent();
							me->CastSpell(me, SPELL_WHITEOUT, false);
							break;
						}
						events.RepeatEvent(2000);
						break;
                }

                DoMeleeAttackIfReady();
            }
Ejemplo n.º 28
0
        void UpdateAI(uint32 diff)
        {
            //Return since we have no target
            if (!UpdateVictim())
                return;

            events.Update(diff);

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

            switch (events.GetEvent())
            {
                case EVENT_HEAT:
                    me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_HEAT_H : SPELL_HEAT_N, true);
                    events.RepeatEvent(8000);
                    break;
                case EVENT_CHECK_HEALTH:
                    if (HealthBelowPct(HealthCheck))
                        GoToAnvil();

                    events.RepeatEvent(1000);
                    return;
                case EVENT_SHATTER:
                {
                    events.RepeatEvent(10000);
                    summons.DoAction(ACTION_SHATTER);
                    break;
                }
                case EVENT_MOVE_TO_ANVIL:
                    GetNextPos();
                    me->GetMotionMaster()->MovePoint(PointID, x, y, z);
                    events.PopEvent();
                    return;
                case EVENT_POSITION:
                    if (me->GetDistance(1331.9f, -106, 56) > 95)
                        EnterEvadeMode();
                    else
                        events.RepeatEvent(4000);
                
                    return;
            }
            
            DoMeleeAttackIfReady();
        }
Ejemplo n.º 29
0
        void UpdateAI(uint32 diff)
        {
            // Some nice visuals
            dropSludgeTimer += diff;
            if (!me->IsInCombat() && dropSludgeTimer >= 5000)
            {
                if (me->IsWithinDist3d(3178, -3305, 319, 5.0f) && !summons.HasEntry(NPC_SEWAGE_SLIME))
                    me->CastSpell(3128.96f+irand(-20, 20), -3312.96f+irand(-20, 20), 293.25f, SPELL_BOMBARD_SLIME, false);

                dropSludgeTimer = 0;
            }

            if (!UpdateVictim())
                return;

            events.Update(diff);
            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            switch (events.GetEvent())
            {
                case EVENT_SPELL_POISON_CLOUD:
                    me->CastSpell(me, SPELL_POISON_CLOUD, true);
                    events.RepeatEvent(15000);
                    break;
                case EVENT_SPELL_BERSERK:
                    me->CastSpell(me, SPELL_BERSERK, true);
                    events.PopEvent();
                    break;
                case EVENT_SPELL_SLIME_SPRAY:
                    me->MonsterTextEmote("Grobbulus sprays slime across the room!", 0, true);
                    me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25), false);
                    events.RepeatEvent(20000);
                    break;
                case EVENT_SPELL_MUTATING_INJECTION:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, -SPELL_MUTATING_INJECTION))
                        me->CastSpell(target, SPELL_MUTATING_INJECTION, false);

                    events.RepeatEvent(8000 + uint32(120 * me->GetHealthPct()));
                    break;
            }

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

                events.Update(diff);
                if (me->HasUnitState(UNIT_STATE_CASTING))
                    return;

                switch (events.GetEvent())
                {
                    case EVENT_CHAIN_LIGHTNING:
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
							me->CastSpell(target, RAID_MODE(SPELL_CHAIN_LIGHTNING_10, SPELL_CHAIN_LIGHTNING_25), false);
                        events.RepeatEvent(25000);
                        break;
                    case EVENT_LIGHTNING_NOVA:
						me->CastSpell(me, RAID_MODE(SPELL_LIGHTNING_NOVA_10, SPELL_LIGHTNING_NOVA_25), false);
                        events.RepeatEvent(40000);
                        break;
                    case EVENT_OVERCHARGE:
						if (!summons.empty())
							me->CastCustomSpell(SPELL_OVERCHARGE, SPELLVALUE_MAX_TARGETS, 1, me, true);
                        Talk(EMOTE_OVERCHARGE);
						events.RepeatEvent(40000);
                        break;
                    case EVENT_BERSERK:
						me->CastSpell(me, SPELL_BERSERK, true);
                        Talk(EMOTE_BERSERK);
                        break;
					case EVENT_SUMMON_NEXT_MINION:
						me->SummonCreature(NPC_TEMPEST_MINION, TempestMinions[urand(0,3)], TEMPSUMMON_CORPSE_DESPAWN, 0);
						events.PopEvent();
						break;
                    default:
                        break;
                }

                DoMeleeAttackIfReady();
            }