示例#1
0
        void Split()
        {
            Talk(SAY_SPLIT);

            Creature* spark;
            for (uint8 i = 0; i < 5; ++i)
            {
                if ((spark = me->SummonCreature(NPC_SPARK_OF_IONAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 20000)))
                {
                    summons.Summon(spark);
                    spark->CastSpell(spark, me->GetMap()->IsHeroic() ? SPELL_SPARK_VISUAL_TRIGGER_H : SPELL_SPARK_VISUAL_TRIGGER_N, true);
                    spark->CastSpell(spark, SPELL_RANDOM_LIGHTNING, true);
                    spark->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED|UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE);
                    spark->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0);

                    if (Player* tgt = SelectTargetFromPlayerList(100))
                        spark->GetMotionMaster()->MoveFollow(tgt, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED);
                }
            }
            
            me->SetVisible(false);
            me->SetControlled(true, UNIT_STATE_STUNNED);

            events.SetPhase(2);
            events.ScheduleEvent(EVENT_CALL_SPARKS, 15000, 0, 2);
        }
			void JustSummoned(Creature* summon)
			{
				if (me->IsInCombat() && summon->GetEntry() == NPC_BEACON)
				{
					summon->CastSpell(summon, SPELL_ETHEREAL_BEACON_VISUAL, false);
					if (Unit* target = SelectTargetFromPlayerList(50.0f))
						summon->AI()->AttackStart(target);
				}

				summons.Summon(summon);
			}
示例#3
0
        void UpdateAI(uint32 diff)
        {
			switchTimer += diff;
			if (switchTimer >= 10000)
			{
				switchTimer = 0;
				me->getThreatManager().resetAllAggro();
				if (Player* player = SelectTargetFromPlayerList(100.0f))
					me->AddThreat(player, 100000.0f);
			}
        }
示例#4
0
        void UpdateAI(uint32 diff)
        {
			events2.Update(diff);
			switch (events2.ExecuteEvent())
			{
				case EVENT_ENTROPIUS_AURAS:
					me->CastSpell(me, SPELL_ENTROPIUS_COSMETIC_SPAWN, false);
					me->CastSpell(me, SPELL_NEGATIVE_ENERGY_PERIODIC, true);
					break;
				case EVENT_ENTROPIUS_COMBAT:
					me->SetReactState(REACT_AGGRESSIVE);
					me->SetInCombatWithZone();
					AttackStart(SelectTargetFromPlayerList(50.0f));
					break;
			}

			if (!events2.Empty())
				return;

            if (!UpdateVictim())
                return;

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

			switch (events.ExecuteEvent())
			{
				case EVENT_SPELL_ENRAGE:
					me->CastSpell(me, SPELL_ENRAGE, true);
					break;
				case EVENT_SPAWN_DARKNESS:
					if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
						me->CastSpell(target, SPELL_DARKNESS, true);
					events.ScheduleEvent(EVENT_SPAWN_DARKNESS, 15000);
					break;
				case EVENT_SPAWN_BLACK_HOLE:
					if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
						me->CastSpell(target, SPELL_BLACK_HOLE, true);
					events.ScheduleEvent(EVENT_SPAWN_BLACK_HOLE, 15000);
					break;
			}

            DoMeleeAttackIfReady();
        }
示例#5
0
		void DoAction(int32 param)
		{
			if (param == ACTION_FERAL_RESPAWN)
			{
				me->setDeathState(JUST_RESPAWNED);

				if (Player* target = SelectTargetFromPlayerList(200))
					AttackStart(target);
				else
				{
					summons.DespawnAll();
					me->DespawnOrUnsummon(1);
				}

				if (_feralEssenceStack)
					if (Aura* aur = me->AddAura(SPELL_FERAL_ESSENCE, me))
						aur->SetStackAmount(_feralEssenceStack);
			}
			else if (param == ACTION_DESPAWN_ADDS)
				summons.DespawnAll();
		}
            void CheckChannelers()
            {
				if (addYell)
				{
					if (!SelectTargetFromPlayerList(100.0f))
						EnterEvadeMode();
					return;
				}

				SummonChannelers();
                for (uint8 i = 0; i < 5; ++i)
                {
                    Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]);
                    if (channeler && !channeler->HasUnitState(UNIT_STATE_CASTING) && !channeler->IsInCombat())
					{
						Creature* target = ObjectAccessor::GetCreature(*me, channelers[(i+2)%5]);
						if (target)
							channeler->CastSpell(target, SPELL_CHANNELING, false);
					}
                }
            }
        void UpdateAI(uint32 diff)
        {
			events2.Update(diff);
			switch (events2.ExecuteEvent())
			{
				case EVENT_INIT_COMBAT:
					me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
					if (Unit* target = SelectTargetFromPlayerList(50.0f))
						AttackStart(target);
					return;
				case EVENT_FINISH_TALK:
					Unit::Kill(me, me);
					return;
			}

            if (!UpdateVictim())
                return;

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

			switch (uint32 eventId = events.ExecuteEvent())
			{
				case EVENT_SPELL_FIREBALL:
					me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_FIREBALL_N, SPELL_FIREBALL_H), false);
					events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(3000, 4500));
					break;
				case EVENT_SPELL_FLAMESTRIKE:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
					{
						me->CastSpell(target, SPELL_FLAMESTRIKE_SUMMON, true);
                        Talk(SAY_FLAMESTRIKE);
                    }
					events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000);
					break;
				case EVENT_SPELL_SHOCK_BARRIER:
					me->CastSpell(me, SPELL_SHOCK_BARRIER, true);
					me->CastCustomSpell(SPELL_PYROBLAST, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, false);
					events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000);
					break;
				case EVENT_SPELL_PHOENIX:
                    Talk(SAY_PHOENIX);
					me->CastSpell(me, SPELL_PHOENIX, false);
					events.ScheduleEvent(EVENT_SPELL_PHOENIX, 60000);
					break;
				case EVENT_CHECK_HEALTH:
                    if (HealthBelowPct(50))
                    {
                        me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true);
						me->CastSpell(me, SPELL_TELEPORT_CENTER, true);
						events.Reset();

                        me->StopMoving();
                        me->GetMotionMaster()->Clear();
                        me->GetMotionMaster()->MoveIdle();

						events.SetPhase(1);
						events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_1, 0);
						break;
                    }
					events.ScheduleEvent(EVENT_CHECK_HEALTH, 500);
					break;
				case EVENT_GRAVITY_LAPSE_1_1:
				case EVENT_GRAVITY_LAPSE_1_2:
					Talk(eventId == EVENT_GRAVITY_LAPSE_1_1 ? SAY_GRAVITY_LAPSE : SAY_RECAST_GRAVITY);
                    me->CastSpell(me, SPELL_GRAVITY_LAPSE_INITIAL, false);
					events.ScheduleEvent(EVENT_GRAVITY_LAPSE_2, 2000);
                    break;
				case EVENT_GRAVITY_LAPSE_2:
					LapseAction(ACTION_TELEPORT_PLAYERS);
					events.ScheduleEvent(EVENT_GRAVITY_LAPSE_3, 1000);
					break;
				case EVENT_GRAVITY_LAPSE_3:
					LapseAction(ACTION_KNOCKUP);
					events.ScheduleEvent(EVENT_GRAVITY_LAPSE_4, 1000);
					break;
				case EVENT_GRAVITY_LAPSE_4:
                    LapseAction(ACTION_ALLOW_FLY);
                    for (uint8 i = 0; i < 3; ++i)
						me->CastSpell(me, SPELL_SUMMON_ARCANE_SPHERE, true);

					me->CastSpell(me, SPELL_GRAVITY_LAPSE_CHANNEL, false);
					events.ScheduleEvent(EVENT_GRAVITY_LAPSE_5, 30000);
					break;
				case EVENT_GRAVITY_LAPSE_5:
					LapseAction(ACTION_REMOVE_FLY);
                    me->InterruptNonMeleeSpells(false);
                    Talk(SAY_TIRED);
					me->CastSpell(me, SPELL_POWER_FEEDBACK, false);
					events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_2, 10000);
					break;
			}


			if (events.GetPhaseMask() == 0)
				DoMeleeAttackIfReady();
        }
            void UpdateAI(uint32 diff)
            {
                events2.Update(diff);
                switch (events2.ExecuteEvent())
                {
                    case EVENT_KRIK_START_WAVE:
                        me->CastCustomSpell(SPELL_SUBBOSS_AGGRO_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, me, true);
                        Talk(SAY_SEND_GROUP);
                        break;
                    case EVENT_KRIK_ENTER_COMBAT:
                        me->SetInCombatWithZone();
                        break;
                    case EVENT_KRIK_CHECK_EVADE:
                        if (!SelectTargetFromPlayerList(100.0f))
                        {
                            EnterEvadeMode();
                            return;
                        }
                        events2.ScheduleEvent(EVENT_KRIK_CHECK_EVADE, 5000);
                        break;
                }

                if (!UpdateVictim())
                    return;

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

                switch (events.ExecuteEvent())
                {
                    case EVENT_KRIK_HEALTH_CHECK:
                        if (HealthBelowPct(10))
                        {
                            events.PopEvent();
                            me->CastSpell(me, SPELL_FRENZY, true);
                            break;
                        }
                        events.ScheduleEvent(EVENT_KRIK_HEALTH_CHECK, 1000);
                        break;
                    case EVENT_KRIK_SUMMON:
                        Talk(SAY_SWARM);
                        me->CastSpell(me, SPELL_SWARM, false);
                        events.ScheduleEvent(EVENT_KRIK_SUMMON, 20000);
                        break;
                    case EVENT_KRIK_MIND_FLAY:
                        me->CastSpell(me->GetVictim(), SPELL_MIND_FLAY, false);
                        events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 15000);
                        break;
                    case EVENT_KRIK_CURSE:
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                            me->CastSpell(target, SPELL_CURSE_OF_FATIGUE, true);
                        events.ScheduleEvent(EVENT_KRIK_CURSE, 10000);
                        break;
                    case EVENT_CALL_ADDS:
                        summons.DoZoneInCombat();
                        break;
                }

                DoMeleeAttackIfReady();
            }
示例#9
0
			bool CheckEvadeIfOutOfCombatArea() const
			{
				return me->GetHomePosition().GetExactDist2d(me) > 80.0f || !SelectTargetFromPlayerList(100.0f);
			}
 bool CheckEvadeIfOutOfCombatArea() const
 {
     return !SelectTargetFromPlayerList(120.0f);
 }
示例#11
0
		void UpdateAI(uint32 diff)
		{
			events2.Update(diff);
			switch (events2.ExecuteEvent())
			{
				case EVENT_SVALA_START:
					Talk(TALK_INTRO_S1);
					events2.ScheduleEvent(EVENT_SVALA_TALK1, 8000);
					break;
				case EVENT_SVALA_TALK1:
					if (Creature* Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID))
						Arthas->AI()->Talk(TALK_INTRO_A1);
					events2.ScheduleEvent(EVENT_SVALA_TALK2, 9000);
					break;
				case EVENT_SVALA_TALK2:
					if (Creature* Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID))
						Arthas->CastSpell(me, SPELL_ARTHAS_TRANSFORMING_SVALA, false);
					me->CastSpell(me, SPELL_SVALA_TRANSFORMING2, true);
					events2.ScheduleEvent(EVENT_SVALA_TALK3, 3000);
					break;
				case EVENT_SVALA_TALK3:
					me->SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 6.0f);
					me->SetHover(true);
					me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
					events2.ScheduleEvent(30, 1000);
					events2.ScheduleEvent(EVENT_SVALA_TALK4, 9000);
					break;
				case 30:
				{
					WorldPacket data(SMSG_SPLINE_MOVE_SET_HOVER, 9);
					data.append(me->GetPackGUID());
					me->SendMessageToSet(&data, false);
					break;
				}
				case EVENT_SVALA_TALK4:
				{
					me->CastSpell(me, SPELL_SVALA_TRANSFORMING1, true);
					me->UpdateEntry(NPC_SVALA_SORROWGRAVE);
					me->SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 6.0f);
					me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
					if (Creature* Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID))
						Arthas->InterruptNonMeleeSpells(false);
					me->RemoveAllAuras();
					me->SetWalk(false);
					events2.ScheduleEvent(EVENT_SVALA_TALK5, 2000);

					std::list<Creature*> creatureList;
					me->GetCreaturesWithEntryInRange(creatureList, 100.0f, NPC_DRAGONFLAYER_SPECTATOR);
					for (std::list<Creature*>::const_iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
						(*itr)->AI()->SetData(1, 2);

					break;
				}
				case EVENT_SVALA_TALK5:
					Talk(TALK_INTRO_S2);
					events2.ScheduleEvent(EVENT_SVALA_TALK6, 12000);
					break;
				case EVENT_SVALA_TALK6:
					if (Creature *Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID))
						Arthas->AI()->Talk(TALK_INTRO_A2);
					events2.ScheduleEvent(EVENT_SVALA_TALK7, 9000);
					break;
				case EVENT_SVALA_TALK7:
					me->SetFacingTo(M_PI/2.0f);
					Talk(TALK_INTRO_S3);
					if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_SVALA_MIRROR)))
						mirror->SetGoState(GO_STATE_ACTIVE);
					events2.ScheduleEvent(EVENT_SVALA_TALK8, 13000);
					break;
				case EVENT_SVALA_TALK8:
					me->GetMotionMaster()->MoveFall(0, true);
					events2.ScheduleEvent(EVENT_SVALA_TALK9, 2000);
					break;
				case EVENT_SVALA_TALK9:
					me->SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 3.0f);
					me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
					me->LoadEquipment(1, true);
					me->setActive(false);
					if (Player* target = SelectTargetFromPlayerList(100.0f))
						AttackStart(target);
					return;
			}

			if (!UpdateVictim())
				return;

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

			switch (events.ExecuteEvent())
			{
				case EVENT_SORROWGRAVE_SS:
					me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SINSTER_STRIKE_H : SPELL_SINSTER_STRIKE_N, false);
					events.ScheduleEvent(EVENT_SORROWGRAVE_SS, urand(3000, 5000));
					break;
				case EVENT_SORROWGRAVE_FLAMES:
					summons.DespawnAll();
					me->CastSpell(me, SPELL_CALL_FLAMES, false);
					events.ScheduleEvent(EVENT_SORROWGRAVE_FLAMES2, 500);
					events.ScheduleEvent(EVENT_SORROWGRAVE_FLAMES2, 1000);
					events.ScheduleEvent(EVENT_SORROWGRAVE_FLAMES, urand(8000, 12000));
					break;
				case EVENT_SORROWGRAVE_FLAMES2:
				{
					std::list<Creature*> braziers;
					me->GetCreaturesWithEntryInRange(braziers, 100.0f, NPC_FLAME_BRAZIER);
					if (!braziers.empty())
					{
						for (std::list<Creature*>::const_iterator itr = braziers.begin(); itr != braziers.end(); ++itr)
							(*itr)->CastCustomSpell(SPELL_BALL_OF_FLAME, SPELLVALUE_MAX_TARGETS, 1, (*itr), true);
					}
					break;
				}
				case EVENT_SORROWGRAVE_RITUAL:
					if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
            		{
						Talk(SAY_SACRIFICE_PLAYER);

						for (uint8 i = 0; i < 3; ++i)
							if (Creature* cr = me->SummonCreature(NPC_RITUAL_CHANNELER, RitualChannelerLoc[i], TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000))
								cr->AI()->AttackStart(target);

						me->GetMotionMaster()->MoveIdle();
						DoTeleportPlayer(target, 296.632f, -346.075f, 90.63f, 4.6f);
						me->NearTeleportTo(296.632f, -346.075f, 110.0f, 4.6f, false);
						me->SetControlled(true, UNIT_STATE_ROOT);
						me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
						me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
						me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
					}

					events.DelayEvents(25001); // +1 just to be sure
					events.ScheduleEvent(EVENT_SORROWGRAVE_RITUAL_SPELLS, 0);
					events.ScheduleEvent(EVENT_SORROWGRAVE_FINISH_RITUAL, 25000);
					return;
				case EVENT_SORROWGRAVE_RITUAL_SPELLS:
					//me->CastSpell(me, SPELL_RITUAL_OF_THE_SWORD, false);
					me->CastSpell(me, SPELL_RITUAL_STRIKE, true);
					return;
				case EVENT_SORROWGRAVE_FINISH_RITUAL:
					me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
					me->SetControlled(false, UNIT_STATE_ROOT);
					AttackStart(me->GetVictim());
					me->GetMotionMaster()->MoveFall(0, true);
					summons.DespawnAll();
					break;
			}

			DoMeleeAttackIfReady();
		}
 void EnterEvadeMode()
 {
     if (InciteChaos && SelectTargetFromPlayerList(100.0f))
         return;
     CreatureAI::EnterEvadeMode();
 }
示例#13
0
        void UpdateAI(uint32 diff)
        {
            if (!isActive)
            {
                IntroTimer += diff;
                if (IntroTimer > 5000 && IntroTimer < 10000)
                {
                    if (SelectTargetFromPlayerList(60))
                    {
                        Talk(SAY_INTRO_1);
                        IntroTimer = 10000;
                    }
                    else
                        IntroTimer = 0;
                }

                if (IntroTimer >= 30000 && IntroTimer < 40000)
                {
                    Talk(SAY_INTRO_2);
                    IntroTimer = 40000;
                }
                if (IntroTimer >= 60000)
                {
                    isActive = true;
                    if (m_pInstance)
                        m_pInstance->SetData(TYPE_LOKEN_INTRO, 1);

                    me->SetControlled(false, UNIT_STATE_STUNNED);
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);

                    if (Player* target = SelectTargetFromPlayerList(80))
                        AttackStart(target);
                }

                return;
            }

            //Return since we have no target
            if (!UpdateVictim())
                return;

            events.Update(diff);

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

            switch (events.GetEvent())
            {
                case EVENT_CHECK_HEALTH:
                    if (HealthBelowPct(HealthCheck))
                    {
                        LokenSpeach(true);
                        HealthCheck -= 25;
                    }

                    events.RepeatEvent(1000);
                    break;
                case EVENT_LIGHTNING_NOVA:
                    events.RepeatEvent(15000);
                    me->CastSpell(me, SPELL_LIGHTNING_NOVA_VISUAL, true);
                    me->CastSpell(me, SPELL_LIGHTNING_NOVA_THUNDERS, true);

                    events.DelayEvents(5001);
                    events.ScheduleEvent(EVENT_AURA_REMOVE, me->GetMap()->IsHeroic() ? 4000 : 5000);

                    me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_LIGHTNING_NOVA_H : SPELL_LIGHTNING_NOVA_N, false);
                    break;
                case EVENT_SHOCKWAVE:
                    me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_PULSING_SHOCKWAVE_H : SPELL_PULSING_SHOCKWAVE_N, false);
                    events.PopEvent();
                    break;
                case EVENT_ARC_LIGHTNING:
                    if (Unit* target = SelectTargetFromPlayerList(100, SPELL_ARC_LIGHTNING))
                        me->CastSpell(target, SPELL_ARC_LIGHTNING, false);

                    events.RepeatEvent(12000);
                    break;
                case EVENT_AURA_REMOVE:
                    me->RemoveAura(SPELL_LIGHTNING_NOVA_THUNDERS);
                    events.PopEvent();
                    break;
            }

            DoMeleeAttackIfReady();
        }
 void JustSummoned(Creature* summon)
 {
     summons.Summon(summon);
     if (Unit* target = SelectTargetFromPlayerList(100.0f))
         summon->AI()->AttackStart(target);
 }