void UpdateAI(const uint32 uiDiff) { if (!UpdateVictim()) return; events.Update(uiDiff); if (me->hasUnitState(UNIT_STAT_CASTING)) return; while(uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_STRIKE: switch(me->GetEntry()) { case WG_CREATURE_GUARD_A: case WG_CREATURE_GUARD_H: case WG_CREATURE_CHAMPION_A: case WG_CREATURE_CHAMPION_H: DoCast(me->getVictim(), SPELL_STRIKE); events.ScheduleEvent(EVENT_STRIKE, 5000); return; } case EVENT_ARCANE_MISSILES: switch(me->GetEntry()) { case WG_CREATURE_ENHANCEMENT_A: DoCast(me->getVictim(), SPELL_ARCANE_MISSILES); events.ScheduleEvent(EVENT_ARCANE_MISSILES, 5000); return; } case EVENT_SLOW: switch(me->GetEntry()) { case WG_CREATURE_ENHANCEMENT_A: DoCast(me->getVictim(), SPELL_SLOW); events.ScheduleEvent(EVENT_SLOW, 15000); return; } case EVENT_HEALING_WAVE: switch(me->GetEntry()) { case WG_CREATURE_ENHANCEMENT_H: if (HealthBelowPct(50)) DoCast(me, SPELL_HEALING_WAVE); events.ScheduleEvent(EVENT_HEALING_WAVE, 3000); return; } case EVENT_LIGHTNING_BOLT: switch(me->GetEntry()) { case WG_CREATURE_ENHANCEMENT_H: DoCast(me->getVictim(), SPELL_LIGHTNING_BOLT); events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 5000); return; } case EVENT_QUICK_FLAME_WARD: switch(me->GetEntry()) { case WG_CREATURE_ENHANCEMENT_H: DoCast(me, SPELL_QUICK_FLAME_WARD); events.ScheduleEvent(EVENT_QUICK_FLAME_WARD, 10000); return; } case EVENT_MORTAL_STRIKE: switch(me->GetEntry()) { case WG_CREATURE_QUESTGIVER_1_A: case WG_CREATURE_QUESTGIVER_1_H: case WG_CREATURE_QUESTGIVER_2_A: case WG_CREATURE_QUESTGIVER_2_H: case WG_CREATURE_QUESTGIVER_3_A: case WG_CREATURE_QUESTGIVER_3_H: case WG_CREATURE_QUESTGIVER_4_A: case WG_CREATURE_QUESTGIVER_4_H: DoCast(me->getVictim(), SPELL_MORTAL_STRIKE); events.ScheduleEvent(EVENT_MORTAL_STRIKE, 10000); return; } case EVENT_HEAL: switch(me->GetEntry()) { case WG_CREATURE_QUESTGIVER_5_A: if (HealthBelowPct(50)) DoCast(me, SPELL_HEAL); events.ScheduleEvent(EVENT_HEAL, 5000); return; } case EVENT_HOLY_NOVA: switch(me->GetEntry()) { case WG_CREATURE_QUESTGIVER_5_A: DoCast(me, SPELL_HOLY_NOVA); events.ScheduleEvent(EVENT_HOLY_NOVA, 8000); return; } case EVENT_CLEAVE: switch(me->GetEntry()) { case WG_CREATURE_QUESTGIVER_5_H: case WG_CREATURE_QUESTGIVER_6_A: case WG_CREATURE_QUESTGIVER_6_H: DoCast(me->getVictim(), SPELL_CLEAVE); events.ScheduleEvent(EVENT_CLEAVE, 10000); return; } } } switch(me->GetEntry()) { case WG_CREATURE_ENHANCEMENT_A: case WG_CREATURE_ENHANCEMENT_H: case WG_CREATURE_QUESTGIVER_5_A: return; default: DoMeleeAttackIfReady(); return; } }
void UpdateAI(const uint32 diff) { switch (phase) { case PHASE_CHAINED: if (!anchorGUID) { if (Creature* anchor = me->FindNearestCreature(29521, 30)) { anchor->AI()->SetGUID(me->GetGUID()); anchor->CastSpell(me, SPELL_SOUL_PRISON_CHAIN, true); anchorGUID = anchor->GetGUID(); } else sLog->outError("npc_unworthy_initiateAI: unable to find anchor!"); float dist = 99.0f; GameObject* prison = NULL; for (uint8 i = 0; i < 12; ++i) { if (GameObject* temp_prison = me->FindNearestGameObject(acherus_soul_prison[i], 30)) { if (me->IsWithinDist(temp_prison, dist, false)) { dist = me->GetDistance2d(temp_prison); prison = temp_prison; } } } if (prison) prison->ResetDoorOrButton(); else sLog->outError("npc_unworthy_initiateAI: unable to find prison!"); } break; case PHASE_TO_EQUIP: if (wait_timer) { if (wait_timer > diff) wait_timer -= diff; else { me->GetMotionMaster()->MovePoint(1, anchorX, anchorY, me->GetPositionZ()); //sLog->outDebug(LOG_FILTER_TSCR, "npc_unworthy_initiateAI: move to %f %f %f", anchorX, anchorY, me->GetPositionZ()); phase = PHASE_EQUIPING; wait_timer = 0; } } break; case PHASE_TO_ATTACK: if (wait_timer) { if (wait_timer > diff) wait_timer -= diff; else { me->setFaction(14); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); phase = PHASE_ATTACKING; if (Player* target = Unit::GetPlayer(*me, playerGUID)) me->AI()->AttackStart(target); wait_timer = 0; } } break; case PHASE_ATTACKING: if (!UpdateVictim()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_ICY_TOUCH: DoCast(me->getVictim(), SPELL_ICY_TOUCH); events.DelayEvents(1000, GCD_CAST); events.ScheduleEvent(EVENT_ICY_TOUCH, 5000, GCD_CAST); break; case EVENT_PLAGUE_STRIKE: DoCast(me->getVictim(), SPELL_PLAGUE_STRIKE); events.DelayEvents(1000, GCD_CAST); events.ScheduleEvent(SPELL_PLAGUE_STRIKE, 5000, GCD_CAST); break; case EVENT_BLOOD_STRIKE: DoCast(me->getVictim(), SPELL_BLOOD_STRIKE); events.DelayEvents(1000, GCD_CAST); events.ScheduleEvent(EVENT_BLOOD_STRIKE, 5000, GCD_CAST); break; case EVENT_DEATH_COIL: DoCast(me->getVictim(), SPELL_DEATH_COIL); events.DelayEvents(1000, GCD_CAST); events.ScheduleEvent(EVENT_DEATH_COIL, 5000, GCD_CAST); break; } } DoMeleeAttackIfReady(); break; default: break; } }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) { if (phase == PHASE_FLIGHT && !me->IsInEvadeMode()) EnterEvadeMode(); return; } events.Update(diff); if (me->IsNonMeleeSpellCasted(false)) return; if (phase == PHASE_GROUND) { switch (events.ExecuteEvent()) { case EVENT_BERSERK: DoScriptText(YELL_BERSERK, me); DoCast(me, SPELL_BERSERK, true); events.ScheduleEvent(EVENT_BERSERK, 10000); break; case EVENT_CLEAVE: DoCast(me->getVictim(), SPELL_CLEAVE, false); events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000)); break; case EVENT_CORROSION: DoCast(me->getVictim(), SPELL_CORROSION, false); events.ScheduleEvent(EVENT_CORROSION, urand(20000, 30000)); break; case EVENT_GAS_NOVA: DoCast(me, SPELL_GAS_NOVA, false); events.ScheduleEvent(EVENT_GAS_NOVA, urand(20000, 25000)); break; case EVENT_ENCAPSULATE: if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true)) DoCast(pTarget, SPELL_ENCAPSULATE_CHANNEL, false); events.ScheduleEvent(EVENT_ENCAPSULATE, urand(25000, 30000)); break; case EVENT_FLIGHT: EnterPhase(PHASE_FLIGHT); break; default: DoMeleeAttackIfReady(); break; } } if (phase == PHASE_FLIGHT) { switch (events.ExecuteEvent()) { case EVENT_BERSERK: DoScriptText(YELL_BERSERK, me); DoCast(me, SPELL_BERSERK, true); break; case EVENT_FLIGHT_SEQUENCE: HandleFlightSequence(); break; case EVENT_SUMMON_FOG: float x, y, z; me->GetPosition(x, y, z); me->UpdateGroundPositionZ(x, y, z); if (Creature *Fog = me->SummonCreature(MOB_VAPOR_TRAIL, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 10000)) { Fog->RemoveAurasDueToSpell(SPELL_TRAIL_TRIGGER); Fog->CastSpell(Fog, SPELL_FOG_TRIGGER, true); me->CastSpell(Fog, SPELL_FOG_FORCE, true); } events.ScheduleEvent(EVENT_SUMMON_FOG, 1000); break; } } }
void UpdateAI(uint32 const diff) { if (!intro) { me->SummonCreature(NPC_SLIPPERY_FLOOR, SummonPositions[0]); // floor ambient me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); me->SetReactState(REACT_AGGRESSIVE); intro = true; } if (!UpdateVictim()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_SWITCH_PHASE: if (events.GetPhaseMask() & PHASE_MASK_ONE) { // Emote: Ahune retreats. His defenses diminish. // me->MonsterTextEmote(EMOTE_SUBMERGE, 0, true); //Hack Fix by jacob events.SetPhase(PHASE_TWO); events.ScheduleEvent(EVENT_SWITCH_PHASE, 30000); DoCast(me, SPELL_MAKE_BONFIRE); me->AttackStop(); me->SetReactState(REACT_PASSIVE); me->setFaction(35); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED); me->HandleEmoteCommand(EMOTE_ONESHOT_SUBMERGE); me->SummonCreature(NPC_FROZEN_CORE, SummonPositions[0], TEMPSUMMON_CORPSE_DESPAWN); } else { events.SetPhase(PHASE_ONE); events.ScheduleEvent(EVENT_SWITCH_PHASE, 90000); events.ScheduleEvent(EVENT_COLD_SLAP, 500, 0, PHASE_ONE); events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 1000, 0, PHASE_ONE); events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 8000, 0, PHASE_ONE); events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 9000, 0, PHASE_ONE); events.ScheduleEvent(EVENT_ICE_SPEAR, 9500, 0, PHASE_ONE); events.ScheduleEvent(EVENT_EARTHEN_RING_ATTACK, 10000, 0, PHASE_ONE); me->SetReactState(REACT_AGGRESSIVE); me->setFaction(14); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); DoCastVictim(SPELL_RESURFACE); summons.DespawnEntry(NPC_FROZEN_CORE); } break; case EVENT_COLD_SLAP: if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 8.0f, true)) { DoCast(target, SPELL_COLD_SLAP); Position targetPos; target->GetNearPosition(targetPos, float(rand_norm()) * 5.0f + 35.0f, me->GetAngle(target)); target->GetMotionMaster()->MoveJump(targetPos.GetPositionX(), targetPos.GetPositionY(), targetPos.GetPositionZ(), target->GetExactDist2d(targetPos.GetPositionX(), targetPos.GetPositionY()), 10.0f); } events.ScheduleEvent(EVENT_COLD_SLAP, 500, 0, PHASE_ONE); break; case EVENT_ICE_SPEAR: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 120.0f, true)) { target->CastSpell(target, SPELL_ICESPEAR_SUMMON_BUNNY); target->CastSpell(target, SPELL_ICESPEAR_SUMMON_GO); events.ScheduleEvent(EVENT_ICE_SPEAR_KNOCKBACK, 2000); } events.ScheduleEvent(EVENT_ICE_SPEAR, 7000, 0, PHASE_ONE); break; case EVENT_ICE_SPEAR_KNOCKBACK: if (GameObject* go = me->FindNearestGameObject(GO_ICE_SPEAR, 120.0f)) { go->UseDoorOrButton(); Map::PlayerList const& playerList = me->GetMap()->GetPlayers(); if (!playerList.isEmpty()) for (Map::PlayerList::const_iterator i = playerList.begin(); i != playerList.end(); ++i) if (i->getSource() && go->GetDistance(i->getSource()) <= 2.0f) i->getSource()->CastSpell(i->getSource(), SPELL_ICESPEAR_KNOCKBACK); go->Delete(); } break; case EVENT_SUMMON_HAILSTONE: me->SummonCreature(NPC_AHUNITE_HAILSTONE, SummonPositions[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); break; case EVENT_SUMMON_COLDWEAVE: me->SummonCreature(NPC_AHUNITE_COLDWEAVE, SummonPositions[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); me->SummonCreature(NPC_AHUNITE_COLDWEAVE, SummonPositions[3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 5000, 0, PHASE_ONE); break; case EVENT_SUMMON_FROSTWIND: me->SummonCreature(NPC_AHUNITE_FROSTWIND, SummonPositions[urand(2,3)], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 7000, 0, PHASE_ONE); break; case EVENT_EARTHEN_RING_ATTACK: if (Creature* totem = me->FindNearestCreature(NPC_EARTHEN_RING_TOTEM, 200.0f)) { totem->CastSpell(me, SPELL_BEAM_ATTACK, false); totem->CastSpell(me, SPELL_BEAM_ATTACK_BEAM, false); } events.ScheduleEvent(EVENT_EARTHEN_RING_ATTACK, 10000, 0, PHASE_ONE); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { events.Update(diff); switch (events.ExecuteEvent()) { case EVENT_SPAWN: { if (Creature* Dalfors = DoSummon(NPC_CRUSADER_LORD_DALFORS, DalforsPos[0])) { guidDalfors = Dalfors->GetGUID(); Dalfors->GetMotionMaster()->MovePoint(0, DalforsPos[1]); } if (Creature* Priest1 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest1Pos[0])) { guidPriest[0] = Priest1->GetGUID(); Priest1->GetMotionMaster()->MovePoint(0, Priest1Pos[1]); } if (Creature* Priest2 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest2Pos[0])) { guidPriest[1] = Priest2->GetGUID(); Priest2->GetMotionMaster()->MovePoint(0, Priest2Pos[1]); } if (Creature* Priest3 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest3Pos[0])) { guidPriest[2] = Priest3->GetGUID(); Priest3->GetMotionMaster()->MovePoint(0, Priest3Pos[1]); } if (Creature* Mason1 = DoSummon(NPC_ARGENT_MASON, Mason1Pos[0])) { guidMason[0] = Mason1->GetGUID(); Mason1->GetMotionMaster()->MovePoint(0, Mason1Pos[1]); } if (Creature* Mason2 = DoSummon(NPC_ARGENT_MASON, Mason2Pos[0])) { guidMason[1] = Mason2->GetGUID(); Mason2->GetMotionMaster()->MovePoint(0, Mason2Pos[1]); } if (Creature* Mason3 = DoSummon(NPC_ARGENT_MASON, Mason3Pos[0])) { guidMason[2] = Mason3->GetGUID(); Mason3->GetMotionMaster()->MovePoint(0, Mason3Pos[1]); } events.ScheduleEvent(EVENT_INTRO_1, 15000); } break; case EVENT_INTRO_1: { if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) Dalfors->AI()->Talk(DALFORS_SAY_PRE_1); events.ScheduleEvent(EVENT_INTRO_2, 5000); } break; case EVENT_INTRO_2: { if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) { Dalfors->SetFacingTo(6.215f); Dalfors->AI()->Talk(DALFORS_SAY_PRE_2); } events.ScheduleEvent(EVENT_INTRO_3, 5000); } break; case EVENT_INTRO_3: { if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) { Dalfors->GetMotionMaster()->MovePoint(0, DalforsPos[2]); Dalfors->SetHomePosition(DalforsPos[2]); } if (Creature* Priest1 = ObjectAccessor::GetCreature(*me, guidPriest[0])) { Priest1->SetFacingTo(5.7421f); Priest1->SetHomePosition(Priest1Pos[1]); } if (Creature* Priest2 = ObjectAccessor::GetCreature(*me, guidPriest[1])) { Priest2->SetFacingTo(5.7421f); Priest2->SetHomePosition(Priest2Pos[1]); } if (Creature* Priest3 = ObjectAccessor::GetCreature(*me, guidPriest[2])) { Priest3->SetFacingTo(5.7421f); Priest3->SetHomePosition(Priest3Pos[1]); } if (Creature* Mason1 = ObjectAccessor::GetCreature(*me, guidMason[0])) { Mason1->GetMotionMaster()->MovePoint(0, Mason1Pos[2]); Mason1->SetHomePosition(Mason1Pos[2]); } if (Creature* Mason2 = ObjectAccessor::GetCreature(*me, guidMason[1])) { Mason2->GetMotionMaster()->MovePoint(0, Mason2Pos[2]); Mason2->SetHomePosition(Mason2Pos[2]); } if (Creature* Mason3 = ObjectAccessor::GetCreature(*me, guidMason[2])) { Mason3->GetMotionMaster()->MovePoint(0, Mason3Pos[2]); Mason3->SetHomePosition(Mason3Pos[2]); } events.ScheduleEvent(EVENT_START_FIGHT, 5000); events.ScheduleEvent(EVENT_MASON_ACTION, 15000); } break; case EVENT_MASON_ACTION: { if (Creature* Mason1 = ObjectAccessor::GetCreature(*me, guidMason[0])) { Mason1->SetFacingTo(2.8972f); Mason1->AI()->SetData(1, 1); // triggers SAI actions on npc } if (Creature* Mason2 = ObjectAccessor::GetCreature(*me, guidMason[1])) { Mason2->SetFacingTo(3.1241f); Mason2->AI()->SetData(1, 1); // triggers SAI actions on npc } if (Creature* Mason3 = ObjectAccessor::GetCreature(*me, guidMason[2])) { Mason3->SetFacingTo(3.6651f); Mason3->AI()->SetData(1, 1); // triggers SAI actions on npc } } break; case EVENT_START_FIGHT: { if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) LK->AI()->Talk(LK_TALK_1); if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) Dalfors->AI()->Talk(DALFORS_SAY_START); events.ScheduleEvent(EVENT_WAVE_SPAWN, 1000); } break; case EVENT_WAVE_SPAWN: { if (PhaseCount == 3) { if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) LK->AI()->Talk(LK_TALK_2); } else if (PhaseCount == 6) { if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) LK->AI()->Talk(LK_TALK_3); } if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason3Pos[0])) { tempsum->SetHomePosition(DalforsPos[2]); tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } if (urand(0, 1) == 0) { if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER, Mason1Pos[0])) { tempsum->SetHomePosition(DalforsPos[2]); tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER, Mason2Pos[0])) { tempsum->SetHomePosition(DalforsPos[2]); tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } } else { if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN, Mason1Pos[0])) { tempsum->SetHomePosition(DalforsPos[2]); tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN, Mason2Pos[0])) { tempsum->SetHomePosition(DalforsPos[2]); tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } } PhaseCount++; if (PhaseCount < 8) events.ScheduleEvent(EVENT_WAVE_SPAWN, urand(10000, 20000)); else events.ScheduleEvent(EVENT_HALOF, urand(10000, 20000)); } break; case EVENT_HALOF: { if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) LK->AI()->Talk(LK_TALK_4); if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason1Pos[0])) { tempsum->SetHomePosition(DalforsPos[2]); tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason2Pos[0])) { tempsum->SetHomePosition(DalforsPos[2]); tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } if (Creature* tempsum = DoSummon(NPC_HALOF_THE_DEATHBRINGER, DalforsPos[0])) { HalofSpawned = true; guidHalof = tempsum->GetGUID(); tempsum->SetHomePosition(DalforsPos[2]); tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } } break; case EVENT_ENDED: { Summons.DespawnAll(); me->DespawnOrUnsummon(); } break; } if (PhaseCount == 8) if (Creature* Halof = ObjectAccessor::GetCreature(*me, guidHalof)) if (Halof->isDead()) { DoCast(me, SPELL_CRUSADERS_SPIRE_VICTORY, true); Summons.DespawnEntry(NPC_HIDEOUS_PLAGEBRINGER); Summons.DespawnEntry(NPC_REANIMATED_CAPTAIN); Summons.DespawnEntry(NPC_SCOURGE_DRUDGE); Summons.DespawnEntry(NPC_HALOF_THE_DEATHBRINGER); if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) Dalfors->AI()->Talk(DALFORS_YELL_FINISHED); events.ScheduleEvent(EVENT_ENDED, 10000); } }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) { if (pInstance && pInstance->GetData(SPELL_RITUAL_OF_PURIFICATION) == false) me->RemoveAura(SPELL_RITUAL_OF_PURIFICATION); return; } if (me->HasUnitState(UNIT_STATE_CASTING)) return; events.Update(diff); switch (events.ExecuteEvent()) { case EVENT_CHECK_MELEE: { if (!me->IsWithinMeleeRange(me->getVictim(), 2.0f)) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f)) me->CastSpell(target, SPELL_REACHING_ATTACK, false); } else { // Always attack champion of light if (Player* target = GetChampionOfLight(me)) if (me->getVictim() && me->getVictim()->GetGUID() != target->GetGUID()) AttackStart(target); } events.ScheduleEvent(EVENT_CHECK_MELEE, 1000); break; } case EVENT_EERIE_SKULL: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 60.0f)) me->CastSpell(target, SPELL_EERIE_SKULL, false); events.ScheduleEvent(EVENT_EERIE_SKULL, 5000); break; } case EVENT_CHECK_ENERGY: { if (!pInstance) { events.ScheduleEvent(EVENT_CHECK_ENERGY, 1000); break; } if (me->GetPower(POWER_ENERGY) >= me->GetMaxPower(POWER_ENERGY)) { if (Creature* pureLight = Creature::GetCreature(*me, pInstance->GetData64(NPC_PURE_LIGHT_TERRACE))) me->CastSpell(pureLight, SPELL_BREATH_OF_FEAR, false); Talk(TALK_BREATH_OF_FEAR); me->SetPower(POWER_ENERGY, 0); me->SetInt32Value(UNIT_FIELD_POWER1, 0); } events.ScheduleEvent(EVENT_CHECK_ENERGY, 1000); break; } case EVENT_FIRST_TERRORS: { me->CastSpell(me, SPELL_CONJURE_TERROR_SPAWN_TICK, true); break; } default: break; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING)) return; if (me->HealthBelowPct(81) && !firstSelection) { events.CancelEvent(EVENT_WHIRLWIND); events.CancelEvent(EVENT_GRIEVOUS_THROW); EnterPhase(RAND(PHASE_BEAR, PHASE_LYNX)); firstSelection = true; } if (me->HealthBelowPct(41) && !secondSelection) { if (Phase == PHASE_BEAR) { events.CancelEvent(EVENT_SURGE); events.CancelEvent(EVENT_OVERPOWER); events.CancelEvent(EVENT_CREEPING_PARALYSIS); } else if (Phase == PHASE_LYNX) { events.CancelEvent(EVENT_CLAW_RAGE); events.CancelEvent(EVENT_LYNX_RUSH); } EnterPhase(RAND(PHASE_EAGLE, PHASE_DRAGONHAWK)); secondSelection = true; } if (isFlameBreathing) { if (!me->IsNonMeleeSpellCasted(false)) isFlameBreathing = false; else return; } events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) { //====== Troll Form case EVENT_WHIRLWIND: DoCast(me, SPELL_WHIRLWIND); events.ScheduleEvent(EVENT_WHIRLWIND, urand(15000, 20000)); break; case EVENT_GRIEVOUS_THROW: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_GRIEVOUS_THROW, false); events.ScheduleEvent(EVENT_GRIEVOUS_THROW, urand(10000, 11000)); break; //====== Bear Form case EVENT_SURGE: if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 80.0f, true)) // Try to select farthest target. DoCast(target, SPELL_SURGE); events.ScheduleEvent(EVENT_SURGE, urand(15000, 20000)); break; case EVENT_OVERPOWER: DoCastVictim(SPELL_OVERPOWER); events.ScheduleEvent(EVENT_OVERPOWER, urand(11000, 15000)); break; case EVENT_CREEPING_PARALYSIS: { Map::PlayerList const& players = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (Player* player = itr->getSource()) DoCast(player, SPELL_CREEPING_PARALYSIS); events.ScheduleEvent(EVENT_CREEPING_PARALYSIS, urand(19000, 21000)); } break; //====== Lynx Form case EVENT_SUMMON_LYNX: DoCast(me, SPELL_SUMMON_LYNX); break; case EVENT_CLAW_RAGE: if (canCastClaw && clawRageTicks < 10) { if(!hasclawTarget) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { DoCast(target, SPELL_CLAW_RAGE_CHARGE, false); DoCast(target, SPELL_CLAW_RAGE_DAMAGE, false); clawTarget = target; hasclawTarget = true; } } else { DoCast(clawTarget, SPELL_CLAW_RAGE_DAMAGE, false); } clawRageTicks++; events.ScheduleEvent(EVENT_CLAW_RAGE, 500); } else { canCastClaw = false; clawRageTicks = 0; hasclawTarget = false; canCastRush = true; events.ScheduleEvent(EVENT_CLAW_RAGE, urand(15000, 20000)); } break; case EVENT_LYNX_RUSH: if (canCastRush && lynxRushes < 4) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_LYNX_RUSH); lynxRushes++; events.ScheduleEvent(EVENT_LYNX_RUSH, 1000); } else { canCastRush = false; lynxRushes = 0; events.ScheduleEvent(EVENT_LYNX_RUSH, urand(15000, 20000)); canCastClaw = true; } break; //====== Eagle Form case EVENT_LIGHTNING_TOTEM: DoCast(me, SPELL_SUMMON_LIGHT_TOTEM); events.ScheduleEvent(EVENT_LIGHTNING_TOTEM, urand(15000, 18000)); break; case EVENT_SWEEPING_WINDS: DoCast(me, SPELL_SWEEPING_WINDS); events.ScheduleEvent(EVENT_TORNADO_MOVE, 1000); // events.ScheduleEvent(EVENT_SWEEPING_WINDS, urand(9000, 11000)); break; case EVENT_TORNADO_MOVE: { std::list<Creature*> creatures; GetCreatureListWithEntryInGrid(creatures, me, 52865, 1000.0f); if (creatures.empty()) return; for (std::list<Creature*>::iterator iter = creatures.begin(); iter != creatures.end(); ++iter) { (*iter)->SetWalk(false); (*iter)->SetSpeed(MOVE_RUN, 2.5f); (*iter)->GetMotionMaster()->MoveRandom(20.0f); } events.ScheduleEvent(EVENT_TORNADO_STOP, 2000); } break; case EVENT_TORNADO_STOP: { std::list<Creature*> creatures; GetCreatureListWithEntryInGrid(creatures, me, 52865, 1000.0f); if (creatures.empty()) return; for (std::list<Creature*>::iterator iter = creatures.begin(); iter != creatures.end(); ++iter) { (*iter)->GetMotionMaster()->MovementExpired(); (*iter)->GetMotionMaster()->Clear(); } } break; //====== Dragonhawk Form case EVENT_FLAME_BREATH: Talk(YELL_FIRE_BREATH); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { me->AttackStop(); me->GetMotionMaster()->Clear(); for (uint8 i = 0; i < 7; i++) { float x, y, z; me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, 1.0f + (4 * i)); me->CastSpell(x, y, z, SPELL_SUMMON_BREATH_LINE, true); } DoCast(target, SPELL_FLAME_BREATH); me->StopMoving(); isFlameBreathing = true; } events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 15000)); break; case EVENT_FLAME_WHIRL: DoCast(me, SPELL_FLAME_WHIRL); events.ScheduleEvent(EVENT_FLAME_WHIRL, urand(10000, 12000)); break; case EVENT_PILLAR_OF_FIRE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_SUMMON_PILLAR); events.ScheduleEvent(EVENT_PILLAR_OF_FIRE, urand(8000, 11000)); break; case EVENT_BERSERK: Talk(YELL_BERSERK); DoCast(me, SPELL_BERSERK); break; } } if (Phase != PHASE_EAGLE) DoMeleeAttackIfReady(); }
void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; if (me->getVictim()->GetTypeId() != TYPEID_PLAYER) { EnterEvadeMode(); return; } // dialog if (talkPhase == SAY_AGGRO) { Talk(SAY_AGGRO); talkPhase++; } else if (me->GetHealthPct() <= 80.0f && talkPhase++ == SAY_80PERC) Talk(SAY_80PERC); else if (me->GetHealthPct() <= 60.0f && talkPhase++ == SAY_60PERC) Talk(SAY_60PERC); else if (me->GetHealthPct() <= 5.0f && talkPhase++ == SAY_5PERC) Talk(SAY_5PERC); // Immune-Choosing-Phase if (me->GetHealthPct() <= 30 && !wasImmune) { me->InterruptNonMeleeSpells(true); DoCastVictim(SPELL_BINDINGS); // has implicit targeting Talk(SAY_30PERC); Talk(EMOTE_SHIELDED); talkPhase += 2; // workaround for SpellHit not being called for implicit targeting if (Creature* zepik = me->FindNearestCreature(NPC_ZEPIK, 60.0f, true)) zepik->GetAI()->DoAction(ACTION_BIND); if (Creature* jaloot = me->FindNearestCreature(NPC_JALOOT, 60.0f, true)) jaloot->GetAI()->DoAction(ACTION_BIND); wasImmune = true; isBound = true; } events.Update(diff); if (isBound || me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) switch (eventId) { case EVENT_FROSTBOLT: DoCastVictim(SPELL_FROSTBOLT); events.ScheduleEvent(EVENT_FROSTBOLT, 4000); break; case EVENT_ICE_LANCE: DoCastVictim(SPELL_ICE_LANCE); events.ScheduleEvent(EVENT_ICE_LANCE, 7000); break; case EVENT_FROST_NOVA: DoCastVictim(SPELL_FROST_NOVA); events.ScheduleEvent(EVENT_FROST_NOVA, 14000); break; case EVENT_ICY_VEINS: DoCast(me, SPELL_ICY_VEINS); events.ScheduleEvent(EVENT_ICY_VEINS, 25000); break; } }
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) { if (!(UpdateVictim() && isInManglePhase) || me->HasUnitState(UNIT_STATE_CASTING)) return; if(me->GetMap()->IsHeroic()) { if (Creature* nefarian = me->FindNearestCreature(NPC_NEFARIAN_HELPER_HEROIC, 150.0f, true)) { if(me->GetHealthPct() < 95 && say1 == false) { nefarian->AI()->Talk(NEF_H_STARTED_C); say1 = true; } if(me->GetHealthPct() < 31 && say2 == false) { nefarian->AI()->Talk(NEF_H_LOW_HP); say2 = true; events.CancelEvent(EVENT_BLAZING_INFERNO); events.ScheduleEvent(EVENT_SHADOW_BREATH, urand(6000, 9000)); } } } events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_IGNITION: CastIgnition(); break; case EVENT_SHADOW_BREATH: if (Creature* nefarian = me->FindNearestCreature(NPC_NEFARIAN_HELPER_HEROIC, 150.0f, true)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) nefarian->CastSpell(target, SPELL_SHADOW_BREATH, false); events.ScheduleEvent(EVENT_SHADOW_BREATH, urand(9000, 13000)); break; case EVENT_BLAZING_INFERNO: if (Creature* nefarian = me->FindNearestCreature(NPC_NEFARIAN_HELPER_HEROIC, 150.0f, true)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) nefarian->CastSpell(target, SPELL_BLAZING_INFERNO, false); events.ScheduleEvent(EVENT_BLAZING_INFERNO, urand(30000, 35000)); break; case EVENT_MAGMA_SPIT: me->AttackStop(); CastMagmaSpit(); me->Attack(me->GetVictim(), true); events.ScheduleEvent(EVENT_MAGMA_SPIT, urand(8000, 11000)); break; case EVENT_LAVA_SPEW: DoCastAOE(SPELL_LAVA_SPEW); events.ScheduleEvent(EVENT_LAVA_SPEW, urand(17000,20000)); break; case EVENT_BREAK_FREE: if (me->HasAura(SPELL_CUSTOM_STATE_05)) // Check if the second chain hit or not. { Talk(ANN_BREAK_FREE); me->RemoveAura(SPELL_CUSTOM_STATE_05); if (Creature* spikeStalker = me->FindNearestCreature(41767, 50.0f, true)) spikeStalker->AI()->DoAction(ACTION_SPIKE_RESET); } break; case EVENT_PILLAR_OF_FLAME: if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 80.0f, true)) // Try to select farthest target. { if (me->GetDistance2d(target) >= 15.0f) // If target is over 15y away, it's ok. DoCast(target, SPELL_PILLAR_OF_FLAME); else if (me->GetDistance2d(target) < 15.0f) // If target is less then 15y away, cast on nearest, as they are hacking the encounter by standing all melee. if (Unit* target2 = SelectTarget(SELECT_TARGET_NEAREST, 0, 80.0f, true)) DoCast(target2, SPELL_PILLAR_OF_FLAME); } events.ScheduleEvent(EVENT_PILLAR_OF_FLAME, urand(20000, 25000)); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK); break; case EVENT_MANGLE: if (Unit* victim = me->GetVictim()) { if (victim->GetTypeId() == TYPEID_PLAYER) { sTarget = victim; sTar = true; isInManglePhase = true; Talk(ANN_CLOSE_HEAD); me->AddAura(SPELL_MANGLE, victim); DoCast(me, SPELL_CUSTOM_IMPACT_06); if (Unit* magmawHead = vehicle->GetPassenger(0)) victim->CastSpell(magmawHead, SPELL_ENTER_MOUTH, true); //sTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } } events.ScheduleEvent(EVENT_MANGLE, 90000); events.ScheduleEvent(EVENT_IGNITION, 5000); events.ScheduleEvent(EVENT_MASSIVE_CRASH, 10000); events.ScheduleEvent(EVENT_KILL_TANK, 30000); break; case EVENT_MASSIVE_CRASH: events.CancelEvent(EVENT_LAVA_SPEW); events.CancelEvent(EVENT_PILLAR_OF_FLAME); events.CancelEvent(EVENT_MAGMA_SPIT); DoCast(me, SPELL_MASSIVE_CRASH); Talk(ANN_EXPOSE_PINCERS); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); // Enter Head Phase if (Unit* head = vehicle->GetPassenger(0)) { Unit* pincer1 = head->GetVehicleKit()->GetPassenger(0); Unit* pincer2 = head->GetVehicleKit()->GetPassenger(1); // Make pincers visible and right faction. if (pincer1 && pincer2) { pincer1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); pincer2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); pincer1->setFaction(35); pincer2->setFaction(35); } } break; case EVENT_EJECT_PINCERS: if (Unit* head = vehicle->GetPassenger(0)) { Unit* pincer1 = head->GetVehicleKit()->GetPassenger(0); Unit* pincer2 = head->GetVehicleKit()->GetPassenger(1); // Eject pincer passengers and set right faction. if (pincer1 && pincer2) { pincer1->GetVehicleKit()->RemoveAllPassengers(); pincer2->GetVehicleKit()->RemoveAllPassengers(); pincer1->setFaction(14); pincer2->setFaction(14); pincer1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pincer2->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } if (sTar) { head->RemoveAura(SPELL_ENTER_MOUTH); // Remove from mouth seat. sTarget->CastSpell(sTarget, SPELL_SWELTERING_ARMOR, true); if (Unit* hTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) sTarget->JumpTo(hTarget, 10.0f); isInManglePhase = false; sTar = false; } } break; case EVENT_KILL_TANK: if (Unit* head = vehicle->GetPassenger(0)) if (sTar) { head->RemoveAura(SPELL_ENTER_MOUTH); // Remove from mouth seat. sTarget->CastSpell(sTarget, SPELL_MANGLED_LIFELESS, true); me->Kill(sTarget); isInManglePhase = false; sTar = false; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } break; case EVENT_LEAVE_GROUND_PHASE: // Leave Head Phase if (Unit* head = vehicle->GetPassenger(0)) { head->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); head->RemoveAllAuras(); me->RemoveAura(SPELL_POINT_OF_VULNERABILITY2); head->RemoveAura(SPELL_POINT_OF_VULNERABILITY); head->RemoveAura(SPELL_POINT_OF_VULNERABILITY2); } me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveAura(SPELL_CUSTOM_STATE_04); events.ScheduleEvent(EVENT_LAVA_SPEW, urand(17000,20000)); events.ScheduleEvent(EVENT_MAGMA_SPIT, urand(8000, 11000)); events.ScheduleEvent(EVENT_PILLAR_OF_FLAME, 25000); break; } } if(!me->HasAura(SPELL_CUSTOM_STATE_04) && !me->HasAura(SPELL_CUSTOM_STATE_05) && !isInManglePhase) DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!pInstance || !UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (me->GetVictim()) if (me->GetVictim()->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 55.0f) { DoCastVictim(SPELL_LIGHTNING_BLAST); return; } while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_CHILLING_BREATH: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) DoCast(target, SPELL_CHILLING_BREATH); events.ScheduleEvent(EVENT_CHILLING_BREATH, urand(10000, 16000)); break; case EVENT_RESET_WIND: if (_aircurrent) _aircurrent->DespawnOrUnsummon(); events.DelayEvents(1000); events.ScheduleEvent(EVENT_CALL_OF_WIND, 800); break; case EVENT_CALL_OF_WIND: _aircurrent = me->SummonCreature(NPC_AIR_CURRENT, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), orientations[urand(0, 3)]); events.ScheduleEvent(EVENT_RESET_WIND, 18000); break; case EVENT_CHECK_FACING: if (me->GetMap()->GetPlayers().isEmpty() || !_aircurrent) break; for (Map::PlayerList::const_iterator itr = me->GetMap()->GetPlayers().begin(); itr != me->GetMap()->GetPlayers().end(); ++itr) { if (CheckOrientation(itr->GetSource()->GetOrientation(), _aircurrent->GetOrientation())) { itr->GetSource()->RemoveAurasDueToSpell(SPELL_DOWNWIND_OF_ALTAIRUS); me->AddAura(SPELL_UPWIND_OF_ALTAIRUS, itr->GetSource()); } else { itr->GetSource()->RemoveAurasDueToSpell(SPELL_UPWIND_OF_ALTAIRUS); me->AddAura(SPELL_DOWNWIND_OF_ALTAIRUS, itr->GetSource()); } } events.ScheduleEvent(EVENT_CHECK_FACING, 3000); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!me->isActiveObject()) return; events.Update(diff); switch (events.ExecuteEvent()) { case 1: if (Creature* c = me->FindNearestCreature(NPC_SUNWELL_HONOR_GUARD, 60.0f, true)) c->AI()->Talk(0); break; case 2: if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true)) c->AI()->Talk(0); break; case 3: me->SetWalk(true); me->GetMotionMaster()->MovePath(me->GetEntry()*100, false); if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true)) { c->SetWalk(true); c->GetMotionMaster()->MovePath(c->GetEntry()*100, false); } if (Creature* c = me->FindNearestCreature(NPC_AURIC, 60.0f, true)) { c->SetWalk(true); c->GetMotionMaster()->MovePath(c->GetEntry()*100, false); } break; case 4: Talk(0); break; case 5: if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true)) c->AI()->Talk(1); break; case 6: if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true)) c->AI()->Talk(2, ObjectAccessor::GetPlayer(*me, playerGUID)); break; case 7: Talk(1, ObjectAccessor::GetPlayer(*me, playerGUID)); break; case 8: Talk(2); break; case 9: Talk(3); break; case 10: if (Creature* c = me->FindNearestCreature(NPC_AURIC, 60.0f, true)) c->AI()->Talk(0); break; case 11: if (Creature* c = me->FindNearestCreature(NPC_AURIC, 60.0f, true)) c->AI()->Talk(1); break; case 12: if (Player* p = ObjectAccessor::GetPlayer(*me, playerGUID)) Talk(p->GetTeamId() == TEAM_ALLIANCE ? 5 : 4, p); break; case 13: me->setActive(false); if (Creature* c = me->FindNearestCreature(NPC_SUNWELL_VISUAL_BUNNY, 60.0f, true)) c->DespawnOrUnsummon(1); if (GameObject* go = me->FindNearestGameObject(GO_QUEL_DELAR, 60.0f)) go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); me->SetWalk(true); if (me->GetCreatureData()) me->GetMotionMaster()->MovePoint(0, me->GetCreatureData()->posX, me->GetCreatureData()->posY, me->GetCreatureData()->posZ); if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true)) { c->SetWalk(true); if (c->GetCreatureData()) c->GetMotionMaster()->MovePoint(0, c->GetCreatureData()->posX, c->GetCreatureData()->posY, c->GetCreatureData()->posZ); } if (Creature* c = me->FindNearestCreature(NPC_AURIC, 60.0f, true)) { c->SetWalk(true); if (c->GetCreatureData()) c->GetMotionMaster()->MovePoint(0, c->GetCreatureData()->posX, c->GetCreatureData()->posY, c->GetCreatureData()->posZ); } break; } }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (AggroResetTime) { //Attack random Gamers if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true)) { me->AddThreat(target, 1.0f); me->TauntApply(target); AttackStart(target); } AggroResetTime = false; } events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_ENERGY_DRAIN: if (me->GetPower(POWER_ENERGY) == 0) { DoCast(me, SPELL_SMOLDERING_DEVASTATION); me->SetPower(POWER_ENERGY, 100); Devastion++; if (Devastion == 3) { events.CancelEvent(EVENT_ENERGY_DRAIN); events.ScheduleEvent(EVENT_PHASE_LOWER, 10000); break; } } else me->SetPower(POWER_ENERGY, (me->GetPower(POWER_ENERGY) - 1)); events.ScheduleEvent(EVENT_ENERGY_DRAIN, 1000, EVENT_GROUP_UP_PHASE); break; case EVENT_EMBER_FLARE: DoCast(me, SPELL_EMBER_FLARE); events.ScheduleEvent(EVENT_EMBER_FLARE, urand(10000, 15000)); break; case EVENT_METEOR_FALL: if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f, true)) { DoCast(target, SPELL_METEOR_FALL); events.ScheduleEvent(EVENT_METEOR_FALL, urand(20000, 30000)); } else events.ScheduleEvent(EVENT_METEOR_FALL, 5000); break; case EVENT_PHASE_UPPER: me->SetCanFly(true); me->SetDisableGravity(true); AggroResetTime = true; me->AddAura(SPELL_WEB_SILK, me); me->GetMotionMaster()->MovePoint(POINT_UP, upPos); _moveup = true; me->SetReactState(REACT_PASSIVE); me->SetPower(POWER_ENERGY, 100); DoCast(me, SPELL_NO_REGEN); events.ScheduleEvent(EVENT_ENERGY_DRAIN, 3000, EVENT_GROUP_UP_PHASE); events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_SPINNER, 10000, EVENT_GROUP_UP_PHASE); events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_DRONE, 44500, EVENT_GROUP_UP_PHASE); events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_SPIDERLING, 12000, EVENT_GROUP_UP_PHASE); events.ScheduleEvent(EVENT_SMOLDERING_DEVASTATION, 120000, EVENT_GROUP_UP_PHASE); events.ScheduleEvent(EVENT_PHASE_LOWER, 312000); events.ScheduleEvent(EVENT_CHECK_UPPER, 1900); if (me->GetMap()->IsHeroic()) events.ScheduleEvent(EVENT_SUMMON_ENGORGED_BROODLING, 45000, EVENT_GROUP_UP_PHASE); break; case EVENT_PHASE_LOWER: events.CancelEvent(EVENT_SUMMON_CINDERWEB_SPINNER); events.CancelEvent(EVENT_SUMMON_CINDERWEB_DRONE); events.CancelEvent(EVENT_SUMMON_CINDERWEB_SPIDERLING); events.CancelEvent(EVENT_SUMMON_ENGORGED_BROODLING); events.CancelEvent(EVENT_SMOLDERING_DEVASTATION); events.CancelEvent(EVENT_CHECK_UPPER); events.CancelEvent(EVENT_METEOR_FALL); me->GetMotionMaster()->MovePoint(POINT_DOWN, 67.888f, 387.82f, 74.042f); me->SetPower(POWER_ENERGY, 0); events.ScheduleEvent(EVENT_ATTACK_START, 12000); events.ScheduleEvent(EVENT_FRENZY, 13000); events.ScheduleEvent(EVENT_WIDOWS_KISS, 15000); break; case EVENT_SUMMON_CINDERWEB_SPINNER: for (int i = 0; i < 5; i++) me->SummonCreature(NPC_LIFT_CONTROLLER, CinderwebSummonPos[i].GetPositionX(), CinderwebSummonPos[i].GetPositionY(), CinderwebSummonPos[i].GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 120000); events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_SPINNER, 55000, EVENT_GROUP_UP_PHASE); break; case EVENT_SUMMON_CINDERWEB_DRONE: me->SummonCreature(NPC_CINDERWEB_DRONE, DronePositionSummon[urand(0, 1)], TEMPSUMMON_CORPSE_DESPAWN); events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_DRONE, 60000, EVENT_GROUP_UP_PHASE); break; case EVENT_SUMMON_CINDERWEB_SPIDERLING: { int8 position = urand(0, 4); for (int i = 1; i < 8; i++) me->SummonCreature(NPC_CINDERWEB_SPIDERLING, SpinderlingsPos[position].GetPositionX() + urand(1, 4), SpinderlingsPos[position].GetPositionY() + urand(1, 4), SpinderlingsPos[position].GetPositionZ(), TEMPSUMMON_CORPSE_DESPAWN); events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_SPIDERLING, urand(25000, 35000), EVENT_GROUP_UP_PHASE); } break; case EVENT_SUMMON_ENGORGED_BROODLING: for (int i = 4; i < 8; i++) me->SummonCreature(NPC_ENGORGED_BROODLING, CinderwebSummonPos[i].GetPositionX(), CinderwebSummonPos[i].GetPositionY(), 74.042f, TEMPSUMMON_CORPSE_DESPAWN); events.ScheduleEvent(EVENT_SUMMON_ENGORGED_BROODLING, urand(30000, 40000), EVENT_GROUP_UP_PHASE); break; case EVENT_ATTACK_START: me->GetMotionMaster()->MoveChase(me->GetVictim()); break; case EVENT_FRENZY: DoCast(me, SPELL_FRENZY); events.ScheduleEvent(EVENT_FRENZY, 15000); break; case EVENT_WIDOWS_KISS: if (Unit* target = me->GetVictim()) me->AddAura(SPELL_THE_WIDOWS_KISS, target); events.ScheduleEvent(EVENT_WIDOWS_KISS, 20000); break; case EVENT_CHECK_UPPER: Map* map = me->GetMap(); if (map && map->IsDungeon() && Devastion != 3) { //Players part std::list<Player*> TargetList; Map::PlayerList const& Players = map->GetPlayers(); for (Map::PlayerList::const_iterator itr = Players.begin(); itr != Players.end(); ++itr) { if (Player* player = itr->getSource()) { if (player->GetPositionZ() > 108.0f) TargetList.push_back(player); else continue; } } if (TargetList.empty()) { me->SetReactState(REACT_PASSIVE); me->AddAura(SPELL_WEB_SILK, me); //me->GetMotionMaster()->MoveJumpTo(67.888f, 387.82f, 111.767f); me->GetMotionMaster()->MovePoint(POINT_UP, upPos); DoCast(me, SPELL_VENOM_RAIN); } else { for (std::list<Player*>::const_iterator itr = TargetList.begin(); itr != TargetList.end(); ++itr) { if (!me->HasReactState(REACT_AGGRESSIVE)) { me->SetReactState(REACT_AGGRESSIVE); me->Attack((*itr), true); me->GetMotionMaster()->MoveChase((*itr)); } me->AddAura(SPELL_WEB_SILK, *itr); } } //Creatures part std::list<Creature*> DroneList; GetCreatureListWithEntryInGrid(DroneList, me, NPC_CINDERWEB_DRONE, 1000.0f); for (std::list<Creature*>::const_iterator itr = DroneList.begin(); itr != DroneList.end(); ++itr) if ((*itr)->GetPositionZ() > 108.0f) me->AddAura(SPELL_WEB_SILK, *itr); } events.ScheduleEvent(EVENT_CHECK_UPPER, 2500); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 const diff) { if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING)) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_BLOOD_SUMMON: switch (urand(0, 1)) { case 0: me->SummonCreature(NPC_BLACK_BLOOD, SummonPositions[0], TEMPSUMMON_MANUAL_DESPAWN); me->SummonCreature(NPC_COBLAT_BLOOD, SummonPositions[1], TEMPSUMMON_MANUAL_DESPAWN); me->SummonCreature(NPC_CRIMSON_BLOOD, SummonPositions[2], TEMPSUMMON_MANUAL_DESPAWN); if(IsHeroic()) me->SummonCreature(NPC_GLOWING_BLOOD, SummonPositions[3], TEMPSUMMON_MANUAL_DESPAWN); Talk(YELL); break; case 1: me->SummonCreature(NPC_GLOWING_BLOOD, SummonPositions[3], TEMPSUMMON_MANUAL_DESPAWN); me->SummonCreature(NPC_ACIDIC_BLOOD, SummonPositions[4], TEMPSUMMON_MANUAL_DESPAWN); me->SummonCreature(NPC_SHADOWED_BLOOD, SummonPositions[5], TEMPSUMMON_MANUAL_DESPAWN); if(IsHeroic()) me->SummonCreature(NPC_CRIMSON_BLOOD, SummonPositions[2], TEMPSUMMON_MANUAL_DESPAWN); Talk(YELL); break; } events.ScheduleEvent(EVENT_BLOOD_SUMMON, 82000); break; case EVENT_COID_BOLT: if(me->HasAura(SPELL_GLOWING_BLOOD_OF_SHUMA)) { if(Unit* target = me->FindNearestPlayer(100.0f)) DoCast(target, SPELL_COID_BOLT); } else if(Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO)) DoCast(target, SPELL_COID_BOLT); if(me->HasAura(SPELL_GLOWING_BLOOD_OF_SHUMA)) events.ScheduleEvent(EVENT_COID_BOLT, urand(2500, 15000)); else events.ScheduleEvent(EVENT_COID_BOLT, urand(5000, 30000)); break; case EVENT_SEARING_BLOOD: if(me->HasAura(SPELL_CRIMSON_BLOOD_OF_SHUMA)) { if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, SPELL_SEARING_BLOOD); events.ScheduleEvent(EVENT_SEARING_BLOOD, urand(5000,30000)); } else events.ScheduleEvent(EVENT_SEARING_BLOOD, 1000); break; case EVENT_MANA_VOID: if (me->HasAura(SPELL_COBALT_BLOOD_OF_SHUMA) && !mana_void) { me->SummonCreature(NPC_MANA_VOID, SummonMvPositions[urand(0,5)], TEMPSUMMON_MANUAL_DESPAWN); mana_void = true; } if (!me->HasAura(SPELL_COBALT_BLOOD_OF_SHUMA) && mana_void) mana_void = false; events.ScheduleEvent(EVENT_MANA_VOID, 1000); break; case EVENT_FORGOTTEN_ONE: if(me->HasAura(SPELL_BLACK_BLOOD_OF_SHUMA)) { switch(urand(0,2)) { case 1: for (int8 i = 0; i < 3; i++) me->SummonCreature(NPC_FORGOTTEN_ONE, forgotten[i], TEMPSUMMON_TIMED_DESPAWN, 60000); break; case 2: for (int8 i = 0; i < 3; i++) me->SummonCreature(NPC_FORGOTTEN_ONE, forgotten2[i], TEMPSUMMON_TIMED_DESPAWN, 60000); break; case 3: for (int8 i = 0; i < 3; i++) me->SummonCreature(NPC_FORGOTTEN_ONE, forgotten3[i], TEMPSUMMON_TIMED_DESPAWN, 60000); break; } events.ScheduleEvent(EVENT_FORGOTTEN_ONE, urand(7500,15000)); } else events.ScheduleEvent(EVENT_FORGOTTEN_ONE, 1000); break; case EVENT_DIGESTIVE_ACID: if(me->HasAura(SPELL_ACIDIC_BLOOD_OF_SHUMA)) { Map::PlayerList const &PlList = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i) { Unit* target = i->getSource(); DoCast(target, SPELL_DIGESTIVE_ACID); } events.ScheduleEvent(EVENT_DIGESTIVE_ACID, urand(5000,15000)); } else events.ScheduleEvent(EVENT_DIGESTIVE_ACID, 1000); break; default: break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { events.Update(diff); switch (events.ExecuteEvent()) { case EVENT_MAD_1: me->SetVisible(true); if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) { me->SetTarget(brutallus->GetGUID()); brutallus->SetReactState(REACT_PASSIVE); brutallus->setActive(true); } me->GetMotionMaster()->MovePoint(1, 1477.94f, 643.22f, 21.21f); me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); events.ScheduleEvent(EVENT_MAD_2, 6000); break; case EVENT_MAD_2: Talk(SAY_MAD_1); me->CastSpell(me, SPELL_MADRIGOSA_FREEZE, false); events.ScheduleEvent(EVENT_MAD_2_1, 1000); break; case EVENT_MAD_2_1: me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); me->SetDisableGravity(false); me->CastSpell(me, SPELL_MADRIGOSA_FROST_BREATH, false); events.ScheduleEvent(EVENT_MAD_3, 7000); break; case EVENT_MAD_3: Talk(SAY_MAD_2); events.ScheduleEvent(EVENT_MAD_4, 7000); break; case EVENT_MAD_4: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) brutallus->AI()->Talk(YELL_INTRO); events.ScheduleEvent(EVENT_MAD_5, 5000); break; case EVENT_MAD_5: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) { brutallus->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK1H); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK1H); } events.ScheduleEvent(EVENT_MAD_6, 10000); break; case EVENT_MAD_6: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) { brutallus->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); } me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); me->SetDisableGravity(true); events.ScheduleEvent(EVENT_MAD_7, 4000); break; case EVENT_MAD_7: Talk(SAY_MAD_3); me->CastSpell(me, SPELL_MADRIGOSA_FROST_BLAST, false); events.ScheduleEvent(EVENT_MAD_8, 3000); events.ScheduleEvent(EVENT_MAD_8, 5000); events.ScheduleEvent(EVENT_MAD_8, 6500); events.ScheduleEvent(EVENT_MAD_8, 7500); events.ScheduleEvent(EVENT_MAD_8, 8500); events.ScheduleEvent(EVENT_MAD_8, 9500); events.ScheduleEvent(EVENT_MAD_9, 11000); events.ScheduleEvent(EVENT_MAD_8, 12000); events.ScheduleEvent(EVENT_MAD_8, 14000); break; case EVENT_MAD_8: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) me->CastSpell(brutallus, SPELL_MADRIGOSA_FROSTBOLT, false); break; case EVENT_MAD_9: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) { brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_FLAME_RING, true); brutallus->RemoveAllAuras(); brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_FEL_FIREBALL, false); brutallus->AI()->Talk(YELL_INTRO_BREAK_ICE); } events.ScheduleEvent(EVENT_MAD_11, 6000); break; //case EVENT_MAD_10: case EVENT_MAD_11: me->SetDisableGravity(false); me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); events.ScheduleEvent(EVENT_MAD_13, 2500); break; case EVENT_MAD_13: Talk(SAY_MAD_4); me->RemoveAllAuras(); me->CastSpell(me, SPELL_MADRIGOSA_ENCAPSULATE, false); events.ScheduleEvent(EVENT_MAD_14, 2000); break; case EVENT_MAD_14: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) { brutallus->SetDisableGravity(true); brutallus->GetMotionMaster()->MovePoint(0, brutallus->GetPositionX(), brutallus->GetPositionY()-30.0f, brutallus->GetPositionZ()+15.0f, false, true); } events.ScheduleEvent(EVENT_MAD_15, 10000); break; case EVENT_MAD_15: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) { brutallus->RemoveAllAuras(); brutallus->SetDisableGravity(false); brutallus->GetMotionMaster()->MoveFall(); brutallus->AI()->Talk(YELL_INTRO_CHARGE); } events.ScheduleEvent(EVENT_MAD_16, 1400); break; case EVENT_MAD_16: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) brutallus->CastSpell(me, SPELL_BRUTALLUS_CHARGE, true); events.ScheduleEvent(EVENT_MAD_17, 1200); break; case EVENT_MAD_17: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) brutallus->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK1H); events.ScheduleEvent(EVENT_MAD_18, 500); break; case EVENT_MAD_18: Talk(SAY_MAD_5); me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); me->SetStandState(UNIT_STAND_STATE_DEAD); events.ScheduleEvent(EVENT_MAD_19, 6000); break; case EVENT_MAD_19: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) brutallus->AI()->Talk(YELL_INTRO_KILL_MADRIGOSA); events.ScheduleEvent(EVENT_MAD_20, 7000); break; case EVENT_MAD_20: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->setFaction(35); if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) { brutallus->AI()->Talk(YELL_INTRO_TAUNT); brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_BREAK_ICE, false); } events.ScheduleEvent(EVENT_MAD_21, 4000); break; case EVENT_MAD_21: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) { brutallus->SetReactState(REACT_AGGRESSIVE); brutallus->SetHealth(brutallus->GetMaxHealth()); brutallus->AI()->EnterEvadeMode(); brutallus->setActive(false); } break; case EVENT_SPAWN_FELMYST: me->DespawnOrUnsummon(1); if (Creature* felmyst = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_FELMYST))) felmyst->AI()->DoAction(ACTION_START_EVENT); break; } }
void UpdateAI(uint32 diff) { if (phase == PHASE_INTRO) { if (!instance) return; events.Update(diff); switch (events.ExecuteEvent()) { case EVENT_INTRO_1: Talk(SAY_JAINA_INTRO_1); events.ScheduleEvent(EVENT_INTRO_2, 8000); break; case EVENT_INTRO_2: Talk(SAY_JAINA_INTRO_2); events.ScheduleEvent(EVENT_INTRO_3, 8500); break; case EVENT_INTRO_3: Talk(SAY_JAINA_INTRO_3); events.ScheduleEvent(EVENT_INTRO_4, 8000); break; case EVENT_INTRO_4: Talk(SAY_JAINA_INTRO_4); events.ScheduleEvent(EVENT_INTRO_5, 10000); break; case EVENT_INTRO_5: Talk(SAY_JAINA_INTRO_5); events.ScheduleEvent(EVENT_INTRO_6, 8000); break; case EVENT_INTRO_6: Talk(SAY_JAINA_INTRO_6); events.ScheduleEvent(EVENT_INTRO_7, 12000); break; case EVENT_INTRO_7: Talk(SAY_JAINA_INTRO_7); events.ScheduleEvent(EVENT_INTRO_8, 8000); break; case EVENT_INTRO_8: Talk(SAY_JAINA_INTRO_8); // End of Intro phase = PHASE_NORMAL; break; } } //Return since we have no target if (!UpdateVictim()) return; events.Update(diff); DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (phase == PHASE_MOVE && !phaseInitiated) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE); me->RemoveAurasDueToSpell(SPELL_ENERGY_SHIELD); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true)) me->GetMotionMaster()->MoveFollow(target, 3, 2); gravity = 0; summon = 0; creature = false; events.CancelEvent(EVENT_SEISMIC_SHARD); events.CancelEvent(EVENT_ENERGY_SHIELD); events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 1 *IN_MILLISECONDS); events.ScheduleEvent(EVENT_GRAVITY_WELL, 2 *IN_MILLISECONDS); events.ScheduleEvent(EVENT_PHASE_SHIELD, 35 *IN_MILLISECONDS); phaseInitiated = true; } if (phase == PHASE_SHIELDS && !phaseInitiated) { me->GetMotionMaster()->MovePoint(1, MeteorPosition[3]); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE); DoCast(me, SPELL_ENERGY_SHIELD); DoCast(me, SPELL_SEISMIC_SHARD_DUMMY); events.CancelEvent(EVENT_CURSE_OF_BLOOD); events.CancelEvent(EVENT_GRAVITY_WELL); events.ScheduleEvent(EVENT_SUMMON_GUARDS, 1 *IN_MILLISECONDS); events.ScheduleEvent(EVENT_SEISMIC_SHARD, 2 *IN_MILLISECONDS); events.ScheduleEvent(EVENT_START_METEOR, 12 *IN_MILLISECONDS); events.ScheduleEvent(EVENT_PHASE_MOVE, 35 *IN_MILLISECONDS); phaseInitiated = true; creature = true; } while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_PHASE_SHIELD: phase = PHASE_SHIELDS; phaseInitiated = false; break; case EVENT_PHASE_MOVE: phase = PHASE_MOVE; phaseInitiated = false; break; case EVENT_CURSE_OF_BLOOD: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true)) DoCast(target, SPELL_CURSE_OF_BLOOD); events.RescheduleEvent(EVENT_CURSE_OF_BLOOD, 15 *IN_MILLISECONDS); break; case EVENT_GRAVITY_WELL: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true)) DoCast(target, SPELL_GRAVITY_WELL_SUMMON); if (++gravity <= 6) events.RescheduleEvent(EVENT_GRAVITY_WELL, 5 *IN_MILLISECONDS); break; case EVENT_SUMMON_GUARDS: for (uint8 i = 0; i < 10; ++i) //summon 10 Guards me->SummonCreature(NPC_DEVOUT_FOLLOWER, MeteorPosition[4], TEMPSUMMON_CORPSE_DESPAWN); for (uint8 i = 0; i < 10; ++i) //summon 10 Guards me->SummonCreature(NPC_DEVOUT_FOLLOWER, MeteorPosition[5], TEMPSUMMON_CORPSE_DESPAWN); break; case EVENT_SEISMIC_SHARD: meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[0], TEMPSUMMON_CORPSE_DESPAWN)); meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[1], TEMPSUMMON_CORPSE_DESPAWN)); meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[2], TEMPSUMMON_CORPSE_DESPAWN)); break; case EVENT_START_METEOR: if (meteors.size()) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true)) { uint8 i = urand(0, meteors.size()-1); if (Unit* trigger = me->SummonCreature(NPC_SEISMIC_SHARD_TRIGGER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_DESPAWN)) { meteors[i]->SetSpeed(MOVE_RUN, speed*3.0f, true); meteors[i]->SetSpeed(MOVE_WALK, speed*3.0f, true); meteors[i]->SetSpeed(MOVE_FLIGHT, speed*3.0f, true); meteors[i]->GetMotionMaster()->MovePoint(1, trigger->GetPositionX(), trigger->GetPositionY(), trigger->GetPositionZ()); trigger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NOT_SELECTABLE); triggerGUID = trigger->GetGUID(); meteorGUID = meteors[i]->GetGUID(); } meteors.erase(meteors.begin() + i); if (++summon <= 3) events.ScheduleEvent(EVENT_SEND_NEXT_METEOR, 1 *IN_MILLISECONDS); if (meteors.size()) events.RescheduleEvent(EVENT_START_METEOR, 10 *IN_MILLISECONDS); } } break; case EVENT_SEND_NEXT_METEOR: if (Unit * cast = Unit::GetCreature(*me, triggerGUID)) { cast->setFaction(16); cast->CastSpell(me, SPELL_SEISMIC_SHARD_DAMAGE, true); } if (Unit * despawn = Unit::GetCreature(*me, meteorGUID)) despawn->SetVisible(false); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_CASTING)) return; if(phase == PHASE_CASTER_PHASE && !HealthAbovePct(30)) { phase = PHASE_DRAGON_PHASE; me->SetSpeed(MOVE_RUN, 1.5f); me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->RemoveAllAuras(); // He should not die when he is jumping down... DoCast(me, SPELL_TWILIGHT_PROTECTION, true); events.Reset(); // He Should not cast while he is flying me->GetMotionMaster()->MovePoint(POINT_DRAHGA_GO_TO_THE_LAVA, position[0]); pValiona = me->SummonCreature(NPC_VALIONA,-375.33f,-667.291f,270.0f,3.29545f, TEMPSUMMON_CORPSE_DESPAWN); } if(phase == PHASE_DRAGON_PHASE && !HealthAbovePct(10)) { phase = PHASE_FINAL_PHASE; me->SetReactState(REACT_AGGRESSIVE); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(me->getVictim()); pValiona->GetAI()->DoAction(ACTION_VALIONA_SHOULD_FLY_AWAY); pValiona = NULL; } events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_BURNING_SHADOWBOLT: if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, RAID_MODE(SPELL_BURNING_SHADOWBOLT,SPELL_BURNING_SHADOWBOLT_H)); events.ScheduleEvent(EVENT_BURNING_SHADOWBOLT,4000); break; case EVENT_SUMMON_INVOKED_FLAME_SPIRIT: me->MonsterYell(SAY_SUMMON, LANG_UNIVERSAL, NULL); DoCast(SPELL_INVOCATION_OF_FLAME); events.ScheduleEvent(EVENT_SUMMON_INVOKED_FLAME_SPIRIT,20000); break; case EVENT_DRAGAH_ENTER_VEHICLE: me->GetMotionMaster()->Clear(); // me->EnterVehicle(pValiona, 1); break; default: break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { // Phase 1 case EVENT_PHASE_1: events.ScheduleEvent(EVENT_ICE_SPEAR, urand(5000,14000)); events.ScheduleEvent(EVENT_SHATTERED_ICE, urand(15000,30000)); switch (urand(0, 1)) { case 0: events.ScheduleEvent(EVENT_PHASE_2, urand(200000, 340000)); break; case 1: events.ScheduleEvent(EVENT_PHASE_3, 200000,340000); break; } break; case EVENT_ICE_SPEAR: DoCastVictim(SPELL_ICE_SPEAR); events.ScheduleEvent(EVENT_ICE_SPEAR, urand(5000,14000)); break; case EVENT_SHATTERED_ICE: if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, SPELL_SHATTERED_ICE); events.ScheduleEvent(EVENT_SHATTERED_ICE, urand(20000, 40000)); break; //phase 2 case EVENT_PHASE_2: events.CancelEvent(EVENT_PHASE_1); events.CancelEvent(EVENT_ICE_SPEAR); events.CancelEvent(EVENT_SHATTERED_ICE); events.ScheduleEvent(HAS_ICE_SPEAR_DEATH, 5000); events.ScheduleEvent(EVENT_DAMAGE_PHASE2_1, 1); events.ScheduleEvent(EVENT_REMOVE_PHASE_2, 310000); if(IsHeroic()) events.ScheduleEvent(EVENT_DAMAGE_PHASE2_3, urand(15000,30000)); instance->SetBossState(DATA_WAVE, IN_PROGRESS); DoCast(SPELL_ICE_SHIELD); break; case HAS_ICE_SPEAR_DEATH: if(me->HasAura(SPELL_AURA_CRYSTAL)) { events.ScheduleEvent(HAS_ICE_SPEAR_DEATH, 1000); } else { events.CancelEvent(EVENT_PHASE_2); events.CancelEvent(EVENT_REMOVE_PHASE_2); events.CancelEvent(EVENT_DAMAGE_PHASE2_3); events.CancelEvent(HAS_ICE_SPEAR_DEATH); events.ScheduleEvent(EVENT_PHASE_1, 1); me->RemoveAurasDueToSpell(SPELL_ICE_SHIELD); instance->SetBossState(DATA_WAVE, DONE); } break; case EVENT_REMOVE_PHASE_2: events.CancelEvent(EVENT_PHASE_2); events.CancelEvent(EVENT_DAMAGE_PHASE2_3); events.ScheduleEvent(EVENT_PHASE_1, 1); break; case EVENT_DAMAGE_PHASE2_1: me->SummonCreature(NPC_ICE_WAVE, 13587.398f, 13581.050f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13587.754f, 13571.093f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13587.528f, 13563.034f, 124.480f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13587.476f, 13559.762f, 124.480f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13555.149f, 13612.340f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13551.117f, 13612.680f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13544.259f, 13612.964f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13537.617f, 13612.762f, 123.479f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13592.307f, 13643.856f, 123.484f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13593.133f, 13649.511f, 123.484f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13594.512f, 13655.144f, 123.484f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13596.036f, 13661.617f, 124.480f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13617.921f, 13612.467f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13622.455f, 13612.219f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13628.173f, 13612.303f, 124.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICE_WAVE, 13635.879f, 13612.416f, 124.480f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_ICICLE, 13585.291f, 13610.428f, 122.420f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000); me->SummonCreature(NPC_FORZEN_BINDIG_CRYSTAL, 13617.5f, 13580.9f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000); me->SummonCreature(NPC_FORZEN_BINDIG_CRYSTAL, 13557.4f, 13643.1f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000); me->SummonCreature(NPC_FORZEN_BINDIG_CRYSTAL, 13557.7f, 13580.7f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000); me->SummonCreature(NPC_FORZEN_BINDIG_CRYSTAL, 13617.3f, 13643.5f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000); break; case EVENT_DAMAGE_PHASE2_3: if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) me->AddAura(SPELL_FROSTFLAKE, target); events.ScheduleEvent(EVENT_DAMAGE_PHASE2_3, urand(5000,35000)); break; //Phase 3 case EVENT_PHASE_3: events.CancelEvent(EVENT_ICE_SPEAR); events.CancelEvent(EVENT_SHATTERED_ICE); events.ScheduleEvent(EVENT_REMOVE_PHASE_3, 310000); events.ScheduleEvent(EVENT_DAMAGE_PHASE3_1, 10000); events.ScheduleEvent(HAS_ARRESTER_RELOAD, 5000); events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 1); DoCast(SPELL_WATER_SHIELD); break; case HAS_ARRESTER_RELOAD: if(me->HasAura(SPELL_AURA_CRYSTAL)) { events.ScheduleEvent(HAS_ARRESTER_RELOAD, 1000); } else { events.CancelEvent(EVENT_PHASE_3); events.CancelEvent(EVENT_REMOVE_PHASE_3); events.CancelEvent(EVENT_DAMAGE_PHASE3_1); events.CancelEvent(HAS_ARRESTER_RELOAD); events.ScheduleEvent(EVENT_PHASE_1, 1); me->RemoveAurasDueToSpell(SPELL_WATER_SHIELD); } break; case EVENT_REMOVE_PHASE_3: events.CancelEvent(EVENT_PHASE_3); events.CancelEvent(EVENT_DAMAGE_PHASE3_1); events.ScheduleEvent(EVENT_PHASE_1, 1); break; case EVENT_DAMAGE_PHASE3_1: me->SummonCreature(NPC_BOUND_LIGHTNING_ELEMENTAL, 13587.624f, 13653.375f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 130000); me->SummonCreature(NPC_BOUND_LIGHTNING_ELEMENTAL, 13621.863f, 13621.847f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 130000); me->SummonCreature(NPC_BOUND_LIGHTNING_ELEMENTAL, 13623.250f, 13606.621f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 130000); me->SummonCreature(NPC_BOUND_LIGHTNING_ELEMENTAL, 13587.191f, 13570.221f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 130000); events.ScheduleEvent(EVENT_DAMAGE_PHASE3_1, urand(60000,90000)); break; case EVENT_SUMMON_CRYSTAL: me->SummonCreature(NPC_CRYSTAL_CONDUCTOR, 13617.5f, 13580.9f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000); me->SummonCreature(NPC_CRYSTAL_CONDUCTOR, 13557.4f, 13643.1f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000); me->SummonCreature(NPC_CRYSTAL_CONDUCTOR, 13557.7f, 13580.7f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000); me->SummonCreature(NPC_CRYSTAL_CONDUCTOR, 13617.3f, 13643.5f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000); break; default: break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (berserk <= diff) { me->CastSpell(me, 64238); berserk = 32432234; } else berserk -= diff; if (swirlhit <= diff) { Swirl(); swirlhit = 3000; } else swirlhit -= diff; if (sheepingsha <= diff) { SeepingSha(); sheepingsha = 4500; } else sheepingsha -= diff; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.ExecuteEvent()) { case EVENT_SHA_BOLT: { me->CastSpell(me, 143290); std::list<Player*> pl_list; pl_list.clear(); me->GetPlayerListInGrid(pl_list, 300.0f); if (pl_list.empty()) return; for (auto itr : pl_list) { me->CastSpell(itr, SPELL_SHA_BOLT_COSMETIC); } events.ScheduleEvent(EVENT_SHA_BOLT, 10000, GROUP_TEARS_OF_THE_VALE); break; } case EVENT_SWIRL_DE: swirl = false; break; case EVENT_SWIRL: { for (int i = 0; i <= 50; i++) { Position pos; me->GetRandomNearPosition(pos, 100.0f); me->SummonCreature(TRIGGER_SHA_SWIRL, pos, TEMPSUMMON_TIMED_DESPAWN, 30000); } target = NULL; swirl = true; uint32 rando; if(roll_chance_i(50)) { rando = 1; } else { rando = 4; } DespawnCreaturesInArea(TRIGGER_SHA_SWIRL_CIRCLE, me); Creature* trigger = me->SummonCreature(TRIGGER_SHA_SWIRL_CIRCLE, circleposition[rando], TEMPSUMMON_MANUAL_DESPAWN); target = trigger; me->CastSpell(trigger, SPELL_SWIRL_DUMMY); events.ScheduleEvent(EVENT_SWIRL_DE, 10000); events.ScheduleEvent(EVENT_SWIRL, 40000, GROUP_TEARS_OF_THE_VALE); break; } case EVENT_CORRSIVE_BLAST: me->SetFacingToObject(me->getVictim()); me->CastSpell(me->getVictim(), SPELL_CORROSIVE_BLAST); events.ScheduleEvent(EVENT_CORRSIVE_BLAST, 42000, GROUP_TEARS_OF_THE_VALE); break; case EVENT_SEEPING_SHA: for (int i = 0; i <= 5; i++) { Position pos; me->GetRandomNearPosition(pos, 35.0f); // estimated? me->SummonCreature(TRIGGER_SEEPING_SHA, pos, TEMPSUMMON_TIMED_DESPAWN, 20000); } events.ScheduleEvent(EVENT_SEEPING_SHA, 20000, GROUP_TEARS_OF_THE_VALE); break; // 2ND PHASE case EVENT_SPLIT_PHASE: events.ScheduleEvent(EVENT_SPLIT_PHASE_2, 1000); split = false; splitphase = true; me->SetHealth(me->GetMaxHealth()); DespawnCreaturesInArea(71544, me); me->SummonCreature(CREATURE_SHA_POOL_HC, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN); me->CastSpell(me, SPELL_SPLIT_DUMMY); if (AuraPtr aura = me->GetAura(SPELL_SPLIT_DUMMY)) { aura->SetDuration(500000); } events.CancelEvent(EVENT_SPLIT_PHASE); break; case EVENT_SPLIT_PHASE_2: //me->SetDisplayId(11686); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); for (int i = 0; i <= 12; i++) { me->CastSpell(me, SPELL_SPLIT_SHA_PUDDLE_THROW, true); me->CastSpell(me, SPELL_SPLIT_CONTEMPLATED_THROW, true); } count = 0; events.CancelEvent(EVENT_SPLIT_PHASE); events.Reset(); break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; if (me->HasUnitState(UNIT_STATE_CASTING)) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_UNLEASHED_WRATH: { phase1 = false; for (uint8 i = 0; i < 5; i++) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) { if (target->GetAuraCount(SPELL_SEETHE_AURA) < 3) { me->CastSpell(target, SPELL_SHADOW_BOLT_ANGER, false); me->AddAura(SPELL_SEETHE_AURA, target); } } } if (_targetCount < _maxTargetCount) { if (_targetCount == 0) Talk(TALK_INTRO); _targetCount++; events.ScheduleEvent(EVENT_UNLEASHED_WRATH, 2000); } else { events.ScheduleEvent(EVENT_UNLEASHED_WRATH, 50000); phase1 = true; _targetCount = 0; } break; } case EVENT_GROWING_ANGER_WARNING: { Talk(TALK_ANGER); for (uint8 i = 0; i < _dominateMindCount; ++i) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) { targetedDominationPlayerGuids.push_back(target->GetGUID()); me->CastSpell(target, SPELL_DOMINATE_MIND_WARNING, true); } events.ScheduleEvent(EVENT_GROWING_ANGER, 6000); break; } case EVENT_GROWING_ANGER: { if (!targetedDominationPlayerGuids.empty()) for (auto guid : targetedDominationPlayerGuids) if (Player* target = ObjectAccessor::GetPlayer(*me, guid)) if (!me->GetVictim() || target != me->GetVictim()) me->CastSpell(target, SPELL_DOMINATE_MIND, false); events.ScheduleEvent(EVENT_GROWING_ANGER_WARNING, 19000); break; } case EVENT_SPAWN: { Talk(TALK_SPAWN); for (uint8 i = 0; i < _cloudCount; ++i) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) me->CastSpell(target, SPELL_ENDLESS_RAGE, false); events.ScheduleEvent(EVENT_SPAWN, 15000); break; } case EVENT_UPDATE_RAGE: { if (phase1) timer = timer + 20; else timer = timer - 20; me->SetPower(POWER_RAGE, timer); events.ScheduleEvent(EVENT_UPDATE_RAGE, 1000); break; } case EVENT_BERSERK: { me->CastSpell(me, SPELL_BERSERK, false); break; } case EVENT_RANGE_ATTACK: { if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO)) { me->CastSpell(target, SPELL_SHADOW_BOLT_ANGER, false); me->AddAura(SPELL_SEETHE_AURA, target); } range = false; break; } default: break; } } if (me->GetVictim() && !me->IsWithinMeleeRange(me->GetVictim()) && !range) { range = true; events.ScheduleEvent(EVENT_RANGE_ATTACK, 2000); } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!m_creature->isInCombat()) return; if (!m_creature->getVictim() && m_creature->getThreatManager().isThreatListEmpty()) { EnterEvadeMode(); return; } events.Update(diff); if (m_creature->hasUnitState(UNIT_STAT_CASTING)) return; switch(events.ExecuteEvent()) { case EVENT_PURSUE: if (Creature* pKrick = GetKrick()) DoScriptText(RAND(SAY_KRICK_CHASE_1,SAY_KRICK_CHASE_2,SAY_KRICK_CHASE_3), pKrick); if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { m_creature->Attack(pTarget,false); DoScriptText(SAY_ICK_CHASE_1, m_creature, pTarget); DoCast(pTarget, SPELL_PURSUED); } DoCast(SPELL_CONFUSION); events.ScheduleEvent(EVENT_PURSUE, 30000, GCD_1); return; case EVENT_MIGHTY_KICK: DoCast(m_creature->getVictim(), SPELL_MIGHTY_KICK); events.ScheduleEvent(EVENT_MIGHTY_KICK, 25000, GCD_1); return; case EVENT_POISON_NOVA: if (Creature* pKrick = GetKrick()) DoScriptText(SAY_KRICK_POISON_NOVA, pKrick); DoScriptText(SAY_ICK_POISON_NOVA, m_creature); DoCastAOE(SPELL_POISON_NOVA); events.ScheduleEvent(EVENT_POISON_NOVA, 30000, GCD_1); return; case EVENT_TOXIC_WASTE: DoCast(m_creature->getVictim(), SPELL_TOXIC_WASTE); events.ScheduleEvent(EVENT_TOXIC_WASTE, 5000); return; case EVENT_SHADOW_BOLT: DoCast(m_creature->getVictim(), SPELL_SHADOW_BOLT); events.ScheduleEvent(EVENT_SHADOW_BOLT, 15000); return; case EVENT_EXPLOSIVE_BARRAGE: if (Creature *pKrick = GetKrick()) { DoScriptText(SAY_KRICK_BARRAGE_1, pKrick); DoScriptText(SAY_KRICK_BARRAGE_2, pKrick); } DoCastAOE(SPELL_EXPLOSIVE_BARRAGE); m_creature->GetMotionMaster()->MoveIdle(); events.DelayEvents(20000, GCD_1); // 2 sec cast + 18 sec events.ScheduleEvent(EVENT_END_EXPLOSIVE_BARRAGE, 20000); return; case EVENT_END_EXPLOSIVE_BARRAGE: m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); events.ScheduleEvent(EVENT_EXPLOSIVE_BARRAGE, 25000); break; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_SPIKE: if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10000, true)) DoCast(target, SPELL_ICE_SPIKE); events.ScheduleEvent(EVENT_SPIKE, urand(10000, 15000), 0, PHASE_ONE); break; case EVENT_SUBMERGE: events.Reset(); events.SetPhase(PHASE_TWO); events.ScheduleEvent(EVENT_EMERGE, 40000, 0, PHASE_TWO); me->AttackStop(); me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED); me->HandleEmoteCommand(EMOTE_ONESHOT_SUBMERGE); if (Unit* frozenCore = me->SummonCreature(NPC_FROZEN_CORE, SummonPositions[0], TEMPSUMMON_CORPSE_DESPAWN)) { frozenCoreGUID = frozenCore->GetGUID(); frozenCore->SetHealth(me->GetHealth()); // sync health on phase change } break; case EVENT_EMERGE: if (Creature* frozenCore = me->GetCreature(*me, frozenCoreGUID)) me->SetHealth(frozenCore->GetHealth()); // sync health on phase change events.Reset(); events.SetPhase(PHASE_ONE); events.ScheduleEvent(EVENT_SUBMERGE, 90000, 0, PHASE_ONE); events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 5000, 0, PHASE_ONE); events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 5000, 0, PHASE_ONE); events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 5000, 0, PHASE_ONE); me->SetReactState(REACT_AGGRESSIVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); // despawn core if (Creature* frozenCore = me->GetCreature(*me, frozenCoreGUID)) frozenCore->DespawnOrUnsummon(0); break; case EVENT_SUMMON_HAILSTONE: me->SummonCreature(NPC_AHUNITE_HAILSTONE, SummonPositions[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 20000, 0, PHASE_ONE); break; case EVENT_SUMMON_COLDWEAVE: // they always come in pairs of two me->CastSpell(SummonPositions[2].GetPositionX(), SummonPositions[2].GetPositionY(), SummonPositions[2].GetPositionZ(), SPELL_SUMMON_MINION_VISUAL, false); me->SummonCreature(NPC_AHUNITE_COLDWEAVE, SummonPositions[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); me->CastSpell(SummonPositions[3].GetPositionX(), SummonPositions[3].GetPositionY(), SummonPositions[3].GetPositionZ(), SPELL_SUMMON_MINION_VISUAL, false); me->SummonCreature(NPC_AHUNITE_COLDWEAVE, SummonPositions[3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 10000, 0, PHASE_ONE); break; case EVENT_SUMMON_FROSTWIND: // not in first phase 1 me->SummonCreature(NPC_AHUNITE_FROSTWIND, SummonPositions[urand(2,3)], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 10000, 0, PHASE_ONE); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (phase == PHASE_OUTRO) { if (!pInstance) return; events.Update(diff); switch(events.ExecuteEvent()) { case EVENT_OUTRO_1: { DoScriptText(SAY_KRICK_OUTRO_1, m_creature); events.ScheduleEvent(EVENT_OUTRO_2, 14000); break; } case EVENT_OUTRO_2: { Creature* pNpcDialog = m_creature->GetCreature(*m_creature, uiNpcOutroDialog); if (pNpcDialog) { if (pInstance->GetData(DATA_TEAM_IN_INSTANCE) == TEAM_ALLIANCE) DoScriptText(SAY_JAYNA_OUTRO_2, pNpcDialog); else DoScriptText(SAY_SYLVANAS_OUTRO_2, pNpcDialog); } events.ScheduleEvent(EVENT_OUTRO_3, 8500); break; } case EVENT_OUTRO_3: DoScriptText(SAY_KRICK_OUTRO_3, m_creature); events.ScheduleEvent(EVENT_OUTRO_4, 12000); break; case EVENT_OUTRO_4: { Creature* pNpcDialog = m_creature->GetCreature(*m_creature, uiNpcOutroDialog); if (pNpcDialog) { if (pInstance->GetData(DATA_TEAM_IN_INSTANCE) == TEAM_ALLIANCE) DoScriptText(SAY_JAYNA_OUTRO_4, pNpcDialog); else DoScriptText(SAY_SYLVANAS_OUTRO_4, pNpcDialog); } events.ScheduleEvent(EVENT_OUTRO_5, 8000); break; } case EVENT_OUTRO_5: DoScriptText(SAY_KRICK_OUTRO_5, m_creature); events.ScheduleEvent(EVENT_OUTRO_6, 4000); break; case EVENT_OUTRO_6: // TODO spawn Tyrannus at some distance and MovePoint near-by (flying on rimefang) // store uiTyrannus // Adjust timer so tyrannus has time to come uiTyrannus = (pInstance ? pInstance->GetData64(DATA_TYRANNUS) : 0); events.ScheduleEvent(EVENT_OUTRO_7, 1); break; case EVENT_OUTRO_7: if (Creature *pTyrannus = m_creature->GetCreature(*m_creature, uiTyrannus)) DoScriptText(SAY_TYRANNUS_OUTRO_7, pTyrannus); events.ScheduleEvent(EVENT_OUTRO_8, 7000); break; case EVENT_OUTRO_8: DoScriptText(SAY_KRICK_OUTRO_8, m_creature); // TODO: Tyrannus starts killing Krick. // there shall be some visual spell effect events.ScheduleEvent(EVENT_OUTRO_9, 6000); break; case EVENT_OUTRO_9: // tyrannus kills krick m_creature->SetStandState(UNIT_STAND_STATE_DEAD); m_creature->SetHealth(0); if (Creature *pTyrannus = m_creature->GetCreature(*m_creature, uiTyrannus)) DoScriptText(SAY_TYRANNUS_OUTRO_9, pTyrannus); events.ScheduleEvent(EVENT_OUTRO_10, 12000); break; case EVENT_OUTRO_10: { Creature* pNpcDialog = m_creature->GetCreature(*m_creature, uiNpcOutroDialog); if (pNpcDialog) { if (pInstance->GetData(DATA_TEAM_IN_INSTANCE) == TEAM_ALLIANCE) DoScriptText(SAY_JAYNA_OUTRO_10, pNpcDialog); else DoScriptText(SAY_SYLVANAS_OUTRO_10, pNpcDialog); } // End of OUTRO. for now... events.ScheduleEvent(EVENT_OUTRO_END, 8000); break; } case EVENT_OUTRO_END: { Creature* pNpcDialog = m_creature->GetCreature(*m_creature, uiNpcOutroDialog); if (pNpcDialog) pNpcDialog->DisappearAndDie(); m_creature->DisappearAndDie(); break; } } return; } }
void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; events.Update(diff); if (me->hasUnitState(UNIT_STAT_CASTING)) return; if (phase == PHASE_1 && HealthBelowPct(30)) { phase = PHASE_2; DoCast(me,SPELL_TELEPORT); me->GetMotionMaster()->Clear(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); events.CancelEvent(EVENT_CORRUPT_SOUL); events.ScheduleEvent(EVENT_SOUL_STORM, 1000); events.ScheduleEvent(EVENT_FEAR, urand(8000,12000)); return; } while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_CORRUPT_SOUL: if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1)) { DoScriptText(SAY_CORRUPT_SOUL, me); DoCast(pTarget,SPELL_CORRUPT_SOUL); } events.ScheduleEvent(EVENT_CORRUPT_SOUL, urand(25000,35000)); break; case EVENT_SOUL_STORM: DoScriptText(SAY_SOUL_STORM, me); // DoCast(me, SPELL_SOULSTORM); bug: put the aura without the limit of 10 yards. events.ScheduleEvent(EVENT_SOUL_STORM_AURA, 1000); break; case EVENT_SOUL_STORM_AURA: ApplySoulStorm(); events.ScheduleEvent(EVENT_SOUL_STORM_AURA, 1000); break; case EVENT_FEAR: if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1)) DoCast(pTarget,SPELL_FEAR); events.ScheduleEvent(EVENT_FEAR, urand(8000,12000)); break; case EVENT_SHADOW_BOLT: DoCastVictim(SPELL_SHADOW_BOLT); events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000); break; case EVENT_MAGIC_BANE: DoCastVictim(SPELL_MAGIC_S_BANE); events.ScheduleEvent(EVENT_MAGIC_BANE, urand(8000,15000)); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!pInstance || !UpdateVictim()) return; Summons.DespawnAll(); events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_LIGHTNING_BOLT: if (me->HasUnitState(UNIT_STATE_CASTING)) return; DoCastVictim(SPELL_LIGHTNING_BOLT); events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 2000); break; case EVENT_CALL_VORTEX: for (uint8 i = 0; i < 8; i++) if (_vortexes[i]) { float _angle; _angle = me->GetAngle(_vortexes[i]->GetPositionX(), _vortexes[i]->GetPositionY()); Position _pos = me->GetNearPosition(5.0f, _angle); _vortexes[i]->GetMotionMaster()->MovementExpired(false); _vortexes[i]->GetMotionMaster()->MovePoint(1, _pos); } events.ScheduleEvent(EVENT_RESET_VORTEX, urand(14000, 17000)); break; case EVENT_RESET_VORTEX: for (uint8 i = 0; i < 8; i++) if (_vortexes[i]) { _vortexes[i]->GetMotionMaster()->MovementExpired(false); _vortexes[i]->GetMotionMaster()->MovePoint(2, ertanvortexPos_1[i]); } events.ScheduleEvent(EVENT_CALL_VORTEX, urand(20000, 25000)); break; case EVENT_STORM_EDGE: _distance = me->GetDistance2d(_vortexes[1]); if (me->GetMap()->GetPlayers().isEmpty()) return; for (Map::PlayerList::const_iterator itr = me->GetMap()->GetPlayers().begin(); itr != me->GetMap()->GetPlayers().end(); ++itr) { if (Player* pPlayer = itr->GetSource()) { if (me->GetDistance2d(pPlayer) > _distance) { //uint8 i = urand(0, 7); //if (_vortexes[i]) //_vortexes[i]->CastSpell(itr->GetSource(), SPELL_STORM_EDGE, true); DoCast(pPlayer, SPELL_STORM_EDGE, true); } } } events.ScheduleEvent(EVENT_STORM_EDGE, 2000); break; } } }
void UpdateAI(const uint32 diff) { if (phase == PHASE_INTRO) { if (!pInstance) return; events.Update(diff); switch (events.ExecuteEvent()) { case EVENT_INTRO_1: DoScriptText(SAY_JAINA_INTRO_1, me); events.ScheduleEvent(EVENT_INTRO_2, 8000); break; case EVENT_INTRO_2: DoScriptText(SAY_JAINA_INTRO_2, me); events.ScheduleEvent(EVENT_INTRO_3, 8500); break; case EVENT_INTRO_3: DoScriptText(SAY_JAINA_INTRO_3, me); events.ScheduleEvent(EVENT_INTRO_4, 8000); break; case EVENT_INTRO_4: DoScriptText(SAY_JAINA_INTRO_4, me); events.ScheduleEvent(EVENT_INTRO_5, 10000); break; case EVENT_INTRO_5: DoScriptText(SAY_JAINA_INTRO_5, me); events.ScheduleEvent(EVENT_INTRO_6, 8000); break; case EVENT_INTRO_6: DoScriptText(SAY_JAINA_INTRO_6, me); events.ScheduleEvent(EVENT_INTRO_7, 12000); break; case EVENT_INTRO_7: DoScriptText(SAY_JAINA_INTRO_7, me); events.ScheduleEvent(EVENT_INTRO_8, 8000); break; case EVENT_INTRO_8: DoScriptText(SAY_JAINA_INTRO_8, me); // End of Intro phase = PHASE_NORMAL; break; } } //Return since we have no target if (!UpdateVictim()) return; events.Update(diff); DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { if (HealthBelowPct(75)) { if (PotTimer <= diff) { DoCast(me, SPELL_HEALING_POTION, true); PotTimer = 10000; } else PotTimer -= diff; } if (IsActiveAttacker() && UpdateVictim()) DoMeleeAttackIfReady(); EscortAI::UpdateAI(diff); if (me->IsInCombat()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_EMOTE_BEG: me->HandleEmoteCommand(EMOTE_ONESHOT_BEG); events.ScheduleEvent(EVENT_EMOTE_BEG, 25s); break; case EVENT_BEGIN: if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) Talk(TALK_0, player); break; case EVENT_START_ESCORT: events.Reset(); me->SetFaction(FACTION_ESCORTEE_H_PASSIVE); me->SetReactState(REACT_AGGRESSIVE); ENSURE_AI(EscortAI, (me->AI()))->Start(true, true, _player); break; case EVENT_TALK_1: if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) Talk(TALK_1, player); break; case EVENT_KNEEL: me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL); break; case EVENT_TALK_2: if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) Talk(TALK_2, player); me->LoadEquipment(EQUIP_TORCH); me->SetSheath(SHEATH_STATE_MELEE); break; case EVENT_BURN_CRATES: DoCastAOE(SPELL_BURN, true); break; case EVENT_TALK_3: if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) Talk(TALK_3, player); break; case EVENT_TALK_4: if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) Talk(TALK_4, player); break; case EVENT_LAUGH: me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); break; case EVENT_TALK_5: if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) Talk(TALK_5, player); me->HandleEmoteCommand(EMOTE_ONESHOT_RUDE); break; case EVENT_TALK_6: if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) Talk(TALK_6, player); break; case EVENT_TALK_8: if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) Talk(TALK_8, player); break; } } }
void UpdateAI(uint32 const diff) { events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_BARADAS_TALK: switch (step) { case 0: me->SetFacingTo(1.513286f); me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL); events.ScheduleEvent(EVENT_BARADAS_TALK, 3000); step++; break; case 1: DoCast(SPELL_BARADAS_COMMAND); events.ScheduleEvent(EVENT_BARADAS_TALK, 5000); step++; break; case 2: Talk(SAY_BARADA_3); events.ScheduleEvent(EVENT_BARADAS_TALK, 7000); step++; break; case 3: if (jules) jules->AI()->Talk(SAY_JULES_2); events.ScheduleEvent(EVENT_BARADAS_TALK, 18000); step++; break; case 4: DoCast(SPELL_BARADA_FALTERS); me->HandleEmoteCommand(EMOTE_STAND_STATE_NONE); if (jules) jules->GetAI()->DoAction(ACTION_JULES_HOVER); events.ScheduleEvent(EVENT_BARADAS_TALK, 11000); step++; break; case 5: if (jules) jules->AI()->Talk(SAY_JULES_3); events.ScheduleEvent(EVENT_BARADAS_TALK, 13000); step++; break; case 6: Talk(SAY_BARADA_4); events.ScheduleEvent(EVENT_BARADAS_TALK, 5000); step++; break; case 7: if (jules) jules->AI()->Talk(SAY_JULES_3); events.ScheduleEvent(EVENT_BARADAS_TALK, 13000); step++; break; case 8: Talk(SAY_BARADA_4); events.ScheduleEvent(EVENT_BARADAS_TALK, 12000); step++; break; case 9: if (jules) jules->AI()->Talk(SAY_JULES_4); events.ScheduleEvent(EVENT_BARADAS_TALK, 12000); step++; break; case 10: Talk(SAY_BARADA_4); events.ScheduleEvent(EVENT_BARADAS_TALK, 5000); step++; break; case 11: if (jules) jules->GetAI()->DoAction(ACTION_JULES_FLIGH); events.ScheduleEvent(EVENT_BARADAS_TALK, 10000); step++; break; case 12: if (jules) jules->AI()->Talk(SAY_JULES_4); events.ScheduleEvent(EVENT_BARADAS_TALK, 8000); step++; break; case 13: Talk(SAY_BARADA_5); events.ScheduleEvent(EVENT_BARADAS_TALK, 10000); step++; break; case 14: if (jules) jules->AI()->Talk(SAY_JULES_4); events.ScheduleEvent(EVENT_BARADAS_TALK, 10000); step++; break; case 15: Talk(SAY_BARADA_6); events.ScheduleEvent(EVENT_BARADAS_TALK, 10000); step++; break; case 16: if (jules) jules->AI()->Talk(SAY_JULES_5); events.ScheduleEvent(EVENT_BARADAS_TALK, 10000); step++; break; case 17: Talk(SAY_BARADA_7); events.ScheduleEvent(EVENT_BARADAS_TALK, 10000); step++; break; case 18: if (jules) jules->AI()->Talk(SAY_JULES_3); events.ScheduleEvent(EVENT_BARADAS_TALK, 10000); step++; break; case 19: Talk(SAY_BARADA_7); events.ScheduleEvent(EVENT_BARADAS_TALK, 10000); step++; break; case 20: if (jules) { jules->GetAI()->DoAction(ACTION_JULES_MOVE_HOME); jules->RemoveAura(SPELL_JULES_VOMITS_AURA); } events.ScheduleEvent(EVENT_BARADAS_TALK, 10000); step++; break; case 21: //Ende if (playerGUID) { if (Player* player = ObjectAccessor::FindPlayer(playerGUID)) player->KilledMonsterCredit(NPC_COLONEL_JULES, 0); me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } if (jules) jules->RemoveAllAuras(); me->RemoveAura(SPELL_BARADAS_COMMAND); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); Talk(SAY_BARADA_8); me->GetMotionMaster()->MoveTargetedHome(); EnterEvadeMode(); break; } break; } } }
void UpdateAI(const uint32 diff) { events.Update(diff); switch (events.ExecuteEvent()) { case EVENT_START_INTRO: me->GetMotionMaster()->MovePoint(0, MoveThronePos); // Begining of intro is differents between factions as the speech sequence and timers are differents. if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) events.ScheduleEvent(EVENT_INTRO_A2_1, 0); else events.ScheduleEvent(EVENT_INTRO_H2_1, 0); break; // A2 Intro Events case EVENT_INTRO_A2_1: DoScriptText(SAY_JAINA_INTRO_3, me); events.ScheduleEvent(EVENT_INTRO_A2_2, 5000); break; case EVENT_INTRO_A2_2: DoScriptText(SAY_JAINA_INTRO_4, me); events.ScheduleEvent(EVENT_INTRO_A2_3, 10000); break; case EVENT_INTRO_A2_3: // TODO: she's doing some kind of spell casting emote instance->HandleGameObject(instance->GetData64(DATA_FROSTMOURNE), true); events.ScheduleEvent(EVENT_INTRO_A2_4, 10000); break; case EVENT_INTRO_A2_4: // spawn UTHER during speach 2 if (Creature* pUther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN)) { pUther->GetMotionMaster()->MoveIdle(); pUther->SetReactState(REACT_PASSIVE); // be sure he will not aggro arthas uiUther = pUther->GetGUID(); } events.ScheduleEvent(EVENT_INTRO_A2_5, 2000); break; case EVENT_INTRO_A2_5: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_A2_1, pUther); events.ScheduleEvent(EVENT_INTRO_A2_6, 3000); break; case EVENT_INTRO_A2_6: DoScriptText(SAY_JAINA_INTRO_5, me); events.ScheduleEvent(EVENT_INTRO_A2_7, 6000); break; case EVENT_INTRO_A2_7: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_A2_2, pUther); events.ScheduleEvent(EVENT_INTRO_A2_8, 6500); break; case EVENT_INTRO_A2_8: DoScriptText(SAY_JAINA_INTRO_6, me); events.ScheduleEvent(EVENT_INTRO_A2_9, 2000); break; case EVENT_INTRO_A2_9: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_A2_3, pUther); events.ScheduleEvent(EVENT_INTRO_A2_10, 9000); break; case EVENT_INTRO_A2_10: DoScriptText(SAY_JAINA_INTRO_7, me); events.ScheduleEvent(EVENT_INTRO_A2_11, 5000); break; case EVENT_INTRO_A2_11: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_A2_4, pUther); events.ScheduleEvent(EVENT_INTRO_A2_12, 11000); break; case EVENT_INTRO_A2_12: DoScriptText(SAY_JAINA_INTRO_8, me); events.ScheduleEvent(EVENT_INTRO_A2_13, 4000); break; case EVENT_INTRO_A2_13: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_A2_5, pUther); events.ScheduleEvent(EVENT_INTRO_A2_14, 12500); break; case EVENT_INTRO_A2_14: DoScriptText(SAY_JAINA_INTRO_9, me); events.ScheduleEvent(EVENT_INTRO_A2_15, 10000); break; case EVENT_INTRO_A2_15: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_A2_6, pUther); events.ScheduleEvent(EVENT_INTRO_A2_16, 22000); break; case EVENT_INTRO_A2_16: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_A2_7, pUther); events.ScheduleEvent(EVENT_INTRO_A2_17, 4000); break; case EVENT_INTRO_A2_17: DoScriptText(SAY_JAINA_INTRO_10, me); events.ScheduleEvent(EVENT_INTRO_A2_18, 2000); break; case EVENT_INTRO_A2_18: if (Creature* pUther = me->GetCreature(*me, uiUther)) { pUther->HandleEmoteCommand(EMOTE_ONESHOT_NO); DoScriptText(SAY_UTHER_INTRO_A2_8, pUther); } events.ScheduleEvent(EVENT_INTRO_A2_19, 11000); break; case EVENT_INTRO_A2_19: DoScriptText(SAY_JAINA_INTRO_11, me); events.ScheduleEvent(EVENT_INTRO_LK_1, 2000); break; // H2 Intro Events case EVENT_INTRO_H2_1: DoScriptText(SAY_SYLVANAS_INTRO_1, me); events.ScheduleEvent(EVENT_INTRO_H2_2, 8000); break; case EVENT_INTRO_H2_2: DoScriptText(SAY_SYLVANAS_INTRO_2, me); events.ScheduleEvent(EVENT_INTRO_H2_3, 6000); break; case EVENT_INTRO_H2_3: DoScriptText(SAY_SYLVANAS_INTRO_3, me); // TODO: she's doing some kind of spell casting emote events.ScheduleEvent(EVENT_INTRO_H2_4, 6000); break; case EVENT_INTRO_H2_4: // spawn UTHER during speach 2 if (Creature* pUther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN)) { pUther->GetMotionMaster()->MoveIdle(); pUther->SetReactState(REACT_PASSIVE); // be sure he will not aggro arthas uiUther = pUther->GetGUID(); } events.ScheduleEvent(EVENT_INTRO_H2_5, 2000); break; case EVENT_INTRO_H2_5: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_H2_1, pUther); events.ScheduleEvent(EVENT_INTRO_H2_6, 11000); break; case EVENT_INTRO_H2_6: DoScriptText(SAY_SYLVANAS_INTRO_4, me); events.ScheduleEvent(EVENT_INTRO_H2_7, 3000); break; case EVENT_INTRO_H2_7: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_H2_2, pUther); events.ScheduleEvent(EVENT_INTRO_H2_8, 6000); break; case EVENT_INTRO_H2_8: DoScriptText(SAY_SYLVANAS_INTRO_5, me); events.ScheduleEvent(EVENT_INTRO_H2_9, 5000); break; case EVENT_INTRO_H2_9: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_H2_3, pUther); events.ScheduleEvent(EVENT_INTRO_H2_10, 19000); break; case EVENT_INTRO_H2_10: DoScriptText(SAY_SYLVANAS_INTRO_6, me); events.ScheduleEvent(EVENT_INTRO_H2_11, 1500); break; case EVENT_INTRO_H2_11: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_H2_4, pUther); events.ScheduleEvent(EVENT_INTRO_H2_12, 19500); break; case EVENT_INTRO_H2_12: DoScriptText(SAY_SYLVANAS_INTRO_7, me); events.ScheduleEvent(EVENT_INTRO_H2_13, 2000); break; case EVENT_INTRO_H2_13: if (Creature* pUther = me->GetCreature(*me, uiUther)) { pUther->HandleEmoteCommand(EMOTE_ONESHOT_NO); DoScriptText(SAY_UTHER_INTRO_H2_5, pUther); } events.ScheduleEvent(EVENT_INTRO_H2_14, 12000); break; case EVENT_INTRO_H2_14: if (Creature* pUther = me->GetCreature(*me, uiUther)) DoScriptText(SAY_UTHER_INTRO_H2_6, pUther); events.ScheduleEvent(EVENT_INTRO_H2_15, 8000); break; case EVENT_INTRO_H2_15: DoScriptText(SAY_SYLVANAS_INTRO_8, me); events.ScheduleEvent(EVENT_INTRO_LK_1, 2000); break; // Remaining Intro Events common for both faction case EVENT_INTRO_LK_1: // Spawn LK in front of door, and make him move to the sword. if (Creature* pLichKing = me->SummonCreature(NPC_LICH_KING_EVENT, LichKingSpawnPos, TEMPSUMMON_MANUAL_DESPAWN)) { pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos); pLichKing->SetReactState(REACT_PASSIVE); uiLichKing = pLichKing->GetGUID(); } if (Creature* pUther = me->GetCreature(*me, uiUther)) { if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) DoScriptText(SAY_UTHER_INTRO_A2_9, pUther); else DoScriptText(SAY_UTHER_INTRO_H2_7, pUther); } events.ScheduleEvent(EVENT_INTRO_LK_2, 11000); break; case EVENT_INTRO_LK_2: if (Creature* pLichKing = me->GetCreature(*me, uiLichKing)) DoScriptText(SAY_LK_INTRO_1, pLichKing); events.ScheduleEvent(EVENT_INTRO_LK_3, 2000); break; case EVENT_INTRO_LK_3: // The Lich King banishes Uther to the abyss. if (Creature* pUther = me->GetCreature(*me, uiUther)) { pUther->DisappearAndDie(); uiUther = 0; } // He steps forward and removes the runeblade from the heap of skulls. events.ScheduleEvent(EVENT_INTRO_LK_4, 4000); break; case EVENT_INTRO_LK_4: if (Creature* pLichKing = me->GetCreature(*me, uiLichKing)) DoScriptText(SAY_LK_INTRO_2, pLichKing); events.ScheduleEvent(EVENT_INTRO_LK_5, 10000); break; case EVENT_INTRO_LK_5: // summon Falric and Marwyn. then go back to the door if (Creature* pFalric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC))) pFalric->SetVisible(true); if (Creature* pMarwyn = me->GetCreature(*me, instance->GetData64(DATA_MARWYN))) pMarwyn->SetVisible(true); if (Creature* pLichKing = me->GetCreature(*me, uiLichKing)) { pLichKing->GetMotionMaster()->MovePoint(0, LichKingSpawnPos); DoScriptText(SAY_LK_INTRO_3, pLichKing); } events.ScheduleEvent(EVENT_INTRO_LK_6, 8000); break; case EVENT_INTRO_LK_6: if (Creature* pFalric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC))) DoScriptText(SAY_FALRIC_INTRO_1, pFalric); events.ScheduleEvent(EVENT_INTRO_LK_7, 2000); break; case EVENT_INTRO_LK_7: if (Creature* pMarwyn = me->GetCreature(*me, instance->GetData64(DATA_MARWYN))) DoScriptText(SAY_MARWYN_INTRO_1, pMarwyn); events.ScheduleEvent(EVENT_INTRO_LK_8, 2000); break; case EVENT_INTRO_LK_8: if (Creature* pFalric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC))) DoScriptText(SAY_FALRIC_INTRO_2, pFalric); events.ScheduleEvent(EVENT_INTRO_LK_9, 5000); break; case EVENT_INTRO_LK_9: if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) DoScriptText(SAY_JAINA_INTRO_END, me); else DoScriptText(SAY_SYLVANAS_INTRO_END, me); me->GetMotionMaster()->MovePoint(0, LichKingSpawnPos); // TODO: Loralen/Koreln shall run also events.ScheduleEvent(EVENT_INTRO_END, 10000); break; case EVENT_INTRO_END: if (instance) instance->SetData(DATA_WAVE_COUNT, SPECIAL); // start first wave // Loralen or Koreln disappearAndDie() me->DisappearAndDie(); break; case EVENT_SKIP_INTRO: // TODO: implement if (Creature* pFalric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC))) pFalric->SetVisible(true); if (Creature* pMarwyn = me->GetCreature(*me, instance->GetData64(DATA_MARWYN))) pMarwyn->SetVisible(true); me->GetMotionMaster()->MovePoint(0, LichKingSpawnPos); // TODO: Loralen/Koreln shall run also events.ScheduleEvent(EVENT_INTRO_END, 15000); break; } }