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; } }
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(); }
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(); }
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(); }
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; } } }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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; } }
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(); }
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(); }
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; } }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }