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); }
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); } }
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(); }
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(); }
bool CheckEvadeIfOutOfCombatArea() const { return me->GetHomePosition().GetExactDist2d(me) > 80.0f || !SelectTargetFromPlayerList(100.0f); }
bool CheckEvadeIfOutOfCombatArea() const { return !SelectTargetFromPlayerList(120.0f); }
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(); }
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); }